Fix camera unmount crash via overlay architecture
This commit is contained in:
@@ -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>
|
||||||
);
|
);
|
||||||
|
|||||||
Reference in New Issue
Block a user