@prose-reader/react-native 1.218.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.
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,12 @@
1
+ import { Streamer } from '@prose-reader/streamer';
2
+ export declare class ReactNativeStreamer extends Streamer {
3
+ fetchResourceAsData({ key, resourcePath, }: {
4
+ key: string;
5
+ resourcePath: string;
6
+ }): Promise<{
7
+ data: string;
8
+ headers: {
9
+ [k: string]: string;
10
+ };
11
+ }>;
12
+ }
@@ -0,0 +1,33 @@
1
+ import { useCreateReader } from './useCreateReader';
2
+ export declare const ReaderContext: import('react').Context<{
3
+ webviewBridge: {
4
+ postMessage: <EventName extends keyof import('.').ProsePostMessageSchema, Args extends EventName extends keyof import('.').ProsePostMessageSchema ? import('.').ProsePostMessageSchema[EventName]["validate"] extends (data: unknown) => unknown ? ReturnType<import('.').ProsePostMessageSchema[EventName]["validate"]> : import('@webview-bridge/types').Primitive | Record<string, import('@webview-bridge/types').Primitive> : never>(eventName: EventName, args: Args, options?: {
5
+ broadcast: boolean;
6
+ }) => void;
7
+ WebView: React.ForwardRefExoticComponent<import('react-native-webview/lib/WebViewTypes').IOSWebViewProps & import('react-native-webview/lib/WebViewTypes').AndroidWebViewProps & import('react-native-webview/lib/WebViewTypes').WindowsWebViewProps & React.RefAttributes<import('@webview-bridge/react-native').BridgeWebView>>;
8
+ linkWebMethod<T>(): {
9
+ current: import('@webview-bridge/react-native').WebMethod<T>;
10
+ };
11
+ };
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
+ appBridge: import('@webview-bridge/types').BridgeStore<import('.').BridgeState & import('.').BridgeMethods>;
14
+ load: (manifest: import('@prose-reader/shared').Manifest) => void;
15
+ } | null | undefined>;
16
+ export declare const useProseReaderContext: () => {
17
+ webviewBridge: {
18
+ postMessage: <EventName extends keyof import('.').ProsePostMessageSchema, Args extends EventName extends keyof import('.').ProsePostMessageSchema ? import('.').ProsePostMessageSchema[EventName]["validate"] extends (data: unknown) => unknown ? ReturnType<import('.').ProsePostMessageSchema[EventName]["validate"]> : import('@webview-bridge/types').Primitive | Record<string, import('@webview-bridge/types').Primitive> : never>(eventName: EventName, args: Args, options?: {
19
+ broadcast: boolean;
20
+ }) => void;
21
+ WebView: React.ForwardRefExoticComponent<import('react-native-webview/lib/WebViewTypes').IOSWebViewProps & import('react-native-webview/lib/WebViewTypes').AndroidWebViewProps & import('react-native-webview/lib/WebViewTypes').WindowsWebViewProps & React.RefAttributes<import('@webview-bridge/react-native').BridgeWebView>>;
22
+ linkWebMethod<T>(): {
23
+ current: import('@webview-bridge/react-native').WebMethod<T>;
24
+ };
25
+ };
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
+ appBridge: import('@webview-bridge/types').BridgeStore<import('.').BridgeState & import('.').BridgeMethods>;
28
+ load: (manifest: import('@prose-reader/shared').Manifest) => void;
29
+ };
30
+ export declare const ReaderProvider: ({ children, reader, }: {
31
+ children: React.ReactNode;
32
+ reader: ReturnType<typeof useCreateReader>;
33
+ }) => import("react").JSX.Element;
@@ -0,0 +1,6 @@
1
+ import { Archive } from '@prose-reader/streamer';
2
+ import { Directory } from 'expo-file-system/next';
3
+ export declare const createArchiveFromExpoFileSystemNext: (directory: Directory, { orderByAlpha, name }?: {
4
+ orderByAlpha?: boolean;
5
+ name?: string;
6
+ }) => Promise<Archive>;
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const c=require("@webview-bridge/react-native"),o=require("react"),g=require("../useLiveRef-Dg4CKqYn.cjs"),u=require("@prose-reader/streamer"),v=require("expo-file-system/next"),p=require("react/jsx-runtime"),b=t=>{const e=g.useLiveRef(t),[i]=o.useState(()=>c.bridge(({set:s})=>({pagination:void 0,setPagination:async a=>{s({pagination:a})},context:void 0,setContext:async a=>{s({context:a})},async getResource(a){return e.current.getResource(a)}})));return i},h=c.postMessageSchema({load:{validate:t=>t},turnRight:{validate:()=>{}},turnLeft:{validate:()=>{}}}),x=t=>{const[e,i]=o.useState(void 0),s=b(t),a=e==null?void 0:e.postMessage;o.useEffect(()=>{s&&i(c.createWebView({bridge:s,debug:!0,postMessageSchema:h}))},[s]);const d=o.useCallback(m=>{a==null||a("load",{manifest:m})},[a]);return e?{webviewBridge:e,ReaderWebView:e.WebView,appBridge:s,load:d}:null},y=async(t,{orderByAlpha:e,name:i}={})=>{let s=t.list();e&&(s=s.slice().sort((r,n)=>u.sortByTitleComparator(r.name,n.name)));const a=r=>r.list().reduce((n,l)=>l instanceof v.Directory?[...n,...a(l)]:[...n,l],[]),d=s.reduce((r,n)=>n instanceof v.Directory?[...r,...a(n)]:[...r,n],[]);return{filename:i||"",records:d.map(r=>r instanceof v.Directory?{dir:!0,basename:u.getUriBasename(r.name),uri:r.uri.replace("file://",""),blob:()=>Promise.resolve(new Blob),string:()=>Promise.resolve(""),size:0}:{dir:!1,basename:u.getUriBasename(r.name),uri:r.uri.replace("file://",""),blob:async()=>r.blob(),string:async()=>r.text(),size:r.bytes().length,encodingFormat:r.type??void 0}),close:()=>Promise.resolve()}},R=o.createContext(void 0),f=()=>{const t=o.useContext(R);if(!t)throw new Error("useProseReader must be used within a ProseReaderProvider");return t},P=({children:t,reader:e})=>p.jsx(R.Provider,{value:e,children:t}),S=()=>{const{webviewBridge:t}=f(),{postMessage:e}=t;return{turnRight:()=>{e("turnRight",void 0)},turnLeft:()=>{e("turnLeft",void 0)}}},w=t=>{const{appBridge:e}=f();return c.useBridge(e,t)};class B extends u.Streamer{async fetchResourceAsData({key:e,resourcePath:i}){const s=await super.fetchResource({key:e,resourcePath:i});return{data:await s.text(),headers:Object.fromEntries(s.headers.entries())}}}exports.useLiveRef=g.useLiveRef;exports.ReactNativeStreamer=B;exports.ReaderProvider=P;exports.createArchiveFromExpoFileSystemNext=y;exports.useCreateReader=x;exports.useReader=S;exports.useReaderState=w;
@@ -0,0 +1,7 @@
1
+ export { useCreateReader } from './useCreateReader';
2
+ export { createArchiveFromExpoFileSystemNext } from './createArchiveFromExpoFileSystemNext';
3
+ export * from '../shared';
4
+ export { ReaderProvider } from './ReaderProvider';
5
+ export { useReader } from './useReader';
6
+ export { useReaderState } from './useReaderState';
7
+ export * from './ReactNativeStreamer';
@@ -0,0 +1,130 @@
1
+ import { bridge as g, postMessageSchema as v, createWebView as b, useBridge as R } from "@webview-bridge/react-native";
2
+ import { useState as l, useEffect as h, useCallback as x, createContext as y, useContext as P } from "react";
3
+ import { u as w } from "../useLiveRef-CYh-YkID.js";
4
+ import { sortByTitleComparator as B, getUriBasename as m, Streamer as C } from "@prose-reader/streamer";
5
+ import { Directory as c } from "expo-file-system/next";
6
+ import { jsx as S } from "react/jsx-runtime";
7
+ const L = (t) => {
8
+ const e = w(t), [a] = l(
9
+ () => g(({ set: s }) => ({
10
+ pagination: void 0,
11
+ setPagination: async (n) => {
12
+ s({ pagination: n });
13
+ },
14
+ context: void 0,
15
+ setContext: async (n) => {
16
+ s({ context: n });
17
+ },
18
+ /**
19
+ * For a given spine item, provide the resource to the webview.
20
+ */
21
+ async getResource(n) {
22
+ return e.current.getResource(n);
23
+ }
24
+ }))
25
+ );
26
+ return a;
27
+ }, E = v({
28
+ load: {
29
+ validate: (t) => t
30
+ },
31
+ turnRight: {
32
+ validate: () => {
33
+ }
34
+ },
35
+ turnLeft: {
36
+ validate: () => {
37
+ }
38
+ }
39
+ }), A = (t) => {
40
+ const [e, a] = l(void 0), s = L(t), n = e == null ? void 0 : e.postMessage;
41
+ h(() => {
42
+ s && a(
43
+ b({
44
+ bridge: s,
45
+ debug: !0,
46
+ postMessageSchema: E
47
+ })
48
+ );
49
+ }, [s]);
50
+ const i = x(
51
+ (d) => {
52
+ n == null || n("load", { manifest: d });
53
+ },
54
+ [n]
55
+ );
56
+ return e ? {
57
+ webviewBridge: e,
58
+ ReaderWebView: e.WebView,
59
+ appBridge: s,
60
+ load: i
61
+ } : null;
62
+ }, D = async (t, { orderByAlpha: e, name: a } = {}) => {
63
+ let s = t.list();
64
+ e && (s = s.slice().sort((r, o) => B(r.name, o.name)));
65
+ const n = (r) => r.list().reduce((o, u) => u instanceof c ? [...o, ...n(u)] : [...o, u], []), i = s.reduce((r, o) => o instanceof c ? [...r, ...n(o)] : [...r, o], []);
66
+ return {
67
+ filename: a || "",
68
+ records: i.map((r) => r instanceof c ? {
69
+ dir: !0,
70
+ basename: m(r.name),
71
+ uri: r.uri.replace("file://", ""),
72
+ // @todo fix prose-reader
73
+ blob: () => Promise.resolve(new Blob()),
74
+ string: () => Promise.resolve(""),
75
+ size: 0
76
+ } : {
77
+ dir: !1,
78
+ basename: m(r.name),
79
+ uri: r.uri.replace("file://", ""),
80
+ // @todo fix prose-reader
81
+ blob: async () => r.blob(),
82
+ string: async () => r.text(),
83
+ size: r.bytes().length,
84
+ encodingFormat: r.type ?? void 0
85
+ }),
86
+ close: () => Promise.resolve()
87
+ };
88
+ }, f = y(void 0), p = () => {
89
+ const t = P(f);
90
+ if (!t)
91
+ throw new Error("useProseReader must be used within a ProseReaderProvider");
92
+ return t;
93
+ }, N = ({
94
+ children: t,
95
+ reader: e
96
+ }) => /* @__PURE__ */ S(f.Provider, { value: e, children: t }), O = () => {
97
+ const { webviewBridge: t } = p(), { postMessage: e } = t;
98
+ return {
99
+ turnRight: () => {
100
+ e("turnRight", void 0);
101
+ },
102
+ turnLeft: () => {
103
+ e("turnLeft", void 0);
104
+ }
105
+ };
106
+ }, k = (t) => {
107
+ const { appBridge: e } = p();
108
+ return R(e, t);
109
+ };
110
+ class T extends C {
111
+ async fetchResourceAsData({
112
+ key: e,
113
+ resourcePath: a
114
+ }) {
115
+ const s = await super.fetchResource({ key: e, resourcePath: a });
116
+ return {
117
+ data: await s.text(),
118
+ headers: Object.fromEntries(s.headers.entries())
119
+ };
120
+ }
121
+ }
122
+ export {
123
+ T as ReactNativeStreamer,
124
+ N as ReaderProvider,
125
+ D as createArchiveFromExpoFileSystemNext,
126
+ A as useCreateReader,
127
+ w as useLiveRef,
128
+ O as useReader,
129
+ k as useReaderState
130
+ };
@@ -0,0 +1,17 @@
1
+ import { Manifest } from '@prose-reader/streamer';
2
+ import { BridgeMethods, ProsePostMessageSchema } from '../shared';
3
+ export declare const appPostMessageSchema: ProsePostMessageSchema;
4
+ export declare const useCreateReader: (options: BridgeMethods) => {
5
+ webviewBridge: {
6
+ postMessage: <EventName extends keyof ProsePostMessageSchema, Args extends EventName extends keyof ProsePostMessageSchema ? ProsePostMessageSchema[EventName]["validate"] extends (data: unknown) => unknown ? ReturnType<ProsePostMessageSchema[EventName]["validate"]> : import('@webview-bridge/types').Primitive | Record<string, import('@webview-bridge/types').Primitive> : never>(eventName: EventName, args: Args, options?: {
7
+ broadcast: boolean;
8
+ }) => void;
9
+ WebView: React.ForwardRefExoticComponent<import('react-native-webview/lib/WebViewTypes').IOSWebViewProps & import('react-native-webview/lib/WebViewTypes').AndroidWebViewProps & import('react-native-webview/lib/WebViewTypes').WindowsWebViewProps & React.RefAttributes<import('@webview-bridge/react-native').BridgeWebView>>;
10
+ linkWebMethod<T>(): {
11
+ current: import('@webview-bridge/react-native').WebMethod<T>;
12
+ };
13
+ };
14
+ 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
+ appBridge: import('@webview-bridge/types').BridgeStore<import('.').BridgeState & BridgeMethods>;
16
+ load: (manifest: Manifest) => void;
17
+ } | null;
@@ -0,0 +1,2 @@
1
+ import { BridgeMethods, BridgeState } from '../shared';
2
+ export declare const useProseBridge: (options: BridgeMethods) => import('@webview-bridge/types').BridgeStore<BridgeState & BridgeMethods>;
@@ -0,0 +1,4 @@
1
+ export declare const useReader: () => {
2
+ turnRight: () => void;
3
+ turnLeft: () => void;
4
+ };
@@ -0,0 +1,2 @@
1
+ import { BridgeState } from '../shared';
2
+ export declare const useReaderState: <T = BridgeState>(selector: (state: BridgeState) => T) => T;
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("../useLiveRef-Dg4CKqYn.cjs");exports.useLiveRef=e.useLiveRef;
@@ -0,0 +1,32 @@
1
+ import { ContextState, Manifest, PaginationState, createReader } from '@prose-reader/core';
2
+ import { Bridge, BridgeStore } from '@webview-bridge/react-native';
3
+ type ReaderOptions = Parameters<typeof createReader>[0];
4
+ type RnPaginationState = Omit<PaginationState, "navigationId">;
5
+ type RnContextState = Omit<ContextState, "containerElement" | "rootElement">;
6
+ export interface BridgeState extends Bridge {
7
+ pagination: RnPaginationState | undefined;
8
+ setPagination: (pagination: RnPaginationState) => Promise<void>;
9
+ context: RnContextState | undefined;
10
+ setContext: (context: RnContextState) => Promise<void>;
11
+ }
12
+ export type BridgeMethods = {
13
+ getResource: (resource: Parameters<NonNullable<ReaderOptions["getResource"]>>[0]) => Promise<{
14
+ data: string;
15
+ headers?: Record<string, string>;
16
+ }>;
17
+ };
18
+ export type ProseBridgeStore = BridgeStore<BridgeMethods & BridgeState>;
19
+ export type ProsePostMessageSchema = {
20
+ load: {
21
+ validate: (data: unknown) => {
22
+ manifest: Manifest;
23
+ };
24
+ };
25
+ turnRight: {
26
+ validate: () => void;
27
+ };
28
+ turnLeft: {
29
+ validate: () => void;
30
+ };
31
+ };
32
+ export { useLiveRef } from './useLiveRef';
@@ -0,0 +1,4 @@
1
+ import { u as o } from "../useLiveRef-CYh-YkID.js";
2
+ export {
3
+ o as useLiveRef
4
+ };
@@ -0,0 +1 @@
1
+ export declare const useLiveRef: <T>(value: T) => import('react').RefObject<T>;
@@ -0,0 +1,10 @@
1
+ import { useRef as t, useEffect as f } from "react";
2
+ const o = (e) => {
3
+ const r = t(e);
4
+ return f(() => {
5
+ r.current = e;
6
+ }, [e]), r;
7
+ };
8
+ export {
9
+ o as u
10
+ };
@@ -0,0 +1 @@
1
+ "use strict";const s=require("react"),t=e=>{const r=s.useRef(e);return s.useEffect(()=>{r.current=e},[e]),r};exports.useLiveRef=t;
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const o=require("@webview-bridge/web"),r=()=>o.linkBridge({onReady:async()=>{}}),s=({bridge:t,reader:e,containerElement:i})=>(t.addEventListener("load",n=>{e.load({containerElement:i,manifest:n.manifest})}),t.addEventListener("turnRight",()=>{e.navigation.turnRight()}),t.addEventListener("turnLeft",()=>{e.navigation.turnLeft()}),e.pagination.state$.subscribe(n=>{t.setPagination(n)}),e.context.state$.subscribe(({containerElement:n,rootElement:c,...a})=>{t.setContext(a)}),e);exports.bridgeReader=s;exports.createReaderBridge=r;
@@ -0,0 +1,10 @@
1
+ import { createReader as createReaderCore } from '@prose-reader/core';
2
+ import { ProseBridgeStore, ProsePostMessageSchema } from '../shared';
3
+ type Reader = ReturnType<typeof createReaderCore>;
4
+ export declare const createReaderBridge: () => import('@webview-bridge/web').LinkBridge<import('@webview-bridge/types').ExcludePrimitive<import('../shared').BridgeMethods & import('../shared').BridgeState>, Omit<ProseBridgeStore, "setState">, ProsePostMessageSchema>;
5
+ export declare const bridgeReader: ({ bridge, reader, containerElement, }: {
6
+ reader: Reader;
7
+ bridge: ReturnType<typeof createReaderBridge>;
8
+ containerElement: HTMLElement;
9
+ }) => Reader;
10
+ export {};
@@ -0,0 +1,28 @@
1
+ import { linkBridge as o } from "@webview-bridge/web";
2
+ const c = () => o({
3
+ onReady: async () => {
4
+ }
5
+ }), u = ({
6
+ bridge: t,
7
+ reader: n,
8
+ containerElement: i
9
+ }) => (t.addEventListener("load", (e) => {
10
+ n.load({
11
+ containerElement: i,
12
+ manifest: e.manifest
13
+ });
14
+ }), t.addEventListener("turnRight", () => {
15
+ n.navigation.turnRight();
16
+ }), t.addEventListener("turnLeft", () => {
17
+ n.navigation.turnLeft();
18
+ }), n.pagination.state$.subscribe((e) => {
19
+ t.setPagination(e);
20
+ }), n.context.state$.subscribe(
21
+ ({ containerElement: e, rootElement: s, ...a }) => {
22
+ t.setContext(a);
23
+ }
24
+ ), n);
25
+ export {
26
+ u as bridgeReader,
27
+ c as createReaderBridge
28
+ };
package/package.json ADDED
@@ -0,0 +1,45 @@
1
+ {
2
+ "name": "@prose-reader/react-native",
3
+ "version": "1.218.0",
4
+ "type": "module",
5
+ "main": "./dist/native/index.cjs.js",
6
+ "module": "./dist/native/index.es.js",
7
+ "react-native": "./dist/native/index.cjs.js",
8
+ "exports": {
9
+ ".": {
10
+ "import": "./dist/native/index.es.js",
11
+ "require": "./dist/native/index.cjs.js",
12
+ "types": "./dist/native/index.d.ts"
13
+ },
14
+ "./web": {
15
+ "import": "./dist/web/index.es.js",
16
+ "require": "./dist/web/index.cjs.js",
17
+ "types": "./dist/web/index.d.ts"
18
+ },
19
+ "./shared": {
20
+ "import": "./dist/shared/index.es.js",
21
+ "require": "./dist/shared/index.cjs.js",
22
+ "types": "./dist/shared/index.d.ts"
23
+ }
24
+ },
25
+ "license": "MIT",
26
+ "files": ["/dist"],
27
+ "scripts": {
28
+ "start": "vite build --watch --mode development",
29
+ "build": "vite build",
30
+ "test": "vitest run --coverage"
31
+ },
32
+ "devDependencies": {
33
+ "@webview-bridge/react-native": "^1.7.7"
34
+ },
35
+ "peerDependencies": {
36
+ "@prose-reader/core": "^1.215.0",
37
+ "@prose-reader/shared": "^1.215.0",
38
+ "@prose-reader/streamer": "^1.215.0",
39
+ "@webview-bridge/react-native": "^1.7.7",
40
+ "@webview-bridge/web": "^1.7.7",
41
+ "expo-file-system": "^18.1.10",
42
+ "react": "19.x",
43
+ "rxjs": "*"
44
+ }
45
+ }