Fix camera unmount crash via overlay architecture
This commit is contained in:
@@ -81,54 +81,22 @@ export default function App() {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// 3. Conditional Screen Rendering
|
// 3. Conditional Screen Rendering
|
||||||
const renderScreen = () => {
|
return (
|
||||||
switch (currentScreen) {
|
<GestureHandlerRootView style={styles.container}>
|
||||||
case 'camera':
|
<SafeAreaView style={styles.container}>
|
||||||
return (
|
<StatusBar hidden={true} />
|
||||||
|
|
||||||
|
{/*
|
||||||
|
Keep CameraScreen ALWAYS mounted in the background to prevent
|
||||||
|
Android expo-camera hardware crashes when unmounting right after capture
|
||||||
|
*/}
|
||||||
|
<View style={StyleSheet.absoluteFill}>
|
||||||
<CameraScreen
|
<CameraScreen
|
||||||
countdownDuration={settings.countdownDuration}
|
countdownDuration={settings.countdownDuration}
|
||||||
onPhotoCaptured={handlePhotoCaptured}
|
onPhotoCaptured={handlePhotoCaptured}
|
||||||
onBurstComplete={handleBurstComplete}
|
onBurstComplete={handleBurstComplete}
|
||||||
onCancel={handleReset}
|
onCancel={handleReset}
|
||||||
isIdle={false}
|
isIdle={currentScreen === 'home'}
|
||||||
burstCount={settings.burstCount}
|
|
||||||
burstIntervalSec={settings.burstIntervalSec}
|
|
||||||
frameMode={settings.frameMode}
|
|
||||||
selectedFrameId={settings.selectedFrameId}
|
|
||||||
/>
|
|
||||||
);
|
|
||||||
case 'preview':
|
|
||||||
return (
|
|
||||||
<PreviewScreen
|
|
||||||
photoUris={photoUris}
|
|
||||||
printerIp={settings.printerIp}
|
|
||||||
onRetakeLast={handleRetakeLast}
|
|
||||||
onAddAnother={handleAddAnother}
|
|
||||||
onReset={handleReset}
|
|
||||||
frameMode={settings.frameMode}
|
|
||||||
initialFrameId={settings.selectedFrameId}
|
|
||||||
availableFrameIds={settings.availableFrameIds}
|
|
||||||
dateOverlay={settings.dateOverlay}
|
|
||||||
dateOverlayPosition={settings.dateOverlayPosition}
|
|
||||||
eventText={settings.eventText}
|
|
||||||
/>
|
|
||||||
);
|
|
||||||
case 'admin':
|
|
||||||
return (
|
|
||||||
<AdminScreen
|
|
||||||
currentSettings={settings}
|
|
||||||
onSave={handleSaveSettings}
|
|
||||||
onClose={() => setCurrentScreen('home')}
|
|
||||||
/>
|
|
||||||
);
|
|
||||||
default:
|
|
||||||
return (
|
|
||||||
<CameraScreen
|
|
||||||
countdownDuration={settings.countdownDuration}
|
|
||||||
onPhotoCaptured={handlePhotoCaptured}
|
|
||||||
onBurstComplete={handleBurstComplete}
|
|
||||||
onCancel={handleReset}
|
|
||||||
isIdle={true}
|
|
||||||
onStartBooth={handleStartBooth}
|
onStartBooth={handleStartBooth}
|
||||||
onNavigateToAdmin={handleOpenAdmin}
|
onNavigateToAdmin={handleOpenAdmin}
|
||||||
adminPassword={settings.adminPassword}
|
adminPassword={settings.adminPassword}
|
||||||
@@ -138,15 +106,37 @@ export default function App() {
|
|||||||
frameMode={settings.frameMode}
|
frameMode={settings.frameMode}
|
||||||
selectedFrameId={settings.selectedFrameId}
|
selectedFrameId={settings.selectedFrameId}
|
||||||
/>
|
/>
|
||||||
);
|
</View>
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
return (
|
{/* Overlay PreviewScreen if active */}
|
||||||
<GestureHandlerRootView style={styles.container}>
|
{currentScreen === 'preview' && (
|
||||||
<SafeAreaView style={styles.container}>
|
<View style={StyleSheet.absoluteFill}>
|
||||||
<StatusBar hidden={true} />
|
<PreviewScreen
|
||||||
{renderScreen()}
|
photoUris={photoUris}
|
||||||
|
printerIp={settings.printerIp}
|
||||||
|
onRetakeLast={handleRetakeLast}
|
||||||
|
onAddAnother={handleAddAnother}
|
||||||
|
onReset={handleReset}
|
||||||
|
frameMode={settings.frameMode}
|
||||||
|
initialFrameId={settings.selectedFrameId}
|
||||||
|
availableFrameIds={settings.availableFrameIds}
|
||||||
|
dateOverlay={settings.dateOverlay}
|
||||||
|
dateOverlayPosition={settings.dateOverlayPosition}
|
||||||
|
eventText={settings.eventText}
|
||||||
|
/>
|
||||||
|
</View>
|
||||||
|
)}
|
||||||
|
|
||||||
|
{/* Overlay AdminScreen if active */}
|
||||||
|
{currentScreen === 'admin' && (
|
||||||
|
<View style={StyleSheet.absoluteFill}>
|
||||||
|
<AdminScreen
|
||||||
|
currentSettings={settings}
|
||||||
|
onSave={handleSaveSettings}
|
||||||
|
onClose={() => setCurrentScreen('home')}
|
||||||
|
/>
|
||||||
|
</View>
|
||||||
|
)}
|
||||||
</SafeAreaView>
|
</SafeAreaView>
|
||||||
</GestureHandlerRootView>
|
</GestureHandlerRootView>
|
||||||
);
|
);
|
||||||
|
|||||||
Reference in New Issue
Block a user