diff --git a/frontend/src/components/contextMenus/FolderContextMenu.tsx b/frontend/src/components/contextMenus/FolderContextMenu.tsx index f7eea78..3f9762d 100644 --- a/frontend/src/components/contextMenus/FolderContextMenu.tsx +++ b/frontend/src/components/contextMenus/FolderContextMenu.tsx @@ -16,7 +16,7 @@ export const FolderContextMenu: React.FC = ({ folder, onClose, }) => { - const { loadFolderTree } = useNoteStore(); + const { loadFolderTree, updateFolder } = useNoteStore(); const [isRenaming, setIsRenaming] = useState(false); const [newName, setNewName] = useState(folder.name); @@ -35,12 +35,7 @@ export const FolderContextMenu: React.FC = ({ const handleRename = async () => { if (newName.trim() && newName !== folder.name) { - try { - await folderApi.update(folder.id, { name: newName.trim() }); - await loadFolderTree(); - } catch (error) { - console.error("Failed to rename folder:", error); - } + await updateFolder(folder.id, { name: newName }); } setIsRenaming(false); onClose(); diff --git a/frontend/src/stores/notesStore.ts b/frontend/src/stores/notesStore.ts index b552ef0..3ae29a6 100644 --- a/frontend/src/stores/notesStore.ts +++ b/frontend/src/stores/notesStore.ts @@ -5,11 +5,11 @@ import { FolderCreate, FolderTreeNode, FolderTreeResponse, + FolderUpdate, NoteRead, } from "../api/folders"; import { Note, NoteCreate, notesApi } from "../api/notes"; -// Helper function to update a note within the folder tree const updateNoteInTree = ( tree: FolderTreeResponse | null, updatedNote: NoteRead, @@ -32,19 +32,41 @@ const updateNoteInTree = ( }; }; -interface NoteState { - folderTree: FolderTreeResponse | null; - selectedFolder: number | null; - selectedNote: NoteRead | null; +const updateFolder = ( + id: number, + folder: FolderTreeNode, + newFolder: FolderUpdate, +) => { + if (folder.id === id) { + return { ...folder, ...newFolder }; + } + if (folder.children) { + return { + ...folder, + children: folder.children.map((f) => updateFolder(id, f, newFolder)), + }; + } + return folder; +}; +interface NoteState { + loadFolderTree: () => Promise; + folderTree: FolderTreeResponse | null; + + selectedFolder: number | null; + setSelectedFolder: (id: number | null) => void; + + selectedNote: NoteRead | null; + setSelectedNote: (id: NoteRead | null) => void; setContent: (content: string) => void; setTitle: (title: string) => void; - loadFolderTree: () => Promise; + createNote: (note: NoteCreate) => Promise; updateNote: (id: number) => Promise; + createFolder: (folder: FolderCreate) => Promise; - setSelectedFolder: (id: number | null) => void; - setSelectedNote: (id: NoteRead | null) => void; + updateFolder: (id: number, newFolder: FolderUpdate) => Promise; + moveNoteToFolder: (noteId: number, folderId: number) => Promise; moveFolderToFolder: (folderId: number, newParentId: number) => Promise; } @@ -52,10 +74,24 @@ interface NoteState { export const useNoteStore = create()( persist( (set, get) => ({ + loadFolderTree: async () => { + const data = await folderApi.tree(); + console.log("getting tree"); + set({ folderTree: data }); + }, folderTree: null, + selectedFolder: null, + + setSelectedFolder: (id: number | null) => { + set({ selectedFolder: id }); + }, + selectedNote: null, + setSelectedNote: (id: NoteRead | null) => { + set({ selectedNote: id }); + }, setContent: (content) => { const currentNote = get().selectedNote; if (currentNote) { @@ -66,7 +102,6 @@ export const useNoteStore = create()( }); } }, - setTitle: (title) => { const currentNote = get().selectedNote; if (currentNote) { @@ -78,12 +113,6 @@ export const useNoteStore = create()( } }, - loadFolderTree: async () => { - const data = await folderApi.tree(); - console.log("getting tree"); - set({ folderTree: data }); - }, - createNote: async (note: Partial) => { const response = await notesApi.create(note as NoteCreate); const newNote = response.data as NoteRead; @@ -129,6 +158,11 @@ export const useNoteStore = create()( } }, + updateNote: async (id: number) => { + const note = get().selectedNote as Partial; + await notesApi.update(id, note); + }, + createFolder: async (folder: FolderCreate) => { const response = await folderApi.create(folder); const newFolder = response.data; @@ -173,19 +207,21 @@ export const useNoteStore = create()( }); } }, + updateFolder: async (id: number, newFolder: FolderUpdate) => { + const tree = get().folderTree as FolderTreeResponse; - updateNote: async (id: number) => { - const note = get().selectedNote as Partial; - await notesApi.update(id, note); - // await get().loadFolderTree(); - }, + const newFolders = tree.folders.map((folder) => + updateFolder(id, folder, newFolder), + ); - setSelectedFolder: (id: number | null) => { - set({ selectedFolder: id }); - }, + set({ + folderTree: { + folders: newFolders, + orphaned_notes: tree.orphaned_notes, + }, + }); - setSelectedNote: (id: NoteRead | null) => { - set({ selectedNote: id }); + await folderApi.update(id, newFolder); }, moveNoteToFolder: async (noteId: number, folderId: number) => { @@ -257,7 +293,6 @@ export const useNoteStore = create()( let folderToMove: FolderTreeNode | null = null; - // Find and remove folder from current location const findAndRemoveFolder = ( folders: FolderTreeNode[], ): FolderTreeNode[] => { @@ -275,7 +310,6 @@ export const useNoteStore = create()( })); }; - // Add folder to new parent const addFolderToParent = ( folders: FolderTreeNode[], ): FolderTreeNode[] => { @@ -303,7 +337,6 @@ export const useNoteStore = create()( }, }); - // Update backend await folderApi.update(folderId, { parent_id: newParentId }); }, }),