UI refactor: Admin Screen redesign, Timers, Flash timing, Date overlay
This commit is contained in:
@@ -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}>
|
||||
|
||||
Reference in New Issue
Block a user