- Dark-blue theme background assets and styling integration - Appearance settings with layoutMode (full/compact) preference - Settings dialog and auth context updates - AI writing form and panel refinements - Open Canvas context updates - Roundtable planning styling and dashboard enhancements - Strategy components and header updates - Light app management and routing improvements - Global style enhancements for dark theme - Various page layout and workspace routing optimizations
95 lines
2.3 KiB
TypeScript
95 lines
2.3 KiB
TypeScript
export interface LoginByUsernameResponse {
|
|
access_token: string;
|
|
token_type: string;
|
|
expires_in: number;
|
|
user_id: string;
|
|
email: string;
|
|
system_role: string;
|
|
needs_setup: boolean;
|
|
created: boolean;
|
|
}
|
|
|
|
const AUTH_STORAGE_KEY = "deerflow.auth";
|
|
|
|
function isBrowser(): boolean {
|
|
return typeof window !== "undefined";
|
|
}
|
|
|
|
export function getStoredAuth(): LoginByUsernameResponse | null {
|
|
if (!isBrowser()) {
|
|
return null;
|
|
}
|
|
const raw = window.localStorage.getItem(AUTH_STORAGE_KEY);
|
|
if (!raw) {
|
|
return null;
|
|
}
|
|
try {
|
|
return JSON.parse(raw) as LoginByUsernameResponse;
|
|
} catch {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
export function setStoredAuth(auth: LoginByUsernameResponse) {
|
|
if (!isBrowser()) {
|
|
return;
|
|
}
|
|
window.localStorage.setItem(AUTH_STORAGE_KEY, JSON.stringify(auth));
|
|
}
|
|
|
|
export function clearStoredAuth() {
|
|
if (!isBrowser()) {
|
|
return;
|
|
}
|
|
window.localStorage.removeItem(AUTH_STORAGE_KEY);
|
|
}
|
|
|
|
/**
|
|
* 把登录用户名写入 localStorage.userInfo.userName(顶栏用户区据此显示)。
|
|
* 仅在尚未设置时写入,避免覆盖外部登录(yUserId)从 consumer 拿到的用户名。
|
|
*/
|
|
export function setStoredUserName(name: string | null | undefined) {
|
|
if (!isBrowser()) {
|
|
return;
|
|
}
|
|
const trimmed = name?.trim();
|
|
if (!trimmed) {
|
|
return;
|
|
}
|
|
let info: Record<string, unknown> = {};
|
|
try {
|
|
const raw = window.localStorage.getItem("userInfo");
|
|
if (raw) {
|
|
const parsed = JSON.parse(raw);
|
|
if (parsed && typeof parsed === "object") {
|
|
info = parsed as Record<string, unknown>;
|
|
}
|
|
}
|
|
} catch {
|
|
info = {};
|
|
}
|
|
if (typeof info.userName === "string" && info.userName.trim()) {
|
|
return;
|
|
}
|
|
info.userName = trimmed;
|
|
window.localStorage.setItem("userInfo", JSON.stringify(info));
|
|
}
|
|
|
|
export function getAccessToken(): string | undefined {
|
|
const auth = getStoredAuth();
|
|
const token = auth?.access_token?.trim();
|
|
return token ? token : undefined;
|
|
}
|
|
|
|
export function getAuthorizationHeaderValue(): string | undefined {
|
|
const auth = getStoredAuth();
|
|
const token = auth?.access_token?.trim();
|
|
if (!token) {
|
|
return undefined;
|
|
}
|
|
const rawType = auth?.token_type?.trim();
|
|
const tokenType = rawType ? rawType : "Bearer";
|
|
return `${tokenType} ${token}`;
|
|
}
|
|
|