frontend/src/common/auth/token_storage.ts
MartinT 1140e6026c
Add "Keep me logged in" checkbox within login flow (#10226)
Co-authored-by: Bram Kragten <mail@bramkragten.nl>
2021-10-26 12:05:13 +02:00

74 lines
1.6 KiB
TypeScript

import { AuthData } from "home-assistant-js-websocket";
const storage = window.localStorage || {};
declare global {
interface Window {
__tokenCache: {
// undefined: we haven't loaded yet
// null: none stored
tokens?: AuthData | null;
writeEnabled?: boolean;
};
}
}
// So that core.js and main app hit same shared object.
let tokenCache = window.__tokenCache;
if (!tokenCache) {
tokenCache = window.__tokenCache = {
tokens: undefined,
writeEnabled: undefined,
};
}
export function askWrite() {
return (
tokenCache.tokens !== undefined && tokenCache.writeEnabled === undefined
);
}
export function saveTokens(tokens: AuthData | null) {
tokenCache.tokens = tokens;
if (
!tokenCache.writeEnabled &&
new URLSearchParams(window.location.search).get("storeToken") === "true"
) {
tokenCache.writeEnabled = true;
}
if (tokenCache.writeEnabled) {
try {
storage.hassTokens = JSON.stringify(tokens);
} catch (err: any) {
// write failed, ignore it. Happens if storage is full or private mode.
}
}
}
export function enableWrite() {
tokenCache.writeEnabled = true;
if (tokenCache.tokens) {
saveTokens(tokenCache.tokens);
}
}
export function loadTokens() {
if (tokenCache.tokens === undefined) {
try {
// Delete the old token cache.
delete storage.tokens;
const tokens = storage.hassTokens;
if (tokens) {
tokenCache.tokens = JSON.parse(tokens);
tokenCache.writeEnabled = true;
} else {
tokenCache.tokens = null;
}
} catch (err: any) {
tokenCache.tokens = null;
}
}
return tokenCache.tokens;
}