From e22f50bfc4e6eb53f36cf1054da2b09ed67a37fc Mon Sep 17 00:00:00 2001 From: BetaHuhn Date: Wed, 30 Aug 2023 16:21:40 +0200 Subject: [PATCH] feat: chat settings --- src/components/EditChatModal.tsx | 135 +++++++++++++++++++++++++++++-- src/components/Layout.tsx | 33 +++++--- src/db/index.ts | 2 +- src/routes/ChatRoute.tsx | 1 + 4 files changed, 154 insertions(+), 17 deletions(-) diff --git a/src/components/EditChatModal.tsx b/src/components/EditChatModal.tsx index c396f4d..e55c919 100644 --- a/src/components/EditChatModal.tsx +++ b/src/components/EditChatModal.tsx @@ -1,9 +1,10 @@ -import { Button, Modal, Stack, TextInput } from "@mantine/core"; +import { Button, Modal, Select, SimpleGrid, Stack, TextInput, Textarea } from "@mantine/core"; import { useDisclosure } from "@mantine/hooks"; import { notifications } from "@mantine/notifications"; import { cloneElement, ReactElement, useEffect, useState } from "react"; import { Chat, detaDB } from "../db"; -import { useChat, useChats } from "../hooks/contexts"; +import { useChat, useChats, usePrompts } from "../hooks/contexts"; +import { config } from "../utils/config"; export function EditChatModal({ chat, @@ -15,35 +16,91 @@ export function EditChatModal({ const [opened, { open, close }] = useDisclosure(false); const [submitting, setSubmitting] = useState(false); + const { prompts } = usePrompts() const { setChats } = useChats() const { setChat } = useChat() + const [promptKey, setPromptKey] = useState(null); + + const [writingInstructions, setWritingInstructions] = useState(null); + const [writingCharacter, setWritingCharacter] = useState(null); + const [writingTone, setWritingTone] = useState(null); + const [writingStyle, setWritingStyle] = useState(null); + const [writingFormat, setWritingFormat] = useState(null); + const [value, setValue] = useState(""); useEffect(() => { setValue(chat?.description ?? ""); + + if (chat.prompt) { + setPromptKey(chat.prompt) + } else { + setPromptKey(null) + if (chat.writingInstructions) setWritingInstructions(chat.writingInstructions) + if (chat.writingCharacter) setWritingCharacter(chat.writingCharacter) + if (chat.writingTone) setWritingTone(chat.writingTone) + if (chat.writingStyle) setWritingStyle(chat.writingStyle) + if (chat.writingFormat) setWritingFormat(chat.writingFormat) + } }, [chat]); + useEffect(() => { + const prompt = prompts.find(prompt => prompt.key === promptKey) + if (prompt) { + setWritingInstructions(prompt.content ?? null) + setWritingCharacter(prompt.writingCharacter ?? null) + setWritingTone(prompt.writingTone ?? null) + setWritingStyle(prompt.writingStyle ?? null) + setWritingFormat(prompt.writingFormat ?? null) + } + }, [promptKey]); + + useEffect(() => { + const prompt = prompts.find(prompt => prompt.key === promptKey) + if (prompt) { + // compare current values with saved values and update if different + if (prompt.content !== writingInstructions + || prompt.writingCharacter !== writingCharacter + || prompt.writingTone !== writingTone + || prompt.writingStyle !== writingStyle + || prompt.writingFormat !== writingFormat + ) { + setPromptKey(null) + } + } + }, [writingInstructions, writingCharacter, writingFormat, writingStyle, writingTone]); + return ( <> {cloneElement(children, { onClick: open })} - +
{ try { setSubmitting(true); event.preventDefault(); - await detaDB.chats.update({ description: value }, chat.key); + const updates: Partial = { + description: value, + prompt: promptKey, + writingInstructions, + writingCharacter, + writingFormat, + writingStyle, + writingTone + } + + await detaDB.chats.update(updates, chat.key); setChats(current => (current || []).map(item => { if (item.key === chat.key) { - return { ...item, description: value }; + return { ...item, ...updates }; } return item; })); setChat(current => { if (current?.key === chat.key) { - return { ...current, description: value }; + return { ...current, ...updates }; } return current; @@ -83,6 +140,72 @@ export function EditChatModal({ formNoValidate data-autofocus /> + + +