Skip to content

Commit bc10b35

Browse files
committed
feat: 切换配置时自动清理 Claude 认证冲突并添加操作提示
- 添加 clean_claude_auth_conflict 函数,切换 Claude 配置时自动移除冲突的 ANTHROPIC_API_KEY - 安装 sonner 并添加 Toaster 组件 - 切换/添加/更新/删除配置时显示成功提示 - 版本更新至 0.14.1
1 parent 3374339 commit bc10b35

9 files changed

Lines changed: 75 additions & 4 deletions

File tree

package-lock.json

Lines changed: 11 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "proxycast",
33
"private": true,
4-
"version": "0.14.0",
4+
"version": "0.14.1",
55
"type": "module",
66
"repository": {
77
"type": "git",
@@ -37,6 +37,7 @@
3737
"lucide-react": "^0.460.0",
3838
"react": "^18.3.1",
3939
"react-dom": "^18.3.1",
40+
"sonner": "^2.0.7",
4041
"tailwind-merge": "^2.5.4"
4142
},
4243
"devDependencies": {

src-tauri/Cargo.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src-tauri/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "proxycast"
3-
version = "0.14.0"
3+
version = "0.14.1"
44
description = "AI API Proxy Desktop App"
55
authors = ["you"]
66
edition = "2021"

src-tauri/src/services/live_sync.rs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,35 @@ pub fn sync_to_live(
2727
}
2828
}
2929

30+
/// 清理 Claude 配置中冲突的认证环境变量
31+
///
32+
/// Claude Code 同时检测到 ANTHROPIC_AUTH_TOKEN 和 ANTHROPIC_API_KEY 时会报警告。
33+
/// 此函数确保只保留一个认证变量:
34+
/// - 优先保留 ANTHROPIC_AUTH_TOKEN(OAuth token)
35+
/// - 如果只有 ANTHROPIC_API_KEY,则保留它
36+
fn clean_claude_auth_conflict(settings: &mut Value) {
37+
if let Some(env) = settings.get_mut("env").and_then(|v| v.as_object_mut()) {
38+
let has_auth_token = env
39+
.get("ANTHROPIC_AUTH_TOKEN")
40+
.and_then(|v| v.as_str())
41+
.map(|s| !s.is_empty())
42+
.unwrap_or(false);
43+
let has_api_key = env
44+
.get("ANTHROPIC_API_KEY")
45+
.and_then(|v| v.as_str())
46+
.map(|s| !s.is_empty())
47+
.unwrap_or(false);
48+
49+
// 如果两者都存在,移除 ANTHROPIC_API_KEY(优先使用 AUTH_TOKEN)
50+
if has_auth_token && has_api_key {
51+
tracing::info!(
52+
"检测到 Claude 认证冲突:同时存在 ANTHROPIC_AUTH_TOKEN 和 ANTHROPIC_API_KEY,移除 ANTHROPIC_API_KEY"
53+
);
54+
env.remove("ANTHROPIC_API_KEY");
55+
}
56+
}
57+
}
58+
3059
/// Sync Claude settings to ~/.claude/settings.json
3160
fn sync_claude_settings(
3261
provider: &Provider,
@@ -69,6 +98,9 @@ fn sync_claude_settings(
6998
settings = provider.settings_config.clone();
7099
}
71100

101+
// 清理冲突的认证环境变量
102+
clean_claude_auth_conflict(&mut settings);
103+
72104
// Write settings
73105
let content = serde_json::to_string_pretty(&settings)?;
74106
std::fs::write(&config_path, content)?;

src-tauri/tauri.conf.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"$schema": "https://schema.tauri.app/config/2",
33
"productName": "ProxyCast",
4-
"version": "0.14.0",
4+
"version": "0.14.1",
55
"identifier": "com.proxycast.app",
66
"build": {
77
"beforeDevCommand": "npm run dev",

src/components/ui/sonner.tsx

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import { Toaster as SonnerToaster } from "sonner";
2+
3+
export function Toaster() {
4+
return (
5+
<SonnerToaster
6+
position="top-center"
7+
richColors
8+
theme="system"
9+
toastOptions={{
10+
duration: 3000,
11+
classNames: {
12+
toast:
13+
"group rounded-md border bg-background text-foreground shadow-lg",
14+
title: "text-sm font-semibold",
15+
description: "text-sm text-muted-foreground",
16+
},
17+
}}
18+
/>
19+
);
20+
}

src/hooks/useSwitch.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { useState, useEffect, useCallback } from "react";
2+
import { toast } from "sonner";
23
import { switchApi, Provider, AppType } from "@/lib/api/switch";
34

45
export function useSwitch(appType: AppType) {
@@ -40,21 +41,25 @@ export function useSwitch(appType: AppType) {
4041
};
4142
await switchApi.addProvider(newProvider);
4243
await fetchProviders();
44+
toast.success("配置已添加");
4345
};
4446

4547
const updateProvider = async (provider: Provider) => {
4648
await switchApi.updateProvider(provider);
4749
await fetchProviders();
50+
toast.success("配置已更新");
4851
};
4952

5053
const deleteProvider = async (id: string) => {
5154
await switchApi.deleteProvider(appType, id);
5255
await fetchProviders();
56+
toast.success("配置已删除");
5357
};
5458

5559
const switchToProvider = async (id: string) => {
5660
await switchApi.switchProvider(appType, id);
5761
await fetchProviders();
62+
toast.success("切换成功");
5863
};
5964

6065
return {

src/main.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
import React from "react";
22
import ReactDOM from "react-dom/client";
33
import App from "./App";
4+
import { Toaster } from "./components/ui/sonner";
45
import "./index.css";
56

67
ReactDOM.createRoot(document.getElementById("root")!).render(
78
<React.StrictMode>
89
<App />
10+
<Toaster />
911
</React.StrictMode>,
1012
);

0 commit comments

Comments
 (0)