App copy
This commit is contained in:
41
services/devReset.ts
Normal file
41
services/devReset.ts
Normal file
@@ -0,0 +1,41 @@
|
||||
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);
|
||||
};
|
||||
Reference in New Issue
Block a user