@june24/expo-pdf-reader 0.1.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,85 @@
1
+ import { ViewProps, StyleProp, ViewStyle } from 'react-native';
2
+ export type AnnotationTool = 'none' | 'pen' | 'highlighter' | 'text' | 'note' | 'eraser';
3
+ export type DisplayMode = 'single' | 'continuous' | 'twoUp' | 'twoUpContinuous';
4
+ export type Point = {
5
+ x: number;
6
+ y: number;
7
+ };
8
+ export type Annotation = {
9
+ type: 'pen' | 'highlighter' | 'text';
10
+ color: string;
11
+ page?: number;
12
+ points?: Point[][];
13
+ width?: number;
14
+ text?: string;
15
+ fontSize?: number;
16
+ x?: number;
17
+ y?: number;
18
+ };
19
+ export type AnnotationChangeEvent = {
20
+ nativeEvent: {
21
+ annotations: Annotation[];
22
+ };
23
+ };
24
+ export type PageChangeEvent = {
25
+ nativeEvent: {
26
+ page: number;
27
+ total: number;
28
+ };
29
+ };
30
+ export type ScrollEvent = {
31
+ nativeEvent: {
32
+ x: number;
33
+ y: number;
34
+ contentWidth: number;
35
+ contentHeight: number;
36
+ layoutWidth: number;
37
+ layoutHeight: number;
38
+ };
39
+ };
40
+ export type SearchResult = {
41
+ page: number;
42
+ x: number;
43
+ y: number;
44
+ width: number;
45
+ height: number;
46
+ textSnippet?: string;
47
+ };
48
+ export type AnnotationOptions = {
49
+ tool?: AnnotationTool;
50
+ color?: string;
51
+ fontSize?: number;
52
+ text?: string;
53
+ strokeWidth?: number;
54
+ };
55
+ export type ExpoPdfReaderViewProps = ViewProps & {
56
+ url: string;
57
+ style?: StyleProp<ViewStyle>;
58
+ displayMode?: DisplayMode;
59
+ initialPage?: number;
60
+ minZoom?: number;
61
+ maxZoom?: number;
62
+ annotationOptions?: AnnotationOptions;
63
+ initialAnnotations?: Annotation[];
64
+ onAnnotationChange?: (event: AnnotationChangeEvent) => void;
65
+ onPageChange?: (event: PageChangeEvent) => void;
66
+ onScroll?: (event: ScrollEvent) => void;
67
+ };
68
+ export type NativeExpoPdfReaderViewProps = ViewProps & {
69
+ url: string;
70
+ style?: StyleProp<ViewStyle>;
71
+ displayMode?: DisplayMode;
72
+ initialPage?: number;
73
+ minZoom?: number;
74
+ maxZoom?: number;
75
+ annotationTool?: AnnotationTool;
76
+ annotationColor?: string;
77
+ annotationFontSize?: number;
78
+ annotationText?: string;
79
+ annotationStrokeWidth?: number;
80
+ initialAnnotations?: Annotation[];
81
+ onAnnotationChange?: (event: AnnotationChangeEvent) => void;
82
+ onPageChange?: (event: PageChangeEvent) => void;
83
+ onScroll?: (event: ScrollEvent) => void;
84
+ };
85
+ //# sourceMappingURL=ExpoPdfReader.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExpoPdfReader.types.d.ts","sourceRoot":"","sources":["../src/ExpoPdfReader.types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ExpoPdfReader.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExpoPdfReader.types.js","sourceRoot":"","sources":["../src/ExpoPdfReader.types.ts"],"names":[],"mappings":"","sourcesContent":["import { ViewProps, StyleProp, ViewStyle } from 'react-native';\n\nexport type AnnotationTool = 'none' | 'pen' | 'highlighter' | 'text' | 'note' | 'eraser';\n\nexport type DisplayMode = 'single' | 'continuous' | 'twoUp' | 'twoUpContinuous';\n\nexport type Point = { x: number; y: number };\n\nexport type Annotation = {\n type: 'pen' | 'highlighter' | 'text';\n color: string;\n page?: number;\n points?: Point[][]; // For pen/highlighter\n width?: number; // Stroke width or font size for text? Let's use fontSize for text explicitly\n text?: string; // For text\n fontSize?: number; // For text\n x?: number; // For text\n y?: number; // For text\n};\n\nexport type AnnotationChangeEvent = {\n nativeEvent: {\n annotations: Annotation[];\n };\n};\n\nexport type PageChangeEvent = {\n nativeEvent: {\n page: number;\n total: number;\n };\n};\n\nexport type ScrollEvent = {\n nativeEvent: {\n x: number;\n y: number;\n contentWidth: number;\n contentHeight: number;\n layoutWidth: number;\n layoutHeight: number;\n };\n};\n\nexport type SearchResult = {\n page: number;\n x: number;\n y: number;\n width: number;\n height: number;\n textSnippet?: string;\n};\n\n// Public API: group drawing configuration into a single object\nexport type AnnotationOptions = {\n tool?: AnnotationTool;\n color?: string; // Hex color\n fontSize?: number;\n text?: string;\n strokeWidth?: number; // line thickness for pen/highlighter\n};\n\n// Props exposed to JS users of the component\nexport type ExpoPdfReaderViewProps = ViewProps & {\n url: string;\n style?: StyleProp<ViewStyle>;\n displayMode?: DisplayMode; // 'single' | 'continuous' | 'twoUp' | 'twoUpContinuous'\n initialPage?: number; // starting page index (0-based)\n minZoom?: number;\n maxZoom?: number;\n annotationOptions?: AnnotationOptions;\n initialAnnotations?: Annotation[];\n onAnnotationChange?: (event: AnnotationChangeEvent) => void;\n onPageChange?: (event: PageChangeEvent) => void;\n onScroll?: (event: ScrollEvent) => void;\n};\n\n// Internal props that the native view actually receives.\n// This keeps backwards-compat with the native module while giving\n// JS a cleaner grouped API via `annotationOptions`.\nexport type NativeExpoPdfReaderViewProps = ViewProps & {\n url: string;\n style?: StyleProp<ViewStyle>;\n displayMode?: DisplayMode;\n initialPage?: number;\n minZoom?: number;\n maxZoom?: number;\n annotationTool?: AnnotationTool;\n annotationColor?: string; // Hex color\n annotationFontSize?: number;\n annotationText?: string; // Default text to place\n // Native-only props derived from AnnotationOptions\n annotationStrokeWidth?: number;\n initialAnnotations?: Annotation[];\n onAnnotationChange?: (event: AnnotationChangeEvent) => void;\n onPageChange?: (event: PageChangeEvent) => void;\n onScroll?: (event: ScrollEvent) => void;\n};\n\n"]}
@@ -0,0 +1,28 @@
1
+ import * as React from 'react';
2
+ import { Annotation, SearchResult } from './ExpoPdfReader.types';
3
+ export type ExpoPdfReaderRef = {
4
+ save: () => Promise<string>;
5
+ getAnnotations: () => Promise<Annotation[]>;
6
+ searchText: (text: string) => Promise<SearchResult[]>;
7
+ goToPage: (page: number) => Promise<void>;
8
+ undo: () => Promise<boolean>;
9
+ redo: () => Promise<boolean>;
10
+ zoomIn: () => Promise<boolean>;
11
+ zoomOut: () => Promise<boolean>;
12
+ renderThumbnail: (page: number, width: number) => Promise<string>;
13
+ };
14
+ declare const ExpoPdfReaderView: React.ForwardRefExoticComponent<import("react-native").ViewProps & {
15
+ url: string;
16
+ style?: import("react-native").StyleProp<import("react-native").ViewStyle>;
17
+ displayMode?: import("./ExpoPdfReader.types").DisplayMode;
18
+ initialPage?: number;
19
+ minZoom?: number;
20
+ maxZoom?: number;
21
+ annotationOptions?: import("./ExpoPdfReader.types").AnnotationOptions;
22
+ initialAnnotations?: Annotation[];
23
+ onAnnotationChange?: (event: import("./ExpoPdfReader.types").AnnotationChangeEvent) => void;
24
+ onPageChange?: (event: import("./ExpoPdfReader.types").PageChangeEvent) => void;
25
+ onScroll?: (event: import("./ExpoPdfReader.types").ScrollEvent) => void;
26
+ } & React.RefAttributes<ExpoPdfReaderRef>>;
27
+ export default ExpoPdfReaderView;
28
+ //# sourceMappingURL=ExpoPdfReaderView.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExpoPdfReaderView.d.ts","sourceRoot":"","sources":["../src/ExpoPdfReaderView.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,OAAO,EAGL,UAAU,EACV,YAAY,EACb,MAAM,uBAAuB,CAAC;AAQ/B,MAAM,MAAM,gBAAgB,GAAG;IAC7B,IAAI,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5B,cAAc,EAAE,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IAC5C,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IACtD,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1C,IAAI,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7B,IAAI,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7B,MAAM,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/B,OAAO,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IAChC,eAAe,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CACnE,CAAC;AAEF,QAAA,MAAM,iBAAiB;;;;;;;;;;;;0CAwGtB,CAAC;AAEF,eAAe,iBAAiB,CAAC"}
@@ -0,0 +1,107 @@
1
+ import { requireNativeModule } from 'expo-modules-core';
2
+ import { requireNativeViewManager } from 'expo-modules-core';
3
+ import * as React from 'react';
4
+ import { findNodeHandle } from 'react-native';
5
+ const NativeView = requireNativeViewManager('ExpoPdfReader');
6
+ const NativeModule = requireNativeModule('ExpoPdfReader');
7
+ const ExpoPdfReaderView = React.forwardRef((props, ref) => {
8
+ const nativeRef = React.useRef(null);
9
+ React.useImperativeHandle(ref, () => ({
10
+ save: async () => {
11
+ if (nativeRef.current) {
12
+ const viewTag = findNodeHandle(nativeRef.current);
13
+ if (viewTag && NativeModule && NativeModule.save) {
14
+ return await NativeModule.save(viewTag);
15
+ }
16
+ }
17
+ throw new Error('Cannot save: Native view not found');
18
+ },
19
+ getAnnotations: async () => {
20
+ if (nativeRef.current) {
21
+ const viewTag = findNodeHandle(nativeRef.current);
22
+ if (viewTag && NativeModule && NativeModule.getAnnotations) {
23
+ return await NativeModule.getAnnotations(viewTag);
24
+ }
25
+ }
26
+ return [];
27
+ },
28
+ searchText: async (text) => {
29
+ if (nativeRef.current) {
30
+ const viewTag = findNodeHandle(nativeRef.current);
31
+ if (viewTag && NativeModule && NativeModule.searchText) {
32
+ return await NativeModule.searchText(viewTag, text);
33
+ }
34
+ }
35
+ return [];
36
+ },
37
+ goToPage: async (page) => {
38
+ if (nativeRef.current) {
39
+ const viewTag = findNodeHandle(nativeRef.current);
40
+ if (viewTag && NativeModule && NativeModule.goToPage) {
41
+ return await NativeModule.goToPage(viewTag, page);
42
+ }
43
+ }
44
+ },
45
+ undo: async () => {
46
+ if (nativeRef.current) {
47
+ const viewTag = findNodeHandle(nativeRef.current);
48
+ if (viewTag && NativeModule && NativeModule.undo) {
49
+ return await NativeModule.undo(viewTag);
50
+ }
51
+ }
52
+ return false;
53
+ },
54
+ redo: async () => {
55
+ if (nativeRef.current) {
56
+ const viewTag = findNodeHandle(nativeRef.current);
57
+ if (viewTag && NativeModule && NativeModule.redo) {
58
+ return await NativeModule.redo(viewTag);
59
+ }
60
+ }
61
+ return false;
62
+ },
63
+ zoomIn: async () => {
64
+ if (nativeRef.current) {
65
+ const viewTag = findNodeHandle(nativeRef.current);
66
+ if (viewTag && NativeModule && NativeModule.zoomIn) {
67
+ return await NativeModule.zoomIn(viewTag);
68
+ }
69
+ }
70
+ return false;
71
+ },
72
+ zoomOut: async () => {
73
+ if (nativeRef.current) {
74
+ const viewTag = findNodeHandle(nativeRef.current);
75
+ if (viewTag && NativeModule && NativeModule.zoomOut) {
76
+ return await NativeModule.zoomOut(viewTag);
77
+ }
78
+ }
79
+ return false;
80
+ },
81
+ renderThumbnail: async (page, width) => {
82
+ if (nativeRef.current) {
83
+ const viewTag = findNodeHandle(nativeRef.current);
84
+ if (viewTag && NativeModule && NativeModule.renderThumbnail) {
85
+ return await NativeModule.renderThumbnail(viewTag, page, width);
86
+ }
87
+ }
88
+ return '';
89
+ },
90
+ }));
91
+ const { annotationOptions, ...restProps } = props;
92
+ const nativeProps = {
93
+ ...restProps,
94
+ displayMode: props.displayMode,
95
+ initialPage: props.initialPage,
96
+ minZoom: props.minZoom,
97
+ maxZoom: props.maxZoom,
98
+ annotationTool: annotationOptions?.tool,
99
+ annotationColor: annotationOptions?.color,
100
+ annotationFontSize: annotationOptions?.fontSize,
101
+ annotationText: annotationOptions?.text,
102
+ annotationStrokeWidth: annotationOptions?.strokeWidth,
103
+ };
104
+ return <NativeView ref={nativeRef} {...nativeProps}/>;
105
+ });
106
+ export default ExpoPdfReaderView;
107
+ //# sourceMappingURL=ExpoPdfReaderView.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExpoPdfReaderView.js","sourceRoot":"","sources":["../src/ExpoPdfReaderView.tsx"],"names":[],"mappings":"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","sourcesContent":["import { requireNativeModule } from 'expo-modules-core';\nimport { requireNativeViewManager } from 'expo-modules-core';\nimport * as React from 'react';\nimport { findNodeHandle } from 'react-native';\n\nimport {\n ExpoPdfReaderViewProps,\n NativeExpoPdfReaderViewProps,\n Annotation,\n SearchResult,\n} from './ExpoPdfReader.types';\n\nconst NativeView: React.ComponentType<\n NativeExpoPdfReaderViewProps & { ref?: React.Ref<any> }\n> = requireNativeViewManager('ExpoPdfReader');\n\nconst NativeModule = requireNativeModule('ExpoPdfReader');\n\nexport type ExpoPdfReaderRef = {\n save: () => Promise<string>;\n getAnnotations: () => Promise<Annotation[]>;\n searchText: (text: string) => Promise<SearchResult[]>;\n goToPage: (page: number) => Promise<void>;\n undo: () => Promise<boolean>;\n redo: () => Promise<boolean>;\n zoomIn: () => Promise<boolean>;\n zoomOut: () => Promise<boolean>;\n renderThumbnail: (page: number, width: number) => Promise<string>;\n};\n\nconst ExpoPdfReaderView = React.forwardRef<ExpoPdfReaderRef, ExpoPdfReaderViewProps>(\n (props, ref) => {\n const nativeRef = React.useRef<any>(null);\n\n React.useImperativeHandle(ref, () => ({\n save: async () => {\n if (nativeRef.current) {\n const viewTag = findNodeHandle(nativeRef.current);\n if (viewTag && NativeModule && NativeModule.save) {\n return await NativeModule.save(viewTag);\n }\n }\n throw new Error('Cannot save: Native view not found');\n },\n getAnnotations: async () => {\n if (nativeRef.current) {\n const viewTag = findNodeHandle(nativeRef.current);\n if (viewTag && NativeModule && NativeModule.getAnnotations) {\n return await NativeModule.getAnnotations(viewTag);\n }\n }\n return [];\n },\n searchText: async (text: string) => {\n if (nativeRef.current) {\n const viewTag = findNodeHandle(nativeRef.current);\n if (viewTag && NativeModule && NativeModule.searchText) {\n return await NativeModule.searchText(viewTag, text);\n }\n }\n return [];\n },\n goToPage: async (page: number) => {\n if (nativeRef.current) {\n const viewTag = findNodeHandle(nativeRef.current);\n if (viewTag && NativeModule && NativeModule.goToPage) {\n return await NativeModule.goToPage(viewTag, page);\n }\n }\n },\n undo: async () => {\n if (nativeRef.current) {\n const viewTag = findNodeHandle(nativeRef.current);\n if (viewTag && NativeModule && NativeModule.undo) {\n return await NativeModule.undo(viewTag);\n }\n }\n return false;\n },\n redo: async () => {\n if (nativeRef.current) {\n const viewTag = findNodeHandle(nativeRef.current);\n if (viewTag && NativeModule && NativeModule.redo) {\n return await NativeModule.redo(viewTag);\n }\n }\n return false;\n },\n zoomIn: async () => {\n if (nativeRef.current) {\n const viewTag = findNodeHandle(nativeRef.current);\n if (viewTag && NativeModule && NativeModule.zoomIn) {\n return await NativeModule.zoomIn(viewTag);\n }\n }\n return false;\n },\n zoomOut: async () => {\n if (nativeRef.current) {\n const viewTag = findNodeHandle(nativeRef.current);\n if (viewTag && NativeModule && NativeModule.zoomOut) {\n return await NativeModule.zoomOut(viewTag);\n }\n }\n return false;\n },\n renderThumbnail: async (page: number, width: number) => {\n if (nativeRef.current) {\n const viewTag = findNodeHandle(nativeRef.current);\n if (viewTag && NativeModule && NativeModule.renderThumbnail) {\n return await NativeModule.renderThumbnail(viewTag, page, width);\n }\n }\n return '';\n },\n }));\n\n const { annotationOptions, ...restProps } = props;\n\n const nativeProps: NativeExpoPdfReaderViewProps = {\n ...(restProps as NativeExpoPdfReaderViewProps),\n displayMode: props.displayMode,\n initialPage: props.initialPage,\n minZoom: props.minZoom,\n maxZoom: props.maxZoom,\n annotationTool: annotationOptions?.tool,\n annotationColor: annotationOptions?.color,\n annotationFontSize: annotationOptions?.fontSize,\n annotationText: annotationOptions?.text,\n annotationStrokeWidth: annotationOptions?.strokeWidth,\n };\n\n return <NativeView ref={nativeRef} {...nativeProps} />;\n }\n);\n\nexport default ExpoPdfReaderView;\n"]}
@@ -0,0 +1,4 @@
1
+ import ExpoPdfReaderView from './ExpoPdfReaderView';
2
+ import { ExpoPdfReaderViewProps } from './ExpoPdfReader.types';
3
+ export { ExpoPdfReaderView, ExpoPdfReaderViewProps };
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,iBAAiB,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAE/D,OAAO,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,CAAC"}
package/build/index.js ADDED
@@ -0,0 +1,3 @@
1
+ import ExpoPdfReaderView from './ExpoPdfReaderView';
2
+ export { ExpoPdfReaderView };
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,iBAAiB,MAAM,qBAAqB,CAAC;AAGpD,OAAO,EAAE,iBAAiB,EAA0B,CAAC","sourcesContent":["import ExpoPdfReaderView from './ExpoPdfReaderView';\nimport { ExpoPdfReaderViewProps } from './ExpoPdfReader.types';\n\nexport { ExpoPdfReaderView, ExpoPdfReaderViewProps };\n"]}
@@ -0,0 +1,16 @@
1
+ {
2
+ "platforms": [
3
+ "ios",
4
+ "android"
5
+ ],
6
+ "ios": {
7
+ "modules": [
8
+ "ExpoPdfReaderModule"
9
+ ]
10
+ },
11
+ "android": {
12
+ "modules": [
13
+ "expo.modules.pdfreader.ExpoPdfReaderModule"
14
+ ]
15
+ }
16
+ }
@@ -0,0 +1,27 @@
1
+ require 'json'
2
+
3
+ package = JSON.parse(File.read(File.join(__dir__, '..', 'package.json')))
4
+
5
+ Pod::Spec.new do |s|
6
+ s.name = 'ExpoPdfReader'
7
+ s.version = package['version']
8
+ s.summary = package['description']
9
+ s.description = package['description']
10
+ s.license = package['license']
11
+ s.author = package['author']
12
+ s.homepage = package['homepage']
13
+ s.platform = :ios, '13.0'
14
+ s.swift_version = '5.4'
15
+ s.source = { git: 'https://github.com/user/expo-pdf-reader' }
16
+ s.static_framework = true
17
+
18
+ s.dependency 'ExpoModulesCore'
19
+
20
+ # Swift/Objective-C compatibility
21
+ s.pod_target_xcconfig = {
22
+ 'DEFINES_MODULE' => 'YES',
23
+ 'SWIFT_COMPILATION_MODE' => 'wholemodule'
24
+ }
25
+
26
+ s.source_files = "**/*.{h,m,swift}"
27
+ end
@@ -0,0 +1,170 @@
1
+ import ExpoModulesCore
2
+
3
+ public class ExpoPdfReaderModule: Module {
4
+ public func definition() -> ModuleDefinition {
5
+ Name("ExpoPdfReader")
6
+
7
+ View(ExpoPdfReaderView.self) {
8
+ Events("onAnnotationChange", "onPageChange", "onScroll")
9
+
10
+ Prop("url") { (view: ExpoPdfReaderView, url: URL) in
11
+ view.load(url: url)
12
+ }
13
+
14
+ Prop("displayMode") { (view: ExpoPdfReaderView, mode: String) in
15
+ view.setDisplayMode(mode)
16
+ }
17
+
18
+ Prop("initialPage") { (view: ExpoPdfReaderView, page: Int) in
19
+ view.setInitialPage(page)
20
+ }
21
+
22
+ Prop("minZoom") { (view: ExpoPdfReaderView, value: Double) in
23
+ view.setMinZoom(value)
24
+ }
25
+
26
+ Prop("maxZoom") { (view: ExpoPdfReaderView, value: Double) in
27
+ view.setMaxZoom(value)
28
+ }
29
+
30
+ Prop("annotationTool") { (view: ExpoPdfReaderView, tool: String) in
31
+ view.setAnnotationTool(tool)
32
+ }
33
+
34
+ Prop("annotationColor") { (view: ExpoPdfReaderView, color: String?) in
35
+ view.setAnnotationColor(color)
36
+ }
37
+
38
+ Prop("annotationFontSize") { (view: ExpoPdfReaderView, size: Double) in
39
+ view.setAnnotationFontSize(size)
40
+ }
41
+
42
+ Prop("annotationText") { (view: ExpoPdfReaderView, text: String) in
43
+ view.setAnnotationText(text)
44
+ }
45
+
46
+ Prop("annotationStrokeWidth") { (view: ExpoPdfReaderView, width: Double) in
47
+ view.setAnnotationStrokeWidth(width)
48
+ }
49
+
50
+ Prop("initialAnnotations") { (view: ExpoPdfReaderView, annotations: [[String: Any]]) in
51
+ view.setAnnotations(annotations)
52
+ }
53
+ }
54
+
55
+ AsyncFunction("save") { (viewTag: Int, promise: Promise) in
56
+ DispatchQueue.main.async {
57
+ guard let view = self.appContext?.findView(withTag: viewTag, ofType: ExpoPdfReaderView.self) else {
58
+ promise.reject("ERR_VIEW_NOT_FOUND", "Could not find view with tag \(viewTag)")
59
+ return
60
+ }
61
+
62
+ do {
63
+ let path = try view.savePdf()
64
+ promise.resolve(path)
65
+ } catch {
66
+ promise.reject("ERR_SAVE_FAILED", "Failed to save PDF: \(error.localizedDescription)")
67
+ }
68
+ }
69
+ }
70
+
71
+ AsyncFunction("getAnnotations") { (viewTag: Int, promise: Promise) in
72
+ DispatchQueue.main.async {
73
+ guard let view = self.appContext?.findView(withTag: viewTag, ofType: ExpoPdfReaderView.self) else {
74
+ promise.reject("ERR_VIEW_NOT_FOUND", "Could not find view with tag \(viewTag)")
75
+ return
76
+ }
77
+
78
+ promise.resolve(view.getAnnotations())
79
+ }
80
+ }
81
+
82
+ AsyncFunction("searchText") { (viewTag: Int, text: String, promise: Promise) in
83
+ DispatchQueue.main.async {
84
+ guard let view = self.appContext?.findView(withTag: viewTag, ofType: ExpoPdfReaderView.self) else {
85
+ promise.reject("ERR_VIEW_NOT_FOUND", "Could not find view with tag \(viewTag)")
86
+ return
87
+ }
88
+
89
+ let results = view.searchText(text)
90
+ promise.resolve(results)
91
+ }
92
+ }
93
+
94
+ AsyncFunction("goToPage") { (viewTag: Int, page: Int, promise: Promise) in
95
+ DispatchQueue.main.async {
96
+ guard let view = self.appContext?.findView(withTag: viewTag, ofType: ExpoPdfReaderView.self) else {
97
+ promise.reject("ERR_VIEW_NOT_FOUND", "Could not find view with tag \(viewTag)")
98
+ return
99
+ }
100
+
101
+ view.goToPage(page)
102
+ promise.resolve(nil)
103
+ }
104
+ }
105
+
106
+ AsyncFunction("undo") { (viewTag: Int, promise: Promise) in
107
+ DispatchQueue.main.async {
108
+ guard let view = self.appContext?.findView(withTag: viewTag, ofType: ExpoPdfReaderView.self) else {
109
+ promise.reject("ERR_VIEW_NOT_FOUND", "Could not find view with tag \(viewTag)")
110
+ return
111
+ }
112
+
113
+ let success = view.undo()
114
+ promise.resolve(success)
115
+ }
116
+ }
117
+
118
+ AsyncFunction("redo") { (viewTag: Int, promise: Promise) in
119
+ DispatchQueue.main.async {
120
+ guard let view = self.appContext?.findView(withTag: viewTag, ofType: ExpoPdfReaderView.self) else {
121
+ promise.reject("ERR_VIEW_NOT_FOUND", "Could not find view with tag \(viewTag)")
122
+ return
123
+ }
124
+
125
+ let success = view.redo()
126
+ promise.resolve(success)
127
+ }
128
+ }
129
+
130
+ AsyncFunction("zoomIn") { (viewTag: Int, promise: Promise) in
131
+ DispatchQueue.main.async {
132
+ guard let view = self.appContext?.findView(withTag: viewTag, ofType: ExpoPdfReaderView.self) else {
133
+ promise.reject("ERR_VIEW_NOT_FOUND", "Could not find view with tag \(viewTag)")
134
+ return
135
+ }
136
+
137
+ let changed = view.zoomIn()
138
+ promise.resolve(changed)
139
+ }
140
+ }
141
+
142
+ AsyncFunction("zoomOut") { (viewTag: Int, promise: Promise) in
143
+ DispatchQueue.main.async {
144
+ guard let view = self.appContext?.findView(withTag: viewTag, ofType: ExpoPdfReaderView.self) else {
145
+ promise.reject("ERR_VIEW_NOT_FOUND", "Could not find view with tag \(viewTag)")
146
+ return
147
+ }
148
+
149
+ let changed = view.zoomOut()
150
+ promise.resolve(changed)
151
+ }
152
+ }
153
+
154
+ AsyncFunction("renderThumbnail") { (viewTag: Int, page: Int, width: Double, promise: Promise) in
155
+ DispatchQueue.main.async {
156
+ guard let view = self.appContext?.findView(withTag: viewTag, ofType: ExpoPdfReaderView.self) else {
157
+ promise.reject("ERR_VIEW_NOT_FOUND", "Could not find view with tag \(viewTag)")
158
+ return
159
+ }
160
+
161
+ do {
162
+ let path = try view.renderThumbnail(pageIndex: page, width: width)
163
+ promise.resolve(path)
164
+ } catch {
165
+ promise.reject("ERR_THUMBNAIL_FAILED", "Failed to render thumbnail: \(error.localizedDescription)")
166
+ }
167
+ }
168
+ }
169
+ }
170
+ }