mirror of
https://github.com/Sagit-chu/flvx.git
synced 2026-10-01 08:36:38 +08:00
refactor(frontend): extract reusable hooks and page helper modules
This commit is contained in:
@@ -0,0 +1,57 @@
|
||||
const parseOrderIds = (rawValue: string | null): number[] | null => {
|
||||
if (!rawValue) {
|
||||
return null;
|
||||
}
|
||||
|
||||
try {
|
||||
const parsed = JSON.parse(rawValue);
|
||||
|
||||
if (!Array.isArray(parsed)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return parsed
|
||||
.map((id) => Number(id))
|
||||
.filter((id) => Number.isInteger(id) && id >= 0);
|
||||
} catch {
|
||||
return null;
|
||||
}
|
||||
};
|
||||
|
||||
export const loadStoredOrder = (
|
||||
storageKey: string,
|
||||
sourceIds: number[],
|
||||
): number[] => {
|
||||
const parsed = parseOrderIds(localStorage.getItem(storageKey));
|
||||
|
||||
if (!parsed || parsed.length === 0) {
|
||||
return sourceIds;
|
||||
}
|
||||
|
||||
const idSet = new Set(sourceIds);
|
||||
const validIds: number[] = [];
|
||||
|
||||
parsed.forEach((id) => {
|
||||
if (idSet.has(id) && !validIds.includes(id)) {
|
||||
validIds.push(id);
|
||||
}
|
||||
});
|
||||
|
||||
if (validIds.length === 0) {
|
||||
return sourceIds;
|
||||
}
|
||||
|
||||
sourceIds.forEach((id) => {
|
||||
if (!validIds.includes(id)) {
|
||||
validIds.push(id);
|
||||
}
|
||||
});
|
||||
|
||||
return validIds;
|
||||
};
|
||||
|
||||
export const saveOrder = (storageKey: string, ids: number[]): void => {
|
||||
try {
|
||||
localStorage.setItem(storageKey, JSON.stringify(ids));
|
||||
} catch {}
|
||||
};
|
||||
@@ -0,0 +1,90 @@
|
||||
export const SESSION_STORAGE_KEYS = {
|
||||
token: "token",
|
||||
roleId: "role_id",
|
||||
name: "name",
|
||||
admin: "admin",
|
||||
} as const;
|
||||
|
||||
export interface SessionData {
|
||||
token: string | null;
|
||||
roleId: number | null;
|
||||
name: string | null;
|
||||
isAdmin: boolean;
|
||||
}
|
||||
|
||||
export interface LoginSessionPayload {
|
||||
token: string;
|
||||
role_id: number;
|
||||
name: string;
|
||||
}
|
||||
|
||||
const SESSION_EVENT_NAME = "sessionUpdated";
|
||||
|
||||
const parseRoleId = (value: string | null): number | null => {
|
||||
if (value === null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
const roleId = Number.parseInt(value, 10);
|
||||
|
||||
return Number.isNaN(roleId) ? null : roleId;
|
||||
};
|
||||
|
||||
export const getToken = (): string | null => {
|
||||
return localStorage.getItem(SESSION_STORAGE_KEYS.token);
|
||||
};
|
||||
|
||||
export const getRoleId = (): number | null => {
|
||||
return parseRoleId(localStorage.getItem(SESSION_STORAGE_KEYS.roleId));
|
||||
};
|
||||
|
||||
export const getSessionName = (): string | null => {
|
||||
return localStorage.getItem(SESSION_STORAGE_KEYS.name);
|
||||
};
|
||||
|
||||
export const getAdminFlag = (): boolean => {
|
||||
const adminValue = localStorage.getItem(SESSION_STORAGE_KEYS.admin);
|
||||
|
||||
if (adminValue !== null) {
|
||||
return adminValue === "true";
|
||||
}
|
||||
|
||||
const roleId = getRoleId();
|
||||
const isAdmin = roleId === 0;
|
||||
|
||||
if (roleId !== null) {
|
||||
localStorage.setItem(SESSION_STORAGE_KEYS.admin, String(isAdmin));
|
||||
}
|
||||
|
||||
return isAdmin;
|
||||
};
|
||||
|
||||
export const readSession = (): SessionData => {
|
||||
return {
|
||||
token: getToken(),
|
||||
roleId: getRoleId(),
|
||||
name: getSessionName(),
|
||||
isAdmin: getAdminFlag(),
|
||||
};
|
||||
};
|
||||
|
||||
export const writeLoginSession = (payload: LoginSessionPayload): void => {
|
||||
localStorage.setItem(SESSION_STORAGE_KEYS.token, payload.token);
|
||||
localStorage.setItem(SESSION_STORAGE_KEYS.roleId, String(payload.role_id));
|
||||
localStorage.setItem(SESSION_STORAGE_KEYS.name, payload.name);
|
||||
localStorage.setItem(
|
||||
SESSION_STORAGE_KEYS.admin,
|
||||
String(payload.role_id === 0),
|
||||
);
|
||||
window.dispatchEvent(new Event(SESSION_EVENT_NAME));
|
||||
};
|
||||
|
||||
export const clearSession = (): void => {
|
||||
localStorage.removeItem(SESSION_STORAGE_KEYS.token);
|
||||
localStorage.removeItem(SESSION_STORAGE_KEYS.roleId);
|
||||
localStorage.removeItem(SESSION_STORAGE_KEYS.name);
|
||||
localStorage.removeItem(SESSION_STORAGE_KEYS.admin);
|
||||
window.dispatchEvent(new Event(SESSION_EVENT_NAME));
|
||||
};
|
||||
|
||||
export const SESSION_UPDATED_EVENT = SESSION_EVENT_NAME;
|
||||
Reference in New Issue
Block a user