diff --git a/desktop/src/components/settings/ClaudeOfficialLogin.tsx b/desktop/src/components/settings/ClaudeOfficialLogin.tsx new file mode 100644 index 00000000..81c6caf2 --- /dev/null +++ b/desktop/src/components/settings/ClaudeOfficialLogin.tsx @@ -0,0 +1,77 @@ +// desktop/src/components/settings/ClaudeOfficialLogin.tsx +// +// 显示当前 Claude Official OAuth 登录状态,提供 Login / Logout 按钮。 +// 点击 Login 调 Tauri shell.open 打开浏览器走 OAuth flow;浏览器回 callback +// 到 haha server 后,store 的 polling 自动刷新 UI 展示"已登录"。 + +import { useEffect } from 'react' +import { open as shellOpen } from '@tauri-apps/plugin-shell' +import { useHahaOAuthStore } from '../../stores/hahaOAuthStore' + +export function ClaudeOfficialLogin() { + const { status, isLoading, error, fetchStatus, login, logout, stopPolling } = + useHahaOAuthStore() + + useEffect(() => { + fetchStatus() + return () => stopPolling() + }, [fetchStatus, stopPolling]) + + const handleLogin = async () => { + try { + const { authorizeUrl } = await login() + await shellOpen(authorizeUrl) + } catch { + // error 已经在 store 里,不做额外处理 + } + } + + if (status === null) { + return ( +
加载中…
+ ) + } + + if (status.loggedIn) { + const subTypeLabel = status.subscriptionType + ? status.subscriptionType.toUpperCase() + : '未知' + return ( +
+ + ✓ 已登录(Claude {subTypeLabel}) + + +
+ ) + } + + return ( +
+
+ 使用官方 Claude 模型需要登录你的 Claude.ai 账号。点击下方按钮,浏览器会 + 打开 Claude 官方登录页面,授权后自动回到这里。 +
+ + {error && ( +
+ 错误:{error} +
+ )} +
+ ) +}