Add folder update to store and use it for rename

This commit is contained in:
james fitzsimons 2025-12-09 22:20:00 +00:00
parent 5e6764b026
commit 502d78f244
2 changed files with 63 additions and 35 deletions

View file

@ -16,7 +16,7 @@ export const FolderContextMenu: React.FC<FolderContextMenuProps> = ({
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<FolderContextMenuProps> = ({
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();

View file

@ -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<void>;
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<void>;
createNote: (note: NoteCreate) => Promise<void>;
updateNote: (id: number) => Promise<void>;
createFolder: (folder: FolderCreate) => Promise<void>;
setSelectedFolder: (id: number | null) => void;
setSelectedNote: (id: NoteRead | null) => void;
updateFolder: (id: number, newFolder: FolderUpdate) => Promise<void>;
moveNoteToFolder: (noteId: number, folderId: number) => Promise<void>;
moveFolderToFolder: (folderId: number, newParentId: number) => Promise<void>;
}
@ -52,10 +74,24 @@ interface NoteState {
export const useNoteStore = create<NoteState>()(
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<NoteState>()(
});
}
},
setTitle: (title) => {
const currentNote = get().selectedNote;
if (currentNote) {
@ -78,12 +113,6 @@ export const useNoteStore = create<NoteState>()(
}
},
loadFolderTree: async () => {
const data = await folderApi.tree();
console.log("getting tree");
set({ folderTree: data });
},
createNote: async (note: Partial<NoteRead>) => {
const response = await notesApi.create(note as NoteCreate);
const newNote = response.data as NoteRead;
@ -129,6 +158,11 @@ export const useNoteStore = create<NoteState>()(
}
},
updateNote: async (id: number) => {
const note = get().selectedNote as Partial<Note>;
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<NoteState>()(
});
}
},
updateFolder: async (id: number, newFolder: FolderUpdate) => {
const tree = get().folderTree as FolderTreeResponse;
updateNote: async (id: number) => {
const note = get().selectedNote as Partial<Note>;
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<NoteState>()(
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<NoteState>()(
}));
};
// Add folder to new parent
const addFolderToParent = (
folders: FolderTreeNode[],
): FolderTreeNode[] => {
@ -303,7 +337,6 @@ export const useNoteStore = create<NoteState>()(
},
});
// Update backend
await folderApi.update(folderId, { parent_id: newParentId });
},
}),