chatbot-ui/components/sidebar/items/folders/update-folder.tsx

79 lines
2.2 KiB
TypeScript

import { Button } from "@/components/ui/button"
import {
Dialog,
DialogContent,
DialogFooter,
DialogHeader,
DialogTitle,
DialogTrigger
} from "@/components/ui/dialog"
import { Input } from "@/components/ui/input"
import { Label } from "@/components/ui/label"
import { ChatbotUIContext } from "@/context/context"
import { updateFolder } from "@/db/folders"
import { Tables } from "@/supabase/types"
import { IconEdit } from "@tabler/icons-react"
import { FC, useContext, useRef, useState } from "react"
import { useTranslation } from 'react-i18next'
interface UpdateFolderProps {
folder: Tables<"folders">
}
export const UpdateFolder: FC<UpdateFolderProps> = ({ folder }) => {
const { t } = useTranslation()
const { setFolders } = useContext(ChatbotUIContext)
const buttonRef = useRef<HTMLButtonElement>(null)
const [showFolderDialog, setShowFolderDialog] = useState(false)
const [name, setName] = useState(folder.name)
const handleUpdateFolder = async (e: React.MouseEvent<HTMLButtonElement>) => {
const updatedFolder = await updateFolder(folder.id, {
name
})
setFolders(prevState =>
prevState.map(c => (c.id === folder.id ? updatedFolder : c))
)
setShowFolderDialog(false)
}
const handleKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {
if (e.key === "Enter") {
buttonRef.current?.click()
}
}
return (
<Dialog open={showFolderDialog} onOpenChange={setShowFolderDialog}>
<DialogTrigger asChild>
<IconEdit className="hover:opacity-50" size={18} />
</DialogTrigger>
<DialogContent onKeyDown={handleKeyDown}>
<DialogHeader>
<DialogTitle>{t("side.editFolder")}</DialogTitle>
</DialogHeader>
<div className="space-y-1">
<Label>{t("side.name")}</Label>
<Input value={name} onChange={e => setName(e.target.value)} />
</div>
<DialogFooter>
<Button variant="ghost" onClick={() => setShowFolderDialog(false)}>
{t("side.cancel")}
</Button>
<Button ref={buttonRef} onClick={handleUpdateFolder}>
{t("side.save")}
</Button>
</DialogFooter>
</DialogContent>
</Dialog>
)
}