react-native-gesture-image-viewer 2.1.2 → 2.1.4
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/README.md +1 -1
- package/lib/module/GestureTrigger.js.map +1 -1
- package/lib/module/GestureViewer.js +23 -6
- package/lib/module/GestureViewer.js.map +1 -1
- package/lib/module/GestureViewerManager.js +26 -6
- package/lib/module/GestureViewerManager.js.map +1 -1
- package/lib/module/GestureViewerRegistry.js.map +1 -1
- package/lib/module/WebPagingFixStyle.js.map +1 -1
- package/lib/module/useGestureViewer.js +205 -229
- package/lib/module/useGestureViewer.js.map +1 -1
- package/lib/module/useGestureViewerController.js.map +1 -1
- package/lib/module/useGestureViewerEvent.js.map +1 -1
- package/lib/module/useGestureViewerPaging.js +68 -0
- package/lib/module/useGestureViewerPaging.js.map +1 -0
- package/lib/module/useGestureViewerPaging.types.js +4 -0
- package/lib/module/useGestureViewerPaging.types.js.map +1 -0
- package/lib/module/useGestureViewerPaging.web.js +241 -0
- package/lib/module/useGestureViewerPaging.web.js.map +1 -0
- package/lib/module/useGestureViewerState.js.map +1 -1
- package/lib/module/utils/index.js +23 -16
- package/lib/module/utils/index.js.map +1 -1
- package/lib/module/utils/tapZoom.js +34 -0
- package/lib/module/utils/tapZoom.js.map +1 -0
- package/lib/module/utils/webScroll.js +70 -0
- package/lib/module/utils/webScroll.js.map +1 -0
- package/lib/typescript/src/GestureTrigger.d.ts +1 -1
- package/lib/typescript/src/GestureTrigger.d.ts.map +1 -1
- package/lib/typescript/src/GestureViewer.d.ts.map +1 -1
- package/lib/typescript/src/GestureViewerManager.d.ts +5 -0
- package/lib/typescript/src/GestureViewerManager.d.ts.map +1 -1
- package/lib/typescript/src/GestureViewerRegistry.d.ts.map +1 -1
- package/lib/typescript/src/WebPagingFixStyle.d.ts.map +1 -1
- package/lib/typescript/src/types.d.ts.map +1 -1
- package/lib/typescript/src/useGestureViewer.d.ts +13 -11
- package/lib/typescript/src/useGestureViewer.d.ts.map +1 -1
- package/lib/typescript/src/useGestureViewerController.d.ts.map +1 -1
- package/lib/typescript/src/useGestureViewerEvent.d.ts.map +1 -1
- package/lib/typescript/src/useGestureViewerPaging.d.ts +3 -0
- package/lib/typescript/src/useGestureViewerPaging.d.ts.map +1 -0
- package/lib/typescript/src/useGestureViewerPaging.types.d.ts +32 -0
- package/lib/typescript/src/useGestureViewerPaging.types.d.ts.map +1 -0
- package/lib/typescript/src/useGestureViewerPaging.web.d.ts +3 -0
- package/lib/typescript/src/useGestureViewerPaging.web.d.ts.map +1 -0
- package/lib/typescript/src/useGestureViewerState.d.ts.map +1 -1
- package/lib/typescript/src/utils/index.d.ts +8 -1
- package/lib/typescript/src/utils/index.d.ts.map +1 -1
- package/lib/typescript/src/utils/tapZoom.d.ts +12 -0
- package/lib/typescript/src/utils/tapZoom.d.ts.map +1 -0
- package/lib/typescript/src/utils/webScroll.d.ts +18 -0
- package/lib/typescript/src/utils/webScroll.d.ts.map +1 -0
- package/package.json +86 -80
- package/src/GestureTrigger.tsx +9 -2
- package/src/GestureViewer.tsx +77 -28
- package/src/GestureViewerManager.ts +62 -12
- package/src/GestureViewerRegistry.ts +1 -0
- package/src/WebPagingFixStyle.tsx +1 -0
- package/src/types.ts +44 -32
- package/src/useGestureViewer.ts +292 -313
- package/src/useGestureViewerController.ts +1 -0
- package/src/useGestureViewerEvent.ts +5 -1
- package/src/useGestureViewerPaging.ts +112 -0
- package/src/useGestureViewerPaging.types.ts +34 -0
- package/src/useGestureViewerPaging.web.ts +390 -0
- package/src/useGestureViewerState.ts +1 -0
- package/src/utils/index.ts +48 -16
- package/src/utils/tapZoom.ts +44 -0
- package/src/utils/webScroll.ts +96 -0
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { SharedValue } from 'react-native-reanimated';
|
|
2
|
+
import { Easing, withTiming } from 'react-native-reanimated';
|
|
3
|
+
|
|
4
|
+
export const applyTapZoomAtPoint = ({
|
|
5
|
+
x,
|
|
6
|
+
y,
|
|
7
|
+
width,
|
|
8
|
+
height,
|
|
9
|
+
maxZoomScale,
|
|
10
|
+
scale,
|
|
11
|
+
translateX,
|
|
12
|
+
translateY,
|
|
13
|
+
}: {
|
|
14
|
+
x: number;
|
|
15
|
+
y: number;
|
|
16
|
+
width: number;
|
|
17
|
+
height: number;
|
|
18
|
+
maxZoomScale: number;
|
|
19
|
+
scale: SharedValue<number>;
|
|
20
|
+
translateX: SharedValue<number>;
|
|
21
|
+
translateY: SharedValue<number>;
|
|
22
|
+
}) => {
|
|
23
|
+
'worklet';
|
|
24
|
+
|
|
25
|
+
const nextScale = scale.value > 1 ? 1 : maxZoomScale;
|
|
26
|
+
const timingConfig = {
|
|
27
|
+
duration: 300,
|
|
28
|
+
easing: Easing.bezier(0.25, 0.1, 0.25, 1),
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
if (nextScale > 1) {
|
|
32
|
+
const centerX = x - width / 2;
|
|
33
|
+
const centerY = y - height / 2;
|
|
34
|
+
|
|
35
|
+
// NOTE 확대로 밀려난 거리만큼 반대로 이동해서 탭 지점을 제자리에 유지
|
|
36
|
+
translateX.value = withTiming(-centerX * (nextScale - 1), timingConfig);
|
|
37
|
+
translateY.value = withTiming(-centerY * (nextScale - 1), timingConfig);
|
|
38
|
+
} else {
|
|
39
|
+
translateX.value = withTiming(0, timingConfig);
|
|
40
|
+
translateY.value = withTiming(0, timingConfig);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
scale.value = withTiming(nextScale, timingConfig);
|
|
44
|
+
};
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
export const getWebScrollPhysicalIndex = (offsetX: number, pageWidth: number): number => {
|
|
2
|
+
if (!Number.isFinite(offsetX) || !Number.isFinite(pageWidth) || pageWidth <= 0) {
|
|
3
|
+
return 0;
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
return Math.max(0, Math.round(offsetX / pageWidth));
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
export const resolveWebScrollFinalState = ({
|
|
10
|
+
dataLength,
|
|
11
|
+
enableLoop,
|
|
12
|
+
lastSettledPhysicalIndex,
|
|
13
|
+
offsetX,
|
|
14
|
+
pageWidth,
|
|
15
|
+
}: {
|
|
16
|
+
offsetX: number;
|
|
17
|
+
pageWidth: number;
|
|
18
|
+
lastSettledPhysicalIndex: number;
|
|
19
|
+
dataLength: number;
|
|
20
|
+
enableLoop: boolean;
|
|
21
|
+
}): { logicalIndex: number; rawPhysicalIndex: number; settledPhysicalIndex: number } | null => {
|
|
22
|
+
if (
|
|
23
|
+
dataLength <= 0 ||
|
|
24
|
+
!Number.isFinite(offsetX) ||
|
|
25
|
+
!Number.isFinite(pageWidth) ||
|
|
26
|
+
pageWidth <= 0
|
|
27
|
+
) {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const maxPhysicalIndex = enableLoop && dataLength > 1 ? dataLength + 1 : dataLength - 1;
|
|
32
|
+
const rawPhysicalIndex = getWebScrollPhysicalIndex(offsetX, pageWidth);
|
|
33
|
+
|
|
34
|
+
if (enableLoop && dataLength > 1) {
|
|
35
|
+
const isWrappingBackward = lastSettledPhysicalIndex === 1 && rawPhysicalIndex >= dataLength;
|
|
36
|
+
const isWrappingForward = lastSettledPhysicalIndex === dataLength && rawPhysicalIndex <= 1;
|
|
37
|
+
|
|
38
|
+
if (isWrappingBackward || rawPhysicalIndex === 0) {
|
|
39
|
+
return {
|
|
40
|
+
logicalIndex: dataLength - 1,
|
|
41
|
+
rawPhysicalIndex,
|
|
42
|
+
settledPhysicalIndex: dataLength,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
if (isWrappingForward || rawPhysicalIndex >= dataLength + 1) {
|
|
47
|
+
return {
|
|
48
|
+
logicalIndex: 0,
|
|
49
|
+
rawPhysicalIndex,
|
|
50
|
+
settledPhysicalIndex: 1,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
const targetPhysicalIndex = Math.max(0, Math.min(maxPhysicalIndex, rawPhysicalIndex));
|
|
56
|
+
|
|
57
|
+
if (enableLoop && dataLength > 1) {
|
|
58
|
+
return {
|
|
59
|
+
logicalIndex: targetPhysicalIndex - 1,
|
|
60
|
+
rawPhysicalIndex,
|
|
61
|
+
settledPhysicalIndex: targetPhysicalIndex,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
return {
|
|
66
|
+
logicalIndex: targetPhysicalIndex,
|
|
67
|
+
rawPhysicalIndex,
|
|
68
|
+
settledPhysicalIndex: targetPhysicalIndex,
|
|
69
|
+
};
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
export const getWebAutoPlayTargetPhysicalIndex = ({
|
|
73
|
+
currentIndex,
|
|
74
|
+
dataLength,
|
|
75
|
+
enableLoop,
|
|
76
|
+
}: {
|
|
77
|
+
currentIndex: number;
|
|
78
|
+
dataLength: number;
|
|
79
|
+
enableLoop: boolean;
|
|
80
|
+
}): number | null => {
|
|
81
|
+
if (dataLength <= 1) {
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
if (enableLoop && currentIndex === dataLength - 1) {
|
|
86
|
+
return dataLength + 1;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
const nextIndex = currentIndex + 1;
|
|
90
|
+
|
|
91
|
+
if (nextIndex >= dataLength) {
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
return enableLoop ? nextIndex + 1 : nextIndex;
|
|
96
|
+
};
|