import AsyncStorage from '@react-native-async-storage/async-storage'; import * as SecureStore from 'expo-secure-store'; import { AuthService } from './authService'; import { AppMetaDb } from './database'; /** * Setzt die App auf den Zustand "frisch installiert" zurueck - fuer Tests. * * Warum das noetig ist: Ein Expo-Reload oder ein neuer QR-Scan loescht keinen * persistenten State. Die Session liegt in SecureStore (auf iOS = Keychain, * ueberlebt sogar das Loeschen der App), der Onboarding-Flag und der * Install-Marker liegen in SQLite. Man landet deshalb immer wieder direkt im * Dashboard, egal wie oft man neu laedt. * * Diese Funktion raeumt genau die vier Stellen ab, die das Onboarding-Gate in * app/_layout.tsx auswerten: * 1. Session -> SecureStore * 2. onboarding_completed -> SQLite (AppMetaDb) * 3. install_marker_v2 -> SQLite + SecureStore * 4. Experiment-Zuweisung -> AsyncStorage */ export const resetToFreshInstall = async (): Promise => { // 1. Session (Access-/Refresh-Token) await AuthService.logout().catch(() => undefined); // 2. Onboarding-Flag: ohne den bleibt hasCompletedOnboarding true und das // Gate laesst den Nutzer am Welcome-Screen vorbei. AppMetaDb.set('onboarding_completed', '0'); // 3. Install-Marker in BEIDEN Speichern. Der Keychain-Eintrag ist der Grund, // warum eine echte Neuinstallation frueher nicht als solche erkannt wurde. // Key muss mit SECURE_INSTALL_MARKER in app/_layout.tsx uebereinstimmen. AppMetaDb.set('install_marker_v2', '0'); await SecureStore.deleteItemAsync('greenlens_install_v1').catch(() => undefined); await SecureStore.deleteItemAsync('greenlens_first_run_complete').catch(() => undefined); // 4. A/B-Zuweisung, damit beim naechsten Start neu gewuerfelt wird. await AsyncStorage.removeItem('greenlens_experiment_welcome_headline_v1').catch(() => undefined); await AsyncStorage.removeItem('greenlens_show_tour').catch(() => undefined); await AsyncStorage.removeItem('greenlens_preauth_onboarding_v1').catch(() => undefined); };