import { useSignal } from '@preact/signals'; import { Directory, DirectoryFile } from '/lib/types.ts'; import { ResponseBody as UploadResponseBody } from '/routes/api/files/upload.tsx'; import { RequestBody as DeleteRequestBody, ResponseBody as DeleteResponseBody } from '/routes/api/files/delete.tsx'; import { RequestBody as CreateDirectoryRequestBody, ResponseBody as CreateDirectoryResponseBody, } from '/routes/api/files/create-directory.tsx'; import { RequestBody as DeleteDirectoryRequestBody, ResponseBody as DeleteDirectoryResponseBody, } from '/routes/api/files/delete-directory.tsx'; import ListFiles from '/components/files/ListFiles.tsx'; import FilesBreadcrumb from '/components/files/FilesBreadcrumb.tsx'; import CreateDirectoryModal from '/components/files/CreateDirectoryModal.tsx'; import CreateNoteModal from './CreateNoteModal.tsx'; interface MainNotesProps { initialDirectories: Directory[]; initialFiles: DirectoryFile[]; initialPath: string; } export default function MainNotes({ initialDirectories, initialFiles, initialPath }: MainNotesProps) { const isAdding = useSignal(false); const isDeleting = useSignal(false); const directories = useSignal(initialDirectories); const files = useSignal(initialFiles); const path = useSignal(initialPath); const areNewOptionsOption = useSignal(false); const isNewNoteModalOpen = useSignal(false); const isNewDirectoryModalOpen = useSignal(false); function onClickCreateNote() { if (isNewNoteModalOpen.value) { isNewNoteModalOpen.value = false; return; } isNewNoteModalOpen.value = true; } async function onClickSaveNote(newNoteName: string) { if (isAdding.value) { return; } if (!newNoteName) { return; } areNewOptionsOption.value = false; isAdding.value = true; const requestBody = new FormData(); requestBody.set('parent_path', path.value); requestBody.set('path_in_view', path.value); requestBody.set('name', `${newNoteName}.md`); requestBody.set('contents', `# ${newNoteName}\n\nStart your new note!\n`); try { const response = await fetch(`/api/files/upload`, { method: 'POST', body: requestBody, }); const result = await response.json() as UploadResponseBody; if (!result.success) { throw new Error('Failed to create note!'); } files.value = [...result.newFiles]; isNewNoteModalOpen.value = false; } catch (error) { console.error(error); } isAdding.value = false; } function onCloseCreateNote() { isNewNoteModalOpen.value = false; } function onClickCreateDirectory() { if (isNewDirectoryModalOpen.value) { isNewDirectoryModalOpen.value = false; return; } isNewDirectoryModalOpen.value = true; } async function onClickSaveDirectory(newDirectoryName: string) { if (isAdding.value) { return; } if (!newDirectoryName) { return; } areNewOptionsOption.value = false; isAdding.value = true; try { const requestBody: CreateDirectoryRequestBody = { parentPath: path.value, name: newDirectoryName, }; const response = await fetch(`/api/files/create-directory`, { method: 'POST', body: JSON.stringify(requestBody), }); const result = await response.json() as CreateDirectoryResponseBody; if (!result.success) { throw new Error('Failed to create directory!'); } directories.value = [...result.newDirectories]; isNewDirectoryModalOpen.value = false; } catch (error) { console.error(error); } isAdding.value = false; } function onCloseCreateDirectory() { isNewDirectoryModalOpen.value = false; } function toggleNewOptionsDropdown() { areNewOptionsOption.value = !areNewOptionsOption.value; } async function onClickDeleteDirectory(parentPath: string, name: string) { if (confirm('Are you sure you want to delete this directory?')) { if (isDeleting.value) { return; } isDeleting.value = true; try { const requestBody: DeleteDirectoryRequestBody = { parentPath, name, }; const response = await fetch(`/api/files/delete-directory`, { method: 'POST', body: JSON.stringify(requestBody), }); const result = await response.json() as DeleteDirectoryResponseBody; if (!result.success) { throw new Error('Failed to delete directory!'); } directories.value = [...result.newDirectories]; } catch (error) { console.error(error); } isDeleting.value = false; } } async function onClickDeleteFile(parentPath: string, name: string) { if (confirm('Are you sure you want to delete this note?')) { if (isDeleting.value) { return; } isDeleting.value = true; try { const requestBody: DeleteRequestBody = { parentPath, name, }; const response = await fetch(`/api/files/delete`, { method: 'POST', body: JSON.stringify(requestBody), }); const result = await response.json() as DeleteResponseBody; if (!result.success) { throw new Error('Failed to delete note!'); } files.value = [...result.newFiles]; } catch (error) { console.error(error); } isDeleting.value = false; } } return ( <>
{isDeleting.value ? ( <> Deleting... ) : null} {isAdding.value ? ( <> Creating... ) : null} {!isDeleting.value && !isAdding.value ? <>  : null}
); }