chatbot-ui/components/sidebar/sidebar-create-buttons.tsx

181 lines
5.0 KiB
TypeScript

import { useChatHandler } from "@/components/chat/chat-hooks/use-chat-handler"
import { ChatbotUIContext } from "@/context/context"
import { createFolder } from "@/db/folders"
import { ContentType } from "@/types"
import { IconFolderPlus, IconPlus } from "@tabler/icons-react"
import { FC, useContext, useState } from "react"
import { Button } from "../ui/button"
import { CreateAssistant } from "./items/assistants/create-assistant"
import { CreateCollection } from "./items/collections/create-collection"
import { CreateFile } from "./items/files/create-file"
import { CreateModel } from "./items/models/create-model"
import { CreatePreset } from "./items/presets/create-preset"
import { CreatePrompt } from "./items/prompts/create-prompt"
import { CreateTool } from "./items/tools/create-tool"
import { useTranslation } from "react-i18next";
interface SidebarCreateButtonsProps {
contentType: ContentType
hasData: boolean
}
export const SidebarCreateButtons: FC<SidebarCreateButtonsProps> = ({
contentType,
hasData
}) => {
const { t, i18n } = useTranslation();
const { profile, selectedWorkspace, folders, setFolders } =
useContext(ChatbotUIContext)
const { handleNewChat } = useChatHandler()
const [isCreatingPrompt, setIsCreatingPrompt] = useState(false)
const [isCreatingPreset, setIsCreatingPreset] = useState(false)
const [isCreatingFile, setIsCreatingFile] = useState(false)
const [isCreatingCollection, setIsCreatingCollection] = useState(false)
const [isCreatingAssistant, setIsCreatingAssistant] = useState(false)
const [isCreatingTool, setIsCreatingTool] = useState(false)
const [isCreatingModel, setIsCreatingModel] = useState(false)
const handleCreateFolder = async () => {
if (!profile) return
if (!selectedWorkspace) return
const createdFolder = await createFolder({
user_id: profile.user_id,
workspace_id: selectedWorkspace.id,
name: "New Folder",
description: "",
type: contentType
})
setFolders([...folders, createdFolder])
}
const getCreateFunction = () => {
switch (contentType) {
case "chats":
return async () => {
handleNewChat()
}
case "presets":
return async () => {
setIsCreatingPreset(true)
}
case "prompts":
return async () => {
setIsCreatingPrompt(true)
}
case "files":
return async () => {
setIsCreatingFile(true)
}
case "collections":
return async () => {
setIsCreatingCollection(true)
}
case "assistants":
return async () => {
setIsCreatingAssistant(true)
}
case "tools":
return async () => {
setIsCreatingTool(true)
}
case "models":
return async () => {
setIsCreatingModel(true)
}
default:
break
}
}
// 获取当前语言
const language = i18n.language;
// 判断需要大写首字母的语言
const needsUpperCaseFirstLetter = (language: string) => {
const languagesRequiringUpperCase = ['en', 'de', 'fr', 'es', 'it']; // 其他需要大写首字母的语言
return languagesRequiringUpperCase.includes(language);
};
// 对动态内容进行首字母大写的处理
const getCapitalizedContentType = (contentType: string, language: string) => {
if (needsUpperCaseFirstLetter(language)) {
return contentType.charAt(0).toUpperCase() + contentType.slice(1, contentType.length - 1); // 保留去掉最后一个字符
}
return contentType; // 不需要大写的语言返回原始值
};
return (
<div className="flex w-full space-x-2">
<Button className="flex h-[36px] grow" onClick={getCreateFunction()}>
<IconPlus className="mr-1" size={20} />
{t('side.sidebarCreateNew')}{" "}
{getCapitalizedContentType(contentType, language)}
</Button>
{hasData && (
<Button className="size-[36px] p-1" onClick={handleCreateFolder}>
<IconFolderPlus size={20} />
</Button>
)}
{isCreatingPrompt && (
<CreatePrompt
isOpen={isCreatingPrompt}
onOpenChange={setIsCreatingPrompt}
/>
)}
{isCreatingPreset && (
<CreatePreset
isOpen={isCreatingPreset}
onOpenChange={setIsCreatingPreset}
/>
)}
{isCreatingFile && (
<CreateFile isOpen={isCreatingFile} onOpenChange={setIsCreatingFile} />
)}
{isCreatingCollection && (
<CreateCollection
isOpen={isCreatingCollection}
onOpenChange={setIsCreatingCollection}
/>
)}
{isCreatingAssistant && (
<CreateAssistant
isOpen={isCreatingAssistant}
onOpenChange={setIsCreatingAssistant}
/>
)}
{isCreatingTool && (
<CreateTool isOpen={isCreatingTool} onOpenChange={setIsCreatingTool} />
)}
{isCreatingModel && (
<CreateModel
isOpen={isCreatingModel}
onOpenChange={setIsCreatingModel}
/>
)}
</div>
)
}