Skip to content

Commit f2c3354

Browse files
committed
(fix): Pinch to close doesn't navigate back
Changelog: fix
1 parent b6a4bca commit f2c3354

2 files changed

Lines changed: 17 additions & 2 deletions

File tree

apps/polycentric/src/features/post/ImageViewer/ImageViewer.tsx

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,9 @@ export function ImageViewer({
176176
if (scale.value > 1) {
177177
translateX.value = savedTranslateX.value + e.translationX;
178178
translateY.value = savedTranslateY.value + e.translationY;
179-
} else {
179+
} else if (scale.value === 1) {
180+
// Only drag-to-dismiss at natural size; ignore the centroid
181+
// drift while a pinch is shrinking the image.
180182
dismissY.value = e.translationY;
181183
}
182184
})
@@ -186,6 +188,13 @@ export function ImageViewer({
186188
savedTranslateY.value = translateY.value;
187189
return;
188190
}
191+
if (scale.value < 1) {
192+
// A pinch-to-close is in progress; let the pinch decide
193+
// whether to dismiss, so we don't double-fire onClose (which
194+
// on Android popped an extra screen).
195+
dismissY.value = withTiming(0, { duration: 150 });
196+
return;
197+
}
189198
const dismiss =
190199
Math.abs(e.translationY) > CLOSE_DISTANCE ||
191200
Math.abs(e.velocityY) > CLOSE_VELOCITY;

apps/polycentric/src/features/post/ImageViewer/ImageViewerScreen.tsx

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { router } from 'expo-router';
2-
import { useCallback } from 'react';
2+
import { useCallback, useRef } from 'react';
33
import { ImageViewer } from './ImageViewer';
44
import { useImageViewerStore } from './useImageViewerStore';
55

@@ -13,7 +13,13 @@ export default function ImageViewerScreen() {
1313
const images = useImageViewerStore((s) => s.images);
1414
const index = useImageViewerStore((s) => s.index);
1515

16+
// Guard against double-dismiss: simultaneous pinch + pan can both fire
17+
// close, and `router.canGoBack()` may still read true before the first
18+
// back() settles — popping an extra screen (notably on Android).
19+
const closing = useRef(false);
1620
const onClose = useCallback(() => {
21+
if (closing.current) return;
22+
closing.current = true;
1723
if (router.canGoBack()) router.back();
1824
}, []);
1925

0 commit comments

Comments
 (0)