This commit is contained in:
ryan
2026-07-13 15:17:45 +08:00
parent 08e61ce833
commit e0eb4e5975
334 changed files with 17212 additions and 12321 deletions
+81 -60
View File
@@ -1,24 +1,35 @@
"use client"
'use client';
import * as React from "react"
import {createContext, useCallback, useContext, useRef, useState} from "react"
import {useQueryClient} from "@tanstack/react-query"
import type {SystemConfig, UpdateSystemConfigRequest} from "@/lib/services/admin"
import services from "@/lib/services"
import {handleContextError} from "@/lib/utils/error-handling"
import * as React from 'react';
import {
createContext,
useCallback,
useContext,
useRef,
useState,
} from 'react';
import { useQueryClient } from '@tanstack/react-query';
import type {
SystemConfig,
UpdateSystemConfigRequest,
} from '@/lib/services/admin';
import services from '@/lib/services';
import { handleContextError } from '@/lib/utils/error-handling';
/** Admin 上下文状态接口 */
export interface AdminContextState {
systemConfigs: SystemConfig[]
systemConfigsLoading: boolean
systemConfigsError: Error | null
refetchSystemConfigs: (type?: 'system' | 'business') => Promise<void>
updateSystemConfig: (key: string, data: UpdateSystemConfigRequest) => Promise<void>
systemConfigs: SystemConfig[];
systemConfigsLoading: boolean;
systemConfigsError: Error | null;
refetchSystemConfigs: (type?: 'system' | 'business') => Promise<void>;
updateSystemConfig: (
key: string,
data: UpdateSystemConfigRequest,
) => Promise<void>;
}
const AdminContext = createContext<AdminContextState | null>(null)
const AdminContext = createContext<AdminContextState | null>(null);
/**
* Admin Provider
@@ -33,52 +44,64 @@ const AdminContext = createContext<AdminContextState | null>(null)
* @param {React.ReactNode} children - Admin Provider 的子元素
*/
export function AdminProvider({ children }: { children: React.ReactNode }) {
const queryClient = useQueryClient()
const [systemConfigs, setSystemConfigs] = useState<SystemConfig[]>([])
const [systemConfigsLoading, setSystemConfigsLoading] = useState(false)
const [systemConfigsError, setSystemConfigsError] = useState<Error | null>(null)
const queryClient = useQueryClient();
const [systemConfigs, setSystemConfigs] = useState<SystemConfig[]>([]);
const [systemConfigsLoading, setSystemConfigsLoading] = useState(false);
const [systemConfigsError, setSystemConfigsError] = useState<Error | null>(
null,
);
const systemRequestIdRef = useRef(0)
const lastConfigTypeRef = useRef<'system' | 'business' | undefined>(undefined)
const systemRequestIdRef = useRef(0);
const lastConfigTypeRef = useRef<'system' | 'business' | undefined>(
undefined,
);
/** 获取系统配置列表 */
const refetchSystemConfigs = useCallback(async (type?: 'system' | 'business') => {
lastConfigTypeRef.current = type
const requestId = ++systemRequestIdRef.current
const refetchSystemConfigs = useCallback(
async (type?: 'system' | 'business') => {
lastConfigTypeRef.current = type;
const requestId = ++systemRequestIdRef.current;
try {
setSystemConfigsLoading(true)
setSystemConfigsError(null)
const data = await services.adminSystemConfig.listSystemConfigs(type)
try {
setSystemConfigsLoading(true);
setSystemConfigsError(null);
const data = await services.adminSystemConfig.listSystemConfigs(type);
if (requestId !== systemRequestIdRef.current) {
return
if (requestId !== systemRequestIdRef.current) {
return;
}
setSystemConfigs(data);
setSystemConfigsLoading(false);
} catch (error) {
if (requestId !== systemRequestIdRef.current) {
return;
}
const errorObject = handleContextError(error, '加载系统配置失败', {
logError: true,
});
setSystemConfigsError(errorObject);
setSystemConfigsLoading(false);
}
setSystemConfigs(data)
setSystemConfigsLoading(false)
} catch (error) {
if (requestId !== systemRequestIdRef.current) {
return
}
const errorObject = handleContextError(error, '加载系统配置失败', { logError: true })
setSystemConfigsError(errorObject)
setSystemConfigsLoading(false)
}
}, [])
},
[],
);
/** 更新系统配置 */
const updateSystemConfig = useCallback(async (key: string, data: UpdateSystemConfigRequest) => {
try {
await services.adminSystemConfig.updateSystemConfig(key, data)
await queryClient.invalidateQueries({ queryKey: ['public-config'] })
await refetchSystemConfigs(lastConfigTypeRef.current)
} catch (error) {
handleContextError(error, '更新系统配置失败')
throw error
}
}, [queryClient, refetchSystemConfigs])
const updateSystemConfig = useCallback(
async (key: string, data: UpdateSystemConfigRequest) => {
try {
await services.adminSystemConfig.updateSystemConfig(key, data);
await queryClient.invalidateQueries({ queryKey: ['public-config'] });
await refetchSystemConfigs(lastConfigTypeRef.current);
} catch (error) {
handleContextError(error, '更新系统配置失败');
throw error;
}
},
[queryClient, refetchSystemConfigs],
);
const value: AdminContextState = {
systemConfigs,
@@ -86,13 +109,11 @@ export function AdminProvider({ children }: { children: React.ReactNode }) {
systemConfigsError,
refetchSystemConfigs,
updateSystemConfig,
}
};
return (
<AdminContext.Provider value={value}>
{children}
</AdminContext.Provider>
)
<AdminContext.Provider value={value}>{children}</AdminContext.Provider>
);
}
/**
@@ -105,11 +126,11 @@ export function AdminProvider({ children }: { children: React.ReactNode }) {
* @returns {AdminContextState} Admin 上下文状态
*/
export function useAdmin() {
const context = useContext(AdminContext)
const context = useContext(AdminContext);
if (!context) {
throw new Error('useAdmin 必须在 AdminProvider 内部使用')
throw new Error('useAdmin 必须在 AdminProvider 内部使用');
}
return context
return context;
}