import Cookies from "js-cookie"; const rememberMe = localStorage.getItem("rememberMe") === "true"; const COOKIE_EXPIRES_DAYS = rememberMe ? 15 : 1; interface Backend { get(k: string): string | null; set(k: string, v: string): void; remove(k: string): void; } const localStore: Backend = { get: (k) => localStorage.getItem(k), set: (k, v) => localStorage.setItem(k, v), remove: (k) => localStorage.removeItem(k), }; const cookieStore: Backend = { get: (k) => Cookies.get(k) ?? null, set: (k, v) => Cookies.set(k, v, { path: "/", secure: true, sameSite: "strict", expires: COOKIE_EXPIRES_DAYS, }), remove: (k) => Cookies.remove(k, { path: "/" }), }; const AUTH_KEY_NAMES = [ "auth-token", "refresh-token", "auth-user", "profile-id", "current-profile", ]; let _prefix = "ema-auth"; let backend: Backend = localStore; export function configureAuthStorage(prefix: string, useCookies = false) { _prefix = prefix; backend = useCookies ? cookieStore : localStore; if (useCookies) { // one-time cleanup: drop pre-migration localStorage leftovers so tokens live in cookies only AUTH_KEY_NAMES.forEach((k) => localStorage.removeItem(`${prefix}-${k}`)); } } function key(k: string) { return `${_prefix}-${k}`; } export const authStorage = { getToken: () => backend.get(key("auth-token")) ?? undefined, setToken: (token: string) => backend.set(key("auth-token"), token), getRefreshToken: () => backend.get(key("refresh-token")) ?? undefined, setRefreshToken: (t: string) => backend.set(key("refresh-token"), t), getUser: (): T | null => { try { return JSON.parse(backend.get(key("auth-user")) ?? "null") as T | null; } catch { return null; } }, setUser: (u: T) => backend.set(key("auth-user"), JSON.stringify(u)), getProfileId: () => backend.get(key("profile-id")) ?? undefined, setProfileId: (id: string) => backend.set(key("profile-id"), id), getProfile: (): T | null => { try { return JSON.parse( backend.get(key("current-profile")) ?? "null", ) as T | null; } catch { return null; } }, setProfile: (p: T) => backend.set(key("current-profile"), JSON.stringify(p)), removeProfile: () => backend.remove(key("current-profile")), clear: () => { [ key("auth-token"), key("refresh-token"), key("auth-user"), key("profile-id"), key("current-profile"), key("profile-id"), ].forEach((k) => backend.remove(k)); Object.keys(Cookies.get()).forEach((name) => { Cookies.remove(name); Cookies.remove(name, { path: "/" }); }); }, };