import { useState } from "react"; import { Settings, CheckCircle, XCircle, Loader2, Eye, EyeOff, ExternalLink, Trash2, RefreshCw } from "lucide-react"; import { useQueryClient } from "@tanstack/react-query"; import { useGetConfigToken, useSetConfigToken, useDeleteConfigToken, getGetConfigTokenQueryKey, } from "@workspace/api-client-react"; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger, } from "@/components/ui/dialog"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { useToast } from "@/hooks/use-toast"; import { useLang } from "@/contexts/LanguageContext"; export function SettingsButton() { const [open, setOpen] = useState(false); const [accessToken, setAccessToken] = useState(""); const [refreshToken, setRefreshToken] = useState(""); const [showToken, setShowToken] = useState(false); const queryClient = useQueryClient(); const { toast } = useToast(); const { t } = useLang(); const { data: tokenStatus, isLoading } = useGetConfigToken({ query: { queryKey: getGetConfigTokenQueryKey() }, }); const { mutate: saveToken, isPending: isSaving } = useSetConfigToken(); const { mutate: removeToken, isPending: isRemoving } = useDeleteConfigToken(); const handleSave = () => { if (!accessToken.trim()) return; saveToken( { data: { token: accessToken.trim(), refreshToken: refreshToken.trim() || undefined } as any }, { onSuccess: () => { toast({ title: t.settingsSavedTitle, description: t.settingsSavedDesc }); setAccessToken(""); setRefreshToken(""); queryClient.invalidateQueries({ queryKey: getGetConfigTokenQueryKey() }); }, onError: () => { toast({ variant: "destructive", title: t.settingsSaveError, description: t.settingsSaveErrorDesc }); }, } ); }; const handleRemove = () => { removeToken(undefined, { onSuccess: () => { toast({ title: t.settingsRemovedTitle }); queryClient.invalidateQueries({ queryKey: getGetConfigTokenQueryKey() }); }, }); }; return ( {t.settingsTitle}
{/* Status */}
{isLoading ? ( ) : tokenStatus?.configured ? ( <>

{t.settingsStatus}

{tokenStatus.token}

) : ( <>

{t.settingsNoToken}

)}
{/* Token Inputs */}
setAccessToken(e.target.value)} className="pr-10 font-mono text-xs bg-black/30 border-violet-500/30 focus-visible:ring-violet-400" />
setRefreshToken(e.target.value)} className="font-mono text-xs bg-black/30 border-violet-500/30 focus-visible:ring-violet-400" />
{/* How to get token */}

{t.settingsHowTitle}

  1. {t.settingsStep1Pre}{" "} geminigen.ai {" "} {t.settingsStep1Post}
  2. {t.settingsStep2}
  3. {t.settingsStep3}
  4. {t.settingsStep4Pre}{" "} access_token{" "} {t.settingsStep4Mid}
  5. {t.settingsStep5Pre}{" "} refresh_token{" "} {t.settingsStep5Mid}

{t.settingsHint}

); }