feat(api): add frontend API and Query hooks for proxy config

Add TypeScript wrappers and TanStack Query hooks for:
- Global proxy config (address, port, logging)
- Per-app proxy config (failover, timeouts, circuit breaker)
- Proxy takeover status management
This commit is contained in:
YoVinchen
2025-12-24 23:46:06 +08:00
parent 00a94e118f
commit 5fcddbd096
4 changed files with 36 additions and 11 deletions
+1
View File
@@ -5,6 +5,7 @@ export { mcpApi } from "./mcp";
export { promptsApi } from "./prompts"; export { promptsApi } from "./prompts";
export { usageApi } from "./usage"; export { usageApi } from "./usage";
export { vscodeApi } from "./vscode"; export { vscodeApi } from "./vscode";
export { proxyApi } from "./proxy";
export * as configApi from "./config"; export * as configApi from "./config";
export type { ProviderSwitchEvent } from "./providers"; export type { ProviderSwitchEvent } from "./providers";
export type { Prompt } from "./prompts"; export type { Prompt } from "./prompts";
+8 -2
View File
@@ -37,7 +37,10 @@ export const proxyApi = {
}, },
// 代理模式下切换供应商 // 代理模式下切换供应商
async switchProxyProvider(appType: string, providerId: string): Promise<void> { async switchProxyProvider(
appType: string,
providerId: string,
): Promise<void> {
return invoke("switch_proxy_provider", { appType, providerId }); return invoke("switch_proxy_provider", { appType, providerId });
}, },
@@ -49,7 +52,10 @@ export const proxyApi = {
}, },
// 为指定应用开启/关闭接管 // 为指定应用开启/关闭接管
async setProxyTakeoverForApp(appType: string, enabled: boolean): Promise<void> { async setProxyTakeoverForApp(
appType: string,
enabled: boolean,
): Promise<void> {
return invoke("set_proxy_takeover_for_app", { appType, enabled }); return invoke("set_proxy_takeover_for_app", { appType, enabled });
}, },
+1
View File
@@ -1,3 +1,4 @@
export * from "./queryClient"; export * from "./queryClient";
export * from "./queries"; export * from "./queries";
export * from "./mutations"; export * from "./mutations";
export * from "./proxy";
+26 -9
View File
@@ -110,11 +110,18 @@ export function useSwitchProxyProvider() {
const { t } = useTranslation(); const { t } = useTranslation();
return useMutation({ return useMutation({
mutationFn: ({ appType, providerId }: { appType: string; providerId: string }) => mutationFn: ({
proxyApi.switchProxyProvider(appType, providerId), appType,
providerId,
}: {
appType: string;
providerId: string;
}) => proxyApi.switchProxyProvider(appType, providerId),
onSuccess: (_, variables) => { onSuccess: (_, variables) => {
queryClient.invalidateQueries({ queryKey: ["proxyStatus"] }); queryClient.invalidateQueries({ queryKey: ["proxyStatus"] });
queryClient.invalidateQueries({ queryKey: ["providers", variables.appType] }); queryClient.invalidateQueries({
queryKey: ["providers", variables.appType],
});
}, },
onError: (error: Error) => { onError: (error: Error) => {
toast.error(t("proxy.switchFailed", { error: error.message })); toast.error(t("proxy.switchFailed", { error: error.message }));
@@ -144,7 +151,9 @@ export function useProxyConfig() {
queryClient.invalidateQueries({ queryKey: ["proxyStatus"] }); queryClient.invalidateQueries({ queryKey: ["proxyStatus"] });
}, },
onError: (error: Error) => { onError: (error: Error) => {
toast.error(t("proxy.settings.toast.saveFailed", { error: error.message })); toast.error(
t("proxy.settings.toast.saveFailed", { error: error.message }),
);
}, },
}); });
@@ -176,7 +185,8 @@ export function useUpdateGlobalProxyConfig() {
const { t } = useTranslation(); const { t } = useTranslation();
return useMutation({ return useMutation({
mutationFn: (config: GlobalProxyConfig) => proxyApi.updateGlobalProxyConfig(config), mutationFn: (config: GlobalProxyConfig) =>
proxyApi.updateGlobalProxyConfig(config),
onSuccess: () => { onSuccess: () => {
toast.success(t("proxy.settings.toast.saved"), { closeButton: true }); toast.success(t("proxy.settings.toast.saved"), { closeButton: true });
queryClient.invalidateQueries({ queryKey: ["globalProxyConfig"] }); queryClient.invalidateQueries({ queryKey: ["globalProxyConfig"] });
@@ -184,7 +194,9 @@ export function useUpdateGlobalProxyConfig() {
queryClient.invalidateQueries({ queryKey: ["proxyStatus"] }); queryClient.invalidateQueries({ queryKey: ["proxyStatus"] });
}, },
onError: (error: Error) => { onError: (error: Error) => {
toast.error(t("proxy.settings.toast.saveFailed", { error: error.message })); toast.error(
t("proxy.settings.toast.saveFailed", { error: error.message }),
);
}, },
}); });
} }
@@ -208,15 +220,20 @@ export function useUpdateAppProxyConfig() {
const { t } = useTranslation(); const { t } = useTranslation();
return useMutation({ return useMutation({
mutationFn: (config: AppProxyConfig) => proxyApi.updateProxyConfigForApp(config), mutationFn: (config: AppProxyConfig) =>
proxyApi.updateProxyConfigForApp(config),
onSuccess: (_, variables) => { onSuccess: (_, variables) => {
toast.success(t("proxy.settings.toast.saved"), { closeButton: true }); toast.success(t("proxy.settings.toast.saved"), { closeButton: true });
queryClient.invalidateQueries({ queryKey: ["appProxyConfig", variables.appType] }); queryClient.invalidateQueries({
queryKey: ["appProxyConfig", variables.appType],
});
queryClient.invalidateQueries({ queryKey: ["proxyConfig"] }); queryClient.invalidateQueries({ queryKey: ["proxyConfig"] });
queryClient.invalidateQueries({ queryKey: ["circuitBreakerConfig"] }); queryClient.invalidateQueries({ queryKey: ["circuitBreakerConfig"] });
}, },
onError: (error: Error) => { onError: (error: Error) => {
toast.error(t("proxy.settings.toast.saveFailed", { error: error.message })); toast.error(
t("proxy.settings.toast.saveFailed", { error: error.message }),
);
}, },
}); });
} }