diff --git a/studio/frontend/src/components/app-sidebar.tsx b/studio/frontend/src/components/app-sidebar.tsx index 97be8943a9..66a828cc19 100644 --- a/studio/frontend/src/components/app-sidebar.tsx +++ b/studio/frontend/src/components/app-sidebar.tsx @@ -57,6 +57,7 @@ import { ChevronDown, ChevronsUpDown, Moon, Sun } from "lucide-react"; import { Link, useNavigate, useRouterState } from "@tanstack/react-router"; import { useTrainingRuntimeStore } from "@/features/training"; import { useSettingsDialogStore } from "@/features/settings"; +import { useEffectiveProfile, UserAvatar } from "@/features/profile"; import { usePlatformStore } from "@/config/env"; import { TOUR_OPEN_EVENT } from "@/features/tour"; import { @@ -182,6 +183,7 @@ export function AppSidebar() { useEffect(() => { if (isStudioRoute) setRunsOpen(true); }, [isStudioRoute]); const isRecipesRoute = pathname.startsWith("/data-recipes"); + const { displayTitle, avatarDataUrl } = useEffectiveProfile(); const { items: chatItems } = useChatSidebarItems(); const storeThreadId = useChatRuntimeStore((s) => s.activeThreadId); @@ -509,16 +511,19 @@ export function AppSidebar() { -
- U +
+
- User + {displayTitle} Studio
diff --git a/studio/frontend/src/components/assistant-ui/markdown-text.tsx b/studio/frontend/src/components/assistant-ui/markdown-text.tsx index 6f40dd1b93..2a0517a44a 100644 --- a/studio/frontend/src/components/assistant-ui/markdown-text.tsx +++ b/studio/frontend/src/components/assistant-ui/markdown-text.tsx @@ -276,8 +276,8 @@ function MermaidCopyButton({ source }: { source: string }) { type="button" className="absolute top-3.5 right-20 z-20 cursor-pointer text-muted-foreground transition-all hover:text-foreground" title="Copy Mermaid source" - onClick={() => { - if (!copyToClipboard(source)) { + onClick={async () => { + if (!(await copyToClipboard(source))) { return; } showCopied(); @@ -310,8 +310,8 @@ function CodeBlockActions({ className={ACTION_BUTTON_CLASS} title="Copy code" disabled={disabled} - onClick={() => { - if (!copyToClipboard(source)) { + onClick={async () => { + if (!(await copyToClipboard(source))) { return; } showCopied(); diff --git a/studio/frontend/src/components/assistant-ui/reasoning.tsx b/studio/frontend/src/components/assistant-ui/reasoning.tsx index 3b09a504e9..387f8cd458 100644 --- a/studio/frontend/src/components/assistant-ui/reasoning.tsx +++ b/studio/frontend/src/components/assistant-ui/reasoning.tsx @@ -282,8 +282,8 @@ function ReasoningCopyButton({ startIndex, endIndex }: { startIndex: number; end .join("\n"); }); - const handleCopy = useCallback(() => { - if (copyToClipboard(reasoningText)) { + const handleCopy = useCallback(async () => { + if (await copyToClipboard(reasoningText)) { setCopied(true); if (resetRef.current) clearTimeout(resetRef.current); resetRef.current = setTimeout(() => setCopied(false), COPY_RESET_MS); diff --git a/studio/frontend/src/components/assistant-ui/thread.tsx b/studio/frontend/src/components/assistant-ui/thread.tsx index 125438cdb6..07373392f6 100644 --- a/studio/frontend/src/components/assistant-ui/thread.tsx +++ b/studio/frontend/src/components/assistant-ui/thread.tsx @@ -701,9 +701,9 @@ const CopyButton: FC = () => { const [copied, setCopied] = useState(false); const resetTimeoutRef = useRef | null>(null); - const handleCopy = () => { + const handleCopy = async () => { const text = aui.message().getCopyText(); - if (copyToClipboard(text)) { + if (await copyToClipboard(text)) { setCopied(true); if (resetTimeoutRef.current) clearTimeout(resetTimeoutRef.current); resetTimeoutRef.current = setTimeout(() => { diff --git a/studio/frontend/src/components/assistant-ui/tool-ui-python.tsx b/studio/frontend/src/components/assistant-ui/tool-ui-python.tsx index 6aa590ae11..bab735104c 100644 --- a/studio/frontend/src/components/assistant-ui/tool-ui-python.tsx +++ b/studio/frontend/src/components/assistant-ui/tool-ui-python.tsx @@ -44,8 +44,8 @@ function CopyBtn({ text }: { text: string }) { }; }, []); - const copy = useCallback(() => { - if (copyToClipboard(text)) { + const copy = useCallback(async () => { + if (await copyToClipboard(text)) { setCopied(true); if (timer.current) { clearTimeout(timer.current); diff --git a/studio/frontend/src/components/assistant-ui/tool-ui-terminal.tsx b/studio/frontend/src/components/assistant-ui/tool-ui-terminal.tsx index f233f951d3..1b1357ab3c 100644 --- a/studio/frontend/src/components/assistant-ui/tool-ui-terminal.tsx +++ b/studio/frontend/src/components/assistant-ui/tool-ui-terminal.tsx @@ -34,8 +34,8 @@ function CopyBtn({ text }: { text: string }) { }; }, []); - const copy = useCallback(() => { - if (copyToClipboard(text)) { + const copy = useCallback(async () => { + if (await copyToClipboard(text)) { setCopied(true); if (timer.current) { clearTimeout(timer.current); diff --git a/studio/frontend/src/components/ui/textarea.tsx b/studio/frontend/src/components/ui/textarea.tsx index b71e593958..36d86e28be 100644 --- a/studio/frontend/src/components/ui/textarea.tsx +++ b/studio/frontend/src/components/ui/textarea.tsx @@ -8,12 +8,12 @@ import { cn } from "@/lib/utils"; function Textarea({ className, ...props }: React.ComponentProps<"textarea">) { return (