Files
lotteryAdmin/src/hooks/use-admin-site-code-options.ts
kang 65eaeecf8c feat(agents, i18n): enhance agent management and settlement features with new translations and UI updates
Added new translations for agent management and settlement features in English, Nepali, and Chinese, improving multi-language support. Updated the agents console to reflect changes in funding modes and player details, enhancing user experience. Refactored the admin permission gate to include new logic for handling bound line agents, ensuring better permission management. Additionally, streamlined the UI for agent-related pages and improved navigation to the settlement center, consolidating related functionalities for better accessibility.
2026-06-04 18:01:05 +08:00

118 lines
2.8 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"use client";
import { useCallback, useEffect, useState } from "react";
import { getAdminIntegrationSites } from "@/api/admin-integration-sites";
import { adminHasAnyPermission } from "@/lib/admin-permissions";
import { PRD_INTEGRATION_ACCESS_ANY, PRD_USERS_MANAGE } from "@/lib/admin-prd";
import { useAdminProfile } from "@/stores/admin-session";
import { useAsyncEffect } from "@/hooks/use-async-effect";
export type AdminSiteCodeOption = {
id: number;
code: string;
name: string;
};
let cachedSites: AdminSiteCodeOption[] | null = null;
let inflightSites: Promise<AdminSiteCodeOption[]> | null = null;
export function clearCachedAdminSiteCodeOptions(): void {
cachedSites = null;
inflightSites = null;
}
async function fetchSiteCodeOptions(): Promise<AdminSiteCodeOption[]> {
if (cachedSites !== null) {
return cachedSites;
}
if (inflightSites !== null) {
return inflightSites;
}
inflightSites = getAdminIntegrationSites()
.then((data) => {
const byId = new Map<number, AdminSiteCodeOption>();
for (const row of data.items) {
if (!byId.has(row.id)) {
byId.set(row.id, { id: row.id, code: row.code, name: row.name });
}
}
cachedSites = [...byId.values()];
return cachedSites;
})
.catch(() => {
cachedSites = [];
return [];
})
.finally(() => {
inflightSites = null;
});
return inflightSites;
}
/**
* 接入站点下拉(已按当前管理员站点权限过滤;模块级缓存避免多页重复 GET
*/
export function useAdminSiteCodeOptions(): {
sites: AdminSiteCodeOption[];
loading: boolean;
canChooseSite: boolean;
reload: () => Promise<void>;
} {
const profile = useAdminProfile();
const canLoad = adminHasAnyPermission(profile?.permissions, [
...PRD_INTEGRATION_ACCESS_ANY,
PRD_USERS_MANAGE,
]);
const [sites, setSites] = useState<AdminSiteCodeOption[]>(cachedSites ?? []);
const [loading, setLoading] = useState(canLoad && cachedSites === null);
const reload = useCallback(async () => {
if (!canLoad) {
setSites([]);
setLoading(false);
return;
}
setLoading(true);
try {
clearCachedAdminSiteCodeOptions();
const next = await fetchSiteCodeOptions();
setSites(next);
} catch {
setSites([]);
} finally {
setLoading(false);
}
}, [canLoad]);
useAsyncEffect(() => {
if (!canLoad) {
setSites([]);
setLoading(false);
return;
}
if (cachedSites !== null) {
setSites(cachedSites);
setLoading(false);
return;
}
void (async () => {
setLoading(true);
const next = await fetchSiteCodeOptions();
setSites(next);
setLoading(false);
})();
}, [canLoad]);
return {
sites,
loading,
canChooseSite: canLoad && sites.length > 0,
reload,
};
}