diff --git a/src/components/ListAPI.tsx b/src/components/ListAPI.tsx index b3879c8..9f2bb99 100644 --- a/src/components/ListAPI.tsx +++ b/src/components/ListAPI.tsx @@ -29,10 +29,22 @@ import { PopoverContent, PopoverTrigger, } from "@/components/ui/popover"; -import { BrushIcon } from "lucide-react"; +import { BrushIcon, DeleteIcon, EditIcon } from "lucide-react"; import { useToast } from "@/hooks/use-toast"; import { newChatStore } from "@/types/newChatstore"; +import { + Dialog, + DialogContent, + DialogHeader, + DialogTrigger, +} from "./ui/dialog"; +import { DialogTitle } from "@radix-ui/react-dialog"; +import { Textarea } from "./ui/textarea"; +import { Label } from "./ui/label"; +import { Input } from "./ui/input"; +import { SetAPIsTemplate } from "./setAPIsTemplate"; +import { isVailedJSON } from "@/utils/isVailedJSON"; interface APITemplateDropdownProps { label: string; @@ -46,17 +58,29 @@ function APIsDropdownList({ apiField, keyField, }: APITemplateDropdownProps) { - const ctxAppChatStore = useContext(AppChatStoreContext); - const ctxApp = useContext(AppContext); - let API = ctxApp.templateAPIs; + const { chatStore, setChatStore } = useContext(AppChatStoreContext); + const { + templates, + templateAPIs, + templateAPIsImageGen, + templateAPIsTTS, + templateAPIsWhisper, + setTemplates, + setTemplateAPIs, + setTemplateAPIsImageGen, + setTemplateAPIsTTS, + setTemplateAPIsWhisper, + setTemplateTools, + } = useContext(AppContext); + let API = templateAPIs; if (label === "Chat API") { - API = ctxApp.templateAPIs; + API = templateAPIs; } else if (label === "Whisper API") { - API = ctxApp.templateAPIsWhisper; + API = templateAPIsWhisper; } else if (label === "TTS API") { - API = ctxApp.templateAPIsTTS; + API = templateAPIsTTS; } else if (label === "Image Gen API") { - API = ctxApp.templateAPIsImageGen; + API = templateAPIsImageGen; } return ( @@ -67,17 +91,14 @@ function APIsDropdownList({ {label}{" "} {API.find( (t: TemplateAPI) => - ctxAppChatStore.chatStore[apiField as keyof ChatStore] === - t.endpoint && - ctxAppChatStore.chatStore[keyField as keyof ChatStore] === t.key + chatStore[apiField as keyof ChatStore] === t.endpoint && + chatStore[keyField as keyof ChatStore] === t.key )?.name && `: ${ API.find( (t: TemplateAPI) => - ctxAppChatStore.chatStore[apiField as keyof ChatStore] === - t.endpoint && - ctxAppChatStore.chatStore[keyField as keyof ChatStore] === - t.key + chatStore[apiField as keyof ChatStore] === t.endpoint && + chatStore[keyField as keyof ChatStore] === t.key )?.name }`} @@ -90,20 +111,17 @@ function APIsDropdownList({ { // @ts-ignore - ctxAppChatStore.chatStore[apiField as keyof ChatStore] = - t.endpoint; + chatStore[apiField as keyof ChatStore] = t.endpoint; // @ts-ignore - ctxAppChatStore.chatStore[keyField] = t.key; - ctxAppChatStore.setChatStore({ - ...ctxAppChatStore.chatStore, + chatStore[keyField] = t.key; + setChatStore({ + ...chatStore, }); }} className={cn( "block select-none space-y-1 rounded-md p-3 leading-none no-underline outline-none transition-colors hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground", - ctxAppChatStore.chatStore[apiField as keyof ChatStore] === - t.endpoint && - ctxAppChatStore.chatStore[keyField as keyof ChatStore] === - t.key + chatStore[apiField as keyof ChatStore] === t.endpoint && + chatStore[keyField as keyof ChatStore] === t.key ? "bg-accent text-accent-foreground" : "" )} @@ -198,7 +216,7 @@ function ChatTemplateDropdownList() { const ctx = useContext(AppContext); const { chatStore, setChatStore } = useContext(AppChatStoreContext); - const { templates } = useContext(AppContext); + const { templates, setTemplates } = useContext(AppContext); return ( @@ -209,32 +227,7 @@ function ChatTemplateDropdownList() { @@ -242,6 +235,107 @@ function ChatTemplateDropdownList() { ); } +const ChatTemplateItem = ({ + t, + index, +}: { + t: TemplateChatStore; + index: number; +}) => { + const [dialogOpen, setDialogOpen] = React.useState(false); + const { chatStore, setChatStore } = useContext(AppChatStoreContext); + const { templates, setTemplates } = useContext(AppContext); + + return ( +
  • + + { + // Update chatStore with the selected template + if ( + chatStore.history.length > 0 || + chatStore.systemMessageContent + ) { + console.log("you clicked", t.name); + const confirm = window.confirm( + "This will replace the current chat history. Are you sure?" + ); + if (!confirm) return; + } + setChatStore({ ...newChatStore({ ...chatStore, ...t }) }); + }} + className={cn( + "flex flex-row justify-between items-center select-none space-y-1 rounded-md p-3 leading-none no-underline outline-none transition-colors hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground" + )} + > +
    {t.name}
    +
    e.stopPropagation()}> + + + + + + + Edit Template + + + { + t.name = e.target.value; + templates[index] = t; + setTemplates([...templates]); + }} + /> +

    + Raw JSON allows you to modify any content within the template. + You can remove unnecessary fields, and non-existent fields + will be inherited from the current session. +

    +