ArcanePixels

Updates

# SafeShoot — Changelog Session 2025-06-23

## Neue Features

### Buchungs- & Connection-Flow
- Nutzer können sich gegenseitig Buchungsanfragen stellen (pending / accepted / declined / ended)
- Anfragen erscheinen direkt im Profil des anderen Nutzers
- Begründung beim Ablehnen oder Beenden optional, verschlüsselt gespeichert (Zero-Knowledge)
- Nachrichten-Kanal öffnet sich automatisch bei akzeptierter Verbindung

### Nachrichten (Messages)
- Tab-Trennung: Nachrichten vs. System-Updates
- Polling alle 5 Sekunden (kein WebSocket-Overhead)
- Toast-Benachrichtigungen bei neuen Nachrichten und Verträgen (In-App)

### Convention Archive
- Fotografen können Events anlegen und Einträge (Personen) pro Event verwalten
- Jeder Eintrag bekommt einen eigenen QR-Code / Access-Token
- Fotos können pro Eintrag hochgeladen werden (Cloudflare R2)
- Öffentliche Archiv-Page `/archive/[token]` — kein Login nötig
- Scanner erkennt Convention-Archive-QR-Codes und leitet direkt weiter
- Nutzer sehen eigene Archiv-Fotos unter „Meine Fotos"

### Scanner
- QR-Codes für SafeShoot-Profile UND Convention-Archive werden erkannt
- Manuelle ID-Eingabe weiterhin möglich
- Klare Fehlermeldung bei unbekannten QR-Codes

### i18n — Deutsch & Englisch
- Alle neuen Features (Messages, Connection, Scanner, Archive, Cancellation) in `de.json` und `en.json`
- Datenschutzerklärung und Impressum vollständig zweisprachig als Server Components
- Sprach-Switcher im Profil/Einstellungen (Cookie-basiert, persistent)
- Sprachumschaltung per `NEXT_LOCALE`-Cookie, Middleware-gesteuert

### Theme-System
- Theme-Wahl wird jetzt via Cookie (`ss_theme`) gespeichert — kein Hydration-Flash mehr beim Laden
- `ThemeProvider` erhält `initialTheme` SSR-seitig aus Cookie (Root-Layout liest Cookie server-side)
- `setTheme` schreibt localStorage **und** Cookie synchron

### Profil — Collapsible Settings
- Einstellungs-Kacheln durch aufklappbare Sektionen ersetzt (`CollapsibleSection`-Komponente)
- Erscheinungsbild standardmäßig geöffnet, Rest zugeklappt
- Profil teilen / Link kopieren direkt in den Einstellungen
- Toggle-Helper-Komponente für saubere Switch-UI

### DSGVO & BFSG
- Datenschutzerklärung aktualisiert: inquiry_connections, Convention Archive, verschlüsselte Endgründe, Zero-Knowledge-Prinzip
- Neuer Abschnitt: Barrierefreiheit (BFSG / WCAG 2.1 AA)
- Beschwerderecht LDI NRW explizit genannt
- Impressum ebenfalls zweisprachig mit BFSG-Verweis

### PWA / iOS
- `viewport-fit=cover` gesetzt — iOS Home Indicator wird korrekt berücksichtigt
- `.safe-area-bottom` CSS-Utility für `env(safe-area-inset-bottom)`

---

## Bug Fixes

### Mobile Navbar (kritisch)
- **Problem:** Inhalte verschwanden hinter der fixen Bottom-Navbar — Buttons nicht anklickbar
- **Fix:** Layout-Wrapper `pb-4` → `pb-24`, Spacer-div entfernt
- **Fix:** Modals mit `items-end` (docken unten an) bekommen `pb-24 sm:pb-4` — Buttons sichtbar über Navbar
- **Betroffen:** Convention Archive „Event anlegen", Session-Detail „Eintrag hinzufügen"

### Theme-Flash (Hydration)
- **Problem:** Theme wurde erst client-seitig aus localStorage gelesen → kurzes Flackern auf Dark Purple
- **Fix:** Cookie `ss_theme` wird server-seitig gelesen und als `initialTheme` an `ThemeProvider` übergeben

### JSON-Truncation (intern / Build-Tool-Bug)
- **Problem:** Edit/Write-Tool schneidet Dateien bei Umlauten oder langen Zeilen ab → kaputte JSON/TSX
- **Fix:** Alle Dateien werden ab jetzt ausschließlich über bash/Python geschrieben (kein Edit/Write-Tool)
- **Betroffen war:** `de.json`, `en.json`, `SettingsPanel.tsx`, `ProfileFormClient.tsx`, `scanner/page.tsx`, `layout.tsx`

### Push / VAPID
- VAPID-Key-Format-Fehler behoben (raw 32-byte statt pkcs8)
- Push-URL enthielt literales `[lang]` statt echtem Locale-Wert
- Sender-Profil-Lookup in `inquiries/route.ts` korrigiert (WHERE id statt WHERE user_id)

### Convention Archive
- QR-Code-Links führten zu 404 (Middleware blockierte `/archive/...`)
- Thumbnail-Vorschau war unsichtbar (opacity:0-Bug)
- File-Proxy: Content-Type-Fallback, korrekte Cache-Header, CORS

### Scanner
- JSX komplett abgeschnitten durch Write-Tool-Bug → komplett neu geschrieben via bash
- Archive-Token-Erkennung im QR-Handler ergänzt

### SettingsPanel / ProfileFormClient
- Beide Dateien durch Edit-Tool-Bug abgeschnitten → closing tags fehlten → TSC-Fehler
- Behoben durch vollständigen Neuschrieb via Python

### Security
- `.dev.vars` (enthält API-Keys) aus Git-Tracking entfernt

---

## Offene Punkte / Known Issues

- Scanner-Seite: Texte noch nicht vollständig i18n (Umlaute wurden wegen Write-Tool-Bug entfernt, müssen nach Bugfix nachgepflegt werden)
- Theme-Override via `!important`-CSS ist ein Workaround — langfristig sollten alle Seiten CSS Custom Properties direkt nutzen statt Tailwind-Klassen wie `bg-black`
- SettingsPanel: Sprach-Switcher zeigt Hardcoded-String statt i18n-Key (niedrige Priorität)

Zurück zur Übersicht