Fix camera unmount crash via overlay architecture
This commit is contained in:
@@ -81,24 +81,36 @@ export default function App() {
|
||||
};
|
||||
|
||||
// 3. Conditional Screen Rendering
|
||||
const renderScreen = () => {
|
||||
switch (currentScreen) {
|
||||
case 'camera':
|
||||
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
|
||||
countdownDuration={settings.countdownDuration}
|
||||
onPhotoCaptured={handlePhotoCaptured}
|
||||
onBurstComplete={handleBurstComplete}
|
||||
onCancel={handleReset}
|
||||
isIdle={false}
|
||||
isIdle={currentScreen === 'home'}
|
||||
onStartBooth={handleStartBooth}
|
||||
onNavigateToAdmin={handleOpenAdmin}
|
||||
adminPassword={settings.adminPassword}
|
||||
welcomeText={settings.welcomeText}
|
||||
burstCount={settings.burstCount}
|
||||
burstIntervalSec={settings.burstIntervalSec}
|
||||
frameMode={settings.frameMode}
|
||||
selectedFrameId={settings.selectedFrameId}
|
||||
/>
|
||||
);
|
||||
case 'preview':
|
||||
return (
|
||||
</View>
|
||||
|
||||
{/* Overlay PreviewScreen if active */}
|
||||
{currentScreen === 'preview' && (
|
||||
<View style={StyleSheet.absoluteFill}>
|
||||
<PreviewScreen
|
||||
photoUris={photoUris}
|
||||
printerIp={settings.printerIp}
|
||||
@@ -112,41 +124,19 @@ export default function App() {
|
||||
dateOverlayPosition={settings.dateOverlayPosition}
|
||||
eventText={settings.eventText}
|
||||
/>
|
||||
);
|
||||
case 'admin':
|
||||
return (
|
||||
</View>
|
||||
)}
|
||||
|
||||
{/* Overlay AdminScreen if active */}
|
||||
{currentScreen === 'admin' && (
|
||||
<View style={StyleSheet.absoluteFill}>
|
||||
<AdminScreen
|
||||
currentSettings={settings}
|
||||
onSave={handleSaveSettings}
|
||||
onClose={() => setCurrentScreen('home')}
|
||||
/>
|
||||
);
|
||||
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()}
|
||||
</View>
|
||||
)}
|
||||
</SafeAreaView>
|
||||
</GestureHandlerRootView>
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user