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
Unverified
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 { usageApi } from "./usage";
export { vscodeApi } from "./vscode";
export { proxyApi } from "./proxy";
export * as configApi from "./config";
export type { ProviderSwitchEvent } from "./providers";
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 });
},
@@ -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 });
},
+1
View File
@@ -1,3 +1,4 @@
export * from "./queryClient";
export * from "./queries";
export * from "./mutations";
export * from "./proxy";
+26 -9
View File
@@ -110,11 +110,18 @@ export function useSwitchProxyProvider() {
const { t } = useTranslation();
return useMutation({
mutationFn: ({ appType, providerId }: { appType: string; providerId: string }) =>
proxyApi.switchProxyProvider(appType, providerId),
mutationFn: ({
appType,
providerId,
}: {
appType: string;
providerId: string;
}) => proxyApi.switchProxyProvider(appType, providerId),
onSuccess: (_, variables) => {
queryClient.invalidateQueries({ queryKey: ["proxyStatus"] });
queryClient.invalidateQueries({ queryKey: ["providers", variables.appType] });
queryClient.invalidateQueries({
queryKey: ["providers", variables.appType],
});
},
onError: (error: Error) => {
toast.error(t("proxy.switchFailed", { error: error.message }));
@@ -144,7 +151,9 @@ export function useProxyConfig() {
queryClient.invalidateQueries({ queryKey: ["proxyStatus"] });
},
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();
return useMutation({
mutationFn: (config: GlobalProxyConfig) => proxyApi.updateGlobalProxyConfig(config),
mutationFn: (config: GlobalProxyConfig) =>
proxyApi.updateGlobalProxyConfig(config),
onSuccess: () => {
toast.success(t("proxy.settings.toast.saved"), { closeButton: true });
queryClient.invalidateQueries({ queryKey: ["globalProxyConfig"] });
@@ -184,7 +194,9 @@ export function useUpdateGlobalProxyConfig() {
queryClient.invalidateQueries({ queryKey: ["proxyStatus"] });
},
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();
return useMutation({
mutationFn: (config: AppProxyConfig) => proxyApi.updateProxyConfigForApp(config),
mutationFn: (config: AppProxyConfig) =>
proxyApi.updateProxyConfigForApp(config),
onSuccess: (_, variables) => {
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: ["circuitBreakerConfig"] });
},
onError: (error: Error) => {
toast.error(t("proxy.settings.toast.saveFailed", { error: error.message }));
toast.error(
t("proxy.settings.toast.saveFailed", { error: error.message }),
);
},
});
}