chore: update app configurations and screens
This commit is contained in:
@@ -70,6 +70,9 @@ export default function PreviewScreen({
|
||||
const [selectedStickerId, setSelectedStickerId] = useState<string | null>(null);
|
||||
const [showStickerTray, setShowStickerTray] = useState<boolean>(false);
|
||||
|
||||
// Idle Timer state
|
||||
const idleTimerRef = useRef<any>(null);
|
||||
|
||||
// Frame state
|
||||
const [selectedFrameId, setSelectedFrameId] = useState<string | null>(
|
||||
frameMode === 'always' ? initialFrameId : null
|
||||
@@ -227,7 +230,7 @@ export default function PreviewScreen({
|
||||
};
|
||||
|
||||
// Auto-save and exit
|
||||
const handleExit = async () => {
|
||||
const handleExit = useCallback(async () => {
|
||||
if (stickers.length === 0 && layout === 'single' && !activeFrame && dateOverlay === 'off') {
|
||||
onReset();
|
||||
return;
|
||||
@@ -248,6 +251,36 @@ export default function PreviewScreen({
|
||||
setIsProcessing(false);
|
||||
onReset();
|
||||
}
|
||||
}, [stickers, layout, activeFrame, dateOverlay, onReset]);
|
||||
|
||||
// Idle timer logic
|
||||
const resetIdleTimer = useCallback(() => {
|
||||
if (idleTimerRef.current) clearTimeout(idleTimerRef.current);
|
||||
idleTimerRef.current = setTimeout(() => {
|
||||
handleExit();
|
||||
}, 60000);
|
||||
}, [handleExit]);
|
||||
|
||||
useEffect(() => {
|
||||
resetIdleTimer();
|
||||
return () => {
|
||||
if (idleTimerRef.current) clearTimeout(idleTimerRef.current);
|
||||
};
|
||||
}, [resetIdleTimer]);
|
||||
|
||||
const handleRetakeClick = async () => {
|
||||
if (stickers.length > 0 || layout !== 'single' || activeFrame || dateOverlay !== 'off') {
|
||||
setIsProcessing(true);
|
||||
setStatusMessage('Wird vor dem Wiederholen gespeichert...');
|
||||
try {
|
||||
const capturedUri = await captureComposite();
|
||||
await saveToGallery(capturedUri);
|
||||
} catch (error) {
|
||||
console.error('Auto-saving before retake failed:', error);
|
||||
}
|
||||
setIsProcessing(false);
|
||||
}
|
||||
onRetakeLast();
|
||||
};
|
||||
|
||||
// ── Render the collage ──
|
||||
@@ -303,7 +336,12 @@ export default function PreviewScreen({
|
||||
};
|
||||
|
||||
return (
|
||||
<Animated.View entering={FadeIn.duration(400)} exiting={FadeOut.duration(300)} style={styles.container}>
|
||||
<Animated.View
|
||||
entering={FadeIn.duration(400)}
|
||||
exiting={FadeOut.duration(300)}
|
||||
style={styles.container}
|
||||
onTouchStart={resetIdleTimer}
|
||||
>
|
||||
{/* Left panel: Preview Canvas */}
|
||||
<TouchableOpacity
|
||||
style={styles.previewPanel}
|
||||
@@ -482,7 +520,7 @@ export default function PreviewScreen({
|
||||
)}
|
||||
|
||||
<View style={styles.rowActions}>
|
||||
<TouchableOpacity style={[styles.smallBtn, styles.retakeBtn]} onPress={onRetakeLast}>
|
||||
<TouchableOpacity style={[styles.smallBtn, styles.retakeBtn]} onPress={handleRetakeClick}>
|
||||
<FontAwesomeIcon icon={faRotateLeft} size={14} color={THEME.colors.error} style={{ marginRight: 6 }} />
|
||||
<Text style={[styles.smallBtnText, { color: THEME.colors.error }]}>Wiederholen</Text>
|
||||
</TouchableOpacity>
|
||||
@@ -686,7 +724,7 @@ const styles = StyleSheet.create({
|
||||
width: 480,
|
||||
height: 320,
|
||||
backgroundColor: '#fff',
|
||||
padding: 10,
|
||||
padding: 0,
|
||||
shadowColor: THEME.colors.gradientGlow,
|
||||
shadowOffset: { width: 0, height: 0 },
|
||||
shadowOpacity: 0.35,
|
||||
|
||||
Reference in New Issue
Block a user