/** * Konfiguracja banera migracyjnego (MigrationBanner). * * Kontekst: klucz podpisujący release APK (v0.2.1 i wcześniejsze) został utracony. * Androidowy update in-place wymaga TEGO SAMEGO podpisu, więc kolejnej wersji nie da * się już zainstalować na wierzchu, trzeba odinstalować starą i zainstalować nową. * Odinstalowanie kasuje SecureStore, a w nim `goon.device_id`, czyli kod synchronizacji. * Bez skopiowanego kodu ulubione, historia i postęp oglądania stają się nieosiągalne * (dane leżą na serwerze pod tym id, ale nie ma jak ich wskazać). * * Stąd baner: pokazuje kod PRZED odinstalowaniem i prowadzi przez kolejne kroki. * * Baner ma trafiać WYŁĄCZNIE do instalacji sprzed 0.2.2, czyli tych na runtime 1.1. * Sam podział na kanały OTA to za mało: chronił tylko dopóki kanał 1.2 był pusty, a przy * pierwszej publikacji na 1.2 ten sam bundle trafiłby do nowej wersji i kazałby jej * użytkownikom instalować ręcznie coś, co już mają. Stąd twardy warunek na runtime niżej. */ import * as Updates from 'expo-updates'; /** Kanał OTA instalacji sprzed 0.2.2. Tylko tam baner ma sens. */ const LEGACY_RUNTIME = '1.1'; export const MIGRATION_NOTICE = { /** Master switch. Ustaw false, gdy migracja się dopali i baner ma zniknąć. */ enabled: true, /** Wersja do zainstalowania. Pokazywana w banerze. */ version: '0.2.2', /** Strona pobierania. Celowo strona, nie plik: link przeżyje zmianę nazwy APK. */ downloadUrl: 'https://goon-foss.org/', } as const; /** Czy ta instalacja w ogóle wymaga ręcznej migracji. Fail-closed: gdy nie da się * odczytać runtime'u (dev client, brak expo-updates), NIE straszymy banerem. */ export function needsManualMigration(): boolean { if (!MIGRATION_NOTICE.enabled) return false; try { return Updates.runtimeVersion === LEGACY_RUNTIME; } catch { return false; } }