chahinebrini 23cc147231 feat(auth/ios): native Apple Sign-In via expo-apple-authentication
Vorher: stores/auth.ts hatte TODO + fiel auf Supabase-Web-OAuth-Flow zurück,
was fehlschlug mit 400 'Unsupported provider: missing OAuth client ID' weil
der Supabase-Apple-OAuth-Provider nicht konfiguriert ist.

Jetzt: native Flow ohne Supabase-Provider-Config —
- expo-apple-authentication.signInAsync() → identityToken
- supabase.auth.signInWithIdToken({provider:'apple', token}) verifiziert direkt
  gegen Apple's Public-Keys (kein Client-Secret-JWT-Setup nötig)
- User-Cancel (ERR_REQUEST_CANCELED) → leeres Resultat statt Error
- Platform-Guard: Apple-Path nur auf iOS

app.config.ts: ios.usesAppleSignIn=true → Expo prebuild generiert das
com.apple.developer.applesignin-Entitlement in die .entitlements. Beim
ersten EAS-Build wird die Capability auto-registriert im Apple-Developer-
Portal für org.rebreak.app.

signin.tsx + signup.tsx: Apple-Button conditional auf Platform.OS==='ios'
gerendert. Android-User sehen nur Google-Button (auf Android gibt es kein
natives Apple Sign-In).

App-Store-Submission-Pflicht (Apple Guideline 4.8 — wer OAuth-Login mit
3rd-Party-Provider anbietet, muss auch Apple Sign-In bieten).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-18 00:13:45 +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