56 lines
1.6 KiB
TypeScript
56 lines
1.6 KiB
TypeScript
import { createMMKV } from 'react-native-mmkv';
|
|
import { ONBOARDING_STEPS, CURRENT_ONBOARDING_VERSION, type OnboardingStep } from '../config/onboarding';
|
|
import { safDirectory } from './safDirectory';
|
|
|
|
const storage = createMMKV({ id: 'vaultdrop-onboarding' });
|
|
|
|
const COMPLETED_VERSION_KEY = 'completed_version';
|
|
const SEEN_STEPS_KEY = 'seen_steps';
|
|
|
|
export const onboardingStorage = {
|
|
getCompletedVersion(): number | undefined {
|
|
const raw = storage.getNumber(COMPLETED_VERSION_KEY);
|
|
return raw != null ? raw : undefined;
|
|
},
|
|
|
|
setCompletedVersion(version: number) {
|
|
storage.set(COMPLETED_VERSION_KEY, version);
|
|
},
|
|
|
|
getSeenSteps(): string[] {
|
|
const raw = storage.getString(SEEN_STEPS_KEY);
|
|
if (!raw) return [];
|
|
return JSON.parse(raw) as string[];
|
|
},
|
|
|
|
markStepSeen(stepId: string) {
|
|
const seen = this.getSeenSteps();
|
|
if (!seen.includes(stepId)) {
|
|
seen.push(stepId);
|
|
storage.set(SEEN_STEPS_KEY, JSON.stringify(seen));
|
|
}
|
|
},
|
|
|
|
getPendingSteps(): OnboardingStep[] {
|
|
const lastVersion = this.getCompletedVersion();
|
|
const seenIds = this.getSeenSteps();
|
|
const folders = safDirectory.getAll();
|
|
|
|
return ONBOARDING_STEPS.filter((step) => {
|
|
if (lastVersion != null && step.version <= lastVersion) return false;
|
|
if (seenIds.includes(step.id)) return false;
|
|
if (step.condition === 'has_no_folders' && folders.length > 0) return false;
|
|
return true;
|
|
});
|
|
},
|
|
|
|
needsOnboarding(): boolean {
|
|
return this.getPendingSteps().length > 0;
|
|
},
|
|
|
|
reset() {
|
|
storage.remove(COMPLETED_VERSION_KEY);
|
|
storage.remove(SEEN_STEPS_KEY);
|
|
},
|
|
};
|