import { useState } from "react"; import { Alert, Card, Flex, Group, Loader, ScrollArea, Stack, Text, } from "@mantine/core"; import type { GetPromptResult, Prompt, } from "@modelcontextprotocol/sdk/types.js"; import { PromptControls } from "../../groups/PromptControls/PromptControls"; import { PromptArgumentsForm } from "../../groups/PromptArgumentsForm/PromptArgumentsForm"; import { PromptMessagesDisplay } from "../../groups/PromptMessagesDisplay/PromptMessagesDisplay"; export interface GetPromptState { status: "idle" | "pending" | "ok" | "error"; result?: GetPromptResult; error?: string; } export interface PromptsScreenProps { prompts: Prompt[]; getPromptState?: GetPromptState; listChanged: boolean; onRefreshList: () => void; onGetPrompt: (name: string, args: Record) => void; onCopyMessages?: () => void; } const ScreenLayout = Flex.withProps({ variant: "screen", h: "calc(100vh - var(--app-shell-header-height, 0px))", gap: "md", p: "xl", }); const Sidebar = Stack.withProps({ w: 340, flex: "0 0 auto", }); const SidebarCard = Card.withProps({ withBorder: true, padding: "lg", }); const DetailCard = Card.withProps({ flex: 1, withBorder: true, padding: "lg", }); const EmptyState = Text.withProps({ c: "dimmed", ta: "center", py: "xl", }); export function PromptsScreen({ prompts, getPromptState, listChanged, onRefreshList, onGetPrompt, onCopyMessages, }: PromptsScreenProps) { const [selectedPromptName, setSelectedPromptName] = useState< string | undefined >(undefined); const [argumentValues, setArgumentValues] = useState>( {}, ); const selectedPrompt = selectedPromptName ? prompts.find((p) => p.name === selectedPromptName) : undefined; return ( { setArgumentValues({}); setSelectedPromptName(name); }} /> {selectedPrompt ? ( <> setArgumentValues((prev) => ({ ...prev, [name]: value })) } onGetPrompt={() => onGetPrompt(selectedPrompt.name, argumentValues) } /> {getPromptState?.status === "pending" && ( Loading prompt... )} {getPromptState?.status === "error" && ( {getPromptState.error ?? "Failed to get prompt"} )} {getPromptState?.result && ( )} ) : ( Select a prompt to view details )} ); }