diff --git a/frontend/Layout.tsx b/frontend/Layout.tsx index 05a83d5..8c37ad3 100644 --- a/frontend/Layout.tsx +++ b/frontend/Layout.tsx @@ -521,10 +521,13 @@ const Layout: React.FC = ({ onSave={handleSaveNote} onDelete={async (noteId) => { try { - const { deleteNote } = await import( - './utils/notesService' + const { deleteNoteWithStoreUpdate } = + await import('./utils/noteDeleteUtils'); + await deleteNoteWithStoreUpdate( + noteId, + showSuccessToast, + t ); - await deleteNote(noteId); closeNoteModal(); } catch (error) { console.error('Error deleting note:', error); diff --git a/frontend/components/Note/NoteDetails.tsx b/frontend/components/Note/NoteDetails.tsx index a7e6319..78ec214 100644 --- a/frontend/components/Note/NoteDetails.tsx +++ b/frontend/components/Note/NoteDetails.tsx @@ -1,24 +1,27 @@ import React, { useEffect, useState } from 'react'; import { useParams, Link, useNavigate } from 'react-router-dom'; +import { useTranslation } from 'react-i18next'; import { PencilSquareIcon, TrashIcon, TagIcon, FolderIcon, } from '@heroicons/react/24/solid'; +import { useToast } from '../Shared/ToastContext'; import ConfirmDialog from '../Shared/ConfirmDialog'; import NoteModal from './NoteModal'; import MarkdownRenderer from '../Shared/MarkdownRenderer'; import { Note } from '../../entities/Note'; import { fetchNoteBySlug, - deleteNote as apiDeleteNote, updateNote as apiUpdateNote, } from '../../utils/notesService'; import { createProject } from '../../utils/projectsService'; import { useStore } from '../../store/useStore'; const NoteDetails: React.FC = () => { + const { t } = useTranslation(); + const { showSuccessToast } = useToast(); const { uidSlug } = useParams<{ uidSlug: string }>(); const [note, setNote] = useState(null); const [isNoteModalOpen, setIsNoteModalOpen] = useState(false); @@ -57,7 +60,11 @@ const NoteDetails: React.FC = () => { const handleDeleteNote = async () => { if (!noteToDelete) return; try { - await apiDeleteNote(noteToDelete.id!); + await deleteNoteWithStoreUpdate( + noteToDelete.id!, + showSuccessToast, + t + ); navigate('/notes'); } catch (err) { console.error('Error deleting note:', err); @@ -231,7 +238,11 @@ const NoteDetails: React.FC = () => { onSave={handleSaveNote} onDelete={async (noteId) => { try { - await apiDeleteNote(noteId); + await deleteNoteWithStoreUpdate( + noteId, + showSuccessToast, + t + ); navigate('/notes'); } catch (err) { console.error('Error deleting note:', err); diff --git a/frontend/components/Notes.tsx b/frontend/components/Notes.tsx index e568715..1ad8b71 100644 --- a/frontend/components/Notes.tsx +++ b/frontend/components/Notes.tsx @@ -1,21 +1,20 @@ import React, { useState, useEffect } from 'react'; import { useTranslation } from 'react-i18next'; import { MagnifyingGlassIcon } from '@heroicons/react/24/solid'; +import { useToast } from './Shared/ToastContext'; import SortFilterButton, { SortOption } from './Shared/SortFilterButton'; import NoteModal from './Note/NoteModal'; import ConfirmDialog from './Shared/ConfirmDialog'; import NoteCard from './Shared/NoteCard'; import { Note } from '../entities/Note'; -import { - createNote, - updateNote, - deleteNote as apiDeleteNote, -} from '../utils/notesService'; +import { createNote, updateNote } from '../utils/notesService'; +import { deleteNoteWithStoreUpdate } from '../utils/noteDeleteUtils'; import { useStore } from '../store/useStore'; import { createProject } from '../utils/projectsService'; const Notes: React.FC = () => { const { t } = useTranslation(); + const { showSuccessToast } = useToast(); const [selectedNote, setSelectedNote] = useState(null); const [isNoteModalOpen, setIsNoteModalOpen] = useState(false); const [isConfirmDialogOpen, setIsConfirmDialogOpen] = useState(false); @@ -52,11 +51,11 @@ const Notes: React.FC = () => { const handleDeleteNote = async () => { if (!noteToDelete) return; try { - await apiDeleteNote(noteToDelete.id!); - const updatedNotes = notes.filter( - (note) => note.id !== noteToDelete.id + await deleteNoteWithStoreUpdate( + noteToDelete.id!, + showSuccessToast, + t ); - setNotes(updatedNotes); setIsConfirmDialogOpen(false); setNoteToDelete(null); } catch (err) { @@ -246,11 +245,11 @@ const Notes: React.FC = () => { onSave={handleSaveNote} onDelete={async (noteId) => { try { - await apiDeleteNote(noteId); - const updatedNotes = notes.filter( - (note) => note.id !== noteId + await deleteNoteWithStoreUpdate( + noteId, + showSuccessToast, + t ); - setNotes(updatedNotes); setIsNoteModalOpen(false); setSelectedNote(null); } catch (err) { diff --git a/frontend/utils/noteDeleteUtils.ts b/frontend/utils/noteDeleteUtils.ts new file mode 100644 index 0000000..fcf8be9 --- /dev/null +++ b/frontend/utils/noteDeleteUtils.ts @@ -0,0 +1,29 @@ +import { deleteNote as apiDeleteNote } from './notesService'; +import { useStore } from '../store/useStore'; +import { Note } from '../entities/Note'; + +/** + * Shared utility function to delete a note and update the global store + * @param noteId - The ID of the note to delete + * @param showSuccessToast - Function to show success toast + * @param t - Translation function + * @returns Promise + */ +export const deleteNoteWithStoreUpdate = async ( + noteId: number, + showSuccessToast: (message: string) => void, + t: (key: string) => string +): Promise => { + await apiDeleteNote(noteId); + + // Remove note from global store + const currentNotes = useStore.getState().notesStore.notes; + useStore + .getState() + .notesStore.setNotes( + currentNotes.filter((note: Note) => note.id !== noteId) + ); + + // Show success toast + showSuccessToast(t('success.noteDeleted')); +}; diff --git a/public/locales/ar/translation.json b/public/locales/ar/translation.json index 03f71d7..8130b4b 100644 --- a/public/locales/ar/translation.json +++ b/public/locales/ar/translation.json @@ -578,7 +578,8 @@ "nextActionAdded": "تم إضافة الإجراء التالي بنجاح!", "taskCreated": "تم إنشاء المهمة بنجاح!", "taskUpdated": "تم تحديث المهمة بنجاح!", - "taskDeleted": "تم حذف المهمة بنجاح!" + "taskDeleted": "تم حذف المهمة بنجاح!", + "noteDeleted": "تم حذف الملاحظة بنجاح!" }, "note": { "title": "العنوان", diff --git a/public/locales/bg/translation.json b/public/locales/bg/translation.json index 7d32286..20673b2 100644 --- a/public/locales/bg/translation.json +++ b/public/locales/bg/translation.json @@ -578,7 +578,8 @@ "nextActionAdded": "Следващото действие е добавено успешно!", "taskCreated": "Задачата е създадена успешно!", "taskUpdated": "Задачата е актуализирана успешно!", - "taskDeleted": "Задачата е изтрита успешно!" + "taskDeleted": "Задачата е изтрита успешно!", + "noteDeleted": "Бележката беше изтрита успешно!" }, "note": { "title": "Заглавие", diff --git a/public/locales/da/translation.json b/public/locales/da/translation.json index 35cfadb..e923047 100644 --- a/public/locales/da/translation.json +++ b/public/locales/da/translation.json @@ -578,7 +578,8 @@ "nextActionAdded": "Næste handling tilføjet med succes!", "taskCreated": "Opgave oprettet med succes!", "taskUpdated": "Opgave opdateret med succes!", - "taskDeleted": "Opgave slettet med succes!" + "taskDeleted": "Opgave slettet med succes!", + "noteDeleted": "Noten blev slettet med succes!" }, "note": { "title": "Titel", diff --git a/public/locales/de/translation.json b/public/locales/de/translation.json index cdcae80..2ff3bf6 100644 --- a/public/locales/de/translation.json +++ b/public/locales/de/translation.json @@ -293,7 +293,8 @@ "tagCreated": "Tag erfolgreich erstellt!", "taskCreated": "Aufgabe erfolgreich erstellt!", "taskUpdated": "Aufgabe erfolgreich aktualisiert!", - "taskDeleted": "Aufgabe erfolgreich gelöscht!" + "taskDeleted": "Aufgabe erfolgreich gelöscht!", + "noteDeleted": "Notiz erfolgreich gelöscht!" }, "notes": { "title": "Notizen", diff --git a/public/locales/el/translation.json b/public/locales/el/translation.json index 8bb92ab..f23e779 100644 --- a/public/locales/el/translation.json +++ b/public/locales/el/translation.json @@ -653,7 +653,8 @@ "tagCreated": "Η ετικέτα δημιουργήθηκε με επιτυχία!", "projectCreated": "Το έργο δημιουργήθηκε με επιτυχία!", "projectDeleted": "Το έργο διαγράφηκε με επιτυχία!", - "nextActionAdded": "Η επόμενη ενέργεια προστέθηκε με επιτυχία!" + "nextActionAdded": "Η επόμενη ενέργεια προστέθηκε με επιτυχία!", + "noteDeleted": "Η σημείωση διαγράφηκε με επιτυχία!" }, "areas": { "title": "Περιοχές", diff --git a/public/locales/en/translation.json b/public/locales/en/translation.json index 73dbb90..d1ff03a 100644 --- a/public/locales/en/translation.json +++ b/public/locales/en/translation.json @@ -569,6 +569,7 @@ "success": { "noteUpdated": "Note updated successfully!", "noteCreated": "Note created successfully!", + "noteDeleted": "Note deleted successfully!", "areaUpdated": "Area updated successfully!", "areaCreated": "Area created successfully!", "tagUpdated": "Tag updated successfully!", diff --git a/public/locales/es/translation.json b/public/locales/es/translation.json index fef5d00..4839cb4 100644 --- a/public/locales/es/translation.json +++ b/public/locales/es/translation.json @@ -686,7 +686,8 @@ "taskCreated": "¡Tarea creada con éxito!", "taskUpdated": "¡Tarea actualizada con éxito!", "taskDeleted": "¡Tarea eliminada con éxito!", - "nextActionAdded": "¡Próxima acción agregada con éxito!" + "nextActionAdded": "¡Próxima acción agregada con éxito!", + "noteDeleted": "¡Nota eliminada con éxito!" }, "recurrence": { "none": "Ninguna", diff --git a/public/locales/fi/translation.json b/public/locales/fi/translation.json index c639a5c..7d64580 100644 --- a/public/locales/fi/translation.json +++ b/public/locales/fi/translation.json @@ -578,7 +578,8 @@ "nextActionAdded": "Seuraava toiminto lisätty onnistuneesti!", "taskCreated": "Tehtävä luotu onnistuneesti!", "taskUpdated": "Tehtävä päivitetty onnistuneesti!", - "taskDeleted": "Tehtävä poistettu onnistuneesti!" + "taskDeleted": "Tehtävä poistettu onnistuneesti!", + "noteDeleted": "Muistiinpano poistettiin onnistuneesti!" }, "note": { "title": "Otsikko", diff --git a/public/locales/fr/translation.json b/public/locales/fr/translation.json index cb5c841..62704be 100644 --- a/public/locales/fr/translation.json +++ b/public/locales/fr/translation.json @@ -578,7 +578,8 @@ "nextActionAdded": "Prochaine action ajoutée avec succès !", "taskCreated": "Tâche créée avec succès !", "taskUpdated": "Tâche mise à jour avec succès !", - "taskDeleted": "Tâche supprimée avec succès !" + "taskDeleted": "Tâche supprimée avec succès !", + "noteDeleted": "Note supprimée avec succès !" }, "note": { "title": "Titre", diff --git a/public/locales/id/translation.json b/public/locales/id/translation.json index 8aab578..8eb3e94 100644 --- a/public/locales/id/translation.json +++ b/public/locales/id/translation.json @@ -578,7 +578,8 @@ "nextActionAdded": "Tindakan berikutnya berhasil ditambahkan!", "taskCreated": "Tugas berhasil dibuat!", "taskUpdated": "Tugas berhasil diperbarui!", - "taskDeleted": "Tugas berhasil dihapus!" + "taskDeleted": "Tugas berhasil dihapus!", + "noteDeleted": "Catatan berhasil dihapus!" }, "note": { "title": "Judul", diff --git a/public/locales/jp/translation.json b/public/locales/jp/translation.json index 542807a..3236c46 100644 --- a/public/locales/jp/translation.json +++ b/public/locales/jp/translation.json @@ -480,7 +480,8 @@ "projectCreated": "プロジェクトが正常に作成されました!", "taskCreated": "タスクが正常に作成されました!", "taskUpdated": "タスクが正常に更新されました!", - "taskDeleted": "タスクが正常に削除されました!" + "taskDeleted": "タスクが正常に削除されました!", + "noteDeleted": "ノートが正常に削除されました!" }, "dateFormats": { "long": "EEEE, MMMM d, yyyy", diff --git a/public/locales/ko/translation.json b/public/locales/ko/translation.json index 922b086..cbd4775 100644 --- a/public/locales/ko/translation.json +++ b/public/locales/ko/translation.json @@ -578,7 +578,8 @@ "nextActionAdded": "다음 작업이 성공적으로 추가되었습니다!", "taskCreated": "작업이 성공적으로 생성되었습니다!", "taskUpdated": "작업이 성공적으로 업데이트되었습니다!", - "taskDeleted": "작업이 성공적으로 삭제되었습니다!" + "taskDeleted": "작업이 성공적으로 삭제되었습니다!", + "noteDeleted": "메모가 성공적으로 삭제되었습니다!" }, "note": { "title": "제목", diff --git a/public/locales/nl/translation.json b/public/locales/nl/translation.json index 9748990..2254cac 100644 --- a/public/locales/nl/translation.json +++ b/public/locales/nl/translation.json @@ -578,7 +578,8 @@ "nextActionAdded": "Volgende actie succesvol toegevoegd!", "taskCreated": "Taak succesvol aangemaakt!", "taskUpdated": "Taak succesvol bijgewerkt!", - "taskDeleted": "Taak succesvol verwijderd!" + "taskDeleted": "Taak succesvol verwijderd!", + "noteDeleted": "Notitie succesvol verwijderd!" }, "note": { "title": "Titel", diff --git a/public/locales/no/translation.json b/public/locales/no/translation.json index 70d5c9b..39acf8d 100644 --- a/public/locales/no/translation.json +++ b/public/locales/no/translation.json @@ -578,7 +578,8 @@ "nextActionAdded": "Neste handling lagt til!", "taskCreated": "Oppgave opprettet!", "taskUpdated": "Oppgave oppdatert!", - "taskDeleted": "Oppgave slettet!" + "taskDeleted": "Oppgave slettet!", + "noteDeleted": "Notatet ble slettet med suksess!" }, "note": { "title": "Tittel", diff --git a/public/locales/pl/translation.json b/public/locales/pl/translation.json index 27acc5d..75c14f1 100644 --- a/public/locales/pl/translation.json +++ b/public/locales/pl/translation.json @@ -578,7 +578,8 @@ "nextActionAdded": "Następna akcja dodana pomyślnie!", "taskCreated": "Zadanie utworzone pomyślnie!", "taskUpdated": "Zadanie zaktualizowane pomyślnie!", - "taskDeleted": "Zadanie usunięte pomyślnie!" + "taskDeleted": "Zadanie usunięte pomyślnie!", + "noteDeleted": "Notatka została pomyślnie usunięta!" }, "note": { "title": "Tytuł", diff --git a/public/locales/pt/translation.json b/public/locales/pt/translation.json index 6fc1c80..59c26c5 100644 --- a/public/locales/pt/translation.json +++ b/public/locales/pt/translation.json @@ -578,7 +578,8 @@ "nextActionAdded": "Próxima ação adicionada com sucesso!", "taskCreated": "Tarefa criada com sucesso!", "taskUpdated": "Tarefa atualizada com sucesso!", - "taskDeleted": "Tarefa excluída com sucesso!" + "taskDeleted": "Tarefa excluída com sucesso!", + "noteDeleted": "Nota deletada com sucesso!" }, "note": { "title": "Título", diff --git a/public/locales/ro/translation.json b/public/locales/ro/translation.json index 05a4bf2..133eb81 100644 --- a/public/locales/ro/translation.json +++ b/public/locales/ro/translation.json @@ -578,7 +578,8 @@ "nextActionAdded": "Următoarea acțiune adăugată cu succes!", "taskCreated": "Sarcină creată cu succes!", "taskUpdated": "Sarcină actualizată cu succes!", - "taskDeleted": "Sarcină ștearsă cu succes!" + "taskDeleted": "Sarcină ștearsă cu succes!", + "noteDeleted": "Notă ștearsă cu succes!" }, "note": { "title": "Titlu", diff --git a/public/locales/ru/translation.json b/public/locales/ru/translation.json index 516b7c7..d712974 100644 --- a/public/locales/ru/translation.json +++ b/public/locales/ru/translation.json @@ -578,7 +578,8 @@ "nextActionAdded": "Следующее действие успешно добавлено!", "taskCreated": "Задача успешно создана!", "taskUpdated": "Задача успешно обновлена!", - "taskDeleted": "Задача успешно удалена!" + "taskDeleted": "Задача успешно удалена!", + "noteDeleted": "Заметка успешно удалена!" }, "note": { "title": "Название", diff --git a/public/locales/sl/translation.json b/public/locales/sl/translation.json index f30e5ad..90ce038 100644 --- a/public/locales/sl/translation.json +++ b/public/locales/sl/translation.json @@ -578,7 +578,8 @@ "nextActionAdded": "Naslednja akcija uspešno dodana!", "taskCreated": "Naloga uspešno ustvarjena!", "taskUpdated": "Naloga uspešno posodobljena!", - "taskDeleted": "Naloga uspešno izbrisana!" + "taskDeleted": "Naloga uspešno izbrisana!", + "noteDeleted": "Opomba je bila uspešno izbrisana!" }, "note": { "title": "Naslov", diff --git a/public/locales/sv/translation.json b/public/locales/sv/translation.json index 9440ecd..d3ab712 100644 --- a/public/locales/sv/translation.json +++ b/public/locales/sv/translation.json @@ -578,7 +578,8 @@ "nextActionAdded": "Nästa åtgärd tillagd!", "taskCreated": "Uppgift skapad!", "taskUpdated": "Uppgift uppdaterad!", - "taskDeleted": "Uppgift borttagen!" + "taskDeleted": "Uppgift borttagen!", + "noteDeleted": "Anteckningen har raderats framgångsrikt!" }, "note": { "title": "Titel", diff --git a/public/locales/tr/translation.json b/public/locales/tr/translation.json index a60f59b..3c8bc14 100644 --- a/public/locales/tr/translation.json +++ b/public/locales/tr/translation.json @@ -578,7 +578,8 @@ "nextActionAdded": "Sonraki eylem başarıyla eklendi!", "taskCreated": "Görev başarıyla oluşturuldu!", "taskUpdated": "Görev başarıyla güncellendi!", - "taskDeleted": "Görev başarıyla silindi!" + "taskDeleted": "Görev başarıyla silindi!", + "noteDeleted": "Not başarıyla silindi!" }, "note": { "title": "Başlık", diff --git a/public/locales/ua/translation.json b/public/locales/ua/translation.json index 3546f42..8c9963c 100644 --- a/public/locales/ua/translation.json +++ b/public/locales/ua/translation.json @@ -329,7 +329,8 @@ "projectCreated": "Проект успішно створено!", "taskCreated": "Завдання успішно створено!", "taskUpdated": "Завдання успішно оновлено!", - "taskDeleted": "Завдання успішно видалено!" + "taskDeleted": "Завдання успішно видалено!", + "noteDeleted": "Примітка успішно видалена!" }, "notes": { "loading": "Завантаження нотаток...", diff --git a/public/locales/vi/translation.json b/public/locales/vi/translation.json index 7604f86..74dc6aa 100644 --- a/public/locales/vi/translation.json +++ b/public/locales/vi/translation.json @@ -578,7 +578,8 @@ "nextActionAdded": "Hành động tiếp theo đã được thêm thành công!", "taskCreated": "Nhiệm vụ đã được tạo thành công!", "taskUpdated": "Nhiệm vụ đã được cập nhật thành công!", - "taskDeleted": "Nhiệm vụ đã được xóa thành công!" + "taskDeleted": "Nhiệm vụ đã được xóa thành công!", + "noteDeleted": "Ghi chú đã được xóa thành công!" }, "note": { "title": "Tiêu đề", diff --git a/public/locales/zh/translation.json b/public/locales/zh/translation.json index 48f4a0c..2941234 100644 --- a/public/locales/zh/translation.json +++ b/public/locales/zh/translation.json @@ -578,7 +578,8 @@ "nextActionAdded": "下一个行动添加成功!", "taskCreated": "任务创建成功!", "taskUpdated": "任务更新成功!", - "taskDeleted": "任务删除成功!" + "taskDeleted": "任务删除成功!", + "noteDeleted": "笔记删除成功!" }, "note": { "title": "标题",