Auto-Commit: 2026-07-09 22:51:28
This commit is contained in:
+19
-19
@@ -67,7 +67,7 @@ export default function AdminScreen({ currentSettings, onSave, onClose }: AdminS
|
||||
const [isTogglingKiosk, setIsTogglingKiosk] = useState<boolean>(false);
|
||||
const [logs, setLogs] = useState<string | null>(null);
|
||||
const scrollViewRef = useRef<ScrollView>(null);
|
||||
|
||||
|
||||
const [kioskActive, setKioskActive] = useState<boolean>(false);
|
||||
const [isDeviceOwner, setIsDeviceOwner] = useState<boolean>(false);
|
||||
|
||||
@@ -150,7 +150,7 @@ export default function AdminScreen({ currentSettings, onSave, onClose }: AdminS
|
||||
return () => subscription.remove();
|
||||
}, [
|
||||
countdown, printerIp, password, kioskActive, frameMode, selectedFrameId, availableFrameIds,
|
||||
dateOverlay, dateOverlayTransform, eventText, burstCount, burstIntervalSec, welcomeText,
|
||||
dateOverlay, dateOverlayTransform, eventText, burstCount, burstIntervalSec, welcomeText,
|
||||
footerText, useFrontCamera, enableLogs, currentSettings
|
||||
]);
|
||||
|
||||
@@ -213,7 +213,7 @@ export default function AdminScreen({ currentSettings, onSave, onClose }: AdminS
|
||||
|
||||
const ipTrimmed = printerIp.trim();
|
||||
const ipRegex = /^(?:[0-9]{1,3}\.){3}[0-9]{1,3}$/;
|
||||
|
||||
|
||||
// IP may be empty to enable digital-only mode
|
||||
if (ipTrimmed !== '' && !ipRegex.test(ipTrimmed)) {
|
||||
Alert.alert('Ungültige Eingabe', 'Bitte gib eine gültige IP-Adresse ein oder lass das Feld leer (für rein digitalen Modus).');
|
||||
@@ -328,9 +328,9 @@ export default function AdminScreen({ currentSettings, onSave, onClose }: AdminS
|
||||
<FontAwesomeIcon icon={faArrowLeft} size={14} color={THEME.colors.text} />
|
||||
<Text style={styles.closeBtnText}>Zurück zur Fotobox</Text>
|
||||
</TouchableOpacity>
|
||||
<TouchableOpacity
|
||||
style={styles.logBtn}
|
||||
onPress={async () => setLogs(await logger.readLogs())}
|
||||
<TouchableOpacity
|
||||
style={styles.logBtn}
|
||||
onPress={async () => setLogs(await logger.readLogs())}
|
||||
>
|
||||
<FontAwesomeIcon icon={faFileLines} size={16} color={THEME.colors.text} />
|
||||
<Text style={styles.closeBtnText}>Logs</Text>
|
||||
@@ -354,7 +354,7 @@ export default function AdminScreen({ currentSettings, onSave, onClose }: AdminS
|
||||
/>
|
||||
</View>
|
||||
<View style={styles.inputGroup}>
|
||||
<Text style={styles.label}>Subtext (Footer)</Text>
|
||||
<Text style={styles.label}>Fußtext</Text>
|
||||
<TextInput
|
||||
style={styles.input}
|
||||
placeholder="Display tippen! • Lächeln! • Foto schnappen!"
|
||||
@@ -431,7 +431,7 @@ export default function AdminScreen({ currentSettings, onSave, onClose }: AdminS
|
||||
<Text style={styles.cardTitle}>Gestaltung: Fotorahmen</Text>
|
||||
</View>
|
||||
{renderSegment(FRAME_MODE_OPTIONS, frameMode, setFrameMode)}
|
||||
|
||||
|
||||
{frameMode === 'always' && FRAMES.length > 0 && (
|
||||
<View style={styles.inputGroup}>
|
||||
<Text style={styles.label}>Ausgewählter Rahmen</Text>
|
||||
@@ -498,21 +498,21 @@ export default function AdminScreen({ currentSettings, onSave, onClose }: AdminS
|
||||
<Text style={styles.cardTitle}>Gestaltung: Datum/Uhrzeit-Einblendung</Text>
|
||||
</View>
|
||||
{renderSegment(DATE_OVERLAY_OPTIONS, dateOverlay, setDateOverlay)}
|
||||
|
||||
|
||||
{dateOverlay !== 'off' && (
|
||||
<View style={styles.inputGroup}>
|
||||
<Text style={styles.label}>Vorschau: Positionieren & Drehen</Text>
|
||||
<Text style={styles.cardDesc}>
|
||||
Ziehe den Text in der Vorschau mit dem Finger an die gewünschte Position. Passe Rotation und Größe mit den +/- Tasten an.
|
||||
</Text>
|
||||
|
||||
|
||||
<View style={styles.previewBoxContainer}>
|
||||
<View style={styles.previewBox}>
|
||||
<View
|
||||
<View
|
||||
style={[
|
||||
styles.previewTextWrapper,
|
||||
{
|
||||
left: `${dateOverlayTransform.x}%`,
|
||||
styles.previewTextWrapper,
|
||||
{
|
||||
left: `${dateOverlayTransform.x}%`,
|
||||
top: `${dateOverlayTransform.y}%`,
|
||||
transform: [
|
||||
{ rotate: `${dateOverlayTransform.rotation}deg` },
|
||||
@@ -594,7 +594,7 @@ export default function AdminScreen({ currentSettings, onSave, onClose }: AdminS
|
||||
/>
|
||||
</View>
|
||||
<View style={styles.toggleRow}>
|
||||
<Text style={styles.toggleLabel}>Tablet-Frontkamera als Fallback erzwingen</Text>
|
||||
<Text style={styles.toggleLabel}>Frontkamera nutzen (Deaktiviert externe Kamera)</Text>
|
||||
<Switch
|
||||
value={useFrontCamera}
|
||||
onValueChange={setUseFrontCamera}
|
||||
@@ -603,7 +603,7 @@ export default function AdminScreen({ currentSettings, onSave, onClose }: AdminS
|
||||
/>
|
||||
</View>
|
||||
<View style={styles.toggleRow}>
|
||||
<Text style={styles.toggleLabel}>App-Protokollierung (Logs) aktivieren</Text>
|
||||
<Text style={styles.toggleLabel}>Logs aktivieren</Text>
|
||||
<Switch
|
||||
value={enableLogs}
|
||||
onValueChange={setEnableLogs}
|
||||
@@ -674,7 +674,7 @@ export default function AdminScreen({ currentSettings, onSave, onClose }: AdminS
|
||||
</TouchableOpacity>
|
||||
</View>
|
||||
</View>
|
||||
|
||||
|
||||
{/* Log Modal */}
|
||||
<Modal visible={logs !== null} transparent animationType="slide">
|
||||
<View style={{ flex: 1, backgroundColor: 'rgba(0,0,0,0.8)', justifyContent: 'center', alignItems: 'center' }}>
|
||||
@@ -695,10 +695,10 @@ export default function AdminScreen({ currentSettings, onSave, onClose }: AdminS
|
||||
<Text style={{ color: '#fff', fontWeight: 'bold' }}>Teilen / Kopieren</Text>
|
||||
</TouchableOpacity>
|
||||
</View>
|
||||
<ScrollView
|
||||
<ScrollView
|
||||
style={{ flex: 1, backgroundColor: '#000', padding: 10, borderRadius: 5 }}
|
||||
ref={scrollViewRef}
|
||||
onContentSizeChange={() => scrollViewRef.current?.scrollToEnd({animated: true})}
|
||||
onContentSizeChange={() => scrollViewRef.current?.scrollToEnd({ animated: true })}
|
||||
>
|
||||
<Text style={{ color: '#0f0', fontFamily: 'monospace' }}>{logs}</Text>
|
||||
</ScrollView>
|
||||
|
||||
@@ -348,7 +348,7 @@ export default function CameraScreen({
|
||||
});
|
||||
capturedUri = photo.uri;
|
||||
} else {
|
||||
throw new Error('Kamera-Referenz ist nicht verfügbar. Bitte stelle sicher, dass die externe Kamera verbunden ist, oder aktiviere den Front-Kamera-Fallback in den Admin-Einstellungen.');
|
||||
throw new Error('Externe Kamera nicht gefunden. Bitte stelle sicher, dass die externe Kamera richtig verbunden ist oder aktiviere die Front-Kamera in den Admin-Einstellungen (oben rechts).');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -562,7 +562,7 @@ export default function CameraScreen({
|
||||
<Text style={styles.modalTitle}>Admin-Zugang</Text>
|
||||
<Text style={styles.modalSub}>Passwort eingeben, um Einstellungen zu öffnen</Text>
|
||||
<Text style={[styles.modalSub, { color: THEME.colors.error, marginTop: 10, fontSize: 14, fontStyle: 'italic' }]}>
|
||||
Tipp: Standardcode ist 1234. Bitte ändern! Ein Zurücksetzen ist nur durch Neuinstallation der App möglich.
|
||||
Standardcode: 1234. Bitte in den Einstellungen ändern! Ein Zurücksetzen ist nur durch Neuinstallation der App möglich.
|
||||
</Text>
|
||||
|
||||
<TextInput
|
||||
|
||||
@@ -48,7 +48,7 @@ const DEFAULT_SETTINGS: AppSettings = {
|
||||
burstIntervalSec: 5,
|
||||
welcomeText: 'Zeit für ein Erinnerungsfoto!',
|
||||
footerText: 'Display tippen! • Lächeln! • Foto schnappen!',
|
||||
useFrontCamera: false,
|
||||
useFrontCamera: true,
|
||||
enableLogs: true,
|
||||
};
|
||||
|
||||
@@ -67,7 +67,7 @@ export async function loadSettings(): Promise<AppSettings> {
|
||||
try {
|
||||
const content = await settingsFile.text();
|
||||
const parsed = JSON.parse(content);
|
||||
|
||||
|
||||
// Reset to defaults if the app installation/update time has changed
|
||||
// Also reset if appLastUpdate is completely missing (updating from older version)
|
||||
if (!parsed.appLastUpdate || (currentUpdateTime && Math.abs(parsed.appLastUpdate - currentUpdateTime) > 5000)) {
|
||||
|
||||
Reference in New Issue
Block a user