rn-pdf-king 0.1.0 → 0.1.1
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.
- package/android/src/main/java/expo/modules/rnpdfking/PdfKing.kt +25 -0
- package/android/src/main/java/expo/modules/rnpdfking/RnPdfKingModule.kt +23 -0
- package/build/RnPdfKingModule.d.ts +2 -0
- package/build/RnPdfKingModule.d.ts.map +1 -1
- package/build/RnPdfKingModule.js.map +1 -1
- package/build/ZoomableList.d.ts +1 -0
- package/build/ZoomableList.d.ts.map +1 -1
- package/build/ZoomableList.js +5 -1
- package/build/ZoomableList.js.map +1 -1
- package/package.json +1 -1
- package/src/RnPdfKingModule.ts +2 -0
- package/src/ZoomableList.tsx +7 -0
|
@@ -237,6 +237,31 @@ class PdfKing(private val context: Context) {
|
|
|
237
237
|
}
|
|
238
238
|
}
|
|
239
239
|
|
|
240
|
+
suspend fun getPageBitmapBase64(pageNo: Int): String {
|
|
241
|
+
val bitmap = getPageBitmap(pageNo)
|
|
242
|
+
val outputStream = java.io.ByteArrayOutputStream()
|
|
243
|
+
bitmap.compress(Bitmap.CompressFormat.PNG, 100, outputStream)
|
|
244
|
+
val byteArray = outputStream.toByteArray()
|
|
245
|
+
return android.util.Base64.encodeToString(byteArray, android.util.Base64.NO_WRAP)
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
suspend fun getPageText(pageNo: Int): String {
|
|
249
|
+
return withContext(Dispatchers.IO) {
|
|
250
|
+
pdfMutex.withLock {
|
|
251
|
+
val document = requireNotNull(textDocument) { "No PDF loaded. Please choose a PDF file first." }
|
|
252
|
+
require(pageNo in 1..document.numberOfPages) {
|
|
253
|
+
"Page number must be between 1 and ${document.numberOfPages}."
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
val stripper = PDFTextStripper().apply {
|
|
257
|
+
startPage = pageNo
|
|
258
|
+
endPage = pageNo
|
|
259
|
+
}
|
|
260
|
+
stripper.getText(document)
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
|
|
240
265
|
fun closePdf() {
|
|
241
266
|
try {
|
|
242
267
|
pdfRenderer?.close()
|
|
@@ -7,6 +7,7 @@ import android.provider.OpenableColumns
|
|
|
7
7
|
import com.mobinx.pdfking.PdfKingManager
|
|
8
8
|
import expo.modules.kotlin.modules.Module
|
|
9
9
|
import expo.modules.kotlin.modules.ModuleDefinition
|
|
10
|
+
import expo.modules.kotlin.Promise
|
|
10
11
|
import java.io.File
|
|
11
12
|
import kotlinx.coroutines.CoroutineScope
|
|
12
13
|
import kotlinx.coroutines.Dispatchers
|
|
@@ -124,6 +125,28 @@ class RnPdfKingModule : Module() {
|
|
|
124
125
|
}
|
|
125
126
|
}
|
|
126
127
|
|
|
128
|
+
AsyncFunction("getPageBitmapBase64") { pageNo: Int, promise: Promise ->
|
|
129
|
+
CoroutineScope(Dispatchers.IO).launch {
|
|
130
|
+
try {
|
|
131
|
+
val result = PdfKingManager.getInstance().getPageBitmapBase64(pageNo)
|
|
132
|
+
promise.resolve(result)
|
|
133
|
+
} catch (e: Exception) {
|
|
134
|
+
promise.reject("ERR_BITMAP", e.message, e)
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
AsyncFunction("getTextChars") { pageNo: Int, promise: Promise ->
|
|
140
|
+
CoroutineScope(Dispatchers.IO).launch {
|
|
141
|
+
try {
|
|
142
|
+
val result = PdfKingManager.getInstance().getPageText(pageNo)
|
|
143
|
+
promise.resolve(result)
|
|
144
|
+
} catch (e: Exception) {
|
|
145
|
+
promise.reject("ERR_TEXT", e.message, e)
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
127
150
|
View(RnPdfKingView::class) {
|
|
128
151
|
Prop("pageNo") { view: RnPdfKingView, pageNo: Int ->
|
|
129
152
|
view.setPage(pageNo)
|
|
@@ -6,6 +6,8 @@ declare class RnPdfKingModule extends NativeModule<RnPdfKingModuleEvents> {
|
|
|
6
6
|
setValueAsync(value: string): Promise<void>;
|
|
7
7
|
pickFile(): Promise<void>;
|
|
8
8
|
loadPdf(path: string): Promise<void>;
|
|
9
|
+
getPageBitmapBase64(pageNo: number): Promise<string>;
|
|
10
|
+
getTextChars(pageNo: number): Promise<string>;
|
|
9
11
|
checkInitialIntent(): Promise<boolean>;
|
|
10
12
|
}
|
|
11
13
|
declare const _default: RnPdfKingModule;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RnPdfKingModule.d.ts","sourceRoot":"","sources":["../src/RnPdfKingModule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAuB,MAAM,MAAM,CAAC;AAEzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAE1D,OAAO,OAAO,eAAgB,SAAQ,YAAY,CAAC,qBAAqB,CAAC;IACvE,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,IAAI,MAAM;IACf,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAC3C,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IACzB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IACpC,kBAAkB,IAAI,OAAO,CAAC,OAAO,CAAC;CACvC;;AAGD,wBAAiE"}
|
|
1
|
+
{"version":3,"file":"RnPdfKingModule.d.ts","sourceRoot":"","sources":["../src/RnPdfKingModule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAuB,MAAM,MAAM,CAAC;AAEzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAE1D,OAAO,OAAO,eAAgB,SAAQ,YAAY,CAAC,qBAAqB,CAAC;IACvE,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,IAAI,MAAM;IACf,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAC3C,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IACzB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IACpC,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IACpD,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAC7C,kBAAkB,IAAI,OAAO,CAAC,OAAO,CAAC;CACvC;;AAGD,wBAAiE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RnPdfKingModule.js","sourceRoot":"","sources":["../src/RnPdfKingModule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,mBAAmB,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"RnPdfKingModule.js","sourceRoot":"","sources":["../src/RnPdfKingModule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,mBAAmB,EAAE,MAAM,MAAM,CAAC;AAezD,yDAAyD;AACzD,eAAe,mBAAmB,CAAkB,WAAW,CAAC,CAAC","sourcesContent":["import { NativeModule, requireNativeModule } from 'expo';\n\nimport { RnPdfKingModuleEvents } from './RnPdfKing.types';\n\ndeclare class RnPdfKingModule extends NativeModule<RnPdfKingModuleEvents> {\n PI: number;\n hello(): string;\n setValueAsync(value: string): Promise<void>;\n pickFile(): Promise<void>;\n loadPdf(path: string): Promise<void>;\n getPageBitmapBase64(pageNo: number): Promise<string>;\n getTextChars(pageNo: number): Promise<string>;\n checkInitialIntent(): Promise<boolean>;\n}\n\n// This call loads the native module object from the JSI.\nexport default requireNativeModule<RnPdfKingModule>('RnPdfKing');\n"]}
|
package/build/ZoomableList.d.ts
CHANGED
|
@@ -31,6 +31,7 @@ export interface ZoomableListProps<T> extends Omit<FlashListProps<T>, "renderIte
|
|
|
31
31
|
* Logo/Icon for the slider thumb.
|
|
32
32
|
*/
|
|
33
33
|
pageSliderLogo?: React.ReactNode;
|
|
34
|
+
onScrollPageNumberChanged?: (page: number) => void;
|
|
34
35
|
}
|
|
35
36
|
export declare function ZoomableList<T>(props: ZoomableListProps<T>): React.JSX.Element;
|
|
36
37
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ZoomableList.d.ts","sourceRoot":"","sources":["../src/ZoomableList.tsx"],"names":[],"mappings":"AAAA,OAAO,KAMN,MAAM,OAAO,CAAC;AACf,OAAO,EACL,SAAS,EACT,SAAS,EAKV,MAAM,cAAc,CAAC;AAYtB,OAAO,EAAkB,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnE,OAAO,EAEL,cAAc,EACd,kBAAkB,EACnB,MAAM,qBAAqB,CAAC;AAQ7B,UAAU,uBAAuB;IAC/B,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;CACf;AAMD,eAAO,MAAM,eAAe,+BAM3B,CAAC;AAEF,MAAM,WAAW,iBAAiB,CAAC,CAAC,CAAE,SAAQ,IAAI,CAChD,cAAc,CAAC,CAAC,CAAC,EACjB,YAAY,CACb;IACC,UAAU,EAAE,CACV,IAAI,EAAE,kBAAkB,CAAC,CAAC,CAAC,GAAG;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,KAC5C,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC;IAC/B,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC7B,SAAS,CAAC,EAAE,IAAI,CAAC,mBAAmB,EAAE,yBAAyB,CAAC,CAAC;IACjE,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,iBAAiB,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;IAChD;;;OAGG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B;;;OAGG;IACH,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IAC7D;;OAEG;IACH,cAAc,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"ZoomableList.d.ts","sourceRoot":"","sources":["../src/ZoomableList.tsx"],"names":[],"mappings":"AAAA,OAAO,KAMN,MAAM,OAAO,CAAC;AACf,OAAO,EACL,SAAS,EACT,SAAS,EAKV,MAAM,cAAc,CAAC;AAYtB,OAAO,EAAkB,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnE,OAAO,EAEL,cAAc,EACd,kBAAkB,EACnB,MAAM,qBAAqB,CAAC;AAQ7B,UAAU,uBAAuB;IAC/B,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;CACf;AAMD,eAAO,MAAM,eAAe,+BAM3B,CAAC;AAEF,MAAM,WAAW,iBAAiB,CAAC,CAAC,CAAE,SAAQ,IAAI,CAChD,cAAc,CAAC,CAAC,CAAC,EACjB,YAAY,CACb;IACC,UAAU,EAAE,CACV,IAAI,EAAE,kBAAkB,CAAC,CAAC,CAAC,GAAG;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,KAC5C,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC;IAC/B,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC7B,SAAS,CAAC,EAAE,IAAI,CAAC,mBAAmB,EAAE,yBAAyB,CAAC,CAAC;IACjE,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,iBAAiB,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;IAChD;;;OAGG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B;;;OAGG;IACH,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IAC7D;;OAEG;IACH,cAAc,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACjC,yBAAyB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACpD;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,KAAK,EAAE,iBAAiB,CAAC,CAAC,CAAC,qBAyS1D"}
|
package/build/ZoomableList.js
CHANGED
|
@@ -16,7 +16,7 @@ export const useZoomableList = () => {
|
|
|
16
16
|
return context;
|
|
17
17
|
};
|
|
18
18
|
export function ZoomableList(props) {
|
|
19
|
-
const { style, zoomProps, onZoomChange, onZoomStateChange, renderItem, pageSliderEnabled = false, pageSliderLabel, pageSliderLogo, ...flashListProps } = props;
|
|
19
|
+
const { style, zoomProps, onZoomChange, onZoomStateChange, renderItem, pageSliderEnabled = false, pageSliderLabel, pageSliderLogo, onScrollPageNumberChanged, ...flashListProps } = props;
|
|
20
20
|
const [width, setWidth] = useState(0);
|
|
21
21
|
const [isZoomed, setIsZoomed] = useState(false);
|
|
22
22
|
const [isPanning, setIsPanning] = useState(false);
|
|
@@ -26,6 +26,10 @@ export function ZoomableList(props) {
|
|
|
26
26
|
const [scrubIndex, setScrubIndex] = useState(0);
|
|
27
27
|
const [trackHeight, setTrackHeight] = useState(0);
|
|
28
28
|
const [hasScrolled, setHasScrolled] = useState(false);
|
|
29
|
+
// Notify parent of page changes
|
|
30
|
+
React.useEffect(() => {
|
|
31
|
+
onScrollPageNumberChanged?.(currentIndex + 1);
|
|
32
|
+
}, [currentIndex, onScrollPageNumberChanged]);
|
|
29
33
|
// @ts-ignore
|
|
30
34
|
const listRef = useAnimatedRef();
|
|
31
35
|
const { zoomGesture, contentContainerAnimatedStyle, onLayout, onLayoutContent, onScroll, } = useZoomGesture({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ZoomableList.js","sourceRoot":"","sources":["../src/ZoomableList.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, {\n useMemo,\n useRef,\n useState,\n createContext,\n useContext,\n} from \"react\";\nimport {\n StyleProp,\n ViewStyle,\n View,\n LayoutChangeEvent,\n StyleSheet,\n Text,\n} from \"react-native\";\nimport { GestureDetector, Gesture } from \"react-native-gesture-handler\";\nimport Animated, {\n runOnJS,\n useAnimatedRef,\n useAnimatedStyle,\n useDerivedValue,\n useSharedValue,\n scrollTo,\n withTiming,\n withDelay,\n} from \"react-native-reanimated\";\nimport { useZoomGesture, UseZoomGestureProps } from \"./zoom/index\";\nimport {\n FlashList,\n FlashListProps,\n ListRenderItemInfo,\n} from \"@shopify/flash-list\";\n\nconst AnimatedFlashList = Animated.createAnimatedComponent(FlashList as any) as any;\n\nconst PAGE_SLIDER_PADDING_Y = 16;\nconst PAGE_SLIDER_THUMB_SIZE = 28;\n\n// Context for ZoomableList state\ninterface ZoomableListContextType {\n isZoomed: boolean;\n isPanning: boolean;\n isPinching: boolean;\n width: number;\n}\n\nconst ZoomableListContext = createContext<ZoomableListContextType | undefined>(\n undefined,\n);\n\nexport const useZoomableList = () => {\n const context = useContext(ZoomableListContext);\n if (!context) {\n throw new Error(\"useZoomableList must be used within a ZoomableList\");\n }\n return context;\n};\n\nexport interface ZoomableListProps<T> extends Omit<\n FlashListProps<T>,\n \"renderItem\"\n> {\n renderItem: (\n info: ListRenderItemInfo<T> & { width: number },\n ) => React.ReactElement | null;\n style?: StyleProp<ViewStyle>;\n zoomProps?: Omit<UseZoomGestureProps, \"parentAnimatedScrollRef\">;\n onZoomChange?: (scale: number) => void;\n onZoomStateChange?: (isZoomed: boolean) => void;\n /**\n * Google Drive-style page scrubber on the right side.\n * Works best for \"page\" lists where each item is a page.\n */\n pageSliderEnabled?: boolean;\n /**\n * Label renderer for the bubble. Defaults to \"current/total\".\n * current is 1-based.\n */\n pageSliderLabel?: (current: number, total: number) => string;\n /**\n * Logo/Icon for the slider thumb.\n */\n pageSliderLogo?: React.ReactNode;\n}\n\nexport function ZoomableList<T>(props: ZoomableListProps<T>) {\n const {\n style,\n zoomProps,\n onZoomChange,\n onZoomStateChange,\n renderItem,\n pageSliderEnabled = false,\n pageSliderLabel,\n pageSliderLogo,\n ...flashListProps\n } = props;\n\n const [width, setWidth] = useState(0);\n const [isZoomed, setIsZoomed] = useState(false);\n const [isPanning, setIsPanning] = useState(false);\n const [isPinching, setIsPinching] = useState(false);\n const [currentIndex, setCurrentIndex] = useState(0);\n const [isScrubbing, setIsScrubbing] = useState(false);\n const [scrubIndex, setScrubIndex] = useState(0);\n const [trackHeight, setTrackHeight] = useState(0);\n const [hasScrolled, setHasScrolled] = useState(false);\n\n // @ts-ignore\n const listRef = useAnimatedRef<FlashList<T>>();\n\n const {\n zoomGesture,\n contentContainerAnimatedStyle,\n onLayout,\n onLayoutContent,\n onScroll,\n } = useZoomGesture({\n disableVerticalPan: true,\n parentAnimatedScrollRef: listRef,\n ...zoomProps,\n onPanningStarted: () => {\n setIsPanning(true);\n zoomProps?.onPanningStarted?.();\n },\n onPanningEnd: () => {\n setIsPanning(false);\n zoomProps?.onPanningEnd?.();\n },\n onPinchingStarted: () => {\n setIsPinching(true);\n zoomProps?.onPinchingStarted?.();\n },\n onPinchingStopped: () => {\n setIsPinching(false);\n zoomProps?.onPinchingStopped?.();\n },\n onZoomChange: (s: number) => {\n const newIsZoomed = s > 1.05; // Small buffer\n if (newIsZoomed !== isZoomed) {\n setIsZoomed(newIsZoomed);\n onZoomStateChange?.(newIsZoomed);\n }\n onZoomChange?.(s);\n },\n });\n\n const handleLayout = (e: LayoutChangeEvent) => {\n if (e.nativeEvent.layout.width !== width) {\n setWidth(e.nativeEvent.layout.width);\n }\n };\n\n const totalCount = flashListProps.data?.length ?? 0;\n const sliderEnabled = pageSliderEnabled && totalCount > 1;\n const bubbleText = (\n pageSliderLabel ?? ((cur: number, total: number) => `${cur}/${total}`)\n )((isScrubbing ? scrubIndex : currentIndex) + 1, totalCount);\n\n const onViewableItemsChanged = useRef(\n ({ viewableItems }: { viewableItems: Array<{ index: number | null }> }) => {\n const first = viewableItems?.find(\n (v) => typeof v.index === \"number\" && v.index !== null,\n );\n if (first?.index != null) setCurrentIndex(first.index);\n },\n ).current;\n\n const viewabilityConfig = useMemo(\n () => ({\n itemVisiblePercentThreshold: 55,\n minimumViewTime: 60,\n }),\n [],\n );\n\n const thumbY = useSharedValue(0);\n const bubbleOpacity = useSharedValue(0);\n const contentHeight = useSharedValue(0);\n const viewportHeight = useSharedValue(0);\n\n const handleScroll = (e: any) => {\n // Keep zoom gesture bookkeeping intact\n onScroll?.(e);\n // Preserve consumer scroll handler if provided\n (flashListProps as any).onScroll?.(e);\n\n const ne = e?.nativeEvent;\n if (ne) {\n contentHeight.value = ne.contentSize?.height ?? 0;\n viewportHeight.value = ne.layoutMeasurement?.height ?? 0;\n }\n\n if (!sliderEnabled || trackHeight <= 0) return;\n\n if (!isScrubbing) {\n // Show bubble while panning/scrolling and hide after 1s of inactivity\n bubbleOpacity.value = 1;\n bubbleOpacity.value = withDelay(1000, withTiming(0, { duration: 300 }));\n }\n\n const offsetY = ne?.contentOffset?.y ?? 0;\n const contentH = ne?.contentSize?.height ?? 0;\n const viewportH = ne?.layoutMeasurement?.height ?? 0;\n const scrollable = Math.max(1, contentH - viewportH);\n const ratio = Math.max(0, Math.min(1, offsetY / scrollable));\n thumbY.value = ratio * trackHeight;\n if (!hasScrolled) setHasScrolled(true);\n };\n\n useDerivedValue(() => {\n if (\n !sliderEnabled ||\n isScrubbing ||\n hasScrolled ||\n trackHeight <= 0 ||\n totalCount <= 1\n )\n return;\n const ratio = currentIndex / (totalCount - 1);\n thumbY.value = ratio * trackHeight;\n }, [\n currentIndex,\n isScrubbing,\n sliderEnabled,\n totalCount,\n trackHeight,\n hasScrolled,\n ]);\n\n const updateScrubFromY = (y: number) => {\n if (!sliderEnabled || trackHeight <= 0) return;\n // Gesture y is relative to the track view; normalize into usable range.\n const normalized = y - PAGE_SLIDER_PADDING_Y;\n const clamped = Math.max(0, Math.min(trackHeight, normalized));\n const ratio = trackHeight > 0 ? clamped / trackHeight : 0;\n const idx = Math.max(\n 0,\n Math.min(totalCount - 1, Math.round(ratio * (totalCount - 1))),\n );\n setScrubIndex(idx);\n };\n\n const panGesture = useMemo(() => {\n return Gesture.Pan()\n .manualActivation(true)\n .onTouchesDown((_e, manager) => {\n manager.activate();\n })\n .enabled(sliderEnabled && !isZoomed && !isPanning && !isPinching)\n .onBegin(() => {\n bubbleOpacity.value = 1;\n runOnJS(setIsScrubbing)(true);\n })\n .onUpdate((e) => {\n // keep thumbY in the same normalized coordinate space as trackHeight\n const y = Math.max(\n 0,\n Math.min(trackHeight, e.y - PAGE_SLIDER_PADDING_Y),\n );\n thumbY.value = y;\n\n if (trackHeight > 0) {\n const ratio = y / trackHeight;\n const scrollableHeight = contentHeight.value - viewportHeight.value;\n if (scrollableHeight > 0) {\n scrollTo(listRef, 0, ratio * scrollableHeight, true);\n }\n }\n\n runOnJS(updateScrubFromY)(e.y);\n })\n .onEnd(() => {\n bubbleOpacity.value = withTiming(0, { duration: 300 });\n runOnJS(setIsScrubbing)(false);\n })\n .onFinalize(() => {\n bubbleOpacity.value = withTiming(0, { duration: 300 });\n runOnJS(setIsScrubbing)(false);\n });\n }, [\n bubbleOpacity,\n isPanning,\n isPinching,\n isZoomed,\n sliderEnabled,\n thumbY,\n trackHeight,\n totalCount,\n contentHeight,\n viewportHeight,\n listRef,\n ]);\n\n const thumbStyle = useAnimatedStyle(() => {\n const y =\n trackHeight > 0 ? Math.max(0, Math.min(trackHeight, thumbY.value)) : 0;\n return {\n transform: [{ translateY: y + PAGE_SLIDER_PADDING_Y }],\n };\n }, [trackHeight]);\n\n const bubbleStyle = useAnimatedStyle(() => {\n const y =\n trackHeight > 0 ? Math.max(0, Math.min(trackHeight, thumbY.value)) : 0;\n return {\n opacity: bubbleOpacity.value,\n transform: [{ translateY: y + PAGE_SLIDER_PADDING_Y }],\n };\n });\n\n return (\n <ZoomableListContext.Provider\n value={{ isZoomed, isPanning, isPinching, width }}\n >\n <View style={[styles.container, style]} onLayout={handleLayout}>\n <GestureDetector gesture={zoomGesture}>\n <View style={{ flex: 1 }} onLayout={onLayout} collapsable={false}>\n <Animated.View\n style={[contentContainerAnimatedStyle, { flex: 1 }]}\n onLayout={onLayoutContent}\n >\n <AnimatedFlashList\n ref={listRef}\n scrollEnabled={!isZoomed && !isPanning && !isPinching}\n scrollEventThrottle={16}\n renderItem={(info: ListRenderItemInfo<T>) => renderItem({ ...info, width })}\n {...flashListProps}\n onScroll={handleScroll}\n onViewableItemsChanged={\n sliderEnabled\n ? (onViewableItemsChanged as any)\n : flashListProps.onViewableItemsChanged\n }\n viewabilityConfig={\n sliderEnabled\n ? (viewabilityConfig as any)\n : flashListProps.viewabilityConfig\n }\n />\n </Animated.View>\n </View>\n </GestureDetector>\n\n {sliderEnabled ? (\n <View pointerEvents=\"box-none\" style={styles.pageSliderOverlay}>\n <View style={styles.pageSliderGestureContainer}>\n <GestureDetector gesture={panGesture}>\n <View\n style={styles.pageSliderTrack}\n collapsable={false}\n onLayout={(e) => {\n const h = e.nativeEvent.layout.height;\n const usable = Math.max(\n 0,\n h - PAGE_SLIDER_PADDING_Y * 2 - PAGE_SLIDER_THUMB_SIZE,\n );\n setTrackHeight(usable);\n }}\n >\n <Animated.View style={[styles.pageSliderBubble, bubbleStyle]}>\n <Text style={styles.pageSliderBubbleText}>\n {bubbleText}\n </Text>\n </Animated.View>\n <Animated.View style={[styles.pageSliderThumb, thumbStyle]}>\n {pageSliderLogo}\n </Animated.View>\n </View>\n </GestureDetector>\n </View>\n </View>\n ) : null}\n </View>\n </ZoomableListContext.Provider>\n );\n}\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n overflow: \"hidden\",\n },\n pageSliderOverlay: {\n position: \"absolute\",\n right: 0,\n top: 0,\n bottom: 0,\n width: 10,\n alignItems: \"flex-end\",\n justifyContent: \"flex-start\",\n },\n pageSliderGestureContainer: {\n flex: 1,\n alignSelf: \"stretch\",\n alignItems: \"flex-end\",\n },\n pageSliderTrack: {\n flex: 1,\n width: 10,\n alignItems: \"flex-end\",\n justifyContent: \"flex-start\",\n paddingVertical: 16,\n },\n pageSliderThumb: {\n position: \"absolute\",\n right: 2,\n width: 38,\n height: 38,\n borderRadius: 999,\n backgroundColor: \"rgba(255,255,255,0.92)\",\n borderWidth: 1,\n borderColor: \"rgba(0,0,0,0.12)\",\n shadowColor: \"#000\",\n shadowOpacity: 0.15,\n shadowRadius: 6,\n shadowOffset: { width: 0, height: 2 },\n elevation: 3,\n alignItems: \"center\",\n justifyContent: \"center\",\n },\n pageSliderBubble: {\n position: \"absolute\",\n right: 38,\n minWidth: 80,\n paddingHorizontal: 8,\n paddingVertical: 10,\n borderRadius: 999,\n backgroundColor: \"rgba(0,0,0,0.82)\",\n alignItems: \"center\",\n justifyContent: \"center\",\n },\n pageSliderBubbleText: {\n color: \"#fff\",\n fontSize: 12,\n fontWeight: \"600\",\n },\n});\n"]}
|
|
1
|
+
{"version":3,"file":"ZoomableList.js","sourceRoot":"","sources":["../src/ZoomableList.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, {\n useMemo,\n useRef,\n useState,\n createContext,\n useContext,\n} from \"react\";\nimport {\n StyleProp,\n ViewStyle,\n View,\n LayoutChangeEvent,\n StyleSheet,\n Text,\n} from \"react-native\";\nimport { GestureDetector, Gesture } from \"react-native-gesture-handler\";\nimport Animated, {\n runOnJS,\n useAnimatedRef,\n useAnimatedStyle,\n useDerivedValue,\n useSharedValue,\n scrollTo,\n withTiming,\n withDelay,\n} from \"react-native-reanimated\";\nimport { useZoomGesture, UseZoomGestureProps } from \"./zoom/index\";\nimport {\n FlashList,\n FlashListProps,\n ListRenderItemInfo,\n} from \"@shopify/flash-list\";\n\nconst AnimatedFlashList = Animated.createAnimatedComponent(FlashList as any) as any;\n\nconst PAGE_SLIDER_PADDING_Y = 16;\nconst PAGE_SLIDER_THUMB_SIZE = 28;\n\n// Context for ZoomableList state\ninterface ZoomableListContextType {\n isZoomed: boolean;\n isPanning: boolean;\n isPinching: boolean;\n width: number;\n}\n\nconst ZoomableListContext = createContext<ZoomableListContextType | undefined>(\n undefined,\n);\n\nexport const useZoomableList = () => {\n const context = useContext(ZoomableListContext);\n if (!context) {\n throw new Error(\"useZoomableList must be used within a ZoomableList\");\n }\n return context;\n};\n\nexport interface ZoomableListProps<T> extends Omit<\n FlashListProps<T>,\n \"renderItem\"\n> {\n renderItem: (\n info: ListRenderItemInfo<T> & { width: number },\n ) => React.ReactElement | null;\n style?: StyleProp<ViewStyle>;\n zoomProps?: Omit<UseZoomGestureProps, \"parentAnimatedScrollRef\">;\n onZoomChange?: (scale: number) => void;\n onZoomStateChange?: (isZoomed: boolean) => void;\n /**\n * Google Drive-style page scrubber on the right side.\n * Works best for \"page\" lists where each item is a page.\n */\n pageSliderEnabled?: boolean;\n /**\n * Label renderer for the bubble. Defaults to \"current/total\".\n * current is 1-based.\n */\n pageSliderLabel?: (current: number, total: number) => string;\n /**\n * Logo/Icon for the slider thumb.\n */\n pageSliderLogo?: React.ReactNode;\n onScrollPageNumberChanged?: (page: number) => void;\n}\n\nexport function ZoomableList<T>(props: ZoomableListProps<T>) {\n const {\n style,\n zoomProps,\n onZoomChange,\n onZoomStateChange,\n renderItem,\n pageSliderEnabled = false,\n pageSliderLabel,\n pageSliderLogo,\n onScrollPageNumberChanged,\n ...flashListProps\n } = props;\n\n const [width, setWidth] = useState(0);\n const [isZoomed, setIsZoomed] = useState(false);\n const [isPanning, setIsPanning] = useState(false);\n const [isPinching, setIsPinching] = useState(false);\n const [currentIndex, setCurrentIndex] = useState(0);\n const [isScrubbing, setIsScrubbing] = useState(false);\n const [scrubIndex, setScrubIndex] = useState(0);\n const [trackHeight, setTrackHeight] = useState(0);\n const [hasScrolled, setHasScrolled] = useState(false);\n\n // Notify parent of page changes\n React.useEffect(() => {\n onScrollPageNumberChanged?.(currentIndex + 1);\n }, [currentIndex, onScrollPageNumberChanged]);\n\n // @ts-ignore\n const listRef = useAnimatedRef<FlashList<T>>();\n\n const {\n zoomGesture,\n contentContainerAnimatedStyle,\n onLayout,\n onLayoutContent,\n onScroll,\n } = useZoomGesture({\n disableVerticalPan: true,\n parentAnimatedScrollRef: listRef,\n ...zoomProps,\n onPanningStarted: () => {\n setIsPanning(true);\n zoomProps?.onPanningStarted?.();\n },\n onPanningEnd: () => {\n setIsPanning(false);\n zoomProps?.onPanningEnd?.();\n },\n onPinchingStarted: () => {\n setIsPinching(true);\n zoomProps?.onPinchingStarted?.();\n },\n onPinchingStopped: () => {\n setIsPinching(false);\n zoomProps?.onPinchingStopped?.();\n },\n onZoomChange: (s: number) => {\n const newIsZoomed = s > 1.05; // Small buffer\n if (newIsZoomed !== isZoomed) {\n setIsZoomed(newIsZoomed);\n onZoomStateChange?.(newIsZoomed);\n }\n onZoomChange?.(s);\n },\n });\n\n const handleLayout = (e: LayoutChangeEvent) => {\n if (e.nativeEvent.layout.width !== width) {\n setWidth(e.nativeEvent.layout.width);\n }\n };\n\n const totalCount = flashListProps.data?.length ?? 0;\n const sliderEnabled = pageSliderEnabled && totalCount > 1;\n const bubbleText = (\n pageSliderLabel ?? ((cur: number, total: number) => `${cur}/${total}`)\n )((isScrubbing ? scrubIndex : currentIndex) + 1, totalCount);\n\n const onViewableItemsChanged = useRef(\n ({ viewableItems }: { viewableItems: Array<{ index: number | null }> }) => {\n const first = viewableItems?.find(\n (v) => typeof v.index === \"number\" && v.index !== null,\n );\n if (first?.index != null) setCurrentIndex(first.index);\n },\n ).current;\n\n const viewabilityConfig = useMemo(\n () => ({\n itemVisiblePercentThreshold: 55,\n minimumViewTime: 60,\n }),\n [],\n );\n\n const thumbY = useSharedValue(0);\n const bubbleOpacity = useSharedValue(0);\n const contentHeight = useSharedValue(0);\n const viewportHeight = useSharedValue(0);\n\n const handleScroll = (e: any) => {\n // Keep zoom gesture bookkeeping intact\n onScroll?.(e);\n // Preserve consumer scroll handler if provided\n (flashListProps as any).onScroll?.(e);\n\n const ne = e?.nativeEvent;\n if (ne) {\n contentHeight.value = ne.contentSize?.height ?? 0;\n viewportHeight.value = ne.layoutMeasurement?.height ?? 0;\n }\n\n if (!sliderEnabled || trackHeight <= 0) return;\n\n if (!isScrubbing) {\n // Show bubble while panning/scrolling and hide after 1s of inactivity\n bubbleOpacity.value = 1;\n bubbleOpacity.value = withDelay(1000, withTiming(0, { duration: 300 }));\n }\n\n const offsetY = ne?.contentOffset?.y ?? 0;\n const contentH = ne?.contentSize?.height ?? 0;\n const viewportH = ne?.layoutMeasurement?.height ?? 0;\n const scrollable = Math.max(1, contentH - viewportH);\n const ratio = Math.max(0, Math.min(1, offsetY / scrollable));\n thumbY.value = ratio * trackHeight;\n if (!hasScrolled) setHasScrolled(true);\n };\n\n useDerivedValue(() => {\n if (\n !sliderEnabled ||\n isScrubbing ||\n hasScrolled ||\n trackHeight <= 0 ||\n totalCount <= 1\n )\n return;\n const ratio = currentIndex / (totalCount - 1);\n thumbY.value = ratio * trackHeight;\n }, [\n currentIndex,\n isScrubbing,\n sliderEnabled,\n totalCount,\n trackHeight,\n hasScrolled,\n ]);\n\n const updateScrubFromY = (y: number) => {\n if (!sliderEnabled || trackHeight <= 0) return;\n // Gesture y is relative to the track view; normalize into usable range.\n const normalized = y - PAGE_SLIDER_PADDING_Y;\n const clamped = Math.max(0, Math.min(trackHeight, normalized));\n const ratio = trackHeight > 0 ? clamped / trackHeight : 0;\n const idx = Math.max(\n 0,\n Math.min(totalCount - 1, Math.round(ratio * (totalCount - 1))),\n );\n setScrubIndex(idx);\n };\n\n const panGesture = useMemo(() => {\n return Gesture.Pan()\n .manualActivation(true)\n .onTouchesDown((_e, manager) => {\n manager.activate();\n })\n .enabled(sliderEnabled && !isZoomed && !isPanning && !isPinching)\n .onBegin(() => {\n bubbleOpacity.value = 1;\n runOnJS(setIsScrubbing)(true);\n })\n .onUpdate((e) => {\n // keep thumbY in the same normalized coordinate space as trackHeight\n const y = Math.max(\n 0,\n Math.min(trackHeight, e.y - PAGE_SLIDER_PADDING_Y),\n );\n thumbY.value = y;\n\n if (trackHeight > 0) {\n const ratio = y / trackHeight;\n const scrollableHeight = contentHeight.value - viewportHeight.value;\n if (scrollableHeight > 0) {\n scrollTo(listRef, 0, ratio * scrollableHeight, true);\n }\n }\n\n runOnJS(updateScrubFromY)(e.y);\n })\n .onEnd(() => {\n bubbleOpacity.value = withTiming(0, { duration: 300 });\n runOnJS(setIsScrubbing)(false);\n })\n .onFinalize(() => {\n bubbleOpacity.value = withTiming(0, { duration: 300 });\n runOnJS(setIsScrubbing)(false);\n });\n }, [\n bubbleOpacity,\n isPanning,\n isPinching,\n isZoomed,\n sliderEnabled,\n thumbY,\n trackHeight,\n totalCount,\n contentHeight,\n viewportHeight,\n listRef,\n ]);\n\n const thumbStyle = useAnimatedStyle(() => {\n const y =\n trackHeight > 0 ? Math.max(0, Math.min(trackHeight, thumbY.value)) : 0;\n return {\n transform: [{ translateY: y + PAGE_SLIDER_PADDING_Y }],\n };\n }, [trackHeight]);\n\n const bubbleStyle = useAnimatedStyle(() => {\n const y =\n trackHeight > 0 ? Math.max(0, Math.min(trackHeight, thumbY.value)) : 0;\n return {\n opacity: bubbleOpacity.value,\n transform: [{ translateY: y + PAGE_SLIDER_PADDING_Y }],\n };\n });\n\n return (\n <ZoomableListContext.Provider\n value={{ isZoomed, isPanning, isPinching, width }}\n >\n <View style={[styles.container, style]} onLayout={handleLayout}>\n <GestureDetector gesture={zoomGesture}>\n <View style={{ flex: 1 }} onLayout={onLayout} collapsable={false}>\n <Animated.View\n style={[contentContainerAnimatedStyle, { flex: 1 }]}\n onLayout={onLayoutContent}\n >\n <AnimatedFlashList\n ref={listRef}\n scrollEnabled={!isZoomed && !isPanning && !isPinching}\n scrollEventThrottle={16}\n renderItem={(info: ListRenderItemInfo<T>) => renderItem({ ...info, width })}\n {...flashListProps}\n onScroll={handleScroll}\n onViewableItemsChanged={\n sliderEnabled\n ? (onViewableItemsChanged as any)\n : flashListProps.onViewableItemsChanged\n }\n viewabilityConfig={\n sliderEnabled\n ? (viewabilityConfig as any)\n : flashListProps.viewabilityConfig\n }\n />\n </Animated.View>\n </View>\n </GestureDetector>\n\n {sliderEnabled ? (\n <View pointerEvents=\"box-none\" style={styles.pageSliderOverlay}>\n <View style={styles.pageSliderGestureContainer}>\n <GestureDetector gesture={panGesture}>\n <View\n style={styles.pageSliderTrack}\n collapsable={false}\n onLayout={(e) => {\n const h = e.nativeEvent.layout.height;\n const usable = Math.max(\n 0,\n h - PAGE_SLIDER_PADDING_Y * 2 - PAGE_SLIDER_THUMB_SIZE,\n );\n setTrackHeight(usable);\n }}\n >\n <Animated.View style={[styles.pageSliderBubble, bubbleStyle]}>\n <Text style={styles.pageSliderBubbleText}>\n {bubbleText}\n </Text>\n </Animated.View>\n <Animated.View style={[styles.pageSliderThumb, thumbStyle]}>\n {pageSliderLogo}\n </Animated.View>\n </View>\n </GestureDetector>\n </View>\n </View>\n ) : null}\n </View>\n </ZoomableListContext.Provider>\n );\n}\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n overflow: \"hidden\",\n },\n pageSliderOverlay: {\n position: \"absolute\",\n right: 0,\n top: 0,\n bottom: 0,\n width: 10,\n alignItems: \"flex-end\",\n justifyContent: \"flex-start\",\n },\n pageSliderGestureContainer: {\n flex: 1,\n alignSelf: \"stretch\",\n alignItems: \"flex-end\",\n },\n pageSliderTrack: {\n flex: 1,\n width: 10,\n alignItems: \"flex-end\",\n justifyContent: \"flex-start\",\n paddingVertical: 16,\n },\n pageSliderThumb: {\n position: \"absolute\",\n right: 2,\n width: 38,\n height: 38,\n borderRadius: 999,\n backgroundColor: \"rgba(255,255,255,0.92)\",\n borderWidth: 1,\n borderColor: \"rgba(0,0,0,0.12)\",\n shadowColor: \"#000\",\n shadowOpacity: 0.15,\n shadowRadius: 6,\n shadowOffset: { width: 0, height: 2 },\n elevation: 3,\n alignItems: \"center\",\n justifyContent: \"center\",\n },\n pageSliderBubble: {\n position: \"absolute\",\n right: 38,\n minWidth: 80,\n paddingHorizontal: 8,\n paddingVertical: 10,\n borderRadius: 999,\n backgroundColor: \"rgba(0,0,0,0.82)\",\n alignItems: \"center\",\n justifyContent: \"center\",\n },\n pageSliderBubbleText: {\n color: \"#fff\",\n fontSize: 12,\n fontWeight: \"600\",\n },\n});\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "rn-pdf-king",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"description": "The one and only best pdf library that efficiently handle 1000 page pdf with memeory mangement , easy selection , very customizable and allow pdf to edit",
|
|
5
5
|
"main": "build/index.js",
|
|
6
6
|
"types": "build/index.d.ts",
|
package/src/RnPdfKingModule.ts
CHANGED
|
@@ -8,6 +8,8 @@ declare class RnPdfKingModule extends NativeModule<RnPdfKingModuleEvents> {
|
|
|
8
8
|
setValueAsync(value: string): Promise<void>;
|
|
9
9
|
pickFile(): Promise<void>;
|
|
10
10
|
loadPdf(path: string): Promise<void>;
|
|
11
|
+
getPageBitmapBase64(pageNo: number): Promise<string>;
|
|
12
|
+
getTextChars(pageNo: number): Promise<string>;
|
|
11
13
|
checkInitialIntent(): Promise<boolean>;
|
|
12
14
|
}
|
|
13
15
|
|
package/src/ZoomableList.tsx
CHANGED
|
@@ -81,6 +81,7 @@ export interface ZoomableListProps<T> extends Omit<
|
|
|
81
81
|
* Logo/Icon for the slider thumb.
|
|
82
82
|
*/
|
|
83
83
|
pageSliderLogo?: React.ReactNode;
|
|
84
|
+
onScrollPageNumberChanged?: (page: number) => void;
|
|
84
85
|
}
|
|
85
86
|
|
|
86
87
|
export function ZoomableList<T>(props: ZoomableListProps<T>) {
|
|
@@ -93,6 +94,7 @@ export function ZoomableList<T>(props: ZoomableListProps<T>) {
|
|
|
93
94
|
pageSliderEnabled = false,
|
|
94
95
|
pageSliderLabel,
|
|
95
96
|
pageSliderLogo,
|
|
97
|
+
onScrollPageNumberChanged,
|
|
96
98
|
...flashListProps
|
|
97
99
|
} = props;
|
|
98
100
|
|
|
@@ -106,6 +108,11 @@ export function ZoomableList<T>(props: ZoomableListProps<T>) {
|
|
|
106
108
|
const [trackHeight, setTrackHeight] = useState(0);
|
|
107
109
|
const [hasScrolled, setHasScrolled] = useState(false);
|
|
108
110
|
|
|
111
|
+
// Notify parent of page changes
|
|
112
|
+
React.useEffect(() => {
|
|
113
|
+
onScrollPageNumberChanged?.(currentIndex + 1);
|
|
114
|
+
}, [currentIndex, onScrollPageNumberChanged]);
|
|
115
|
+
|
|
109
116
|
// @ts-ignore
|
|
110
117
|
const listRef = useAnimatedRef<FlashList<T>>();
|
|
111
118
|
|