Fix camera unmount crash via overlay architecture

This commit is contained in:
2026-05-31 14:30:19 +02:00
parent 2b5a259fe5
commit ac8f0722d1
+27 -37
View File
@@ -81,24 +81,36 @@ export default function App() {
}; };
// 3. Conditional Screen Rendering // 3. Conditional Screen Rendering
const renderScreen = () => {
switch (currentScreen) {
case 'camera':
return ( return (
<GestureHandlerRootView style={styles.container}>
<SafeAreaView style={styles.container}>
<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'}
onStartBooth={handleStartBooth}
onNavigateToAdmin={handleOpenAdmin}
adminPassword={settings.adminPassword}
welcomeText={settings.welcomeText}
burstCount={settings.burstCount} burstCount={settings.burstCount}
burstIntervalSec={settings.burstIntervalSec} burstIntervalSec={settings.burstIntervalSec}
frameMode={settings.frameMode} frameMode={settings.frameMode}
selectedFrameId={settings.selectedFrameId} selectedFrameId={settings.selectedFrameId}
/> />
); </View>
case 'preview':
return ( {/* Overlay PreviewScreen if active */}
{currentScreen === 'preview' && (
<View style={StyleSheet.absoluteFill}>
<PreviewScreen <PreviewScreen
photoUris={photoUris} photoUris={photoUris}
printerIp={settings.printerIp} printerIp={settings.printerIp}
@@ -112,41 +124,19 @@ export default function App() {
dateOverlayPosition={settings.dateOverlayPosition} dateOverlayPosition={settings.dateOverlayPosition}
eventText={settings.eventText} eventText={settings.eventText}
/> />
); </View>
case 'admin': )}
return (
{/* Overlay AdminScreen if active */}
{currentScreen === 'admin' && (
<View style={StyleSheet.absoluteFill}>
<AdminScreen <AdminScreen
currentSettings={settings} currentSettings={settings}
onSave={handleSaveSettings} onSave={handleSaveSettings}
onClose={() => setCurrentScreen('home')} onClose={() => setCurrentScreen('home')}
/> />
); </View>
default: )}
return (
<CameraScreen
countdownDuration={settings.countdownDuration}
onPhotoCaptured={handlePhotoCaptured}
onBurstComplete={handleBurstComplete}
onCancel={handleReset}
isIdle={true}
onStartBooth={handleStartBooth}
onNavigateToAdmin={handleOpenAdmin}
adminPassword={settings.adminPassword}
welcomeText={settings.welcomeText}
burstCount={settings.burstCount}
burstIntervalSec={settings.burstIntervalSec}
frameMode={settings.frameMode}
selectedFrameId={settings.selectedFrameId}
/>
);
}
};
return (
<GestureHandlerRootView style={styles.container}>
<SafeAreaView style={styles.container}>
<StatusBar hidden={true} />
{renderScreen()}
</SafeAreaView> </SafeAreaView>
</GestureHandlerRootView> </GestureHandlerRootView>
); );