UI refactor: Admin Screen redesign, Timers, Flash timing, Date overlay

This commit is contained in:
2026-06-12 00:06:12 +02:00
parent d1b7ca36d0
commit 3bed68f728
6 changed files with 282 additions and 205 deletions
+13 -48
View File
@@ -36,7 +36,7 @@ interface PreviewScreenProps {
availableFrameIds: string[];
// Date overlay settings
dateOverlay: 'off' | 'date' | 'datetime';
dateOverlayPosition: string;
dateOverlayTransform: { x: number; y: number; rotation: number; scale: number };
// Event text
eventText: string;
}
@@ -53,7 +53,7 @@ export default function PreviewScreen({
initialFrameId,
availableFrameIds,
dateOverlay,
dateOverlayPosition,
dateOverlayTransform,
eventText,
}: PreviewScreenProps) {
const [layout, setLayout] = useState<CollageLayout>('single');
@@ -176,19 +176,15 @@ export default function PreviewScreen({
// Get date overlay position styles
const getDatePositionStyle = () => {
switch (dateOverlayPosition) {
case 'bottom-left':
return { bottom: 12, left: 12 };
case 'top-right':
return { top: 12, right: 12 };
case 'top-left':
return { top: 12, left: 12 };
case 'bottom-center':
return { bottom: 12, left: 0, right: 0, alignItems: 'center' as const };
case 'bottom-right':
default:
return { bottom: 12, right: 12 };
}
return {
position: 'absolute' as const,
left: `${dateOverlayTransform.x}%` as any,
top: `${dateOverlayTransform.y}%` as any,
transform: [
{ rotate: `${dateOverlayTransform.rotation}deg` },
{ scale: dateOverlayTransform.scale }
]
};
};
// ── Sticker handlers ──
@@ -310,35 +306,7 @@ export default function PreviewScreen({
}
};
// Saves to gallery without printing
const handleSaveOnly = async () => {
logger.log('Action: Clicked Save button');
if (idleTimerRef.current) clearTimeout(idleTimerRef.current);
if (!mountedRef.current) return;
if (isProcessing) return;
setIsProcessing(true);
try {
const saveUri = await captureComposite(currentPhoto);
if (!mountedRef.current) return;
setStatusMessage('Bild wird generiert...');
setStatusMessage('Wird in Galerie gespeichert...');
await saveToGallery(saveUri);
if (!mountedRef.current) return;
setStatusMessage('Erfolgreich gespeichert!');
setTimeout(() => {
if (!mountedRef.current) return;
setIsProcessing(false);
resetIdleTimer();
}, 1500);
} catch (error: any) {
if (!mountedRef.current) return;
console.error('Saving failed:', error);
alert('Fehler: ' + error.message);
setIsProcessing(false);
}
};
const handleExitRef = useRef<(() => void) | null>(null);
handleExitRef.current = async () => {
@@ -389,7 +357,7 @@ export default function PreviewScreen({
if (idleTimerRef.current) clearTimeout(idleTimerRef.current);
idleTimerRef.current = setTimeout(() => {
if (handleExitRef.current) handleExitRef.current();
}, 60000);
}, 120000);
}, []);
useEffect(() => {
@@ -681,10 +649,7 @@ export default function PreviewScreen({
</LinearGradient>
</TouchableOpacity>
<TouchableOpacity style={[styles.actionBtn, styles.saveBtn, isProcessing && styles.btnDisabled]} onPress={handleSaveOnly} disabled={isProcessing}>
<FontAwesomeIcon icon={faDownload} size={16} color={THEME.colors.accent} style={{ marginRight: 8 }} />
<Text style={[styles.actionBtnText, { color: THEME.colors.accent }]}>Nur auf Tablet speichern</Text>
</TouchableOpacity>
{photoUris.length < 4 && (
<TouchableOpacity style={[styles.actionBtn, styles.addBtn, isProcessing && styles.btnDisabled]} onPress={onAddAnother} disabled={isProcessing}>