Spaces:
Running
Running
File size: 2,305 Bytes
ce8f04a | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 | /** Versioned onboarding tour persistence (driver.js). Bump to re-show tours. */
export const ONBOARDING_VERSION = 2;
export type OnboardingTourId = 'dashboard' | 'wizard' | 'workspace';
const STORAGE_KEY = 'grantforge_onboarding';
type OnboardingPayload = {
version: number;
tours: Partial<Record<OnboardingTourId, boolean>>;
};
const LEGACY_KEYS: Record<OnboardingTourId, string> = {
dashboard: 'has_seen_tour_dashboard',
wizard: 'has_seen_tour_wizard',
workspace: 'has_seen_tour_workspace',
};
function readPayload(): OnboardingPayload {
try {
const raw = localStorage.getItem(STORAGE_KEY);
if (!raw) {
return { version: ONBOARDING_VERSION, tours: {} };
}
const parsed = JSON.parse(raw) as OnboardingPayload;
return {
version: parsed.version ?? 0,
tours: parsed.tours ?? {},
};
} catch {
return { version: 0, tours: {} };
}
}
function writePayload(payload: OnboardingPayload): void {
localStorage.setItem(STORAGE_KEY, JSON.stringify(payload));
}
/** Remove legacy keys; version bump in storage resets tour completion. */
export function migrateLegacyOnboardingKeys(): void {
const payload = readPayload();
if (payload.version !== ONBOARDING_VERSION) {
writePayload({ version: ONBOARDING_VERSION, tours: {} });
}
(Object.values(LEGACY_KEYS) as string[]).forEach((key) => {
localStorage.removeItem(key);
});
}
export function hasSeenTour(tourId: OnboardingTourId): boolean {
migrateLegacyOnboardingKeys();
const payload = readPayload();
if (payload.version !== ONBOARDING_VERSION) {
return false;
}
return Boolean(payload.tours[tourId]);
}
export function markTourSeen(tourId: OnboardingTourId): void {
migrateLegacyOnboardingKeys();
const payload = readPayload();
payload.version = ONBOARDING_VERSION;
payload.tours[tourId] = true;
writePayload(payload);
}
export function resetTour(tourId: OnboardingTourId): void {
migrateLegacyOnboardingKeys();
const payload = readPayload();
payload.version = ONBOARDING_VERSION;
delete payload.tours[tourId];
writePayload(payload);
}
export function resetAllTours(): void {
writePayload({ version: ONBOARDING_VERSION, tours: {} });
(Object.values(LEGACY_KEYS) as string[]).forEach((key) => {
localStorage.removeItem(key);
});
}
|