Fix bugs from code review (state flow, idle timer, logger, kiosk, temp files)

This commit is contained in:
2026-05-31 20:10:23 +02:00
parent 58015340a2
commit a922ec29c4
5 changed files with 133 additions and 66 deletions
+19 -12
View File
@@ -183,16 +183,22 @@ export default function PreviewScreen({
setSelectedStickerId(null);
}, []);
// Keep latest state in a ref to avoid stale closures and rapid re-renders
const stateRef = useRef({ stickers, layout, activeFrame, dateOverlay, onReset, currentPhoto });
React.useEffect(() => {
stateRef.current = { stickers, layout, activeFrame, dateOverlay, onReset, currentPhoto };
}, [stickers, layout, activeFrame, dateOverlay, onReset, currentPhoto]);
// ── Capture the final image ──
const captureComposite = async () => {
const captureComposite = async (fallbackPhoto: string = currentPhoto) => {
try {
if (viewShotRef.current) {
return await viewShotRef.current.capture();
}
return currentPhoto;
return fallbackPhoto;
} catch (e) {
console.error('Failed to capture composite:', e);
return currentPhoto;
return fallbackPhoto;
}
};
@@ -202,7 +208,7 @@ export default function PreviewScreen({
setStatusMessage('Dein Foto wird vorbereitet...');
try {
setStatusMessage('Bild wird generiert...');
const printUri = await captureComposite();
const printUri = await captureComposite(currentPhoto);
setStatusMessage('Druckauftrag wird an Drucker gesendet...');
await printImageLocal(printUri, {
@@ -230,7 +236,7 @@ export default function PreviewScreen({
setIsProcessing(true);
setStatusMessage('Bild wird generiert...');
try {
const saveUri = await captureComposite();
const saveUri = await captureComposite(currentPhoto);
setStatusMessage('Wird in Galerie gespeichert...');
await saveToGallery(saveUri);
@@ -249,27 +255,28 @@ export default function PreviewScreen({
// Auto-save and exit
const handleExit = useCallback(async () => {
if (stickers.length === 0 && layout === 'single' && !activeFrame && dateOverlay === 'off') {
onReset();
const state = stateRef.current;
if (state.stickers.length === 0 && state.layout === 'single' && !state.activeFrame && state.dateOverlay === 'off') {
state.onReset();
return;
}
setIsProcessing(true);
setStatusMessage('Wird gespeichert...');
try {
const capturedUri = await captureComposite();
const capturedUri = await captureComposite(state.currentPhoto);
await saveToGallery(capturedUri);
setStatusMessage('Erfolgreich gespeichert!');
setTimeout(() => {
setIsProcessing(false);
onReset();
state.onReset();
}, 1000);
} catch (error) {
console.error('Auto-saving on exit failed:', error);
setIsProcessing(false);
onReset();
state.onReset();
}
}, [stickers, layout, activeFrame, dateOverlay, onReset]);
}, []); // Stable reference
// Idle timer logic
const resetIdleTimer = useCallback(() => {
@@ -291,7 +298,7 @@ export default function PreviewScreen({
setIsProcessing(true);
setStatusMessage('Wird vor dem Wiederholen gespeichert...');
try {
const capturedUri = await captureComposite();
const capturedUri = await captureComposite(currentPhoto);
await saveToGallery(capturedUri);
} catch (error) {
console.error('Auto-saving before retake failed:', error);