"use client"; import { FormEvent, useCallback, useState } from "react"; import { useBoolean } from "@/utils"; import { Accordion, CTAButton, GhostButton, IconButton, Input, Modal } from "@/ui/elements"; import { CloseIcon, MinusIcon, NotebookIcon, PlusIcon } from "@/ui/Icons"; import { Notebook } from "@/ui/elements/Notebook/types"; import { LoadingIndicator } from "@/ui/App"; import { useModal } from "@/ui/elements/Modal"; interface NotebooksAccordionProps { notebooks: Notebook[]; addNotebook: (name: string) => Promise; removeNotebook: (id: string) => Promise; openNotebook: (id: string) => void; } export default function NotebooksAccordion({ notebooks, addNotebook, removeNotebook, openNotebook, }: NotebooksAccordionProps) { const { value: isNotebookPanelOpen, setTrue: openNotebookPanel, setFalse: closeNotebookPanel, } = useBoolean(true); const { value: isNotebookLoading, setTrue: notebookLoading, setFalse: notebookLoaded, } = useBoolean(false); // Notebook removal modal const [notebookToRemove, setNotebookToRemove] = useState(null); const handleNotebookRemove = (notebook: Notebook) => { setNotebookToRemove(notebook); openRemoveNotebookModal(); }; const { value: isRemoveNotebookModalOpen, setTrue: openRemoveNotebookModal, setFalse: closeRemoveNotebookModal, } = useBoolean(false); const handleNotebookRemoveCancel = () => { closeRemoveNotebookModal(); setNotebookToRemove(null); }; const handleNotebookRemoveConfirm = () => { notebookLoading(); removeNotebook(notebookToRemove!.id) .finally(notebookLoaded) .finally(closeRemoveNotebookModal); setNotebookToRemove(null); }; const handleNotebookAdd = useCallback((_: object, formEvent?: FormEvent) => { if (!formEvent) { return; } formEvent.preventDefault(); const formElements = formEvent.currentTarget; const notebookName = formElements.notebookName.value.trim(); return addNotebook(notebookName) }, [addNotebook]); const { isModalOpen: isNewNotebookModalOpen, openModal: openNewNotebookModal, closeModal: closeNewNotebookModal, confirmAction: handleNewNotebookSubmit, isActionLoading: isNewDatasetLoading, } = useModal(false, handleNotebookAdd); return ( <> Notebooks} isOpen={isNotebookPanelOpen} openAccordion={openNotebookPanel} closeAccordion={closeNotebookPanel} tools={isNewDatasetLoading ? ( ) : ( )} > {notebooks.length === 0 && (
No notebooks here, add one by clicking +
)} {notebooks.map((notebook: Notebook) => (
{notebook.deletable && handleNotebookRemove(notebook)}>}
))}
Create a new notebook?
Please provide a name for the notebook being created.
{/* {newDatasetError && {newDatasetError}} */}
closeNewNotebookModal()}>cancel create
Delete {notebookToRemove?.name} notebook?
Are you sure you want to delete {notebookToRemove?.name}? This action cannot be undone.
cancel delete
); }