refactor(frontend): extract reusable hooks and page helper modules

This commit is contained in:
Sagit
2026-02-19 05:14:11 +00:00
parent 6d57b49595
commit c5124a01e6
24 changed files with 2072 additions and 0 deletions
+57
View File
@@ -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 {}
};
+90
View File
@@ -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;