import * as React from "react";
import { Puzzle, CircleCheck } from "lucide-react";
import { cn } from "@/lib/utils";
import {
Empty,
EmptyHeader,
EmptyMedia,
EmptyTitle,
EmptyDescription,
EmptyContent,
} from "@/components/ui/empty";
import { Button } from "@/components/ui/button";
import { Spinner } from "@/components/ui/spinner";
/**
* CopilotConnectionState — WealthX DS (Molecule)
*
* Whole-panel state for the WealthX ↔ Copilot extension handshake used by the
* onboarding flow: the extension is not installed, is being detected, or is
* connected. Composes Empty + Button + Spinner.
*
* Pure display — the host drives `status` from the install-detection event and
* wires onInstall / onContinue.
*/
export type CopilotConnectionStatus =
| "not-installed"
| "connecting"
| "connected";
export interface CopilotConnectionStateProps {
status: CopilotConnectionStatus;
/** Override the default title for the current status. */
title?: string;
/** Override the default description for the current status. */
description?: string;
/** not-installed → primary action to install the extension. */
onInstall?: () => void;
installLabel?: string;
/** connected → optional action to continue into the chat / onboarding. */
onContinue?: () => void;
continueLabel?: string;
className?: string;
}
const DEFAULT_COPY: Record<
CopilotConnectionStatus,
{ title: string; description: string }
> = {
"not-installed": {
title: "Copilot isn't installed yet",
description:
"Install the WealthX Copilot extension to chat with your assistant here.",
},
connecting: {
title: "Connecting to Copilot…",
description: "Checking for the WealthX Copilot extension.",
},
connected: {
title: "Copilot connected",
description: "You're all set — start a conversation below.",
},
};
export function CopilotConnectionState({
status,
title,
description,
onInstall,
installLabel = "Install Copilot",
onContinue,
continueLabel = "Get started",
className,
}: CopilotConnectionStateProps) {
const copy = DEFAULT_COPY[status];
const action =
status === "not-installed" && onInstall ? (
) : status === "connected" && onContinue ? (
) : null;
return (
{status === "connecting" ? (
) : status === "connected" ? (
) : (
)}
{title ?? copy.title}
{description ?? copy.description}
{action && {action}}
);
}