import { ChatbotUIContext } from "@/context/context" import { WORKSPACE_INSTRUCTIONS_MAX } from "@/db/limits" import { getWorkspaceImageFromStorage, uploadWorkspaceImage } from "@/db/storage/workspace-images" import { updateWorkspace } from "@/db/workspaces" import { convertBlobToBase64 } from "@/lib/blob-to-b64" import { LLMID } from "@/types" import { IconHome, IconSettings } from "@tabler/icons-react" import { FC, useContext, useEffect, useRef, useState } from "react" import { toast } from "sonner" import { Button } from "../ui/button" import { ChatSettingsForm } from "../ui/chat-settings-form" import ImagePicker from "../ui/image-picker" import { Input } from "../ui/input" import { Label } from "../ui/label" import { LimitDisplay } from "../ui/limit-display" import { Sheet, SheetContent, SheetHeader, SheetTitle, SheetTrigger } from "../ui/sheet" import { Tabs, TabsContent, TabsList, TabsTrigger } from "../ui/tabs" import { TextareaAutosize } from "../ui/textarea-autosize" import { WithTooltip } from "../ui/with-tooltip" import { DeleteWorkspace } from "./delete-workspace" import { useTranslation } from "react-i18next"; interface WorkspaceSettingsProps {} export const WorkspaceSettings: FC = ({}) => { const { t } = useTranslation(); const { profile, selectedWorkspace, setSelectedWorkspace, setWorkspaces, setChatSettings, workspaceImages, setWorkspaceImages } = useContext(ChatbotUIContext) const buttonRef = useRef(null) const [isOpen, setIsOpen] = useState(false) const [name, setName] = useState(selectedWorkspace?.name || "") const [imageLink, setImageLink] = useState("") const [selectedImage, setSelectedImage] = useState(null) const [description, setDescription] = useState( selectedWorkspace?.description || "" ) const [instructions, setInstructions] = useState( selectedWorkspace?.instructions || "" ) const [defaultChatSettings, setDefaultChatSettings] = useState({ model: selectedWorkspace?.default_model, prompt: selectedWorkspace?.default_prompt, temperature: selectedWorkspace?.default_temperature, contextLength: selectedWorkspace?.default_context_length, includeProfileContext: selectedWorkspace?.include_profile_context, includeWorkspaceInstructions: selectedWorkspace?.include_workspace_instructions, embeddingsProvider: selectedWorkspace?.embeddings_provider }) useEffect(() => { const workspaceImage = workspaceImages.find( image => image.path === selectedWorkspace?.image_path )?.base64 || "" setImageLink(workspaceImage) }, [workspaceImages]) const handleSave = async () => { if (!selectedWorkspace) return let imagePath = "" if (selectedImage) { imagePath = await uploadWorkspaceImage(selectedWorkspace, selectedImage) const url = (await getWorkspaceImageFromStorage(imagePath)) || "" if (url) { const response = await fetch(url) const blob = await response.blob() const base64 = await convertBlobToBase64(blob) setWorkspaceImages(prev => [ ...prev, { workspaceId: selectedWorkspace.id, path: imagePath, base64, url } ]) } } const updatedWorkspace = await updateWorkspace(selectedWorkspace.id, { ...selectedWorkspace, name, description, image_path: imagePath, instructions, default_model: defaultChatSettings.model, default_prompt: defaultChatSettings.prompt, default_temperature: defaultChatSettings.temperature, default_context_length: defaultChatSettings.contextLength, embeddings_provider: defaultChatSettings.embeddingsProvider, include_profile_context: defaultChatSettings.includeProfileContext, include_workspace_instructions: defaultChatSettings.includeWorkspaceInstructions }) if ( defaultChatSettings.model && defaultChatSettings.prompt && defaultChatSettings.temperature && defaultChatSettings.contextLength && defaultChatSettings.includeProfileContext && defaultChatSettings.includeWorkspaceInstructions && defaultChatSettings.embeddingsProvider ) { setChatSettings({ model: defaultChatSettings.model as LLMID, prompt: defaultChatSettings.prompt, temperature: defaultChatSettings.temperature, contextLength: defaultChatSettings.contextLength, includeProfileContext: defaultChatSettings.includeProfileContext, includeWorkspaceInstructions: defaultChatSettings.includeWorkspaceInstructions, embeddingsProvider: defaultChatSettings.embeddingsProvider as | "openai" | "local" }) } setIsOpen(false) setSelectedWorkspace(updatedWorkspace) setWorkspaces(workspaces => { return workspaces.map(workspace => { if (workspace.id === selectedWorkspace.id) { return updatedWorkspace } return workspace }) }) toast.success("Workspace updated!") } const handleKeyDown = (e: React.KeyboardEvent) => { if (e.key === "Enter" && !e.shiftKey) { buttonRef.current?.click() } } if (!selectedWorkspace || !profile) return null return ( {t("side.workspaceSettings")}} trigger={ setIsOpen(true)} /> } />
{t("side.workspaceSettings")} {selectedWorkspace?.is_home && } {selectedWorkspace?.is_home && (
{t("side.workspaceDescription")}
)}
{t("side.main")} {t("side.defaults")} <>
setName(e.target.value)} />
{/*
setDescription(e.target.value)} />
*/}
{t("side.workspaceBeginSettings")}
{!selectedWorkspace.is_home && ( setIsOpen(false)} /> )}
) }