feat(api, i18n): add agent_node_id to various admin queries and enhance multi-language support

Introduced the agent_node_id field in AdminDrawListQuery, AdminPlayerListQuery, AdminSettlementBatchListQuery, TicketItemsListQuery, and TransferOrderListQuery to improve filtering capabilities. Updated the admin-breadcrumb and admin-sidebar components to include new translations for agent-related terms in English, Nepali, and Chinese, enhancing the overall user experience and multi-language support across the admin interface.
This commit is contained in:
2026-06-02 14:37:08 +08:00
parent a4e7a2d228
commit b15e377187
105 changed files with 5305 additions and 1596 deletions

View File

@@ -6,14 +6,50 @@ import { getAdminIntegrationSites } from "@/api/admin-integration-sites";
import { adminHasAnyPermission } from "@/lib/admin-permissions";
import { PRD_INTEGRATION_ACCESS_ANY } from "@/lib/admin-prd";
import { useAdminProfile } from "@/stores/admin-session";
import { useAsyncEffect } from "@/hooks/use-async-effect";
export type AdminSiteCodeOption = {
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) => {
cachedSites = data.items.map((row) => ({
code: row.code,
name: row.name,
}));
return cachedSites;
})
.catch(() => {
cachedSites = [];
return [];
})
.finally(() => {
inflightSites = null;
});
return inflightSites;
}
/**
* 接入站点下拉(已按当前管理员站点权限过滤)。
* 接入站点下拉(已按当前管理员站点权限过滤;模块级缓存避免多页重复 GET)。
*/
export function useAdminSiteCodeOptions(): {
sites: AdminSiteCodeOption[];
@@ -24,24 +60,21 @@ export function useAdminSiteCodeOptions(): {
const profile = useAdminProfile();
const canLoad = adminHasAnyPermission(profile?.permissions, PRD_INTEGRATION_ACCESS_ANY);
const [sites, setSites] = useState<AdminSiteCodeOption[]>([]);
const [loading, setLoading] = useState(false);
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 {
const data = await getAdminIntegrationSites();
setSites(
data.items.map((row) => ({
code: row.code,
name: row.name,
})),
);
clearCachedAdminSiteCodeOptions();
const next = await fetchSiteCodeOptions();
setSites(next);
} catch {
setSites([]);
} finally {
@@ -49,11 +82,24 @@ export function useAdminSiteCodeOptions(): {
}
}, [canLoad]);
useEffect(() => {
queueMicrotask(() => {
void reload();
});
}, [reload]);
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,