37 lines
1.1 KiB
TypeScript
37 lines
1.1 KiB
TypeScript
export type Shortcut = {
|
|
famSlug: string;
|
|
famName: string;
|
|
userName: string; // '' for parents (no handle in URL)
|
|
};
|
|
|
|
const KEY = 'fam_shortcut';
|
|
|
|
export function recordShortcut(entry: Shortcut) {
|
|
if (typeof localStorage === 'undefined') return;
|
|
localStorage.setItem(KEY, JSON.stringify(entry));
|
|
}
|
|
|
|
export function readShortcut(): Shortcut | null {
|
|
if (typeof localStorage === 'undefined') return null;
|
|
try {
|
|
const raw = localStorage.getItem(KEY);
|
|
if (!raw) return null;
|
|
const s = JSON.parse(raw) as Shortcut;
|
|
// Self-heal the old poisoned entry: a write that fell back to
|
|
// page.params.fam while page.data.fam was null stored the PB id as
|
|
// both slug and name ({famSlug: id, famName: id}). A real slug is
|
|
// never identical to the display name AND a 15-char PB id.
|
|
if (s && s.famSlug === s.famName && /^[a-z0-9]{15}$/.test(s.famSlug || '')) {
|
|
localStorage.removeItem(KEY);
|
|
return null;
|
|
}
|
|
return s;
|
|
} catch {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
export function shortcutTarget(s: Shortcut): string {
|
|
return s.userName ? `/${s.famSlug}/${s.userName}` : `/${s.famSlug}`;
|
|
}
|