import React from "react"; import { useTranslation } from "react-i18next"; import { AlertTriangle, Check, Copy, ExternalLink, Loader2, LogOut, Plus, Sparkles, User, X, } from "lucide-react"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { Label } from "@/components/ui/label"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { copyText } from "@/lib/clipboard"; import { useXaiOauth } from "./hooks/useXaiOauth"; interface XaiOAuthSectionProps { className?: string; selectedAccountId?: string | null; onAccountSelect?: (accountId: string | null) => void; } export const XaiOAuthSection: React.FC = ({ className, selectedAccountId, onAccountSelect, }) => { const { t } = useTranslation(); const [copied, setCopied] = React.useState(false); const { accounts, defaultAccountId, hasAnyAccount, isAuthenticated, pollingState, deviceCode, error, isPolling, isAddingAccount, isRemovingAccount, isSettingDefaultAccount, addAccount, removeAccount, setDefaultAccount, cancelAuth, logout, } = useXaiOauth(); const usableAccounts = accounts.filter((account) => !account.requires_reauth); const copyUserCode = async () => { if (!deviceCode?.user_code) return; await copyText(deviceCode.user_code); setCopied(true); setTimeout(() => setCopied(false), 2_000); }; const remove = (accountId: string, event: React.MouseEvent) => { event.preventDefault(); event.stopPropagation(); removeAccount(accountId); if (selectedAccountId === accountId) onAccountSelect?.(null); }; return (
{isAuthenticated ? t("xaiOauth.accountCount", { count: usableAccounts.length, defaultValue: `${usableAccounts.length} 个可用账号`, }) : hasAnyAccount ? t("xaiOauth.reauthRequired", "需要重新登录") : t("xaiOauth.notAuthenticated", "未认证")}
{accounts.length > 0 && onAccountSelect && (
)} {hasAnyAccount && (
{accounts.map((account) => (
{account.requires_reauth ? ( ) : ( )} {account.login} {defaultAccountId === account.id && ( {t("xaiOauth.defaultAccount", "默认")} )} {account.requires_reauth && ( {t("xaiOauth.expired", "凭据已失效")} )}
{!account.requires_reauth && defaultAccountId !== account.id && ( )}
))}
)} {pollingState === "idle" && ( )} {isPolling && deviceCode && (
{t("xaiOauth.waitingForAuth", "等待 xAI 授权中…")}

{t("xaiOauth.enterCode", "若浏览器未自动填入,请输入:")}

{deviceCode.user_code}
{deviceCode.verification_uri}
)} {pollingState === "error" && error && (

{error}

)} {hasAnyAccount && accounts.length > 1 && ( )}
); }; export default XaiOAuthSection;