react-native-gesture-image-viewer 0.2.0 → 0.3.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.
Files changed (34) hide show
  1. package/lib/module/GestureImageViewer.js +8 -1
  2. package/lib/module/GestureImageViewer.js.map +1 -1
  3. package/lib/module/ImageViewerManager.js +78 -0
  4. package/lib/module/ImageViewerManager.js.map +1 -0
  5. package/lib/module/ImageViewerRegistry.js +50 -0
  6. package/lib/module/ImageViewerRegistry.js.map +1 -0
  7. package/lib/module/index.js +1 -0
  8. package/lib/module/index.js.map +1 -1
  9. package/lib/module/useGestureImageViewer.js +50 -44
  10. package/lib/module/useGestureImageViewer.js.map +1 -1
  11. package/lib/module/useImageViewerController.js +42 -0
  12. package/lib/module/useImageViewerController.js.map +1 -0
  13. package/lib/typescript/src/GestureImageViewer.d.ts +1 -1
  14. package/lib/typescript/src/GestureImageViewer.d.ts.map +1 -1
  15. package/lib/typescript/src/ImageViewerManager.d.ts +28 -0
  16. package/lib/typescript/src/ImageViewerManager.d.ts.map +1 -0
  17. package/lib/typescript/src/ImageViewerRegistry.d.ts +13 -0
  18. package/lib/typescript/src/ImageViewerRegistry.d.ts.map +1 -0
  19. package/lib/typescript/src/index.d.ts +1 -0
  20. package/lib/typescript/src/index.d.ts.map +1 -1
  21. package/lib/typescript/src/types.d.ts +1 -0
  22. package/lib/typescript/src/types.d.ts.map +1 -1
  23. package/lib/typescript/src/useGestureImageViewer.d.ts +1 -4
  24. package/lib/typescript/src/useGestureImageViewer.d.ts.map +1 -1
  25. package/lib/typescript/src/useImageViewerController.d.ts +8 -0
  26. package/lib/typescript/src/useImageViewerController.d.ts.map +1 -0
  27. package/package.json +1 -1
  28. package/src/GestureImageViewer.tsx +10 -1
  29. package/src/ImageViewerManager.ts +92 -0
  30. package/src/ImageViewerRegistry.ts +66 -0
  31. package/src/index.tsx +1 -0
  32. package/src/types.ts +1 -0
  33. package/src/useGestureImageViewer.ts +64 -47
  34. package/src/useImageViewerController.ts +48 -0
@@ -1,9 +1,10 @@
1
1
  "use strict";
2
2
 
3
- import { useCallback, useMemo } from 'react';
3
+ import { useCallback, useEffect, useMemo } from 'react';
4
4
  import { Platform, StyleSheet, useWindowDimensions, View } from 'react-native';
5
5
  import { FlatList, Gesture, GestureDetector, GestureHandlerRootView } from 'react-native-gesture-handler';
6
6
  import Animated from 'react-native-reanimated';
7
+ import { registry } from "./ImageViewerRegistry.js";
7
8
  import { useGestureImageViewer } from "./useGestureImageViewer.js";
8
9
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
9
10
  const WebPagingFix = () => {
@@ -15,6 +16,7 @@ const WebPagingFix = () => {
15
16
  });
16
17
  };
17
18
  export function GestureImageViewer({
19
+ id = 'default',
18
20
  data,
19
21
  renderImage,
20
22
  renderContainer,
@@ -40,6 +42,7 @@ export function GestureImageViewer({
40
42
  animatedStyle,
41
43
  backdropStyle
42
44
  } = useGestureImageViewer({
45
+ id,
43
46
  data,
44
47
  width,
45
48
  initialIndex,
@@ -69,6 +72,10 @@ export function GestureImageViewer({
69
72
  const gesture = useMemo(() => {
70
73
  return Gesture.Race(dismissGesture, zoomGesture);
71
74
  }, [zoomGesture, dismissGesture]);
75
+ useEffect(() => {
76
+ registry.createManager(id);
77
+ return () => registry.deleteManager(id);
78
+ }, [id]);
72
79
  const listComponent = /*#__PURE__*/_jsx(GestureHandlerRootView, {
73
80
  children: /*#__PURE__*/_jsx(GestureDetector, {
74
81
  gesture: gesture,
@@ -1 +1 @@
1
- {"version":3,"names":["useCallback","useMemo","Platform","StyleSheet","useWindowDimensions","View","FlatList","Gesture","GestureDetector","GestureHandlerRootView","Animated","useGestureImageViewer","jsx","_jsx","jsxs","_jsxs","WebPagingFix","OS","children","GestureImageViewer","data","renderImage","renderContainer","ListComponent","width","customWidth","listProps","backdropStyle","backdropStyleProps","containerStyle","initialIndex","props","screenWidth","currentIndex","flatListRef","isZoomed","dismissGesture","zoomGesture","onMomentumScrollEnd","animatedStyle","renderItem","item","index","isActive","style","height","justifyContent","alignItems","getItemLayout","_","length","offset","keyExtractor","gesture","Race","listComponent","styles","container","background","content","ref","horizontal","pagingEnabled","scrollEnabled","showsHorizontalScrollIndicator","initialScrollIndex","windowSize","maxToRenderPerBatch","removeClippedSubviews","dataSet","create","flex","position","top","left","right","bottom","backgroundColor"],"sourceRoot":"../../src","sources":["GestureImageViewer.tsx"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["useCallback","useEffect","useMemo","Platform","StyleSheet","useWindowDimensions","View","FlatList","Gesture","GestureDetector","GestureHandlerRootView","Animated","registry","useGestureImageViewer","jsx","_jsx","jsxs","_jsxs","WebPagingFix","OS","children","GestureImageViewer","id","data","renderImage","renderContainer","ListComponent","width","customWidth","listProps","backdropStyle","backdropStyleProps","containerStyle","initialIndex","props","screenWidth","currentIndex","flatListRef","isZoomed","dismissGesture","zoomGesture","onMomentumScrollEnd","animatedStyle","renderItem","item","index","isActive","style","height","justifyContent","alignItems","getItemLayout","_","length","offset","keyExtractor","gesture","Race","createManager","deleteManager","listComponent","styles","container","background","content","ref","horizontal","pagingEnabled","scrollEnabled","showsHorizontalScrollIndicator","initialScrollIndex","windowSize","maxToRenderPerBatch","removeClippedSubviews","dataSet","create","flex","position","top","left","right","bottom","backgroundColor"],"sourceRoot":"../../src","sources":["GestureImageViewer.tsx"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,78 @@
1
+ "use strict";
2
+
3
+ class ImageViewerManager {
4
+ currentIndex = 0;
5
+ dataLength = 0;
6
+ flatListRef = null;
7
+ enableSwipeGesture = true;
8
+ listeners = new Set();
9
+
10
+ // private updateState(newState: Partial<any>) {
11
+ // Object.assign(this, newState);
12
+ // this.notifyListeners();
13
+ // }
14
+
15
+ notifyListeners() {
16
+ const state = this.getState();
17
+ this.listeners.forEach(listener => listener(state));
18
+ }
19
+ subscribe(listener) {
20
+ this.listeners.add(listener);
21
+ return () => {
22
+ this.listeners.delete(listener);
23
+ };
24
+ }
25
+ getState() {
26
+ return {
27
+ currentIndex: this.currentIndex,
28
+ dataLength: this.dataLength
29
+ };
30
+ }
31
+ setFlatListRef(ref) {
32
+ this.flatListRef = ref;
33
+ }
34
+ setDataLength(length) {
35
+ this.dataLength = length;
36
+ }
37
+ setEnableSwipeGesture(enabled) {
38
+ this.enableSwipeGesture = enabled;
39
+ }
40
+ setCurrentIndex(index) {
41
+ if (index !== this.currentIndex) {
42
+ this.currentIndex = index;
43
+ }
44
+ }
45
+ notifyStateChange() {
46
+ this.notifyListeners();
47
+ }
48
+ goToIndex = index => {
49
+ if (index < 0 || index >= this.dataLength || !this.enableSwipeGesture || !this.flatListRef) {
50
+ return;
51
+ }
52
+ this.currentIndex = index;
53
+ this.flatListRef.scrollToIndex({
54
+ index,
55
+ animated: true
56
+ });
57
+ this.notifyListeners();
58
+ };
59
+ goToPrevious = () => {
60
+ if (this.currentIndex > 0) {
61
+ this.goToIndex(this.currentIndex - 1);
62
+ }
63
+ };
64
+ goToNext = () => {
65
+ if (this.currentIndex < this.dataLength - 1) {
66
+ this.goToIndex(this.currentIndex + 1);
67
+ }
68
+ };
69
+ cleanUp() {
70
+ this.listeners.clear();
71
+ this.flatListRef = null;
72
+ this.enableSwipeGesture = true;
73
+ this.currentIndex = 0;
74
+ this.dataLength = 0;
75
+ }
76
+ }
77
+ export default ImageViewerManager;
78
+ //# sourceMappingURL=ImageViewerManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["ImageViewerManager","currentIndex","dataLength","flatListRef","enableSwipeGesture","listeners","Set","notifyListeners","state","getState","forEach","listener","subscribe","add","delete","setFlatListRef","ref","setDataLength","length","setEnableSwipeGesture","enabled","setCurrentIndex","index","notifyStateChange","goToIndex","scrollToIndex","animated","goToPrevious","goToNext","cleanUp","clear"],"sourceRoot":"../../src","sources":["ImageViewerManager.ts"],"mappings":";;AAKA,MAAMA,kBAAkB,CAAC;EACfC,YAAY,GAAG,CAAC;EAChBC,UAAU,GAAG,CAAC;EACdC,WAAW,GAAQ,IAAI;EACvBC,kBAAkB,GAAG,IAAI;EACzBC,SAAS,GAAG,IAAIC,GAAG,CAA2C,CAAC;;EAEvE;EACA;EACA;EACA;;EAEQC,eAAeA,CAAA,EAAG;IACxB,MAAMC,KAAK,GAAG,IAAI,CAACC,QAAQ,CAAC,CAAC;IAE7B,IAAI,CAACJ,SAAS,CAACK,OAAO,CAAEC,QAAQ,IAAKA,QAAQ,CAACH,KAAK,CAAC,CAAC;EACvD;EAEAI,SAASA,CAACD,QAAkD,EAAE;IAC5D,IAAI,CAACN,SAAS,CAACQ,GAAG,CAACF,QAAQ,CAAC;IAE5B,OAAO,MAAM;MACX,IAAI,CAACN,SAAS,CAACS,MAAM,CAACH,QAAQ,CAAC;IACjC,CAAC;EACH;EAEAF,QAAQA,CAAA,EAAG;IACT,OAAO;MACLR,YAAY,EAAE,IAAI,CAACA,YAAY;MAC/BC,UAAU,EAAE,IAAI,CAACA;IACnB,CAAC;EACH;EAEAa,cAAcA,CAACC,GAAQ,EAAE;IACvB,IAAI,CAACb,WAAW,GAAGa,GAAG;EACxB;EAEAC,aAAaA,CAACC,MAAc,EAAE;IAC5B,IAAI,CAAChB,UAAU,GAAGgB,MAAM;EAC1B;EAEAC,qBAAqBA,CAACC,OAAgB,EAAE;IACtC,IAAI,CAAChB,kBAAkB,GAAGgB,OAAO;EACnC;EAEAC,eAAeA,CAACC,KAAa,EAAE;IAC7B,IAAIA,KAAK,KAAK,IAAI,CAACrB,YAAY,EAAE;MAC/B,IAAI,CAACA,YAAY,GAAGqB,KAAK;IAC3B;EACF;EAEAC,iBAAiBA,CAAA,EAAG;IAClB,IAAI,CAAChB,eAAe,CAAC,CAAC;EACxB;EAEAiB,SAAS,GAAIF,KAAa,IAAK;IAC7B,IAAIA,KAAK,GAAG,CAAC,IAAIA,KAAK,IAAI,IAAI,CAACpB,UAAU,IAAI,CAAC,IAAI,CAACE,kBAAkB,IAAI,CAAC,IAAI,CAACD,WAAW,EAAE;MAC1F;IACF;IAEA,IAAI,CAACF,YAAY,GAAGqB,KAAK;IACzB,IAAI,CAACnB,WAAW,CAACsB,aAAa,CAAC;MAAEH,KAAK;MAAEI,QAAQ,EAAE;IAAK,CAAC,CAAC;IACzD,IAAI,CAACnB,eAAe,CAAC,CAAC;EACxB,CAAC;EAEDoB,YAAY,GAAGA,CAAA,KAAM;IACnB,IAAI,IAAI,CAAC1B,YAAY,GAAG,CAAC,EAAE;MACzB,IAAI,CAACuB,SAAS,CAAC,IAAI,CAACvB,YAAY,GAAG,CAAC,CAAC;IACvC;EACF,CAAC;EAED2B,QAAQ,GAAGA,CAAA,KAAM;IACf,IAAI,IAAI,CAAC3B,YAAY,GAAG,IAAI,CAACC,UAAU,GAAG,CAAC,EAAE;MAC3C,IAAI,CAACsB,SAAS,CAAC,IAAI,CAACvB,YAAY,GAAG,CAAC,CAAC;IACvC;EACF,CAAC;EAED4B,OAAOA,CAAA,EAAG;IACR,IAAI,CAACxB,SAAS,CAACyB,KAAK,CAAC,CAAC;IACtB,IAAI,CAAC3B,WAAW,GAAG,IAAI;IACvB,IAAI,CAACC,kBAAkB,GAAG,IAAI;IAC9B,IAAI,CAACH,YAAY,GAAG,CAAC;IACrB,IAAI,CAACC,UAAU,GAAG,CAAC;EACrB;AACF;AAEA,eAAeF,kBAAkB","ignoreList":[]}
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+
3
+ import ImageViewerManager from "./ImageViewerManager.js";
4
+ class ImageViewerRegistry {
5
+ managers = new Map();
6
+ subscribers = new Map();
7
+ subscribeToManager(id, callback) {
8
+ if (!this.subscribers.has(id)) {
9
+ this.subscribers.set(id, new Set());
10
+ }
11
+ this.subscribers.get(id)?.add(callback);
12
+ const manager = this.managers.get(id) || null;
13
+ callback(manager);
14
+ return () => {
15
+ const subscribers = this.subscribers.get(id);
16
+ subscribers?.delete(callback);
17
+ if (subscribers && subscribers.size === 0) {
18
+ this.subscribers.delete(id);
19
+ }
20
+ };
21
+ }
22
+ createManager(id) {
23
+ if (this.managers.has(id)) {
24
+ return this.managers.get(id) || null;
25
+ }
26
+ const manager = new ImageViewerManager();
27
+ this.managers.set(id, manager);
28
+ this.notifySubscribers(id, manager);
29
+ return manager;
30
+ }
31
+ getManager(id) {
32
+ return this.managers.get(id) || null;
33
+ }
34
+ deleteManager(id) {
35
+ const manager = this.managers.get(id);
36
+ if (manager) {
37
+ manager.cleanUp();
38
+ this.managers.delete(id);
39
+ this.notifySubscribers(id, null);
40
+ }
41
+ }
42
+ notifySubscribers(id, manager) {
43
+ const listeners = this.subscribers.get(id);
44
+ if (listeners) {
45
+ [...listeners].forEach(callback => callback(manager));
46
+ }
47
+ }
48
+ }
49
+ export const registry = new ImageViewerRegistry();
50
+ //# sourceMappingURL=ImageViewerRegistry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["ImageViewerManager","ImageViewerRegistry","managers","Map","subscribers","subscribeToManager","id","callback","has","set","Set","get","add","manager","delete","size","createManager","notifySubscribers","getManager","deleteManager","cleanUp","listeners","forEach","registry"],"sourceRoot":"../../src","sources":["ImageViewerRegistry.ts"],"mappings":";;AAAA,OAAOA,kBAAkB,MAAM,yBAAsB;AAErD,MAAMC,mBAAmB,CAAC;EAChBC,QAAQ,GAAG,IAAIC,GAAG,CAA6B,CAAC;EAChDC,WAAW,GAAG,IAAID,GAAG,CAA4D,CAAC;EAE1FE,kBAAkBA,CAACC,EAAU,EAAEC,QAAsD,EAAE;IACrF,IAAI,CAAC,IAAI,CAACH,WAAW,CAACI,GAAG,CAACF,EAAE,CAAC,EAAE;MAC7B,IAAI,CAACF,WAAW,CAACK,GAAG,CAACH,EAAE,EAAE,IAAII,GAAG,CAAC,CAAC,CAAC;IACrC;IAEA,IAAI,CAACN,WAAW,CAACO,GAAG,CAACL,EAAE,CAAC,EAAEM,GAAG,CAACL,QAAQ,CAAC;IAEvC,MAAMM,OAAO,GAAG,IAAI,CAACX,QAAQ,CAACS,GAAG,CAACL,EAAE,CAAC,IAAI,IAAI;IAE7CC,QAAQ,CAACM,OAAO,CAAC;IAEjB,OAAO,MAAM;MACX,MAAMT,WAAW,GAAG,IAAI,CAACA,WAAW,CAACO,GAAG,CAACL,EAAE,CAAC;MAE5CF,WAAW,EAAEU,MAAM,CAACP,QAAQ,CAAC;MAE7B,IAAIH,WAAW,IAAIA,WAAW,CAACW,IAAI,KAAK,CAAC,EAAE;QACzC,IAAI,CAACX,WAAW,CAACU,MAAM,CAACR,EAAE,CAAC;MAC7B;IACF,CAAC;EACH;EAEAU,aAAaA,CAACV,EAAU,EAA6B;IACnD,IAAI,IAAI,CAACJ,QAAQ,CAACM,GAAG,CAACF,EAAE,CAAC,EAAE;MACzB,OAAO,IAAI,CAACJ,QAAQ,CAACS,GAAG,CAACL,EAAE,CAAC,IAAI,IAAI;IACtC;IAEA,MAAMO,OAAO,GAAG,IAAIb,kBAAkB,CAAC,CAAC;IACxC,IAAI,CAACE,QAAQ,CAACO,GAAG,CAACH,EAAE,EAAEO,OAAO,CAAC;IAE9B,IAAI,CAACI,iBAAiB,CAACX,EAAE,EAAEO,OAAO,CAAC;IAEnC,OAAOA,OAAO;EAChB;EAEAK,UAAUA,CAACZ,EAAU,EAA6B;IAChD,OAAO,IAAI,CAACJ,QAAQ,CAACS,GAAG,CAACL,EAAE,CAAC,IAAI,IAAI;EACtC;EAEAa,aAAaA,CAACb,EAAU,EAAE;IACxB,MAAMO,OAAO,GAAG,IAAI,CAACX,QAAQ,CAACS,GAAG,CAACL,EAAE,CAAC;IAErC,IAAIO,OAAO,EAAE;MACXA,OAAO,CAACO,OAAO,CAAC,CAAC;MACjB,IAAI,CAAClB,QAAQ,CAACY,MAAM,CAACR,EAAE,CAAC;MAExB,IAAI,CAACW,iBAAiB,CAACX,EAAE,EAAE,IAAI,CAAC;IAClC;EACF;EAEAW,iBAAiBA,CAACX,EAAU,EAAEO,OAAkC,EAAE;IAChE,MAAMQ,SAAS,GAAG,IAAI,CAACjB,WAAW,CAACO,GAAG,CAACL,EAAE,CAAC;IAE1C,IAAIe,SAAS,EAAE;MACb,CAAC,GAAGA,SAAS,CAAC,CAACC,OAAO,CAAEf,QAAQ,IAAKA,QAAQ,CAACM,OAAO,CAAC,CAAC;IACzD;EACF;AACF;AAEA,OAAO,MAAMU,QAAQ,GAAG,IAAItB,mBAAmB,CAAC,CAAC","ignoreList":[]}
@@ -1,4 +1,5 @@
1
1
  "use strict";
2
2
 
3
3
  export { GestureImageViewer } from "./GestureImageViewer.js";
4
+ export { useImageViewerController } from "./useImageViewerController.js";
4
5
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["GestureImageViewer"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;AAAA,SAASA,kBAAkB,QAAQ,yBAAsB","ignoreList":[]}
1
+ {"version":3,"names":["GestureImageViewer","useImageViewerController"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;AAAA,SAASA,kBAAkB,QAAQ,yBAAsB;AAEzD,SAASC,wBAAwB,QAAQ,+BAA4B","ignoreList":[]}
@@ -4,6 +4,7 @@ import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
4
4
  import { InteractionManager, useWindowDimensions } from 'react-native';
5
5
  import { Gesture } from 'react-native-gesture-handler';
6
6
  import { Easing, interpolate, runOnJS, useAnimatedReaction, useAnimatedStyle, useSharedValue, withSpring, withTiming } from 'react-native-reanimated';
7
+ import { registry } from "./ImageViewerRegistry.js";
7
8
  export const useGestureImageViewer = ({
8
9
  data,
9
10
  initialIndex = 0,
@@ -20,15 +21,18 @@ export const useGestureImageViewer = ({
20
21
  enableZoomGesture = true,
21
22
  enableDoubleTapGesture = true,
22
23
  enableZoomPanGesture = true,
23
- maxZoomScale = 2
24
+ maxZoomScale = 2,
25
+ id = 'default'
24
26
  }) => {
25
27
  const {
26
28
  width: screenWidth,
27
29
  height: screenHeight
28
30
  } = useWindowDimensions();
29
31
  const width = customWidth || screenWidth;
30
- const [currentIndex, setCurrentIndex] = useState(initialIndex);
31
32
  const [isZoomed, setIsZoomed] = useState(false);
33
+ const [currentIndex, setCurrentIndex] = useState(initialIndex);
34
+ const [manager, setManager] = useState(null);
35
+ const unsubscribeRef = useRef(null);
32
36
  const initialTranslateY = useSharedValue(0);
33
37
  const initialTranslateX = useSharedValue(0);
34
38
  const startScale = useSharedValue(1);
@@ -41,10 +45,45 @@ export const useGestureImageViewer = ({
41
45
  useAnimatedReaction(() => scale.value, currentScale => {
42
46
  runOnJS(setIsZoomed)(currentScale > 1);
43
47
  });
44
-
45
- // 초기 위치 설정
46
48
  useEffect(() => {
47
- setCurrentIndex(initialIndex);
49
+ const handleManagerChange = manager => {
50
+ unsubscribeRef.current?.();
51
+ unsubscribeRef.current = null;
52
+ setManager(manager);
53
+ if (manager) {
54
+ setCurrentIndex(manager.getState().currentIndex);
55
+ unsubscribeRef.current = manager.subscribe(state => {
56
+ setCurrentIndex(state.currentIndex);
57
+ });
58
+ return;
59
+ }
60
+ setCurrentIndex(0);
61
+ };
62
+ const unsubscribeFromRegistry = registry.subscribeToManager(id, handleManagerChange);
63
+ return () => {
64
+ unsubscribeFromRegistry();
65
+ unsubscribeRef.current?.();
66
+ };
67
+ }, [id]);
68
+ useEffect(() => {
69
+ if (!manager) {
70
+ return;
71
+ }
72
+ manager.setDataLength(dataLength);
73
+ manager.setEnableSwipeGesture(enableSwipeGesture);
74
+ manager.setCurrentIndex(initialIndex);
75
+ manager.notifyStateChange();
76
+ }, [dataLength, enableSwipeGesture, initialIndex, manager]);
77
+ useEffect(() => {
78
+ if (!manager || !flatListRef.current) {
79
+ return;
80
+ }
81
+ manager.setFlatListRef(flatListRef.current);
82
+ }, [manager]);
83
+ useEffect(() => {
84
+ onIndexChange?.(currentIndex);
85
+ }, [currentIndex, onIndexChange]);
86
+ useEffect(() => {
48
87
  translateY.value = 0;
49
88
  translateX.value = 0;
50
89
  scale.value = 1;
@@ -53,8 +92,6 @@ export const useGestureImageViewer = ({
53
92
  if (initialIndex <= 0 || !flatListRef.current) {
54
93
  return;
55
94
  }
56
-
57
- // FlatList 초기 위치 설정
58
95
  const runAfterInteractions = InteractionManager.runAfterInteractions(() => {
59
96
  flatListRef.current?.scrollToIndex({
60
97
  index: initialIndex,
@@ -65,13 +102,6 @@ export const useGestureImageViewer = ({
65
102
  runAfterInteractions?.cancel();
66
103
  };
67
104
  }, [initialIndex, translateY, backdropOpacity, translateX, scale, startScale]);
68
-
69
- // 인덱스 변경 알림
70
- useEffect(() => {
71
- onIndexChange?.(currentIndex);
72
- }, [currentIndex, onIndexChange]);
73
-
74
- // FlatList 스크롤 핸들러
75
105
  const onMomentumScrollEnd = useCallback(event => {
76
106
  if (!enableSwipeGesture) {
77
107
  return;
@@ -79,7 +109,11 @@ export const useGestureImageViewer = ({
79
109
  const contentOffset = event.nativeEvent.contentOffset;
80
110
  const newIndex = Math.round(contentOffset.x / width);
81
111
  if (newIndex !== currentIndex && newIndex >= 0 && newIndex < dataLength) {
82
- setCurrentIndex(newIndex);
112
+ if (manager) {
113
+ manager.setCurrentIndex(newIndex);
114
+ setCurrentIndex(newIndex);
115
+ manager.notifyStateChange();
116
+ }
83
117
  translateX.value = withTiming(0);
84
118
  translateY.value = withTiming(0);
85
119
  initialTranslateX.value = withTiming(0);
@@ -87,27 +121,7 @@ export const useGestureImageViewer = ({
87
121
  startScale.value = withTiming(1);
88
122
  scale.value = withTiming(1);
89
123
  }
90
- }, [currentIndex, dataLength, width, enableSwipeGesture, translateX, translateY, scale, initialTranslateX, initialTranslateY, startScale]);
91
- const goToIndex = useCallback(index => {
92
- if (index < 0 || index >= dataLength || !enableSwipeGesture) {
93
- return;
94
- }
95
- setCurrentIndex(index);
96
- flatListRef.current?.scrollToIndex({
97
- index,
98
- animated: true
99
- });
100
- }, [dataLength, enableSwipeGesture]);
101
- const goToPrevious = useCallback(() => {
102
- if (currentIndex > 0) {
103
- goToIndex(currentIndex - 1);
104
- }
105
- }, [currentIndex, goToIndex]);
106
- const goToNext = useCallback(() => {
107
- if (currentIndex < dataLength - 1) {
108
- goToIndex(currentIndex + 1);
109
- }
110
- }, [currentIndex, dataLength, goToIndex]);
124
+ }, [manager, currentIndex, dataLength, width, enableSwipeGesture, translateX, translateY, scale, initialTranslateX, initialTranslateY, startScale]);
111
125
  const dismissGesture = useMemo(() => {
112
126
  return Gesture.Pan().minDistance(10).averageTouches(true).activeOffsetY([-10, 10]).failOffsetX([-10, 10]).enabled(!isZoomed).onUpdate(event => {
113
127
  translateY.value = event.translationY / resistance;
@@ -205,22 +219,14 @@ export const useGestureImageViewer = ({
205
219
  };
206
220
  }, [animateBackdrop]);
207
221
  return {
208
- // State
209
222
  currentIndex,
210
223
  dataLength,
211
224
  translateY,
212
225
  flatListRef,
213
226
  isZoomed,
214
- // Actions
215
- goToPrevious,
216
- goToNext,
217
- goToIndex,
218
- // Gesture
219
227
  dismissGesture,
220
228
  zoomGesture,
221
- // FlatList handlers
222
229
  onMomentumScrollEnd,
223
- // Animated styles
224
230
  animatedStyle,
225
231
  backdropStyle
226
232
  };
@@ -1 +1 @@
1
- {"version":3,"names":["useCallback","useEffect","useMemo","useRef","useState","InteractionManager","useWindowDimensions","Gesture","Easing","interpolate","runOnJS","useAnimatedReaction","useAnimatedStyle","useSharedValue","withSpring","withTiming","useGestureImageViewer","data","initialIndex","onIndexChange","onDismiss","width","customWidth","dismissThreshold","resistance","animateBackdrop","enableDismissGesture","enableSwipeGesture","enableZoomGesture","enableDoubleTapGesture","enableZoomPanGesture","maxZoomScale","screenWidth","height","screenHeight","currentIndex","setCurrentIndex","isZoomed","setIsZoomed","initialTranslateY","initialTranslateX","startScale","translateY","translateX","scale","backdropOpacity","flatListRef","dataLength","length","value","currentScale","current","runAfterInteractions","scrollToIndex","index","animated","cancel","onMomentumScrollEnd","event","contentOffset","nativeEvent","newIndex","Math","round","x","goToIndex","goToPrevious","goToNext","dismissGesture","Pan","minDistance","averageTouches","activeOffsetY","failOffsetX","enabled","onUpdate","translationY","onEnd","damping","stiffness","zoomPinchGesture","Pinch","onBegin","duration","easing","bezier","zoomPanGesture","maxTranslateX","maxTranslateY","max","min","translationX","doubleTapGesture","Tap","numberOfTaps","nextScale","zoomGesture","Simultaneous","animatedStyle","transform","backdropStyle","opacity"],"sourceRoot":"../../src","sources":["useGestureImageViewer.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["useCallback","useEffect","useMemo","useRef","useState","InteractionManager","useWindowDimensions","Gesture","Easing","interpolate","runOnJS","useAnimatedReaction","useAnimatedStyle","useSharedValue","withSpring","withTiming","registry","useGestureImageViewer","data","initialIndex","onIndexChange","onDismiss","width","customWidth","dismissThreshold","resistance","animateBackdrop","enableDismissGesture","enableSwipeGesture","enableZoomGesture","enableDoubleTapGesture","enableZoomPanGesture","maxZoomScale","id","screenWidth","height","screenHeight","isZoomed","setIsZoomed","currentIndex","setCurrentIndex","manager","setManager","unsubscribeRef","initialTranslateY","initialTranslateX","startScale","translateY","translateX","scale","backdropOpacity","flatListRef","dataLength","length","value","currentScale","handleManagerChange","current","getState","subscribe","state","unsubscribeFromRegistry","subscribeToManager","setDataLength","setEnableSwipeGesture","notifyStateChange","setFlatListRef","runAfterInteractions","scrollToIndex","index","animated","cancel","onMomentumScrollEnd","event","contentOffset","nativeEvent","newIndex","Math","round","x","dismissGesture","Pan","minDistance","averageTouches","activeOffsetY","failOffsetX","enabled","onUpdate","translationY","onEnd","damping","stiffness","zoomPinchGesture","Pinch","onBegin","duration","easing","bezier","zoomPanGesture","maxTranslateX","maxTranslateY","max","min","translationX","doubleTapGesture","Tap","numberOfTaps","nextScale","zoomGesture","Simultaneous","animatedStyle","transform","backdropStyle","opacity"],"sourceRoot":"../../src","sources":["useGestureImageViewer.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+
3
+ import { useEffect, useMemo, useRef, useState } from 'react';
4
+ import { registry } from "./ImageViewerRegistry.js";
5
+ export const useImageViewerController = (id = 'default') => {
6
+ const [state, setState] = useState({
7
+ currentIndex: 0,
8
+ dataLength: 0
9
+ });
10
+ const [manager, setManager] = useState(null);
11
+ const unsubscribeRef = useRef(null);
12
+ useEffect(() => {
13
+ const handleManagerChange = newManager => {
14
+ unsubscribeRef.current?.();
15
+ unsubscribeRef.current = null;
16
+ setManager(newManager);
17
+ if (newManager) {
18
+ setState(newManager.getState());
19
+ unsubscribeRef.current = newManager.subscribe(setState);
20
+ return;
21
+ }
22
+ setState({
23
+ currentIndex: 0,
24
+ dataLength: 0
25
+ });
26
+ };
27
+ const unsubscribeFromRegistry = registry.subscribeToManager(id, handleManagerChange);
28
+ return () => {
29
+ unsubscribeFromRegistry();
30
+ unsubscribeRef.current?.();
31
+ };
32
+ }, [id]);
33
+ const noopFunction = useMemo(() => () => {}, []);
34
+ return {
35
+ goToIndex: manager?.goToIndex || noopFunction,
36
+ goToPrevious: manager?.goToPrevious || noopFunction,
37
+ goToNext: manager?.goToNext || noopFunction,
38
+ currentIndex: state.currentIndex,
39
+ totalCount: state.dataLength
40
+ };
41
+ };
42
+ //# sourceMappingURL=useImageViewerController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["useEffect","useMemo","useRef","useState","registry","useImageViewerController","id","state","setState","currentIndex","dataLength","manager","setManager","unsubscribeRef","handleManagerChange","newManager","current","getState","subscribe","unsubscribeFromRegistry","subscribeToManager","noopFunction","goToIndex","goToPrevious","goToNext","totalCount"],"sourceRoot":"../../src","sources":["useImageViewerController.ts"],"mappings":";;AAAA,SAASA,SAAS,EAAEC,OAAO,EAAEC,MAAM,EAAEC,QAAQ,QAAQ,OAAO;AAG5D,SAASC,QAAQ,QAAQ,0BAAuB;AAEhD,OAAO,MAAMC,wBAAwB,GAAGA,CAACC,EAAE,GAAG,SAAS,KAAK;EAC1D,MAAM,CAACC,KAAK,EAAEC,QAAQ,CAAC,GAAGL,QAAQ,CAA0B;IAC1DM,YAAY,EAAE,CAAC;IACfC,UAAU,EAAE;EACd,CAAC,CAAC;EAEF,MAAM,CAACC,OAAO,EAAEC,UAAU,CAAC,GAAGT,QAAQ,CAA4B,IAAI,CAAC;EACvE,MAAMU,cAAc,GAAGX,MAAM,CAAsB,IAAI,CAAC;EAExDF,SAAS,CAAC,MAAM;IACd,MAAMc,mBAAmB,GAAIC,UAAqC,IAAK;MACrEF,cAAc,CAACG,OAAO,GAAG,CAAC;MAC1BH,cAAc,CAACG,OAAO,GAAG,IAAI;MAE7BJ,UAAU,CAACG,UAAU,CAAC;MAEtB,IAAIA,UAAU,EAAE;QACdP,QAAQ,CAACO,UAAU,CAACE,QAAQ,CAAC,CAAC,CAAC;QAC/BJ,cAAc,CAACG,OAAO,GAAGD,UAAU,CAACG,SAAS,CAACV,QAAQ,CAAC;QACvD;MACF;MAEAA,QAAQ,CAAC;QAAEC,YAAY,EAAE,CAAC;QAAEC,UAAU,EAAE;MAAE,CAAC,CAAC;IAC9C,CAAC;IAED,MAAMS,uBAAuB,GAAGf,QAAQ,CAACgB,kBAAkB,CAACd,EAAE,EAAEQ,mBAAmB,CAAC;IAEpF,OAAO,MAAM;MACXK,uBAAuB,CAAC,CAAC;MACzBN,cAAc,CAACG,OAAO,GAAG,CAAC;IAC5B,CAAC;EACH,CAAC,EAAE,CAACV,EAAE,CAAC,CAAC;EAER,MAAMe,YAAY,GAAGpB,OAAO,CAAC,MAAM,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC;EAEhD,OAAO;IACLqB,SAAS,EAAEX,OAAO,EAAEW,SAAS,IAAID,YAAY;IAC7CE,YAAY,EAAEZ,OAAO,EAAEY,YAAY,IAAIF,YAAY;IACnDG,QAAQ,EAAEb,OAAO,EAAEa,QAAQ,IAAIH,YAAY;IAC3CZ,YAAY,EAAEF,KAAK,CAACE,YAAY;IAChCgB,UAAU,EAAElB,KAAK,CAACG;EACpB,CAAC;AACH,CAAC","ignoreList":[]}
@@ -1,3 +1,3 @@
1
1
  import type { GestureImageViewerProps } from './types';
2
- export declare function GestureImageViewer<T = any>({ data, renderImage, renderContainer, ListComponent, width: customWidth, listProps, backdropStyle: backdropStyleProps, containerStyle, initialIndex, ...props }: GestureImageViewerProps<T>): import("react/jsx-runtime").JSX.Element;
2
+ export declare function GestureImageViewer<T = any>({ id, data, renderImage, renderContainer, ListComponent, width: customWidth, listProps, backdropStyle: backdropStyleProps, containerStyle, initialIndex, ...props }: GestureImageViewerProps<T>): import("react/jsx-runtime").JSX.Element;
3
3
  //# sourceMappingURL=GestureImageViewer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"GestureImageViewer.d.ts","sourceRoot":"","sources":["../../../src/GestureImageViewer.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,SAAS,CAAC;AAWvD,wBAAgB,kBAAkB,CAAC,CAAC,GAAG,GAAG,EAAE,EAC1C,IAAI,EACJ,WAAW,EACX,eAAe,EACf,aAAwB,EACxB,KAAK,EAAE,WAAW,EAClB,SAAS,EACT,aAAa,EAAE,kBAAkB,EACjC,cAAc,EACd,YAAgB,EAChB,GAAG,KAAK,EACT,EAAE,uBAAuB,CAAC,CAAC,CAAC,2CA4F5B"}
1
+ {"version":3,"file":"GestureImageViewer.d.ts","sourceRoot":"","sources":["../../../src/GestureImageViewer.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,SAAS,CAAC;AAWvD,wBAAgB,kBAAkB,CAAC,CAAC,GAAG,GAAG,EAAE,EAC1C,EAAc,EACd,IAAI,EACJ,WAAW,EACX,eAAe,EACf,aAAwB,EACxB,KAAK,EAAE,WAAW,EAClB,SAAS,EACT,aAAa,EAAE,kBAAkB,EACjC,cAAc,EACd,YAAgB,EAChB,GAAG,KAAK,EACT,EAAE,uBAAuB,CAAC,CAAC,CAAC,2CAmG5B"}
@@ -0,0 +1,28 @@
1
+ export type ImageViewerManagerState = {
2
+ currentIndex: number;
3
+ dataLength: number;
4
+ };
5
+ declare class ImageViewerManager {
6
+ private currentIndex;
7
+ private dataLength;
8
+ private flatListRef;
9
+ private enableSwipeGesture;
10
+ private listeners;
11
+ private notifyListeners;
12
+ subscribe(listener: (state: ImageViewerManagerState) => void): () => void;
13
+ getState(): {
14
+ currentIndex: number;
15
+ dataLength: number;
16
+ };
17
+ setFlatListRef(ref: any): void;
18
+ setDataLength(length: number): void;
19
+ setEnableSwipeGesture(enabled: boolean): void;
20
+ setCurrentIndex(index: number): void;
21
+ notifyStateChange(): void;
22
+ goToIndex: (index: number) => void;
23
+ goToPrevious: () => void;
24
+ goToNext: () => void;
25
+ cleanUp(): void;
26
+ }
27
+ export default ImageViewerManager;
28
+ //# sourceMappingURL=ImageViewerManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ImageViewerManager.d.ts","sourceRoot":"","sources":["../../../src/ImageViewerManager.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,uBAAuB,GAAG;IACpC,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,cAAM,kBAAkB;IACtB,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,WAAW,CAAa;IAChC,OAAO,CAAC,kBAAkB,CAAQ;IAClC,OAAO,CAAC,SAAS,CAAuD;IAOxE,OAAO,CAAC,eAAe;IAMvB,SAAS,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,uBAAuB,KAAK,IAAI;IAQ5D,QAAQ;;;;IAOR,cAAc,CAAC,GAAG,EAAE,GAAG;IAIvB,aAAa,CAAC,MAAM,EAAE,MAAM;IAI5B,qBAAqB,CAAC,OAAO,EAAE,OAAO;IAItC,eAAe,CAAC,KAAK,EAAE,MAAM;IAM7B,iBAAiB;IAIjB,SAAS,GAAI,OAAO,MAAM,UAQxB;IAEF,YAAY,aAIV;IAEF,QAAQ,aAIN;IAEF,OAAO;CAOR;AAED,eAAe,kBAAkB,CAAC"}
@@ -0,0 +1,13 @@
1
+ import ImageViewerManager from './ImageViewerManager';
2
+ declare class ImageViewerRegistry {
3
+ private managers;
4
+ private subscribers;
5
+ subscribeToManager(id: string, callback: (manager: ImageViewerManager | null) => void): () => void;
6
+ createManager(id: string): ImageViewerManager | null;
7
+ getManager(id: string): ImageViewerManager | null;
8
+ deleteManager(id: string): void;
9
+ notifySubscribers(id: string, manager: ImageViewerManager | null): void;
10
+ }
11
+ export declare const registry: ImageViewerRegistry;
12
+ export {};
13
+ //# sourceMappingURL=ImageViewerRegistry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ImageViewerRegistry.d.ts","sourceRoot":"","sources":["../../../src/ImageViewerRegistry.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,MAAM,sBAAsB,CAAC;AAEtD,cAAM,mBAAmB;IACvB,OAAO,CAAC,QAAQ,CAAyC;IACzD,OAAO,CAAC,WAAW,CAAwE;IAE3F,kBAAkB,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,OAAO,EAAE,kBAAkB,GAAG,IAAI,KAAK,IAAI;IAsBrF,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI;IAapD,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI;IAIjD,aAAa,CAAC,EAAE,EAAE,MAAM;IAWxB,iBAAiB,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,kBAAkB,GAAG,IAAI;CAOjE;AAED,eAAO,MAAM,QAAQ,qBAA4B,CAAC"}
@@ -1,3 +1,4 @@
1
1
  export { GestureImageViewer } from './GestureImageViewer';
2
2
  export type { GestureImageViewerProps } from './types';
3
+ export { useImageViewerController } from './useImageViewerController';
3
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,YAAY,EAAE,uBAAuB,EAAE,MAAM,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,YAAY,EAAE,uBAAuB,EAAE,MAAM,SAAS,CAAC;AACvD,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC"}
@@ -1,6 +1,7 @@
1
1
  import type { StyleProp, ViewStyle } from 'react-native';
2
2
  import type { SharedValue } from 'react-native-reanimated';
3
3
  export interface GestureImageViewerProps<T = any> {
4
+ id?: string;
4
5
  data: T[];
5
6
  initialIndex?: number;
6
7
  onIndexChange?: (index: number) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAE3D,MAAM,WAAW,uBAAuB,CAAC,CAAC,GAAG,GAAG;IAC9C,IAAI,EAAE,CAAC,EAAE,CAAC;IACV,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,KAAK,CAAC,YAAY,CAAC;IAC5D,eAAe,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC,YAAY,KAAK,KAAK,CAAC,YAAY,CAAC;IACvE,aAAa,CAAC,EAAE,GAAG,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,GAAG,CAAC;IAChB,aAAa,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IACrC,cAAc,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IACtC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAChC,eAAe,EAAE,OAAO,CAAC;IACzB,aAAa,EAAE,YAAY,GAAG,UAAU,GAAG,IAAI,CAAC;CACjD"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAE3D,MAAM,WAAW,uBAAuB,CAAC,CAAC,GAAG,GAAG;IAC9C,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,CAAC,EAAE,CAAC;IACV,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,KAAK,CAAC,YAAY,CAAC;IAC5D,eAAe,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC,YAAY,KAAK,KAAK,CAAC,YAAY,CAAC;IACvE,aAAa,CAAC,EAAE,GAAG,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,GAAG,CAAC;IAChB,aAAa,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IACrC,cAAc,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IACtC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAChC,eAAe,EAAE,OAAO,CAAC;IACzB,aAAa,EAAE,YAAY,GAAG,UAAU,GAAG,IAAI,CAAC;CACjD"}
@@ -1,15 +1,12 @@
1
1
  import { type NativeScrollEvent, type NativeSyntheticEvent } from 'react-native';
2
2
  import type { GestureImageViewerProps } from './types';
3
3
  type UseGestureImageViewerProps<T = any> = Omit<GestureImageViewerProps<T>, 'renderImage' | 'renderContainer' | 'ListComponent' | 'listProps' | 'containerStyle' | 'backdropStyle'>;
4
- export declare const useGestureImageViewer: <T = any>({ data, initialIndex, onIndexChange, onDismiss, width: customWidth, dismissThreshold, resistance, animateBackdrop, enableDismissGesture, enableSwipeGesture, enableZoomGesture, enableDoubleTapGesture, enableZoomPanGesture, maxZoomScale, }: UseGestureImageViewerProps<T>) => {
4
+ export declare const useGestureImageViewer: <T = any>({ data, initialIndex, onIndexChange, onDismiss, width: customWidth, dismissThreshold, resistance, animateBackdrop, enableDismissGesture, enableSwipeGesture, enableZoomGesture, enableDoubleTapGesture, enableZoomPanGesture, maxZoomScale, id, }: UseGestureImageViewerProps<T>) => {
5
5
  currentIndex: number;
6
6
  dataLength: number;
7
7
  translateY: import("react-native-reanimated").SharedValue<number>;
8
8
  flatListRef: import("react").RefObject<any>;
9
9
  isZoomed: boolean;
10
- goToPrevious: () => void;
11
- goToNext: () => void;
12
- goToIndex: (index: number) => void;
13
10
  dismissGesture: import("react-native-gesture-handler/lib/typescript/handlers/gestures/panGesture").PanGesture;
14
11
  zoomGesture: import("react-native-gesture-handler/lib/typescript/handlers/gestures/gestureComposition").SimultaneousGesture;
15
12
  onMomentumScrollEnd: (event: NativeSyntheticEvent<NativeScrollEvent>) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"useGestureImageViewer.d.ts","sourceRoot":"","sources":["../../../src/useGestureImageViewer.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,KAAK,iBAAiB,EACtB,KAAK,oBAAoB,EAE1B,MAAM,cAAc,CAAC;AAYtB,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,SAAS,CAAC;AAEvD,KAAK,0BAA0B,CAAC,CAAC,GAAG,GAAG,IAAI,IAAI,CAC7C,uBAAuB,CAAC,CAAC,CAAC,EAC1B,aAAa,GAAG,iBAAiB,GAAG,eAAe,GAAG,WAAW,GAAG,gBAAgB,GAAG,eAAe,CACvG,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAAI,CAAC,GAAG,GAAG,EAAE,+OAiB5C,0BAA0B,CAAC,CAAC,CAAC;;;;;;;;uBA6FpB,MAAM;;;iCAjCN,oBAAoB,CAAC,iBAAiB,CAAC;;;;;;;;;;;;;;;;;;;CAwNlD,CAAC"}
1
+ {"version":3,"file":"useGestureImageViewer.d.ts","sourceRoot":"","sources":["../../../src/useGestureImageViewer.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,KAAK,iBAAiB,EACtB,KAAK,oBAAoB,EAE1B,MAAM,cAAc,CAAC;AActB,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,SAAS,CAAC;AAEvD,KAAK,0BAA0B,CAAC,CAAC,GAAG,GAAG,IAAI,IAAI,CAC7C,uBAAuB,CAAC,CAAC,CAAC,EAC1B,aAAa,GAAG,iBAAiB,GAAG,eAAe,GAAG,WAAW,GAAG,gBAAgB,GAAG,eAAe,CACvG,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAAI,CAAC,GAAG,GAAG,EAAE,mPAkB5C,0BAA0B,CAAC,CAAC,CAAC;;;;;;;;iCAwGpB,oBAAoB,CAAC,iBAAiB,CAAC;;;;;;;;;;;;;;;;;;;CA0LlD,CAAC"}
@@ -0,0 +1,8 @@
1
+ export declare const useImageViewerController: (id?: string) => {
2
+ goToIndex: (index: number) => void;
3
+ goToPrevious: () => void;
4
+ goToNext: () => void;
5
+ currentIndex: number;
6
+ totalCount: number;
7
+ };
8
+ //# sourceMappingURL=useImageViewerController.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useImageViewerController.d.ts","sourceRoot":"","sources":["../../../src/useImageViewerController.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,wBAAwB,GAAI,WAAc;;;;;;CA0CtD,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-gesture-image-viewer",
3
- "version": "0.2.0",
3
+ "version": "0.3.1",
4
4
  "description": "react-native-gesture-image-viewer",
5
5
  "main": "./lib/module/index.js",
6
6
  "types": "./lib/typescript/src/index.d.ts",
@@ -1,7 +1,8 @@
1
- import { useCallback, useMemo } from 'react';
1
+ import { useCallback, useEffect, useMemo } from 'react';
2
2
  import { Platform, StyleSheet, useWindowDimensions, View } from 'react-native';
3
3
  import { FlatList, Gesture, GestureDetector, GestureHandlerRootView } from 'react-native-gesture-handler';
4
4
  import Animated from 'react-native-reanimated';
5
+ import { registry } from './ImageViewerRegistry';
5
6
  import type { GestureImageViewerProps } from './types';
6
7
  import { useGestureImageViewer } from './useGestureImageViewer';
7
8
 
@@ -14,6 +15,7 @@ const WebPagingFix = () => {
14
15
  };
15
16
 
16
17
  export function GestureImageViewer<T = any>({
18
+ id = 'default',
17
19
  data,
18
20
  renderImage,
19
21
  renderContainer,
@@ -39,6 +41,7 @@ export function GestureImageViewer<T = any>({
39
41
  animatedStyle,
40
42
  backdropStyle,
41
43
  } = useGestureImageViewer({
44
+ id,
42
45
  data,
43
46
  width,
44
47
  initialIndex,
@@ -83,6 +86,12 @@ export function GestureImageViewer<T = any>({
83
86
  return Gesture.Race(dismissGesture, zoomGesture);
84
87
  }, [zoomGesture, dismissGesture]);
85
88
 
89
+ useEffect(() => {
90
+ registry.createManager(id);
91
+
92
+ return () => registry.deleteManager(id);
93
+ }, [id]);
94
+
86
95
  const listComponent = (
87
96
  <GestureHandlerRootView>
88
97
  <GestureDetector gesture={gesture}>
@@ -0,0 +1,92 @@
1
+ export type ImageViewerManagerState = {
2
+ currentIndex: number;
3
+ dataLength: number;
4
+ };
5
+
6
+ class ImageViewerManager {
7
+ private currentIndex = 0;
8
+ private dataLength = 0;
9
+ private flatListRef: any = null;
10
+ private enableSwipeGesture = true;
11
+ private listeners = new Set<(state: ImageViewerManagerState) => void>();
12
+
13
+ // private updateState(newState: Partial<any>) {
14
+ // Object.assign(this, newState);
15
+ // this.notifyListeners();
16
+ // }
17
+
18
+ private notifyListeners() {
19
+ const state = this.getState();
20
+
21
+ this.listeners.forEach((listener) => listener(state));
22
+ }
23
+
24
+ subscribe(listener: (state: ImageViewerManagerState) => void) {
25
+ this.listeners.add(listener);
26
+
27
+ return () => {
28
+ this.listeners.delete(listener);
29
+ };
30
+ }
31
+
32
+ getState() {
33
+ return {
34
+ currentIndex: this.currentIndex,
35
+ dataLength: this.dataLength,
36
+ };
37
+ }
38
+
39
+ setFlatListRef(ref: any) {
40
+ this.flatListRef = ref;
41
+ }
42
+
43
+ setDataLength(length: number) {
44
+ this.dataLength = length;
45
+ }
46
+
47
+ setEnableSwipeGesture(enabled: boolean) {
48
+ this.enableSwipeGesture = enabled;
49
+ }
50
+
51
+ setCurrentIndex(index: number) {
52
+ if (index !== this.currentIndex) {
53
+ this.currentIndex = index;
54
+ }
55
+ }
56
+
57
+ notifyStateChange() {
58
+ this.notifyListeners();
59
+ }
60
+
61
+ goToIndex = (index: number) => {
62
+ if (index < 0 || index >= this.dataLength || !this.enableSwipeGesture || !this.flatListRef) {
63
+ return;
64
+ }
65
+
66
+ this.currentIndex = index;
67
+ this.flatListRef.scrollToIndex({ index, animated: true });
68
+ this.notifyListeners();
69
+ };
70
+
71
+ goToPrevious = () => {
72
+ if (this.currentIndex > 0) {
73
+ this.goToIndex(this.currentIndex - 1);
74
+ }
75
+ };
76
+
77
+ goToNext = () => {
78
+ if (this.currentIndex < this.dataLength - 1) {
79
+ this.goToIndex(this.currentIndex + 1);
80
+ }
81
+ };
82
+
83
+ cleanUp() {
84
+ this.listeners.clear();
85
+ this.flatListRef = null;
86
+ this.enableSwipeGesture = true;
87
+ this.currentIndex = 0;
88
+ this.dataLength = 0;
89
+ }
90
+ }
91
+
92
+ export default ImageViewerManager;
@@ -0,0 +1,66 @@
1
+ import ImageViewerManager from './ImageViewerManager';
2
+
3
+ class ImageViewerRegistry {
4
+ private managers = new Map<string, ImageViewerManager>();
5
+ private subscribers = new Map<string, Set<(manager: ImageViewerManager | null) => void>>();
6
+
7
+ subscribeToManager(id: string, callback: (manager: ImageViewerManager | null) => void) {
8
+ if (!this.subscribers.has(id)) {
9
+ this.subscribers.set(id, new Set());
10
+ }
11
+
12
+ this.subscribers.get(id)?.add(callback);
13
+
14
+ const manager = this.managers.get(id) || null;
15
+
16
+ callback(manager);
17
+
18
+ return () => {
19
+ const subscribers = this.subscribers.get(id);
20
+
21
+ subscribers?.delete(callback);
22
+
23
+ if (subscribers && subscribers.size === 0) {
24
+ this.subscribers.delete(id);
25
+ }
26
+ };
27
+ }
28
+
29
+ createManager(id: string): ImageViewerManager | null {
30
+ if (this.managers.has(id)) {
31
+ return this.managers.get(id) || null;
32
+ }
33
+
34
+ const manager = new ImageViewerManager();
35
+ this.managers.set(id, manager);
36
+
37
+ this.notifySubscribers(id, manager);
38
+
39
+ return manager;
40
+ }
41
+
42
+ getManager(id: string): ImageViewerManager | null {
43
+ return this.managers.get(id) || null;
44
+ }
45
+
46
+ deleteManager(id: string) {
47
+ const manager = this.managers.get(id);
48
+
49
+ if (manager) {
50
+ manager.cleanUp();
51
+ this.managers.delete(id);
52
+
53
+ this.notifySubscribers(id, null);
54
+ }
55
+ }
56
+
57
+ notifySubscribers(id: string, manager: ImageViewerManager | null) {
58
+ const listeners = this.subscribers.get(id);
59
+
60
+ if (listeners) {
61
+ [...listeners].forEach((callback) => callback(manager));
62
+ }
63
+ }
64
+ }
65
+
66
+ export const registry = new ImageViewerRegistry();
package/src/index.tsx CHANGED
@@ -1,2 +1,3 @@
1
1
  export { GestureImageViewer } from './GestureImageViewer';
2
2
  export type { GestureImageViewerProps } from './types';
3
+ export { useImageViewerController } from './useImageViewerController';
package/src/types.ts CHANGED
@@ -2,6 +2,7 @@ import type { StyleProp, ViewStyle } from 'react-native';
2
2
  import type { SharedValue } from 'react-native-reanimated';
3
3
 
4
4
  export interface GestureImageViewerProps<T = any> {
5
+ id?: string;
5
6
  data: T[];
6
7
  initialIndex?: number;
7
8
  onIndexChange?: (index: number) => void;
@@ -16,6 +16,8 @@ import {
16
16
  withSpring,
17
17
  withTiming,
18
18
  } from 'react-native-reanimated';
19
+ import type ImageViewerManager from './ImageViewerManager';
20
+ import { registry } from './ImageViewerRegistry';
19
21
  import type { GestureImageViewerProps } from './types';
20
22
 
21
23
  type UseGestureImageViewerProps<T = any> = Omit<
@@ -40,13 +42,18 @@ export const useGestureImageViewer = <T = any>({
40
42
  enableDoubleTapGesture = true,
41
43
  enableZoomPanGesture = true,
42
44
  maxZoomScale = 2,
45
+ id = 'default',
43
46
  }: UseGestureImageViewerProps<T>) => {
44
47
  const { width: screenWidth, height: screenHeight } = useWindowDimensions();
45
48
  const width = customWidth || screenWidth;
46
49
 
47
- const [currentIndex, setCurrentIndex] = useState(initialIndex);
48
50
  const [isZoomed, setIsZoomed] = useState(false);
49
51
 
52
+ const [currentIndex, setCurrentIndex] = useState(initialIndex);
53
+ const [manager, setManager] = useState<ImageViewerManager | null>(null);
54
+
55
+ const unsubscribeRef = useRef<(() => void) | null>(null);
56
+
50
57
  const initialTranslateY = useSharedValue(0);
51
58
  const initialTranslateX = useSharedValue(0);
52
59
  const startScale = useSharedValue(1);
@@ -67,9 +74,56 @@ export const useGestureImageViewer = <T = any>({
67
74
  },
68
75
  );
69
76
 
70
- // 초기 위치 설정
71
77
  useEffect(() => {
72
- setCurrentIndex(initialIndex);
78
+ const handleManagerChange = (manager: ImageViewerManager | null) => {
79
+ unsubscribeRef.current?.();
80
+ unsubscribeRef.current = null;
81
+
82
+ setManager(manager);
83
+
84
+ if (manager) {
85
+ setCurrentIndex(manager.getState().currentIndex);
86
+ unsubscribeRef.current = manager.subscribe((state) => {
87
+ setCurrentIndex(state.currentIndex);
88
+ });
89
+ return;
90
+ }
91
+
92
+ setCurrentIndex(0);
93
+ };
94
+
95
+ const unsubscribeFromRegistry = registry.subscribeToManager(id, handleManagerChange);
96
+
97
+ return () => {
98
+ unsubscribeFromRegistry();
99
+ unsubscribeRef.current?.();
100
+ };
101
+ }, [id]);
102
+
103
+ useEffect(() => {
104
+ if (!manager) {
105
+ return;
106
+ }
107
+
108
+ manager.setDataLength(dataLength);
109
+ manager.setEnableSwipeGesture(enableSwipeGesture);
110
+ manager.setCurrentIndex(initialIndex);
111
+ manager.notifyStateChange();
112
+ }, [dataLength, enableSwipeGesture, initialIndex, manager]);
113
+
114
+ useEffect(() => {
115
+ if (!manager || !flatListRef.current) {
116
+ return;
117
+ }
118
+
119
+ manager.setFlatListRef(flatListRef.current);
120
+ }, [manager]);
121
+
122
+ useEffect(() => {
123
+ onIndexChange?.(currentIndex);
124
+ }, [currentIndex, onIndexChange]);
125
+
126
+ useEffect(() => {
73
127
  translateY.value = 0;
74
128
  translateX.value = 0;
75
129
  scale.value = 1;
@@ -80,7 +134,6 @@ export const useGestureImageViewer = <T = any>({
80
134
  return;
81
135
  }
82
136
 
83
- // FlatList 초기 위치 설정
84
137
  const runAfterInteractions = InteractionManager.runAfterInteractions(() => {
85
138
  flatListRef.current?.scrollToIndex({
86
139
  index: initialIndex,
@@ -93,12 +146,6 @@ export const useGestureImageViewer = <T = any>({
93
146
  };
94
147
  }, [initialIndex, translateY, backdropOpacity, translateX, scale, startScale]);
95
148
 
96
- // 인덱스 변경 알림
97
- useEffect(() => {
98
- onIndexChange?.(currentIndex);
99
- }, [currentIndex, onIndexChange]);
100
-
101
- // FlatList 스크롤 핸들러
102
149
  const onMomentumScrollEnd = useCallback(
103
150
  (event: NativeSyntheticEvent<NativeScrollEvent>) => {
104
151
  if (!enableSwipeGesture) {
@@ -109,7 +156,12 @@ export const useGestureImageViewer = <T = any>({
109
156
  const newIndex = Math.round(contentOffset.x / width);
110
157
 
111
158
  if (newIndex !== currentIndex && newIndex >= 0 && newIndex < dataLength) {
112
- setCurrentIndex(newIndex);
159
+ if (manager) {
160
+ manager.setCurrentIndex(newIndex);
161
+ setCurrentIndex(newIndex);
162
+ manager.notifyStateChange();
163
+ }
164
+
113
165
  translateX.value = withTiming(0);
114
166
  translateY.value = withTiming(0);
115
167
  initialTranslateX.value = withTiming(0);
@@ -119,6 +171,7 @@ export const useGestureImageViewer = <T = any>({
119
171
  }
120
172
  },
121
173
  [
174
+ manager,
122
175
  currentIndex,
123
176
  dataLength,
124
177
  width,
@@ -132,33 +185,6 @@ export const useGestureImageViewer = <T = any>({
132
185
  ],
133
186
  );
134
187
 
135
- const goToIndex = useCallback(
136
- (index: number) => {
137
- if (index < 0 || index >= dataLength || !enableSwipeGesture) {
138
- return;
139
- }
140
-
141
- setCurrentIndex(index);
142
- flatListRef.current?.scrollToIndex({
143
- index,
144
- animated: true,
145
- });
146
- },
147
- [dataLength, enableSwipeGesture],
148
- );
149
-
150
- const goToPrevious = useCallback(() => {
151
- if (currentIndex > 0) {
152
- goToIndex(currentIndex - 1);
153
- }
154
- }, [currentIndex, goToIndex]);
155
-
156
- const goToNext = useCallback(() => {
157
- if (currentIndex < dataLength - 1) {
158
- goToIndex(currentIndex + 1);
159
- }
160
- }, [currentIndex, dataLength, goToIndex]);
161
-
162
188
  const dismissGesture = useMemo(() => {
163
189
  return Gesture.Pan()
164
190
  .minDistance(10)
@@ -293,26 +319,17 @@ export const useGestureImageViewer = <T = any>({
293
319
  }, [animateBackdrop]);
294
320
 
295
321
  return {
296
- // State
297
322
  currentIndex,
298
323
  dataLength,
299
324
  translateY,
300
325
  flatListRef,
301
326
  isZoomed,
302
327
 
303
- // Actions
304
- goToPrevious,
305
- goToNext,
306
- goToIndex,
307
-
308
- // Gesture
309
328
  dismissGesture,
310
329
  zoomGesture,
311
330
 
312
- // FlatList handlers
313
331
  onMomentumScrollEnd,
314
332
 
315
- // Animated styles
316
333
  animatedStyle,
317
334
  backdropStyle,
318
335
  };
@@ -0,0 +1,48 @@
1
+ import { useEffect, useMemo, useRef, useState } from 'react';
2
+ import type ImageViewerManager from './ImageViewerManager';
3
+ import type { ImageViewerManagerState } from './ImageViewerManager';
4
+ import { registry } from './ImageViewerRegistry';
5
+
6
+ export const useImageViewerController = (id = 'default') => {
7
+ const [state, setState] = useState<ImageViewerManagerState>({
8
+ currentIndex: 0,
9
+ dataLength: 0,
10
+ });
11
+
12
+ const [manager, setManager] = useState<ImageViewerManager | null>(null);
13
+ const unsubscribeRef = useRef<(() => void) | null>(null);
14
+
15
+ useEffect(() => {
16
+ const handleManagerChange = (newManager: ImageViewerManager | null) => {
17
+ unsubscribeRef.current?.();
18
+ unsubscribeRef.current = null;
19
+
20
+ setManager(newManager);
21
+
22
+ if (newManager) {
23
+ setState(newManager.getState());
24
+ unsubscribeRef.current = newManager.subscribe(setState);
25
+ return;
26
+ }
27
+
28
+ setState({ currentIndex: 0, dataLength: 0 });
29
+ };
30
+
31
+ const unsubscribeFromRegistry = registry.subscribeToManager(id, handleManagerChange);
32
+
33
+ return () => {
34
+ unsubscribeFromRegistry();
35
+ unsubscribeRef.current?.();
36
+ };
37
+ }, [id]);
38
+
39
+ const noopFunction = useMemo(() => () => {}, []);
40
+
41
+ return {
42
+ goToIndex: manager?.goToIndex || noopFunction,
43
+ goToPrevious: manager?.goToPrevious || noopFunction,
44
+ goToNext: manager?.goToNext || noopFunction,
45
+ currentIndex: state.currentIndex,
46
+ totalCount: state.dataLength,
47
+ };
48
+ };