diff --git a/memento-note/app/(main)/settings/general/page.tsx b/memento-note/app/(main)/settings/general/page.tsx
index 33760d1..e99de12 100644
--- a/memento-note/app/(main)/settings/general/page.tsx
+++ b/memento-note/app/(main)/settings/general/page.tsx
@@ -9,7 +9,16 @@ export default async function GeneralSettingsPage() {
redirect('/api/auth/signin')
}
- const settings = await getAISettings()
+ const {
+ preferredLanguage,
+ emailNotifications,
+ desktopNotifications,
+ autoSave,
+ } = await getAISettings()
- return
+ return (
+
+ )
}
diff --git a/memento-note/components/notes-editorial-view.tsx b/memento-note/components/notes-editorial-view.tsx
index c0a3f14..2598d84 100644
--- a/memento-note/components/notes-editorial-view.tsx
+++ b/memento-note/components/notes-editorial-view.tsx
@@ -6,7 +6,7 @@ import { getNoteFeedImage, getNotePlainExcerpt, getNoteDisplayTitle } from '@/li
import { useLanguage } from '@/lib/i18n'
import { useRefresh } from '@/lib/use-refresh'
import { motion, AnimatePresence } from 'motion/react'
-import { ChevronRight, MoreHorizontal, Trash2, Archive, Pin, History, Pencil, Sparkles, Loader2 } from 'lucide-react'
+import { ChevronRight, MoreHorizontal, Trash2, Archive, Pin, History, Pencil, Sparkles, Loader2, Bell, FolderOpen, StickyNote } from 'lucide-react'
import { useSession } from 'next-auth/react'
import { getAISettings } from '@/app/actions/ai-settings'
import { generateNoteIllustrationSvg } from '@/app/actions/note-illustration'
@@ -16,8 +16,13 @@ import {
DropdownMenuItem,
DropdownMenuSeparator,
DropdownMenuTrigger,
+ DropdownMenuSub,
+ DropdownMenuSubContent,
+ DropdownMenuSubTrigger,
} from '@/components/ui/dropdown-menu'
-import { deleteNote, toggleArchive, togglePin } from '@/app/actions/notes'
+import { deleteNote, toggleArchive, togglePin, updateNote } from '@/app/actions/notes'
+import { ReminderDialog } from '@/components/reminder-dialog'
+import { useNotebooks } from '@/context/notebooks-context'
import { toast } from 'sonner'
type NotesEditorialViewProps = {
@@ -43,7 +48,10 @@ function EditorialNoteMenu({ note, onOpen, onOpenHistory }: {
}) {
const { t } = useLanguage()
const { refreshNotes } = useRefresh()
+ const { notebooks } = useNotebooks()
const [, startTransition] = useTransition()
+ const [showReminder, setShowReminder] = useState(false)
+ const [showNotebookMenu, setShowNotebookMenu] = useState(false)
const handleDelete = (e: React.MouseEvent) => {
e.stopPropagation()
@@ -83,6 +91,18 @@ function EditorialNoteMenu({ note, onOpen, onOpenHistory }: {
})
}
+ const handleMoveToNotebook = (notebookId: string | null) => {
+ startTransition(async () => {
+ try {
+ await updateNote(note.id, { notebookId })
+ refreshNotes(note?.notebookId)
+ toast.success(t('notebookSuggestion.movedToNotebook') || 'Note déplacée')
+ } catch {
+ toast.error(t('general.error'))
+ }
+ })
+ }
+
return (
e.stopPropagation()}>
@@ -109,6 +129,52 @@ function EditorialNoteMenu({ note, onOpen, onOpenHistory }: {
{t('notes.history') || 'Historique'}
)}
+
+ {/* Rappel */}
+ { e.stopPropagation(); setShowReminder(true) }}>
+
+ {note.reminder ? (t('reminder.changeReminder') || 'Modifier le rappel') : (t('reminder.setReminder') || 'Définir un rappel')}
+
+ {
+ startTransition(async () => {
+ await updateNote(note.id, { reminder: date })
+ refreshNotes(note?.notebookId)
+ setShowReminder(false)
+ })
+ }}
+ onRemove={() => {
+ startTransition(async () => {
+ await updateNote(note.id, { reminder: null })
+ refreshNotes(note?.notebookId)
+ setShowReminder(false)
+ })
+ }}
+ />
+
+ {/* Déplacer vers notebook */}
+
+ e.stopPropagation()}>
+
+ {t('notebookSuggestion.moveToNotebook') || 'Déplacer vers notebook'}
+
+
+ { e.stopPropagation(); handleMoveToNotebook(null) }}>
+
+ {t('notebookSuggestion.generalNotes') || 'Notes générales'}
+
+ {notebooks.map((nb: any) => (
+ { e.stopPropagation(); handleMoveToNotebook(nb.id) }}>
+
+ {nb.name}
+
+ ))}
+
+
+