"use client"; import { useState } from "react"; import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import { settingsApi } from "@/lib/api"; import { CEO_NAME_KEY, DEFAULT_CEO_NAME } from "@/lib/api/settings"; import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from "@/components/ui/card"; import { Label } from "@/components/ui/label"; import { Input } from "@/components/ui/input"; import { Button } from "@/components/ui/button"; import { HelpTip } from "@/components/ui/help-tip"; import { User, Save } from "lucide-react"; import { toast } from "sonner"; const MAX_NAME_LENGTH = 60; export function UserInfoCard() { const queryClient = useQueryClient(); // `edited` holds the in-progress input; null means "show the server value" // (same pattern as TranscriptRetentionCard — avoids syncing query state // into local state with an effect). const [edited, setEdited] = useState(null); const { data: settings, isLoading } = useQuery({ queryKey: ["settings"], queryFn: settingsApi.getAll, }); const serverValue = settings?.[CEO_NAME_KEY] ?? DEFAULT_CEO_NAME; const name = edited ?? serverValue; const saveMutation = useMutation({ mutationFn: (value: string) => settingsApi.update(CEO_NAME_KEY, value), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ["settings"] }); setEdited(null); toast.success("Name updated"); }, onError: (error) => { toast.error( `Failed to save: ${error instanceof Error ? error.message : "Unknown error"}`, ); }, }); const handleSave = () => { const trimmed = name.trim(); if (!trimmed) { toast.error("Name can't be empty"); return; } saveMutation.mutate(trimmed); }; return ( User Info Your account information
CEO
setEdited(e.target.value)} maxLength={MAX_NAME_LENGTH} className="max-w-[200px]" />

Chief Executive Officer

Agent ID: 00000000-0000-0000-0000-000000000001

); }