103 lines
2.8 KiB
JavaScript
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");
|
|
}
|