react-native-pdfrender 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.
Files changed (68) hide show
  1. package/README.md +306 -0
  2. package/android/build.gradle +76 -0
  3. package/android/src/main/AndroidManifest.xml +2 -0
  4. package/android/src/main/java/com/pdfrender/ComposeRenderer.kt +85 -0
  5. package/android/src/main/java/com/pdfrender/PdfCacheManager.kt +150 -0
  6. package/android/src/main/java/com/pdfrender/PdfConstants.kt +63 -0
  7. package/android/src/main/java/com/pdfrender/PdfIconComponents.kt +275 -0
  8. package/android/src/main/java/com/pdfrender/PdfRenderingLogic.kt +325 -0
  9. package/android/src/main/java/com/pdfrender/PdfUIComponents.kt +335 -0
  10. package/android/src/main/java/com/pdfrender/PdfViewPackage.kt +32 -0
  11. package/android/src/main/java/com/pdfrender/PdfViewerActivity.kt +3467 -0
  12. package/android/src/main/java/com/pdfrender/PdfViewerFabricManager.kt +244 -0
  13. package/android/src/main/java/com/pdfrender/PdfViewerFragment.kt +129 -0
  14. package/android/src/main/java/com/pdfrender/PdfViewerTurboModule.kt +158 -0
  15. package/android/src/main/java/com/pdfrender/events/FullScreenChangeEvent.kt +26 -0
  16. package/android/src/main/java/com/pdfrender/events/LeftScreenChangeEvent.kt +22 -0
  17. package/android/src/main/java/com/pdfrender/events/RightScreenChangeEvent.kt +22 -0
  18. package/android/src/main/java/com/pdfrender/events/ZoomChangeEvent.kt +22 -0
  19. package/ios/PdfCacheManager.swift +44 -0
  20. package/ios/PdfConstants.swift +38 -0
  21. package/ios/PdfPageView.swift +121 -0
  22. package/ios/PdfRenderingLogic.swift +107 -0
  23. package/ios/PdfToolbarView.swift +158 -0
  24. package/ios/PdfViewerComponentView.mm +194 -0
  25. package/ios/PdfViewerTurboModule.mm +186 -0
  26. package/ios/PdfViewerTurboModuleImpl.swift +141 -0
  27. package/ios/PdfViewerView.swift +268 -0
  28. package/ios/PdfViewerViewController.swift +109 -0
  29. package/lib/commonjs/PdfViewerView.js +105 -0
  30. package/lib/commonjs/PdfViewerView.js.map +1 -0
  31. package/lib/commonjs/index.js +28 -0
  32. package/lib/commonjs/index.js.map +1 -0
  33. package/lib/commonjs/package.json +1 -0
  34. package/lib/commonjs/specs/NativePdfViewerComponent.js +27 -0
  35. package/lib/commonjs/specs/NativePdfViewerComponent.js.map +1 -0
  36. package/lib/commonjs/specs/NativePdfViewerModule.js +21 -0
  37. package/lib/commonjs/specs/NativePdfViewerModule.js.map +1 -0
  38. package/lib/commonjs/usePdfViewer.js +65 -0
  39. package/lib/commonjs/usePdfViewer.js.map +1 -0
  40. package/lib/module/PdfViewerView.js +99 -0
  41. package/lib/module/PdfViewerView.js.map +1 -0
  42. package/lib/module/index.js +8 -0
  43. package/lib/module/index.js.map +1 -0
  44. package/lib/module/package.json +1 -0
  45. package/lib/module/specs/NativePdfViewerComponent.js +26 -0
  46. package/lib/module/specs/NativePdfViewerComponent.js.map +1 -0
  47. package/lib/module/specs/NativePdfViewerModule.js +18 -0
  48. package/lib/module/specs/NativePdfViewerModule.js.map +1 -0
  49. package/lib/module/usePdfViewer.js +60 -0
  50. package/lib/module/usePdfViewer.js.map +1 -0
  51. package/lib/typescript/PdfViewerView.d.ts +58 -0
  52. package/lib/typescript/PdfViewerView.d.ts.map +1 -0
  53. package/lib/typescript/index.d.ts +7 -0
  54. package/lib/typescript/index.d.ts.map +1 -0
  55. package/lib/typescript/specs/NativePdfViewerComponent.d.ts +59 -0
  56. package/lib/typescript/specs/NativePdfViewerComponent.d.ts.map +1 -0
  57. package/lib/typescript/specs/NativePdfViewerModule.d.ts +47 -0
  58. package/lib/typescript/specs/NativePdfViewerModule.d.ts.map +1 -0
  59. package/lib/typescript/usePdfViewer.d.ts +45 -0
  60. package/lib/typescript/usePdfViewer.d.ts.map +1 -0
  61. package/package.json +109 -0
  62. package/react-native-pdfrender.podspec +35 -0
  63. package/react-native.config.js +11 -0
  64. package/src/PdfViewerView.tsx +159 -0
  65. package/src/index.tsx +10 -0
  66. package/src/specs/NativePdfViewerComponent.ts +94 -0
  67. package/src/specs/NativePdfViewerModule.ts +58 -0
  68. package/src/usePdfViewer.ts +102 -0
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Codegen spec for PdfViewerTurboModule.
3
+ *
4
+ * Codegen reads this file at build time and generates:
5
+ * Android: abstract Kotlin class `NativePdfViewerModuleSpec`
6
+ *
7
+ * The name passed to TurboModuleRegistry.getEnforcing() MUST match the
8
+ * string returned by PdfViewerTurboModule.getName() in Kotlin.
9
+ *
10
+ * Method signatures here are the source of truth — if the Kotlin
11
+ * implementation diverges, the build fails at compile time.
12
+ */
13
+
14
+ import type { TurboModule } from 'react-native';
15
+ import { TurboModuleRegistry } from 'react-native';
16
+
17
+ export interface PdfCreationResult {
18
+ base64: string;
19
+ path: string;
20
+ }
21
+
22
+ export interface PdfPage {
23
+ title: string;
24
+ body: string;
25
+ }
26
+
27
+ export interface Spec extends TurboModule {
28
+ /**
29
+ * Show the PDF viewer inside the host Activity's Fragment back-stack.
30
+ * No new Activity is started — uses PdfViewerFragment.
31
+ *
32
+ * @param uri PDF file URI (file:// or content://)
33
+ * @param pageIndex 0-based page to open on start (-1 = first page)
34
+ * @param defaultZoom Initial zoom level (1.0 = 100%, 1.5 = 150%)
35
+ */
36
+ openPdfViewer(uri: string, pageIndex: number, defaultZoom: number): void;
37
+
38
+ /**
39
+ * Dismiss the viewer Fragment if it is currently visible.
40
+ */
41
+ dismissPdfViewer(): void;
42
+
43
+ /**
44
+ * Async: returns total page count without rendering the PDF.
45
+ */
46
+ getPdfPageCount(uri: string): Promise<number>;
47
+
48
+ /**
49
+ * Generate a multi-page PDF from structured content and return as Base64.
50
+ */
51
+ createMultiPagePdfBase64(
52
+ pages: ReadonlyArray<PdfPage>,
53
+ widthPx: number,
54
+ heightPx: number
55
+ ): Promise<PdfCreationResult>;
56
+ }
57
+
58
+ export default TurboModuleRegistry.getEnforcing<Spec>('NativePdfViewerModule');
@@ -0,0 +1,102 @@
1
+ /**
2
+ * usePdfViewer — programmatic (Fragment-based) PDF viewer hook.
3
+ *
4
+ * Use this when you want to open the PDF viewer imperatively (like a modal),
5
+ * without embedding a <PdfViewerView /> in the render tree.
6
+ *
7
+ * Under the hood it calls PdfViewerTurboModule.openPdfViewer(), which shows
8
+ * PdfViewerFragment inside the host Activity — no new Activity is started.
9
+ *
10
+ * Usage:
11
+ * const { open, dismiss, getPageCount } = usePdfViewer({
12
+ * onZoomChanged: (pct) => console.log('zoom', pct),
13
+ * onDismiss: () => console.log('closed'),
14
+ * });
15
+ *
16
+ * // Open the viewer
17
+ * open('file:///path/to/book.pdf', 0, 1.5);
18
+ *
19
+ * // Dismiss it programmatically
20
+ * dismiss();
21
+ */
22
+
23
+ import { useCallback, useEffect, useRef } from 'react';
24
+ import { NativeEventEmitter, NativeModules } from 'react-native';
25
+ import NativePdfViewerModule from './specs/NativePdfViewerModule';
26
+
27
+ export interface UsePdfViewerOptions {
28
+ onFullScreenChanged?: (isFullScreen: boolean) => void;
29
+ onZoomChanged?: (zoomPercentage: number) => void;
30
+ onDismiss?: () => void;
31
+ onError?: (error: string) => void;
32
+ }
33
+
34
+ export interface UsePdfViewerReturn {
35
+ /** Open the PDF viewer inside the host Activity */
36
+ open: (uri: string, pageIndex?: number, defaultZoom?: number) => void;
37
+ /** Dismiss the viewer programmatically */
38
+ dismiss: () => void;
39
+ /** Get the total number of pages (async, no rendering) */
40
+ getPageCount: (uri: string) => Promise<number>;
41
+ /** Generate a multi-page PDF as Base64 */
42
+ createPdf: (
43
+ pages: Array<{ title: string; body: string }>,
44
+ widthPx: number,
45
+ heightPx: number
46
+ ) => Promise<{ base64: string; path: string }>;
47
+ }
48
+
49
+ export function usePdfViewer(options: UsePdfViewerOptions = {}): UsePdfViewerReturn {
50
+ // Keep options in a ref so event handlers always see the latest callbacks
51
+ // without needing to re-subscribe to native events on every render.
52
+ const optionsRef = useRef(options);
53
+ optionsRef.current = options;
54
+
55
+ useEffect(() => {
56
+ const emitter = new NativeEventEmitter(NativeModules.NativePdfViewerModule);
57
+
58
+ const subs = [
59
+ emitter.addListener('PdfFullScreenChanged', ({ isFullScreen }: { isFullScreen: boolean }) =>
60
+ optionsRef.current.onFullScreenChanged?.(isFullScreen)
61
+ ),
62
+ emitter.addListener('PdfZoomChanged', ({ zoomPercentage }: { zoomPercentage: number }) =>
63
+ optionsRef.current.onZoomChanged?.(zoomPercentage)
64
+ ),
65
+ emitter.addListener('PdfViewerDismissed', () =>
66
+ optionsRef.current.onDismiss?.()
67
+ ),
68
+ emitter.addListener('PdfViewerError', ({ error }: { error: string }) =>
69
+ optionsRef.current.onError?.(error)
70
+ ),
71
+ ];
72
+
73
+ return () => subs.forEach((s) => s.remove());
74
+ }, []); // Empty deps: subscribe once, use ref for callbacks
75
+
76
+ const open = useCallback(
77
+ (uri: string, pageIndex = -1, defaultZoom = 1.5) => {
78
+ NativePdfViewerModule.openPdfViewer(uri, pageIndex, defaultZoom);
79
+ },
80
+ []
81
+ );
82
+
83
+ const dismiss = useCallback(() => {
84
+ NativePdfViewerModule.dismissPdfViewer();
85
+ }, []);
86
+
87
+ const getPageCount = useCallback(
88
+ (uri: string): Promise<number> => NativePdfViewerModule.getPdfPageCount(uri),
89
+ []
90
+ );
91
+
92
+ const createPdf = useCallback(
93
+ (
94
+ pages: Array<{ title: string; body: string }>,
95
+ widthPx: number,
96
+ heightPx: number
97
+ ) => NativePdfViewerModule.createMultiPagePdfBase64(pages, widthPx, heightPx),
98
+ []
99
+ );
100
+
101
+ return { open, dismiss, getPageCount, createPdf };
102
+ }