Skip to content

Commit 01dc6e6

Browse files
committed
feat: cleanup
1 parent f6d3175 commit 01dc6e6

File tree

3 files changed

+92
-77
lines changed

3 files changed

+92
-77
lines changed
+85
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
import { isShallowEqual } from "@prose-reader/shared"
2+
import {
3+
distinctUntilChanged,
4+
map,
5+
merge,
6+
takeUntil,
7+
withLatestFrom,
8+
} from "rxjs"
9+
import type { Context } from "../context/Context"
10+
import type { ReaderSettingsManager } from "../settings/ReaderSettingsManager"
11+
import type { CoreInputSettings } from "../settings/types"
12+
import { ReactiveEntity } from "../utils/ReactiveEntity"
13+
14+
export type ContextSettings = Partial<CoreInputSettings>
15+
16+
type State = {
17+
supportedPageTurnAnimation: NonNullable<
18+
ContextSettings[`pageTurnAnimation`]
19+
>[]
20+
supportedPageTurnMode: NonNullable<ContextSettings[`pageTurnMode`]>[]
21+
supportedPageTurnDirection: NonNullable<
22+
ContextSettings[`pageTurnDirection`]
23+
>[]
24+
supportedComputedPageTurnDirection: NonNullable<
25+
ContextSettings[`pageTurnDirection`]
26+
>[]
27+
}
28+
29+
export class Features extends ReactiveEntity<State> {
30+
constructor(context: Context, settingsManager: ReaderSettingsManager) {
31+
super({
32+
supportedPageTurnAnimation: [`fade`, `none`, `slide`],
33+
supportedPageTurnMode: [`controlled`, `scrollable`],
34+
supportedPageTurnDirection: [`horizontal`, `vertical`],
35+
supportedComputedPageTurnDirection: [`horizontal`, `vertical`],
36+
})
37+
38+
merge(context.state$, settingsManager.values$)
39+
.pipe(
40+
withLatestFrom(context.state$),
41+
map(([, { hasVerticalWriting }]) => {
42+
const manifest = context.manifest
43+
44+
return {
45+
hasVerticalWriting,
46+
renditionFlow: manifest?.renditionFlow,
47+
renditionLayout: manifest?.renditionLayout,
48+
computedPageTurnMode: settingsManager.values.computedPageTurnMode,
49+
}
50+
}),
51+
distinctUntilChanged(isShallowEqual),
52+
map(
53+
({
54+
hasVerticalWriting,
55+
renditionFlow,
56+
renditionLayout,
57+
computedPageTurnMode,
58+
}) => {
59+
return {
60+
...this.value,
61+
supportedPageTurnMode:
62+
renditionFlow === `scrolled-continuous`
63+
? [`scrollable`]
64+
: [`controlled`, `scrollable`],
65+
supportedPageTurnAnimation:
66+
renditionFlow === `scrolled-continuous` ||
67+
computedPageTurnMode === `scrollable`
68+
? [`none`]
69+
: hasVerticalWriting
70+
? [`fade`, `none`]
71+
: [`fade`, `none`, `slide`],
72+
supportedPageTurnDirection:
73+
computedPageTurnMode === `scrollable`
74+
? [`vertical`]
75+
: renditionLayout === `reflowable`
76+
? [`horizontal`]
77+
: [`horizontal`, `vertical`],
78+
} satisfies State
79+
},
80+
),
81+
takeUntil(this.destroy$),
82+
)
83+
.subscribe(this.next.bind(this))
84+
}
85+
}

packages/core/src/reader.ts

+6-76
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,13 @@
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"
93
import { generateCfiForSpineItemPage } from "./cfi/generate/generateCfiForSpineItemPage"
104
import { generateCfiFromRange } from "./cfi/generate/generateCfiFromRange"
115
import { generateCfiFromSelection } from "./cfi/generate/generateCfiFronSelection"
126
import { parseCfi } from "./cfi/lookup/parseCfi"
137
import { resolveCfi } from "./cfi/lookup/resolveCfi"
148
import { HTML_PREFIX } from "./constants"
159
import { Context, type ContextState } from "./context/Context"
10+
import { Features } from "./features/Features"
1611
import { HookManager } from "./hooks/HookManager"
1712
import { createNavigator } from "./navigation/Navigator"
1813
import { Pagination } from "./pagination/Pagination"
@@ -26,7 +21,6 @@ import { SpineItemsManager } from "./spine/SpineItemsManager"
2621
import type { SpineItem } from "./spineItem/SpineItem"
2722
import { createSpineItemLocator } from "./spineItem/locationResolver"
2823
import { isDefined } from "./utils/isDefined"
29-
import { isShallowEqual } from "./utils/objects"
3024
import { Viewport } from "./viewport/Viewport"
3125

3226
export type CreateReaderOptions = Partial<CoreInputSettings>
@@ -38,27 +32,11 @@ export type ContextSettings = Partial<CoreInputSettings>
3832
export type ReaderInternal = ReturnType<typeof createReader>
3933

4034
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-
})
5835
const destroy$ = new Subject<void>()
5936
const hookManager = new HookManager()
6037
const context = new Context()
6138
const settingsManager = new ReaderSettingsManager(inputSettings, context)
39+
const features = new Features(context, settingsManager)
6240
const spineItemsManager = new SpineItemsManager(context, settingsManager)
6341
const elementSubject$ = new BehaviorSubject<HTMLElement | undefined>(
6442
undefined,
@@ -174,54 +152,6 @@ export const createReader = (inputSettings: CreateReaderOptions) => {
174152
layout()
175153
}
176154

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-
225155
/**
226156
* Free up resources, and dispose the whole reader.
227157
* You should call this method if you leave the reader.
@@ -240,7 +170,7 @@ export const createReader = (inputSettings: CreateReaderOptions) => {
240170
navigator.destroy()
241171
spine.destroy()
242172
elementSubject$.getValue()?.remove()
243-
stateSubject$.complete()
173+
features.destroy()
244174
destroy$.next()
245175
destroy$.complete()
246176
viewport.destroy()
@@ -293,8 +223,8 @@ export const createReader = (inputSettings: CreateReaderOptions) => {
293223
state$: context.manifest$.pipe(
294224
map((manifest) => (manifest ? "ready" : "idle")),
295225
),
226+
features,
296227
$: {
297-
state$: stateSubject$.asObservable(),
298228
destroy$,
299229
},
300230
}

packages/demo/src/common/NavigationSettings.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ export const NavigationSettings = ({
1717
}) => {
1818
const settings = useReaderSettings()
1919
const { reader } = useReader()
20-
const readerState = useObserve(() => reader?.$.state$, [reader])
20+
const readerState = useObserve(() => reader?.features, [reader])
2121
const onlySupportScrollableMode =
2222
readerState?.supportedPageTurnMode.length === 1 &&
2323
readerState.supportedPageTurnMode[0] === `scrollable`

0 commit comments

Comments
 (0)