diff --git a/src/components/FrameOverlay.tsx b/src/components/FrameOverlay.tsx index fbcef5c3..b4c6d0a6 100644 --- a/src/components/FrameOverlay.tsx +++ b/src/components/FrameOverlay.tsx @@ -3,6 +3,7 @@ import { StyleSheet, Image, View } from 'react-native'; interface FrameOverlayProps { frameAsset: any; // require() asset + isCapturing?: boolean; } /** @@ -10,11 +11,11 @@ interface FrameOverlayProps { * The frame PNG must have a transparent center (alpha=0) so the photo shows through. * Positioned absolutely to cover the entire photo canvas. */ -export default function FrameOverlay({ frameAsset }: FrameOverlayProps) { +export default function FrameOverlay({ frameAsset, isCapturing = false }: FrameOverlayProps) { if (!frameAsset) return null; return ( - + ('single'); const [isProcessing, setIsProcessing] = useState(false); + const [isCapturing, setIsCapturing] = useState(false); const [statusMessage, setStatusMessage] = useState(''); @@ -204,14 +205,21 @@ export default function PreviewScreen({ try { logger.log(`captureComposite started. Has ViewShot ref: ${!!viewShotRef.current}`); if (viewShotRef.current) { + setIsCapturing(true); + // Wait for React to re-render and remove pointerEvents="none" which blocks ViewShot on Android + await new Promise(resolve => setTimeout(resolve, 300)); + logger.log('Executing viewShotRef.current.capture()...'); const uri = await viewShotRef.current.capture(); + + setIsCapturing(false); logger.log(`ViewShot successfully generated collage URI: ${uri}`); return uri; } logger.log('[WARNING] viewShotRef.current was null, falling back to raw photo.'); return fallbackPhoto; } catch (e: any) { + setIsCapturing(false); logger.error('Failed to capture composite (ViewShot crashed)', e?.message || e); return fallbackPhoto; } @@ -453,11 +461,11 @@ export default function PreviewScreen({ {renderCollageView()} {/* Frame Overlay */} - {activeFrame && } + {activeFrame && } {/* Date/Time Overlay */} {dateOverlay !== 'off' && ( - + {formatDate(dateOverlay)}