@prose-reader/react-native 8.0.0 → 9.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -11,7 +11,7 @@ export declare const ReaderContext: import('react').Context<{
11
11
  };
12
12
  ReaderWebView: import('react').ForwardRefExoticComponent<import('react-native-webview/lib/WebViewTypes').IOSWebViewProps & import('react-native-webview/lib/WebViewTypes').AndroidWebViewProps & import('react-native-webview/lib/WebViewTypes').WindowsWebViewProps & import('react').RefAttributes<import('@webview-bridge/react-native').BridgeWebView>>;
13
13
  appBridge: import('@webview-bridge/web').BridgeStore<import('.').BridgeState & import('.').BridgeMethods> & import('@webview-bridge/react-native').BridgeMiddlewareBuilder<import('.').BridgeState & import('.').BridgeMethods, object>;
14
- load: (manifest: import('@prose-reader/shared').Manifest) => void;
14
+ load: (loadOptions: import('.').ReaderLoadOptions) => void;
15
15
  } | null | undefined>;
16
16
  export declare const useProseReaderContext: () => {
17
17
  webviewBridge: {
@@ -25,7 +25,7 @@ export declare const useProseReaderContext: () => {
25
25
  };
26
26
  ReaderWebView: import('react').ForwardRefExoticComponent<import('react-native-webview/lib/WebViewTypes').IOSWebViewProps & import('react-native-webview/lib/WebViewTypes').AndroidWebViewProps & import('react-native-webview/lib/WebViewTypes').WindowsWebViewProps & import('react').RefAttributes<import('@webview-bridge/react-native').BridgeWebView>>;
27
27
  appBridge: import('@webview-bridge/web').BridgeStore<import('.').BridgeState & import('.').BridgeMethods> & import('@webview-bridge/react-native').BridgeMiddlewareBuilder<import('.').BridgeState & import('.').BridgeMethods, object>;
28
- load: (manifest: import('@prose-reader/shared').Manifest) => void;
28
+ load: (loadOptions: import('.').ReaderLoadOptions) => void;
29
29
  };
30
30
  export declare const ReaderProvider: ({ children, reader, }: {
31
31
  children: React.ReactNode;
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../shared-C6TEX07M.cjs");let t=require("react"),n=require("@prose-reader/archive-reader"),r=require("expo-file-system"),i=require("@prose-reader/streamer"),a=require("react/jsx-runtime"),o=require("@webview-bridge/react-native");var s=e=>e.list().flatMap(e=>e instanceof r.Directory?[e,...s(e)]:[e]),c=async(e,{orderByAlpha:t,name:i}={})=>(0,n.createArchiveFromEntries)(s(e),e=>{let t=e.uri.replace(`file://`,``);return e instanceof r.Directory?{dir:!0,uri:t}:{dir:!1,uri:t,size:e.info().size??0,...(0,n.blobFileAccessors)(async()=>new Blob([await e.arrayBuffer()]))}},{orderByAlpha:t,name:i,close:()=>Promise.resolve()}),l=class extends i.Streamer{async fetchResourceAsData({key:e,resourcePath:t}){let n=await super.fetchResource({key:e,resourcePath:t});return{data:await n.text(),headers:Object.fromEntries(n.headers.entries())}}},u=(0,t.createContext)(void 0),d=()=>{let e=(0,t.useContext)(u);if(!e)throw Error(`useProseReader must be used within a ProseReaderProvider`);return e},f=({children:e,reader:t})=>(0,a.jsx)(u.Provider,{value:t,children:e}),p=n=>{let r=e.t(n),[i]=(0,t.useState)(()=>(0,o.bridge)(({set:e})=>({pagination:void 0,setPagination:async t=>{e({pagination:t})},context:void 0,setContext:async t=>{e({context:t})},async getResource(e){return r.current.getResource(e)}})));return i},m=(0,o.postMessageSchema)({load:{validate:e=>e},turnRight:{validate:()=>{}},turnLeft:{validate:()=>{}}}),h=e=>{let[n,r]=(0,t.useState)(void 0),i=p(e),a=n?.postMessage;(0,t.useEffect)(()=>{i&&r((0,o.createWebView)({bridge:i,debug:!0,postMessageSchema:m}))},[i]);let s=(0,t.useCallback)(e=>{a?.(`load`,{manifest:e})},[a]);return n?{webviewBridge:n,ReaderWebView:n.WebView,appBridge:i,load:s}:null},g=()=>{let{webviewBridge:e}=d(),{postMessage:t}=e;return{turnRight:()=>{t(`turnRight`,void 0)},turnLeft:()=>{t(`turnLeft`,void 0)}}},_=e=>{let{appBridge:t}=d();return(0,o.useBridge)(t,e)};exports.ReactNativeStreamer=l,exports.ReaderProvider=f,exports.createArchiveFromExpoFileSystemNext=c,exports.useCreateReader=h,exports.useLiveRef=e.t,exports.useReader=g,exports.useReaderState=_;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../shared-C6TEX07M.cjs");let t=require("react"),n=require("@prose-reader/archive-reader"),r=require("expo-file-system"),i=require("@prose-reader/streamer"),a=require("react/jsx-runtime"),o=require("@webview-bridge/react-native");var s=e=>e.list().flatMap(e=>e instanceof r.Directory?[e,...s(e)]:[e]),c=async(e,{orderByAlpha:t,name:i}={})=>(0,n.createArchiveFromEntries)(s(e),e=>{let t=e.uri.replace(`file://`,``);return e instanceof r.Directory?{dir:!0,uri:t}:{dir:!1,uri:t,size:e.info().size??0,...(0,n.blobFileAccessors)(async()=>new Blob([await e.arrayBuffer()]))}},{orderByAlpha:t,name:i,close:()=>Promise.resolve()}),l=class extends i.Streamer{async fetchResourceAsData({key:e,resourcePath:t}){let n=await super.fetchResource({key:e,resourcePath:t});return{data:await n.text(),headers:Object.fromEntries(n.headers.entries())}}},u=(0,t.createContext)(void 0),d=()=>{let e=(0,t.useContext)(u);if(!e)throw Error(`useProseReader must be used within a ProseReaderProvider`);return e},f=({children:e,reader:t})=>(0,a.jsx)(u.Provider,{value:t,children:e}),p={pagination:null,context:null,readingPosition:null},m=e=>{let t=0,n=(0,o.bridge)(({set:n})=>({...p,report:async(e,r)=>{e===t&&n(r)},getResource:e}));return{appBridge:n,startLoad:()=>(t+=1,n.setState(p),t)}},h=n=>{let r=e.t(n),[i]=(0,t.useState)(()=>m(e=>r.current.getResource(e)));return i},g=(0,o.postMessageSchema)({load:{validate:e=>e},turnRight:{validate:()=>{}},turnLeft:{validate:()=>{}}}),_=e=>{let[n,r]=(0,t.useState)(void 0),{appBridge:i,startLoad:a}=h(e),s=n?.postMessage;(0,t.useEffect)(()=>{i&&r((0,o.createWebView)({bridge:i,debug:!0,postMessageSchema:g}))},[i]);let c=(0,t.useCallback)(e=>{s&&s(`load`,{load:a(),options:e})},[s,a]);return n?{webviewBridge:n,ReaderWebView:n.WebView,appBridge:i,load:c}:null},v=()=>{let{webviewBridge:e}=d(),{postMessage:t}=e;return{turnRight:()=>{t(`turnRight`,void 0)},turnLeft:()=>{t(`turnLeft`,void 0)}}},y=e=>{let{appBridge:t}=d();return(0,o.useBridge)(t,e)};exports.ReactNativeStreamer=l,exports.ReaderProvider=f,exports.createArchiveFromExpoFileSystemNext=c,exports.useCreateReader=_,exports.useLiveRef=e.t,exports.useReader=v,exports.useReaderState=y;
@@ -39,44 +39,51 @@ var h = (e) => e.list().flatMap((e) => e instanceof c ? [e, ...h(e)] : [e]), g =
39
39
  }, b = ({ children: e, reader: t }) => /* @__PURE__ */ u(v.Provider, {
40
40
  value: t,
41
41
  children: e
42
- }), x = (t) => {
43
- let n = e(t), [r] = a(() => d(({ set: e }) => ({
44
- pagination: void 0,
45
- setPagination: async (t) => {
46
- e({ pagination: t });
42
+ }), x = {
43
+ pagination: null,
44
+ context: null,
45
+ readingPosition: null
46
+ }, S = (e) => {
47
+ let t = 0, n = d(({ set: n }) => ({
48
+ ...x,
49
+ report: async (e, r) => {
50
+ e === t && n(r);
47
51
  },
48
- context: void 0,
49
- setContext: async (t) => {
50
- e({ context: t });
51
- },
52
- async getResource(e) {
53
- return n.current.getResource(e);
54
- }
55
- })));
52
+ getResource: e
53
+ }));
54
+ return {
55
+ appBridge: n,
56
+ startLoad: () => (t += 1, n.setState(x), t)
57
+ };
58
+ }, C = (t) => {
59
+ let n = e(t), [r] = a(() => S((e) => n.current.getResource(e)));
56
60
  return r;
57
- }, S = p({
61
+ }, w = p({
58
62
  load: { validate: (e) => e },
59
63
  turnRight: { validate: () => {} },
60
64
  turnLeft: { validate: () => {} }
61
- }), C = (e) => {
62
- let [t, r] = a(void 0), o = x(e), s = t?.postMessage;
65
+ }), T = (e) => {
66
+ let [t, r] = a(void 0), { appBridge: o, startLoad: s } = C(e), c = t?.postMessage;
63
67
  i(() => {
64
68
  o && r(f({
65
69
  bridge: o,
66
70
  debug: !0,
67
- postMessageSchema: S
71
+ postMessageSchema: w
68
72
  }));
69
73
  }, [o]);
70
- let c = n((e) => {
71
- s?.("load", { manifest: e });
72
- }, [s]);
74
+ let l = n((e) => {
75
+ c && c("load", {
76
+ load: s(),
77
+ options: e
78
+ });
79
+ }, [c, s]);
73
80
  return t ? {
74
81
  webviewBridge: t,
75
82
  ReaderWebView: t.WebView,
76
83
  appBridge: o,
77
- load: c
84
+ load: l
78
85
  } : null;
79
- }, w = () => {
86
+ }, E = () => {
80
87
  let { webviewBridge: e } = y(), { postMessage: t } = e;
81
88
  return {
82
89
  turnRight: () => {
@@ -86,9 +93,9 @@ var h = (e) => e.list().flatMap((e) => e instanceof c ? [e, ...h(e)] : [e]), g =
86
93
  t("turnLeft", void 0);
87
94
  }
88
95
  };
89
- }, T = (e) => {
96
+ }, D = (e) => {
90
97
  let { appBridge: t } = y();
91
98
  return m(t, e);
92
99
  };
93
100
  //#endregion
94
- export { _ as ReactNativeStreamer, b as ReaderProvider, g as createArchiveFromExpoFileSystemNext, C as useCreateReader, e as useLiveRef, w as useReader, T as useReaderState };
101
+ export { _ as ReactNativeStreamer, b as ReaderProvider, g as createArchiveFromExpoFileSystemNext, T as useCreateReader, e as useLiveRef, E as useReader, D as useReaderState };
@@ -1,5 +1,4 @@
1
- import { Manifest } from '@prose-reader/streamer';
2
- import { BridgeMethods, ProsePostMessageSchema } from '../shared';
1
+ import { BridgeMethods, ProsePostMessageSchema, ReaderLoadOptions } from '../shared';
3
2
  export declare const appPostMessageSchema: ProsePostMessageSchema;
4
3
  export declare const useCreateReader: (options: BridgeMethods) => {
5
4
  webviewBridge: {
@@ -13,5 +12,5 @@ export declare const useCreateReader: (options: BridgeMethods) => {
13
12
  };
14
13
  ReaderWebView: import('react').ForwardRefExoticComponent<import('react-native-webview/lib/WebViewTypes').IOSWebViewProps & import('react-native-webview/lib/WebViewTypes').AndroidWebViewProps & import('react-native-webview/lib/WebViewTypes').WindowsWebViewProps & import('react').RefAttributes<import('@webview-bridge/react-native').BridgeWebView>>;
15
14
  appBridge: import('@webview-bridge/web').BridgeStore<import('.').BridgeState & BridgeMethods> & import('@webview-bridge/react-native').BridgeMiddlewareBuilder<import('.').BridgeState & BridgeMethods, object>;
16
- load: (manifest: Manifest) => void;
15
+ load: (loadOptions: ReaderLoadOptions) => void;
17
16
  } | null;
@@ -1,2 +1,13 @@
1
1
  import { BridgeMethods, BridgeState } from '../shared';
2
- export declare const useProseBridge: (options: BridgeMethods) => import('@webview-bridge/web').BridgeStore<BridgeState & BridgeMethods> & import('@webview-bridge/react-native').BridgeMiddlewareBuilder<BridgeState & BridgeMethods, object>;
2
+ /**
3
+ * The native end of the bridge: the store the web side reports its reader's
4
+ * state into, and `startLoad`, which every `load` goes through.
5
+ */
6
+ export declare const createProseBridge: (getResource: BridgeMethods["getResource"]) => {
7
+ appBridge: import('@webview-bridge/web').BridgeStore<BridgeState & BridgeMethods> & import('@webview-bridge/react-native').BridgeMiddlewareBuilder<BridgeState & BridgeMethods, object>;
8
+ startLoad: () => number;
9
+ };
10
+ export declare const useProseBridge: (options: BridgeMethods) => {
11
+ appBridge: import('@webview-bridge/web').BridgeStore<BridgeState & BridgeMethods> & import('@webview-bridge/react-native').BridgeMiddlewareBuilder<BridgeState & BridgeMethods, object>;
12
+ startLoad: () => number;
13
+ };
@@ -1,12 +1,33 @@
1
- import { ContextState, createReader, EnhancerPaginationInfo, Manifest } from '@prose-reader/core';
1
+ import { ContextState, createReader, EnhancerPaginationInfo } from '@prose-reader/core';
2
2
  import { Bridge, BridgeStore } from '@webview-bridge/react-native';
3
3
  type ReaderOptions = Parameters<typeof createReader>[0];
4
4
  type RnContextState = Omit<ContextState, "rootElement">;
5
- export interface BridgeState extends Bridge {
6
- pagination: EnhancerPaginationInfo | undefined;
7
- setPagination: (pagination: EnhancerPaginationInfo) => Promise<void>;
8
- context: RnContextState | undefined;
9
- setContext: (context: RnContextState) => Promise<void>;
5
+ /**
6
+ * What the native side decides about the reader a `load` creates: the book,
7
+ * and where to open it. They are the reader options that cross the bridge,
8
+ * named as the reader names them, so the web side's factory spreads them into
9
+ * the rest.
10
+ */
11
+ export type ReaderLoadOptions = Pick<ReaderOptions, "manifest" | "cfi">;
12
+ /**
13
+ * What the web side reports of the reader of the book last loaded. Each value
14
+ * is `null` until that reader has reported it: `null` rather than `undefined`
15
+ * because the bridge store drops `undefined` values, so a `load` could not
16
+ * clear the previous book's otherwise.
17
+ */
18
+ export type ReaderState = {
19
+ pagination: EnhancerPaginationInfo | null;
20
+ context: RnContextState | null;
21
+ readingPosition: string | null;
22
+ };
23
+ export interface BridgeState extends Bridge, ReaderState {
24
+ /**
25
+ * Called by the web side with part of its reader's state, and the `load`
26
+ * that reader was created for. A report for any `load` but the latest is
27
+ * dropped: the previous reader's can still be crossing the bridge when the
28
+ * next `load` starts.
29
+ */
30
+ report: (load: number, state: Partial<ReaderState>) => Promise<void>;
10
31
  }
11
32
  export type BridgeMethods = {
12
33
  getResource: (resource: Parameters<NonNullable<ReaderOptions["getResource"]>>[0]) => Promise<{
@@ -15,11 +36,17 @@ export type BridgeMethods = {
15
36
  }>;
16
37
  };
17
38
  export type ProseBridgeStore = BridgeStore<BridgeMethods & BridgeState>;
39
+ /**
40
+ * A `load` as it crosses the bridge: the options of the reader to create, and
41
+ * which load it is, for the web side to tag that reader's reports with.
42
+ */
43
+ export type ReaderLoadMessage = {
44
+ load: number;
45
+ options: ReaderLoadOptions;
46
+ };
18
47
  export type ProsePostMessageSchema = {
19
48
  load: {
20
- validate: (data: unknown) => {
21
- manifest: Manifest;
22
- };
49
+ validate: (data: unknown) => ReaderLoadMessage;
23
50
  };
24
51
  turnRight: {
25
52
  validate: () => void;
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require("@webview-bridge/web"),t=require("rxjs");var n=()=>(0,e.linkBridge)({onReady:async()=>{}}),r=({bridge:e,createReader:n,containerElement:r})=>{let i;return e.addEventListener(`load`,a=>{i?.subscription.unsubscribe(),i?.reader.destroy(),i=void 0;let o=n(a.manifest),s=new t.Subscription;s.add(o.pagination.state$.subscribe(t=>{e.setPagination(t)})),s.add(o.context.subscribe(({rootElement:t,...n})=>{e.setContext(n)})),i={reader:o,subscription:s},o.mount(r)}),e.addEventListener(`turnRight`,()=>{i?.reader.navigation.turnRight()}),e.addEventListener(`turnLeft`,()=>{i?.reader.navigation.turnLeft()}),{getReader:()=>i?.reader}};exports.bridgeReader=r,exports.createReaderBridge=n;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require("@webview-bridge/web"),t=require("rxjs");var n=()=>(0,e.linkBridge)({onReady:async()=>{}}),r=({bridge:e,createReader:n,containerElement:r})=>{let i;return e.addEventListener(`load`,({load:a,options:{manifest:o,cfi:s}})=>{i?.subscription.unsubscribe(),i?.reader.destroy(),i=void 0;let c=n({manifest:o,cfi:s}),l=new t.Subscription;i={reader:c,subscription:l},c.mount(r);let u=(0,t.merge)(c.pagination.state$.pipe((0,t.map)(e=>({pagination:e}))),c.context.pipe((0,t.map)(({rootElement:e,...t})=>({context:t}))),c.navigation.readingPosition$.pipe((0,t.map)(e=>({readingPosition:e}))));l.add(u.subscribe(t=>{e.report(a,t)}))}),e.addEventListener(`turnRight`,()=>{i?.reader.navigation.turnRight()}),e.addEventListener(`turnLeft`,()=>{i?.reader.navigation.turnLeft()}),{getReader:()=>i?.reader}};exports.bridgeReader=r,exports.createReaderBridge=n;
@@ -1,5 +1,5 @@
1
- import { Manifest, Reader } from '@prose-reader/core';
2
- import { ProseBridgeStore, ProsePostMessageSchema } from '../shared';
1
+ import { Reader } from '@prose-reader/core';
2
+ import { ProseBridgeStore, ProsePostMessageSchema, ReaderLoadOptions } from '../shared';
3
3
  export type ReaderBridgeController = {
4
4
  /**
5
5
  * The reader currently rendering, or `undefined` before the first `load`
@@ -10,11 +10,12 @@ export type ReaderBridgeController = {
10
10
  export declare const createReaderBridge: () => import('@webview-bridge/web').LinkBridge<import('@webview-bridge/web').ExcludePrimitive<import('../shared').BridgeMethods & import('../shared').BridgeState>, Omit<ProseBridgeStore, "setState">, ProsePostMessageSchema>;
11
11
  export declare const bridgeReader: ({ bridge, createReader, containerElement, }: {
12
12
  /**
13
- * Factory invoked for every `load` event coming from the native side.
13
+ * Factory invoked for every `load` event coming from the native side, with
14
+ * the options that event carries: the manifest, and the cfi to open at.
14
15
  * A reader renders a single book: a subsequent `load` destroys the
15
- * previous reader and creates a fresh one from the new manifest.
16
+ * previous reader and creates a fresh one from the new options.
16
17
  */
17
- createReader: (manifest: Manifest) => Reader;
18
+ createReader: (options: ReaderLoadOptions) => Reader;
18
19
  bridge: ReturnType<typeof createReaderBridge>;
19
20
  containerElement: HTMLElement;
20
21
  }) => ReaderBridgeController;
package/dist/web/index.js CHANGED
@@ -1,24 +1,27 @@
1
1
  import { linkBridge as e } from "@webview-bridge/web";
2
- import { Subscription as t } from "rxjs";
2
+ import { Subscription as t, map as n, merge as r } from "rxjs";
3
3
  //#region src/web/index.ts
4
- var n = () => e({ onReady: async () => {} }), r = ({ bridge: e, createReader: n, containerElement: r }) => {
5
- let i;
6
- return e.addEventListener("load", (a) => {
7
- i?.subscription.unsubscribe(), i?.reader.destroy(), i = void 0;
8
- let o = n(a.manifest), s = new t();
9
- s.add(o.pagination.state$.subscribe((t) => {
10
- e.setPagination(t);
11
- })), s.add(o.context.subscribe(({ rootElement: t, ...n }) => {
12
- e.setContext(n);
13
- })), i = {
14
- reader: o,
15
- subscription: s
16
- }, o.mount(r);
4
+ var i = () => e({ onReady: async () => {} }), a = ({ bridge: e, createReader: i, containerElement: a }) => {
5
+ let o;
6
+ return e.addEventListener("load", ({ load: s, options: { manifest: c, cfi: l } }) => {
7
+ o?.subscription.unsubscribe(), o?.reader.destroy(), o = void 0;
8
+ let u = i({
9
+ manifest: c,
10
+ cfi: l
11
+ }), d = new t();
12
+ o = {
13
+ reader: u,
14
+ subscription: d
15
+ }, u.mount(a);
16
+ let f = r(u.pagination.state$.pipe(n((e) => ({ pagination: e }))), u.context.pipe(n(({ rootElement: e, ...t }) => ({ context: t }))), u.navigation.readingPosition$.pipe(n((e) => ({ readingPosition: e }))));
17
+ d.add(f.subscribe((t) => {
18
+ e.report(s, t);
19
+ }));
17
20
  }), e.addEventListener("turnRight", () => {
18
- i?.reader.navigation.turnRight();
21
+ o?.reader.navigation.turnRight();
19
22
  }), e.addEventListener("turnLeft", () => {
20
- i?.reader.navigation.turnLeft();
21
- }), { getReader: () => i?.reader };
23
+ o?.reader.navigation.turnLeft();
24
+ }), { getReader: () => o?.reader };
22
25
  };
23
26
  //#endregion
24
- export { r as bridgeReader, n as createReaderBridge };
27
+ export { a as bridgeReader, i as createReaderBridge };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@prose-reader/react-native",
3
- "version": "8.0.0",
3
+ "version": "9.0.0",
4
4
  "type": "module",
5
5
  "main": "./dist/native/index.cjs",
6
6
  "module": "./dist/native/index.js",
@@ -43,10 +43,10 @@
43
43
  "react-native-webview": "13.16.1"
44
44
  },
45
45
  "peerDependencies": {
46
- "@prose-reader/archive-reader": "^8.0.0",
47
- "@prose-reader/core": "^8.0.0",
48
- "@prose-reader/shared": "^8.0.0",
49
- "@prose-reader/streamer": "^8.0.0",
46
+ "@prose-reader/archive-reader": "^9.0.0",
47
+ "@prose-reader/core": "^9.0.0",
48
+ "@prose-reader/shared": "^9.0.0",
49
+ "@prose-reader/streamer": "^9.0.0",
50
50
  "@webview-bridge/react-native": "^1.7.7",
51
51
  "@webview-bridge/web": "^1.7.7",
52
52
  "expo-file-system": "^57.0.0",
@@ -54,5 +54,5 @@
54
54
  "react-native-webview": "*",
55
55
  "rxjs": "*"
56
56
  },
57
- "gitHead": "cfc670ec834d430705ef883f594462b46163f822"
57
+ "gitHead": "a6468f8544e71e5b7be80bcc5b657ec3a30da16c"
58
58
  }