Fix additional lifecycle bugs: countdown timer leak, PreviewScreen unmount state updates, CameraView ready loops

This commit is contained in:
2026-05-31 21:19:43 +02:00
parent d6a3d4651b
commit 014536d5ec
3 changed files with 25 additions and 2 deletions
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

+25 -2
View File
@@ -72,6 +72,14 @@ export default function PreviewScreen({
// Sticker state // Sticker state
const [stickers, setStickers] = useState<StickerData[]>([]); const [stickers, setStickers] = useState<StickerData[]>([]);
const [selectedImageIndex, setSelectedImageIndex] = useState<number | null>(null);
const mountedRef = useRef(true);
useEffect(() => {
return () => {
mountedRef.current = false;
};
}, []);
const [selectedStickerId, setSelectedStickerId] = useState<string | null>(null); const [selectedStickerId, setSelectedStickerId] = useState<string | null>(null);
const [showStickerTray, setShowStickerTray] = useState<boolean>(false); const [showStickerTray, setShowStickerTray] = useState<boolean>(false);
@@ -214,6 +222,7 @@ export default function PreviewScreen({
try { try {
setStatusMessage('Bild wird generiert...'); setStatusMessage('Bild wird generiert...');
const printUri = await captureComposite(currentPhoto); const printUri = await captureComposite(currentPhoto);
if (!mountedRef.current) return;
setStatusMessage('Druckauftrag wird an Drucker gesendet...'); setStatusMessage('Druckauftrag wird an Drucker gesendet...');
await printImageLocal(printUri, { await printImageLocal(printUri, {
@@ -223,13 +232,16 @@ export default function PreviewScreen({
setStatusMessage('Wird in Galerie gespeichert...'); setStatusMessage('Wird in Galerie gespeichert...');
await saveToGallery(printUri); await saveToGallery(printUri);
if (!mountedRef.current) return;
setStatusMessage('Druck erfolgreich! Viel Spaß! 🎉'); setStatusMessage('Druck erfolgreich! Viel Spaß! 🎉');
setTimeout(() => { setTimeout(() => {
if (!mountedRef.current) return;
setIsProcessing(false); setIsProcessing(false);
onReset(); onReset();
}, 2000); }, 2000);
} catch (error: any) { } catch (error: any) {
if (!mountedRef.current) return;
console.error('Printing failed:', error); console.error('Printing failed:', error);
alert('Fehler: ' + error.message); alert('Fehler: ' + error.message);
setIsProcessing(false); setIsProcessing(false);
@@ -243,16 +255,20 @@ export default function PreviewScreen({
setStatusMessage('Bild wird generiert...'); setStatusMessage('Bild wird generiert...');
try { try {
const saveUri = await captureComposite(currentPhoto); const saveUri = await captureComposite(currentPhoto);
if (!mountedRef.current) return;
setStatusMessage('Wird in Galerie gespeichert...'); setStatusMessage('Wird in Galerie gespeichert...');
await saveToGallery(saveUri); await saveToGallery(saveUri);
if (!mountedRef.current) return;
setStatusMessage('Erfolgreich gespeichert!'); setStatusMessage('Erfolgreich gespeichert!');
setTimeout(() => { setTimeout(() => {
if (!mountedRef.current) return;
setIsProcessing(false); setIsProcessing(false);
onReset(); onReset();
}, 1500); }, 1500);
} catch (error: any) { } catch (error: any) {
if (!mountedRef.current) return;
console.error('Saving failed:', error); console.error('Saving failed:', error);
alert('Fehler: ' + error.message); alert('Fehler: ' + error.message);
setIsProcessing(false); setIsProcessing(false);
@@ -272,13 +288,17 @@ export default function PreviewScreen({
setStatusMessage('Wird gespeichert...'); setStatusMessage('Wird gespeichert...');
try { try {
const capturedUri = await captureComposite(state.currentPhoto); const capturedUri = await captureComposite(state.currentPhoto);
if (!mountedRef.current) return;
await saveToGallery(capturedUri); await saveToGallery(capturedUri);
if (!mountedRef.current) return;
setStatusMessage('Erfolgreich gespeichert!'); setStatusMessage('Erfolgreich gespeichert!');
setTimeout(() => { setTimeout(() => {
if (!mountedRef.current) return;
setIsProcessing(false); setIsProcessing(false);
state.onReset(); state.onReset();
}, 1000); }, 1000);
} catch (error) { } catch (error) {
if (!mountedRef.current) return;
console.error('Auto-saving on exit failed:', error); console.error('Auto-saving on exit failed:', error);
setIsProcessing(false); setIsProcessing(false);
state.onReset(); state.onReset();
@@ -307,9 +327,12 @@ export default function PreviewScreen({
setStatusMessage('Wird vor dem Wiederholen gespeichert...'); setStatusMessage('Wird vor dem Wiederholen gespeichert...');
try { try {
const capturedUri = await captureComposite(currentPhoto); const capturedUri = await captureComposite(currentPhoto);
if (!mountedRef.current) return;
await saveToGallery(capturedUri); await saveToGallery(capturedUri);
} catch (error) { if (!mountedRef.current) return;
console.error('Auto-saving before retake failed:', error); } catch (e) {
if (!mountedRef.current) return;
console.error('Failed to auto-save before retake:', e);
} }
setIsProcessing(false); setIsProcessing(false);
} }