From 53d999a596a0f0c9e9a644260ef47b4269a7524e Mon Sep 17 00:00:00 2001 From: n4ze3m Date: Sat, 14 Sep 2024 12:07:54 +0530 Subject: [PATCH] feat: Add system and quick prompts on side panel --- src/components/Common/PromptSelect.tsx | 23 ++++++++++------ src/components/Layouts/Header.tsx | 8 ++++-- src/components/Sidepanel/Chat/form.tsx | 26 +++++++++++++++--- src/components/Sidepanel/Chat/header.tsx | 23 ++++++++++++---- src/hooks/useMessage.tsx | 35 ++++++++++++++++++++++-- src/hooks/useMessageOption.tsx | 9 +++--- src/services/ollama.ts | 6 ++-- src/store/index.tsx | 13 ++++++++- src/store/option.tsx | 3 ++ 9 files changed, 115 insertions(+), 31 deletions(-) diff --git a/src/components/Common/PromptSelect.tsx b/src/components/Common/PromptSelect.tsx index fadd8c0..dd493a9 100644 --- a/src/components/Common/PromptSelect.tsx +++ b/src/components/Common/PromptSelect.tsx @@ -4,20 +4,27 @@ import { BookIcon, ComputerIcon, ZapIcon } from "lucide-react" import React from "react" import { useTranslation } from "react-i18next" import { getAllPrompts } from "@/db" -import { useMessageOption } from "@/hooks/useMessageOption" -export const PromptSelect: React.FC = () => { +type Props = { + setSelectedSystemPrompt: (promptId: string | undefined) => void + setSelectedQuickPrompt: (prompt: string | undefined) => void + selectedSystemPrompt: string | undefined + className?: string +} + +export const PromptSelect: React.FC = ({ + setSelectedQuickPrompt, + setSelectedSystemPrompt, + selectedSystemPrompt, + className = "dark:text-gray-300" +}) => { const { t } = useTranslation("option") - const { - selectedSystemPrompt, - setSelectedQuickPrompt, - setSelectedSystemPrompt - } = useMessageOption() const { data } = useQuery({ queryKey: ["getAllPromptsForSelect"], queryFn: getAllPrompts }) + const handlePromptChange = (value?: string) => { if (!value) { setSelectedSystemPrompt(undefined) @@ -79,7 +86,7 @@ export const PromptSelect: React.FC = () => { placement={"topLeft"} trigger={["click"]}> - diff --git a/src/components/Layouts/Header.tsx b/src/components/Layouts/Header.tsx index f7251b1..65fab8e 100644 --- a/src/components/Layouts/Header.tsx +++ b/src/components/Layouts/Header.tsx @@ -45,7 +45,7 @@ export const Header: React.FC = ({ setSelectedQuickPrompt, setSelectedSystemPrompt, messages, - streaming + streaming, } = useMessageOption() const { data: models, @@ -182,7 +182,11 @@ export const Header: React.FC = ({ />
- +
diff --git a/src/components/Sidepanel/Chat/form.tsx b/src/components/Sidepanel/Chat/form.tsx index c413377..e1cc3f0 100644 --- a/src/components/Sidepanel/Chat/form.tsx +++ b/src/components/Sidepanel/Chat/form.tsx @@ -24,7 +24,6 @@ export const SidepanelForm = ({ dropedFile }: Props) => { const { sendWhenEnter, setSendWhenEnter } = useWebUI() const [typing, setTyping] = React.useState(false) const { t } = useTranslation(["playground", "common"]) - const form = useForm({ initialValues: { message: "", @@ -37,7 +36,7 @@ export const SidepanelForm = ({ dropedFile }: Props) => { resetTranscript, start: startListening, stop: stopSpeechRecognition, - supported: browserSupportsSpeechRecognition + supported: browserSupportsSpeechRecognition, } = useSpeechRecognition() const stopListening = async () => { @@ -118,12 +117,14 @@ export const SidepanelForm = ({ dropedFile }: Props) => { onSubmit, selectedModel, chatMode, - speechToTextLanguage, stopStreamingRequest, streaming, setChatMode, webSearch, - setWebSearch + setWebSearch, + selectedQuickPrompt, + setSelectedQuickPrompt, + speechToTextLanguage } = useMessage() React.useEffect(() => { @@ -139,6 +140,23 @@ export const SidepanelForm = ({ dropedFile }: Props) => { form.setFieldValue("message", transcript) } }, [transcript]) + + React.useEffect(() => { + if (selectedQuickPrompt) { + const word = getVariable(selectedQuickPrompt) + form.setFieldValue("message", selectedQuickPrompt) + if (word) { + textareaRef.current?.focus() + const interval = setTimeout(() => { + textareaRef.current?.setSelectionRange(word.start, word.end) + setSelectedQuickPrompt(null) + }, 100) + return () => { + clearInterval(interval) + } + } + } + }, [selectedQuickPrompt]) const { mutateAsync: sendMessage, isPending: isSending } = useMutation({ mutationFn: onSubmit, onSuccess: () => { diff --git a/src/components/Sidepanel/Chat/header.tsx b/src/components/Sidepanel/Chat/header.tsx index 5970a7c..95e1374 100644 --- a/src/components/Sidepanel/Chat/header.tsx +++ b/src/components/Sidepanel/Chat/header.tsx @@ -7,13 +7,22 @@ import { useTranslation } from "react-i18next" import { CurrentChatModelSettings } from "@/components/Common/Settings/CurrentChatModelSettings" import React from "react" import { useStorage } from "@plasmohq/storage/hook" +import { PromptSelect } from "@/components/Common/PromptSelect" export const SidepanelHeader = () => { const [hideCurrentChatModelSettings] = useStorage( "hideCurrentChatModelSettings", false ) - const { clearChat, isEmbedding, messages, streaming } = useMessage() + const { + clearChat, + isEmbedding, + messages, + streaming, + selectedSystemPrompt, + setSelectedSystemPrompt, + setSelectedQuickPrompt + } = useMessage() const { t } = useTranslation(["sidepanel", "common"]) const [openModelSettings, setOpenModelSettings] = React.useState(false) @@ -44,11 +53,13 @@ export const SidepanelHeader = () => { )} - {/* - - - - */} + + {!hideCurrentChatModelSettings && (