42 lines
2.0 KiB
TypeScript
42 lines
2.0 KiB
TypeScript
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<void> => {
|
|
// 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);
|
|
};
|