1
- import { BehaviorSubject , type ObservedValueOf , Subject , merge } from "rxjs"
2
- import {
3
- distinctUntilChanged ,
4
- filter ,
5
- map ,
6
- takeUntil ,
7
- withLatestFrom ,
8
- } from "rxjs/operators"
1
+ import { BehaviorSubject , Subject } from "rxjs"
2
+ import { filter , map } from "rxjs/operators"
9
3
import { generateCfiForSpineItemPage } from "./cfi/generate/generateCfiForSpineItemPage"
10
4
import { generateCfiFromRange } from "./cfi/generate/generateCfiFromRange"
11
5
import { generateCfiFromSelection } from "./cfi/generate/generateCfiFronSelection"
12
6
import { parseCfi } from "./cfi/lookup/parseCfi"
13
7
import { resolveCfi } from "./cfi/lookup/resolveCfi"
14
8
import { HTML_PREFIX } from "./constants"
15
9
import { Context , type ContextState } from "./context/Context"
10
+ import { Features } from "./features/Features"
16
11
import { HookManager } from "./hooks/HookManager"
17
12
import { createNavigator } from "./navigation/Navigator"
18
13
import { Pagination } from "./pagination/Pagination"
@@ -26,7 +21,6 @@ import { SpineItemsManager } from "./spine/SpineItemsManager"
26
21
import type { SpineItem } from "./spineItem/SpineItem"
27
22
import { createSpineItemLocator } from "./spineItem/locationResolver"
28
23
import { isDefined } from "./utils/isDefined"
29
- import { isShallowEqual } from "./utils/objects"
30
24
import { Viewport } from "./viewport/Viewport"
31
25
32
26
export type CreateReaderOptions = Partial < CoreInputSettings >
@@ -38,27 +32,11 @@ export type ContextSettings = Partial<CoreInputSettings>
38
32
export type ReaderInternal = ReturnType < typeof createReader >
39
33
40
34
export const createReader = ( inputSettings : CreateReaderOptions ) => {
41
- const stateSubject$ = new BehaviorSubject < {
42
- supportedPageTurnAnimation : NonNullable <
43
- ContextSettings [ `pageTurnAnimation`]
44
- > [ ]
45
- supportedPageTurnMode : NonNullable < ContextSettings [ `pageTurnMode`] > [ ]
46
- supportedPageTurnDirection : NonNullable <
47
- ContextSettings [ `pageTurnDirection`]
48
- > [ ]
49
- supportedComputedPageTurnDirection : NonNullable <
50
- ContextSettings [ `pageTurnDirection`]
51
- > [ ]
52
- } > ( {
53
- supportedPageTurnAnimation : [ `fade` , `none` , `slide` ] ,
54
- supportedPageTurnMode : [ `controlled` , `scrollable` ] ,
55
- supportedPageTurnDirection : [ `horizontal` , `vertical` ] ,
56
- supportedComputedPageTurnDirection : [ `horizontal` , `vertical` ] ,
57
- } )
58
35
const destroy$ = new Subject < void > ( )
59
36
const hookManager = new HookManager ( )
60
37
const context = new Context ( )
61
38
const settingsManager = new ReaderSettingsManager ( inputSettings , context )
39
+ const features = new Features ( context , settingsManager )
62
40
const spineItemsManager = new SpineItemsManager ( context , settingsManager )
63
41
const elementSubject$ = new BehaviorSubject < HTMLElement | undefined > (
64
42
undefined ,
@@ -174,54 +152,6 @@ export const createReader = (inputSettings: CreateReaderOptions) => {
174
152
layout ( )
175
153
}
176
154
177
- merge ( context . state$ , settingsManager . values$ )
178
- . pipe (
179
- map ( ( ) => undefined ) ,
180
- withLatestFrom ( context . state$ ) ,
181
- map ( ( [ , { hasVerticalWriting } ] ) => {
182
- const manifest = context . manifest
183
-
184
- return {
185
- hasVerticalWriting,
186
- renditionFlow : manifest ?. renditionFlow ,
187
- renditionLayout : manifest ?. renditionLayout ,
188
- computedPageTurnMode : settingsManager . values . computedPageTurnMode ,
189
- }
190
- } ) ,
191
- distinctUntilChanged ( isShallowEqual ) ,
192
- map (
193
- ( {
194
- hasVerticalWriting,
195
- renditionFlow,
196
- renditionLayout,
197
- computedPageTurnMode,
198
- } ) : ObservedValueOf < typeof stateSubject$ > => {
199
- return {
200
- ...stateSubject$ . value ,
201
- supportedPageTurnMode :
202
- renditionFlow === `scrolled-continuous`
203
- ? [ `scrollable` ]
204
- : [ `controlled` , `scrollable` ] ,
205
- supportedPageTurnAnimation :
206
- renditionFlow === `scrolled-continuous` ||
207
- computedPageTurnMode === `scrollable`
208
- ? [ `none` ]
209
- : hasVerticalWriting
210
- ? [ `fade` , `none` ]
211
- : [ `fade` , `none` , `slide` ] ,
212
- supportedPageTurnDirection :
213
- computedPageTurnMode === `scrollable`
214
- ? [ `vertical` ]
215
- : renditionLayout === `reflowable`
216
- ? [ `horizontal` ]
217
- : [ `horizontal` , `vertical` ] ,
218
- }
219
- } ,
220
- ) ,
221
- takeUntil ( destroy$ ) ,
222
- )
223
- . subscribe ( stateSubject$ )
224
-
225
155
/**
226
156
* Free up resources, and dispose the whole reader.
227
157
* You should call this method if you leave the reader.
@@ -240,7 +170,7 @@ export const createReader = (inputSettings: CreateReaderOptions) => {
240
170
navigator . destroy ( )
241
171
spine . destroy ( )
242
172
elementSubject$ . getValue ( ) ?. remove ( )
243
- stateSubject$ . complete ( )
173
+ features . destroy ( )
244
174
destroy$ . next ( )
245
175
destroy$ . complete ( )
246
176
viewport . destroy ( )
@@ -293,8 +223,8 @@ export const createReader = (inputSettings: CreateReaderOptions) => {
293
223
state$ : context . manifest$ . pipe (
294
224
map ( ( manifest ) => ( manifest ? "ready" : "idle" ) ) ,
295
225
) ,
226
+ features,
296
227
$ : {
297
- state$ : stateSubject$ . asObservable ( ) ,
298
228
destroy$,
299
229
} ,
300
230
}
0 commit comments