diff --git a/.agents/AGENTS.md b/.agents/AGENTS.md new file mode 100644 index 00000000..c6baf4db --- /dev/null +++ b/.agents/AGENTS.md @@ -0,0 +1,6 @@ +# Versioning & Build Rules Addendum + +## Build Configuration +- The app MUST ALWAYS be signed with `schnappix-upload-key.keystore`. This is handled automatically by the custom Expo plugin `withAndroidSigning.js`. Do not modify or remove this plugin. +- The `schnappix-upload-key.keystore` file is checked into the Git repository. Do NOT delete it, ignore it in git, or change its password (`#O0he7k00O0he7k00!`). +- The Expo Media Library plugin injects `READ_MEDIA_IMAGES` and `READ_MEDIA_VIDEO` permissions into the Android manifest by default. These are rejected by Google Play for this specific app. To prevent this, the `withRemoveMediaPermissions.js` plugin MUST ALWAYS be included in `app.json`. This plugin forcibly strips these permissions using Android's `tools:node="remove"` directive during compilation. Do not remove this plugin. diff --git a/src/screens/CameraScreen.tsx b/src/screens/CameraScreen.tsx index f7582439..1b0364b1 100644 --- a/src/screens/CameraScreen.tsx +++ b/src/screens/CameraScreen.tsx @@ -9,6 +9,7 @@ import { TextInput, TouchableWithoutFeedback, PermissionsAndroid, + useWindowDimensions, } from 'react-native'; import { CameraView, useCameraPermissions } from 'expo-camera'; import * as FileSystem from 'expo-file-system/legacy'; @@ -110,6 +111,9 @@ export default function CameraScreen({ const completionTimerRef = useRef(null); const isCancelledRef = useRef(false); + const { width } = useWindowDimensions(); + const iconSize = width < 768 ? 18 : 32; + // Reanimated countdown pulse animation const scale = useSharedValue(1); @@ -538,9 +542,7 @@ export default function CameraScreen({ > {footerText === 'Display tippen! • Lächeln! • Foto schnappen!' ? ( - ㅤDisplay tippen!ㅤ•ㅤ - ㅤLächeln!ㅤ•ㅤ - ㅤFoto schnappen! + Display tippen! • Lächeln! • Foto schnappen! ) : ( footerText @@ -559,6 +561,9 @@ export default function CameraScreen({ Admin-Zugang Passwort eingeben, um Einstellungen zu öffnen + + Tipp: Standardcode ist 1234. Bitte ändern! Ein Zurücksetzen ist nur durch Neuinstallation der App möglich. + width; + const isSmallDevice = width < 768; const [activeUris, setActiveUris] = useState([]); @@ -117,6 +118,7 @@ export default function PreviewScreen({ }; }, []); const [showStickerTray, setShowStickerTray] = useState(false); + const [showFrameTray, setShowFrameTray] = useState(false); React.useEffect(() => { logger.log(`PreviewScreen mounted with ${photoUris.length} photos.`); @@ -537,10 +539,10 @@ export default function PreviewScreen({ {/* Right panel: Controls */} - {eventText} + {eventText} {/* Thumbnail Reel for Photo Selection */} {photoUris.length > 1 && ( @@ -581,8 +583,12 @@ export default function PreviewScreen({ {/* Editing Tools Row */} { logger.log(`Action: Toggled sticker tray ${!showStickerTray}`); setShowStickerTray(!showStickerTray); }} + style={[styles.editToolBtn, isSmallDevice && { paddingVertical: 8, paddingHorizontal: 12 }, showStickerTray && styles.editToolBtnActive]} + onPress={() => { + logger.log(`Action: Toggled sticker tray ${!showStickerTray}`); + setShowStickerTray(!showStickerTray); + if (!showStickerTray) setShowFrameTray(false); + }} > { - if (selectedFrameId !== null) { - logger.log('Action: Removed frame'); - setSelectedFrameId(null); - } else { - logger.log('Action: Toggled frame selection'); - } - // FramePicker is shown below + logger.log(`Action: Toggled frame tray ${!showFrameTray}`); + setShowFrameTray(!showFrameTray); + if (!showFrameTray) setShowStickerTray(false); }} > - + Rahmen @@ -620,7 +622,7 @@ export default function PreviewScreen({ {/* Frame Picker (when mode = available) */} - {frameMode === 'available' && ( + {frameMode === 'available' && showFrameTray && ( { @@ -633,12 +635,12 @@ export default function PreviewScreen({ {/* Action Buttons */} - + JETZT DRUCKEN @@ -648,7 +650,7 @@ export default function PreviewScreen({ {photoUris.length < 4 && ( - + Weiteres Foto aufnehmen