agentic.email/frontend/src/auth.js

103 lines
2.8 KiB
JavaScript

export const AUTH_TOKEN_KEY = "agmail_access_token";
export const AUTH_ACCOUNT_KEY = "agmail_account";
export const APP_HOME_PATH = "/app";
export const SESSION_GATED_PATHS = new Set(["/", "/login", "/signup", "/forgot-password"]);
let sessionRedirecting = false;
function readShared(key) {
try {
return localStorage.getItem(key);
} catch {
return null;
}
}
function writeShared(key, value) {
localStorage.setItem(key, value);
sessionStorage.setItem(key, value);
}
function removeShared(key) {
localStorage.removeItem(key);
sessionStorage.removeItem(key);
}
function syncSharedSession() {
const sharedToken = readShared(AUTH_TOKEN_KEY);
if (sharedToken) {
sessionStorage.setItem(AUTH_TOKEN_KEY, sharedToken);
const sharedAccount = readShared(AUTH_ACCOUNT_KEY);
if (sharedAccount) sessionStorage.setItem(AUTH_ACCOUNT_KEY, sharedAccount);
return;
}
const legacyToken = sessionStorage.getItem(AUTH_TOKEN_KEY);
if (!legacyToken) return;
localStorage.setItem(AUTH_TOKEN_KEY, legacyToken);
const legacyAccount = sessionStorage.getItem(AUTH_ACCOUNT_KEY);
if (legacyAccount) localStorage.setItem(AUTH_ACCOUNT_KEY, legacyAccount);
}
syncSharedSession();
export function getAccessToken() {
return readShared(AUTH_TOKEN_KEY) || sessionStorage.getItem(AUTH_TOKEN_KEY);
}
export function isLoggedIn() {
return Boolean(getAccessToken());
}
export function saveSession(token, account) {
writeShared(AUTH_TOKEN_KEY, token);
if (account) writeShared(AUTH_ACCOUNT_KEY, JSON.stringify(account));
}
export function saveStoredAccount(account) {
writeShared(AUTH_ACCOUNT_KEY, JSON.stringify(account));
}
export function clearSession() {
removeShared(AUTH_TOKEN_KEY);
removeShared(AUTH_ACCOUNT_KEY);
}
export function onSessionChange(listener) {
function handle(event) {
if (event.storageArea !== localStorage) return;
if (event.key !== AUTH_TOKEN_KEY && event.key !== AUTH_ACCOUNT_KEY && event.key !== null) return;
listener(event);
}
window.addEventListener("storage", handle);
return () => window.removeEventListener("storage", handle);
}
export function currentPath() {
const path = window.location.pathname;
if (!path || path === "/") return "/";
return path.replace(/\/+$/, "") || "/";
}
export function enterApp(mode = "replace") {
if (currentPath() === APP_HOME_PATH && !window.location.search && !window.location.hash) {
return;
}
if (mode === "assign") {
window.location.assign(APP_HOME_PATH);
return;
}
window.history.replaceState(null, "", APP_HOME_PATH);
}
export function getBrandHomeHref() {
return isLoggedIn() ? APP_HOME_PATH : "/";
}
export function redirectSessionExpired() {
if (sessionRedirecting) return;
sessionRedirecting = true;
clearSession();
window.location.replace("/?session=expired");
}