import React, { useState, useRef, useEffect, SetStateAction } from "react"; import { FolderCreate, FolderTreeNode, FolderTreeResponse, NoteRead, folderApi, } from "../../api/folders"; import { DraggableNote } from "./DraggableNote"; import { DroppableFolder } from "./DroppableFolder"; import { useNoteStore } from "../../stores/notesStore"; export const Sidebar = ({ clearSelection }: { clearSelection: () => void }) => { // const [folderTree, setFolderTree] = useState(null); const [newFolder, setNewFolder] = useState(false); const [newFolderText, setNewFolderText] = useState(""); const newFolderRef = useRef(null); const { setSelectedFolder, selectedFolder, folderTree, loadFolderTree, selectedNote, setSelectedNote, } = useNoteStore(); useEffect(() => { if (newFolder && newFolderRef.current) { newFolderRef.current.focus(); } }, [newFolder]); useEffect(() => { loadFolderTree(); }, []); const handleCreateFolder = async () => { if (!newFolderText.trim()) return; const newFolderData: FolderCreate = { name: newFolderText, parent_id: null, }; await folderApi.create(newFolderData); setNewFolderText(""); loadFolderTree(); setNewFolder(false); }; return (
e.preventDefault()} onTouchMove={(e) => e.preventDefault()} > {/* New folder input */} {newFolder && (
setNewFolder(false)} onChange={(e) => setNewFolderText(e.target.value)} value={newFolderText} type="text" placeholder="Folder name..." className="border border-ctp-mauve rounded-md px-3 py-2 w-full focus:outline-none focus:ring-2 focus:ring-ctp-mauve bg-ctp-base text-ctp-text placeholder:text-ctp-overlay0" ref={newFolderRef} onKeyDown={(e) => { if (e.key === "Enter") { handleCreateFolder(); } if (e.key === "Escape") { setNewFolder(false); } }} />
)} {/* Folder tree */}
{folderTree?.folders.map((folder) => ( ))}
{/* Orphaned notes */} {folderTree?.orphaned_notes && folderTree.orphaned_notes.length > 0 && (
{/*
Unsorted
*/} {folderTree.orphaned_notes.map((note) => ( ))}
)}
); }; export const SidebarHeader = ({ clearSelection, setNewFolder, }: { clearSelection: () => void; setNewFolder: React.Dispatch>; }) => { return (

FastNotes

); }; interface RenderFolderProps { folder: FolderTreeNode; depth?: number; setSelectedFolder: (id: number | null) => void; selectedFolder: number | null; selectedNote: NoteRead | null; selectNote: (note: NoteRead) => void; } const RenderFolder = ({ folder, depth = 0, setSelectedFolder, selectedFolder, selectedNote, selectNote, }: RenderFolderProps) => { const [collapse, setCollapse] = useState(false); return (
0 ? "1.5rem" : "0" }} > {collapse && ( <>
{folder.notes.map((note) => ( ))}
{folder.children.map((child) => ( ))} )}
); };