chahinebrini 8f2b93f881 feat(profile): Avatar + Nickname edit-flow
User-Wunsch: auf Profile Avatar + Nickname ändern können. Avatar entweder
preset aus signup-list ODER eigene Foto mit cropper.

New files:
- app/profile/edit.tsx — vollständiger Edit-Screen (Avatar-Gallery + Photo-Picker
  + Nickname TextInput + Save-Button)
- lib/avatars.ts — HERO_AVATARS preset-list (matched mit Nuxt-app Signup) +
  getAvatarUrl helper
- lib/resolveAvatar.ts — resolveAvatar(avatarId, nickname): URL für
  preset-id ODER fallback auf nickname-initial-tile

Profile-Page wiring:
- Avatar-Tap + Nickname-Tap pushen jetzt zu /profile/edit (statt Alert-stub)
- Nach successful save: useMe.reload() + router.back()

Edit-Flow:
- Preset (HERO_AVATARS, 12 items): tap-grid mit selected-State + brand-Border
- Eigenes Photo: expo-image-picker mit allowsEditing+aspect[1,1] (OS-nativer
  Crop-Dialog), expo-file-system/legacy für base64-Konvertierung, upload via
  POST /api/avatar/upload (writes Supabase-Storage rebreak-avatars + updated
  Profile)
- Save: PATCH /api/auth/me { nickname, avatar }

i18n: profile.edit_* keys DE+EN

Backend-API:
- PATCH /api/auth/me — existiert (apps/admin/composables nicht — backend!)
- POST /api/avatar/upload — existiert

TS-fixes:
- expo-file-system → /legacy import (SDK 54 breaking change, siehe Task #14)
- ?? + || mixing fixed mit klammern

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-08 22:15:13 +02:00
..

Rebreak Native (React Native + Expo)

Mobile App für iOS + Android. Migration von Nuxt+Capacitor → React Native+Expo. Migration-Plan: apps/rebreak/docs/react-native-migration.md

Status

Phase 1 — Foundation Skeleton (2026-05-02)

  • Verzeichnisstruktur
  • package.json mit Expo SDK 53 + RN 0.76 (New Architecture)
  • app.config.ts (Expo, Bundle-ID org.rebreak.app)
  • Expo Router Skeleton
  • NativeWind Setup (Tailwind für RN)
  • Metro Config (pnpm Monorepo aware)
  • Supabase Client + API Wrapper
  • pnpm install — vom User auszuführen
  • expo prebuild — generiert ios/ + android/ Bare-Projekte
  • Native Module Imports (NEFilter, VpnService, A11y) — Phase 5+

Setup

# vom Monorepo-Root:
pnpm install

# Native-Projekte generieren (lokal, nicht committed)
cd apps/rebreak-native
pnpm prebuild

# Run
pnpm ios       # iOS Simulator
pnpm android   # Android Emulator

Stack

Bereich Lib
Framework React Native 0.76 (New Architecture) + Expo SDK 53
Routing Expo Router (file-based)
State Zustand
Server State TanStack Query (React Query)
Styling NativeWind 4 (Tailwind)
Forms React Hook Form + Valibot
i18n react-i18next
Auth @supabase/supabase-js + AsyncStorage
Animation react-native-reanimated, lottie-react-native
Storage react-native-mmkv (fast key-value)

Verzeichnisstruktur

apps/rebreak-native/
├── app/                  # Expo Router (file-based routes)
│   ├── _layout.tsx       # Root Stack
│   ├── index.tsx         # Landing (auth oder app entscheiden)
│   ├── (auth)/           # Auth-Flow (signin, signup, forgot-password)
│   └── (app)/            # Authenticated App (tabs)
├── components/           # Reusable UI Components
├── hooks/                # Custom React Hooks
├── stores/               # Zustand Stores
├── lib/                  # Supabase Client, API Wrapper, Utils
│   ├── supabase.ts
│   └── api.ts
├── locales/              # de.json, en.json
├── modules/              # Custom Expo Native Modules
│   ├── rebreak-ios-filter/        # NEFilter + Tunnel (Phase 5)
│   ├── rebreak-android-blocker/   # VpnService + DnsFilter (Phase 6)
│   └── rebreak-android-a11y/      # AccessibilityService (Phase 6)
├── plugins/              # Expo Config Plugins
└── assets/               # Icons, Splashscreens, Fonts

Wichtige Konfiguration

Datei Zweck
app.config.ts Expo App-Config (Bundle-ID, Permissions, Plugins)
metro.config.js Monorepo-aware Metro (Symlinks, Workspace-Folders)
babel.config.js NativeWind Preset + Reanimated Plugin
tailwind.config.js Tailwind Config — Brand-Colors aus apps/rebreak/ syncen
global.css NativeWind Tailwind-Imports

Native Module Strategie

Bestehender Native-Code aus apps/rebreak/ios/ + apps/rebreak/android/ wird in Expo Native Modules gewrappt — ohne neu zu schreiben.

iOS — modules/rebreak-ios-filter/

Wrapped:

  • RebreakURLFilter (NEFilterDataProvider) → blockt bet365 etc.
  • RebreakTunnel (NEPacketTunnelProvider) → DNS-Filter

Android — modules/rebreak-android-blocker/

Wrapped:

  • RebreakVpnService (Kotlin) → VpnService DNS-Filter
  • DnsFilter + HashList + DomainHasher

Android — modules/rebreak-android-a11y/

Wrapped:

  • RebreakAccessibilityService → Detection von Gambling-Apps

⚠️ Wichtige Hinweise

  • Schutz-Stack bleibt 1:1 erhalten — Swift- und Kotlin-Code wandert unverändert in modules/.
  • Backend bleibt in apps/rebreak/server/ — RN ruft die gleichen Endpoints.
  • Alte Capacitor-App bleibt deployed bis RN-App im Store ist.
  • Kein Auto-Commit — User entscheidet wann committet wird.

Phasen-Tracker

Siehe Migration-Plan für Details: apps/rebreak/docs/react-native-migration.md