fix: resolve note todos synchronization issue between mobile and desktop

Fixed critical bug where todos added on mobile or desktop were being silently lost.

Root cause:
- Mobile and desktop were sending todos via the generic PUT /api/notes/:id endpoint
- Backend ignored the 'todos' field in this endpoint (only processes title and content)
- Users saw success messages but todos were never saved to database
- On reload, todos disappeared

Solution:
- Added dedicated todo management methods to NotesService:
  * addTodo() - POST /api/notes/:id/todos
  * updateTodo() - PUT /api/notes/todos/:todoId
  * toggleTodo() - PUT /api/notes/todos/:todoId
  * deleteTodo() - DELETE /api/notes/todos/:todoId

- Updated NoteDetailPage.tsx (mobile) to use proper API methods
- Updated Index.tsx (desktop) to use proper API methods
- Both versions now correctly persist todos to the database

Files modified:
- src/services/NotesService.ts - Added todo management methods
- src/pages/mobile/NoteDetailPage.tsx - Fixed todo handlers
- src/pages/Index.tsx - Fixed todo handlers in note detail view
This commit is contained in:
Claude committed 2025-11-27 08:43:46 +00:00
1 parent 425b7f36a0
commit 75551be69d
3 files changed
+128 -23

No files matched your search

+79
View File
@@ -219,6 +219,85 @@ class NotesService {
return false;
}
}
// Todo management methods
async addTodo(noteId: number, text: string): Promise<Todo | null> {
try {
const response = await fetch(`/api/notes/${noteId}/todos`, {
method: "POST",
headers: AuthService.getHeaders(),
body: JSON.stringify({ text })
});
if (!response.ok) {
throw new Error("Erreur lors de l'ajout de la tâche");
}
const result = await response.json();
showSuccess("Tâche ajoutée");
return result.todo || result;
} catch (error) {
showError(error instanceof Error ? error.message : "Erreur serveur");
return null;
}
}
async updateTodo(todoId: number, updates: Partial<Todo>): Promise<Todo | null> {
try {
const response = await fetch(`/api/notes/todos/${todoId}`, {
method: "PUT",
headers: AuthService.getHeaders(),
body: JSON.stringify(updates)
});
if (!response.ok) {
throw new Error("Erreur lors de la mise à jour de la tâche");
}
const result = await response.json();
return result.todo || result;
} catch (error) {
showError(error instanceof Error ? error.message : "Erreur serveur");
return null;
}
}
async toggleTodo(todoId: number, completed: boolean): Promise<boolean> {
try {
const response = await fetch(`/api/notes/todos/${todoId}`, {
method: "PUT",
headers: AuthService.getHeaders(),
body: JSON.stringify({ completed })
});
if (!response.ok) {
throw new Error("Erreur lors de la mise à jour de la tâche");
}
return true;
} catch (error) {
showError(error instanceof Error ? error.message : "Erreur serveur");
return false;
}
}
async deleteTodo(todoId: number): Promise<boolean> {
try {
const response = await fetch(`/api/notes/todos/${todoId}`, {
method: "DELETE",
headers: AuthService.getHeaders()
});
if (!response.ok) {
throw new Error("Erreur lors de la suppression de la tâche");
}
return true;
} catch (error) {
showError(error instanceof Error ? error.message : "Erreur serveur");
return false;
}
}
}
export default new NotesService();