goon/mobile
goon-foss 45754afc69 fix(mobile): Edge bez agresywnego kadrowania na foldzie i przy poziomych klipach
Zgloszenie Jana (fold): rozlozony ekran jest prawie kwadratowy, a klip byl skalowany do
wypelnienia i zostawal z niego srodek. Teraz liczymy, ile by sie ucielo: do 30 % zostaje
wypelnienie (pionowy klip na zwyklym telefonie traci ok. 20 % szerokosci i to jest OK),
powyzej cale wideo i czarne pasy. Podpis i kolumna przyciskow stoja przy krawedziach
ekranu, wiec przy pasach same wchodza na pasy zamiast na wideo. Poster pod wideo dostaje
to samo kadrowanie, zeby nie mrugalo przy starcie.

Zysk takze na zwyklym telefonie: ok. 19 % klipow RedGifs jest poziomych i do tej pory byly
rozdmuchane na caly ekran.

Zmierzone na emulatorze przez rozmiar powierzchni wideo (dumpsys activity top):
- telefon 1080x2400: pionowy klip 1242x2209 (wypelnienie, jak dotad), poziomy 1080x607
  i klip 3:4 1080x1440 (pasy zamiast kadrowania)
- rozlozony fold 1768x2208: pionowy klip 1140x1947 z pasami po 314 px, poziomy 1768x1298

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-22 12:00:10 +02:00
..
android fix(apk 0.4.1): puste ikony na paczce wbudowanej, crash expo-video przy zamykaniu z ostatnich 2026-09-15 14:33:13 +02:00
assets feat(brand): oo logo — app icons, landing, in-app mark (Gemini-generated) 2026-05-30 22:38:52 +02:00
patches fix(apk 0.4.1): puste ikony na paczce wbudowanej, crash expo-video przy zamykaniu z ostatnich 2026-09-15 14:33:13 +02:00
src fix(mobile): Edge bez agresywnego kadrowania na foldzie i przy poziomych klipach 2026-09-22 12:00:10 +02:00
.gitignore Initial commit 2026-05-20 10:10:22 +02:00
app.json fix(apk 0.4.1): puste ikony na paczce wbudowanej, crash expo-video przy zamykaniu z ostatnich 2026-09-15 14:33:13 +02:00
App.tsx fix(mobile): monit o nowe APK takze na tym samym kanale OTA 2026-09-22 12:00:09 +02:00
babel.config.js Initial commit 2026-05-20 10:10:22 +02:00
package-lock.json fix(apk 0.4.1): puste ikony na paczce wbudowanej, crash expo-video przy zamykaniu z ostatnich 2026-09-15 14:33:13 +02:00
package.json fix(apk 0.4.1): puste ikony na paczce wbudowanej, crash expo-video przy zamykaniu z ostatnich 2026-09-15 14:33:13 +02:00
README.md Initial commit 2026-05-20 10:10:22 +02:00
tsconfig.json Initial commit 2026-05-20 10:10:22 +02:00

goon mobile (Expo / React Native)

Mobile client do self-hosted goon backendu. iOS/Android jeden codebase.

Setup

cd mobile
npm install
npx expo start

Następnie:

  • Expo Go (iOS/Android): zeskanuj QR z terminala
  • Android emulator: npm run android
  • iOS simulator: npm run ios (tylko macOS)
  • Web preview: npm run web

Konfiguracja

Po pierwszym uruchomieniu zobaczysz ekran logowania:

  • Backend URL — adres twojego goon backendu, np.:
    • http://192.168.1.10:8000 (LAN)
    • https://goon.tvojadomena.dev (przez Cloudflare Tunnel/Caddy)
    • http://100.x.x.x:8000 (przez Tailscale)
  • API Key — klucz wygenerowany dla backendu, ustawiony w .env:
    API_KEYS=<klucz>
    
    Generowanie:
    python -c "import secrets; print(secrets.token_urlsafe(32))"
    

Klucz jest trzymany w expo-secure-store (Keychain na iOS, Keystore na Androidzie).

Ekrany

  • Login — backend URL + API key, weryfikacja przez /healthz + /scenes
  • Scenes — lista scen z search; pull-to-refresh
  • Scene detail — performerzy, tagi, źródła, opis
  • Merge queue — pending merge candidates, sortowane po score (desc)
  • Merge detail — side-by-side dwóch scen + reasons + akcje:
    • Merge → keep LEFT (default — left to wcześniejsza/kanoniczna)
    • Merge → keep RIGHT (gdy nowsza wersja ma lepsze metadane)
    • Reject (keep both) — to nie jest duplikat, zostawiamy oddzielnie

Stack

  • Expo SDK 52 + React Native 0.76 (new architecture)
  • TypeScript strict
  • React Navigation 7 (native stack)
  • TanStack Query 5 (cache, optimistic invalidation)
  • expo-secure-store (credentials)

Build .apk (sideload na Androida)

npx eas build --profile preview --platform android

Wymaga konta Expo. Bez niego można użyć expo prebuild + gradlew assembleRelease.

Dlaczego nie PWA

Wybrany RN+Expo zamiast PWA bo:

  • swipe gestures pasują do triage merge queue
  • secure-store jest natywny (Keychain/Keystore) zamiast localStorage
  • pull-to-refresh i FlatList virtualization out-of-the-box
  • Jeden .apk można rozdać testerom bez App Store