mirror of
https://github.com/farion1231/cc-switch.git
synced 2026-08-04 11:43:57 +08:00
142 lines
3.9 KiB
TypeScript
142 lines
3.9 KiB
TypeScript
import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query";
|
|
import { proxyApi } from "@/lib/api/proxy";
|
|
import { toast } from "sonner";
|
|
import { useTranslation } from "react-i18next";
|
|
import type {
|
|
GlobalProxyConfig,
|
|
AppProxyConfig,
|
|
ProxyTakeoverStatus,
|
|
} from "@/types/proxy";
|
|
|
|
export const proxyKeys = {
|
|
status: ["proxyStatus"] as const,
|
|
takeoverStatus: ["proxyTakeoverStatus"] as const,
|
|
globalConfig: ["globalProxyConfig"] as const,
|
|
appConfig: (appType: string) => ["appProxyConfig", appType] as const,
|
|
};
|
|
|
|
// ========== 代理服务器状态 Hooks ==========
|
|
|
|
/**
|
|
* 获取代理服务器状态
|
|
*/
|
|
export function useProxyStatusQuery() {
|
|
return useQuery({
|
|
queryKey: proxyKeys.status,
|
|
queryFn: () => proxyApi.getProxyStatus(),
|
|
// 仅在服务运行时轮询
|
|
refetchInterval: (query) => (query.state.data?.running ? 2000 : false),
|
|
// 保持之前的数据,避免闪烁
|
|
placeholderData: (previousData) => previousData,
|
|
});
|
|
}
|
|
|
|
/**
|
|
* 获取各应用接管状态
|
|
*/
|
|
export function useProxyTakeoverStatus(poll = true) {
|
|
return useQuery({
|
|
queryKey: proxyKeys.takeoverStatus,
|
|
queryFn: () => proxyApi.getProxyTakeoverStatus(),
|
|
refetchInterval: poll ? 2000 : false,
|
|
...(poll
|
|
? {}
|
|
: {
|
|
placeholderData: (previousData: ProxyTakeoverStatus | undefined) =>
|
|
previousData,
|
|
}),
|
|
});
|
|
}
|
|
|
|
// ========== 代理服务器控制 Hooks ==========
|
|
|
|
/**
|
|
* 设置应用接管状态
|
|
*/
|
|
export function useSetProxyTakeoverForApp() {
|
|
const queryClient = useQueryClient();
|
|
|
|
return useMutation({
|
|
mutationFn: ({ appType, enabled }: { appType: string; enabled: boolean }) =>
|
|
proxyApi.setProxyTakeoverForApp(appType, enabled),
|
|
onSuccess: () => {
|
|
queryClient.invalidateQueries({ queryKey: proxyKeys.takeoverStatus });
|
|
},
|
|
});
|
|
}
|
|
|
|
// ========== v3+ 全局/应用级配置 Hooks ==========
|
|
|
|
/**
|
|
* 获取全局代理配置
|
|
*/
|
|
export function useGlobalProxyConfig() {
|
|
return useQuery({
|
|
queryKey: proxyKeys.globalConfig,
|
|
queryFn: () => proxyApi.getGlobalProxyConfig(),
|
|
});
|
|
}
|
|
|
|
/**
|
|
* 更新全局代理配置
|
|
*/
|
|
export function useUpdateGlobalProxyConfig() {
|
|
const queryClient = useQueryClient();
|
|
const { t } = useTranslation();
|
|
|
|
return useMutation({
|
|
mutationFn: (config: GlobalProxyConfig) =>
|
|
proxyApi.updateGlobalProxyConfig(config),
|
|
onSuccess: () => {
|
|
toast.success(t("proxy.settings.toast.saved"), { closeButton: true });
|
|
queryClient.invalidateQueries({ queryKey: proxyKeys.globalConfig });
|
|
queryClient.invalidateQueries({ queryKey: proxyKeys.status });
|
|
},
|
|
onError: (error: Error) => {
|
|
toast.error(
|
|
t("proxy.settings.toast.saveFailed", { error: error.message }),
|
|
);
|
|
},
|
|
});
|
|
}
|
|
|
|
/**
|
|
* 获取指定应用的代理配置
|
|
*/
|
|
export function useAppProxyConfig(appType: string) {
|
|
return useQuery({
|
|
queryKey: proxyKeys.appConfig(appType),
|
|
queryFn: () => proxyApi.getProxyConfigForApp(appType),
|
|
enabled: !!appType,
|
|
});
|
|
}
|
|
|
|
/**
|
|
* 更新指定应用的代理配置
|
|
*/
|
|
export function useUpdateAppProxyConfig() {
|
|
const queryClient = useQueryClient();
|
|
const { t } = useTranslation();
|
|
|
|
return useMutation({
|
|
mutationFn: (config: AppProxyConfig) =>
|
|
proxyApi.updateProxyConfigForApp(config),
|
|
onSuccess: (_, variables) => {
|
|
toast.success(t("proxy.settings.toast.saved"), { closeButton: true });
|
|
queryClient.invalidateQueries({
|
|
queryKey: proxyKeys.appConfig(variables.appType),
|
|
});
|
|
queryClient.invalidateQueries({
|
|
queryKey: ["autoFailoverEnabled", variables.appType],
|
|
});
|
|
queryClient.invalidateQueries({ queryKey: ["circuitBreakerConfig"] });
|
|
queryClient.invalidateQueries({ queryKey: proxyKeys.status });
|
|
},
|
|
onError: (error: Error) => {
|
|
toast.error(
|
|
t("proxy.settings.toast.saveFailed", { error: error.message }),
|
|
);
|
|
},
|
|
});
|
|
}
|