From dc18dc3de43f58f87b00a21f8fc99bde24988cb8 Mon Sep 17 00:00:00 2001 From: sepehr Date: Sun, 26 Apr 2026 10:04:06 +0200 Subject: [PATCH] fix: exclude trashed notes from notebook counts + wire up trash restore/delete - Add trashedAt: null filter to notebook note count queries in /api/notebooks - Pass isTrashView, onRestore, onPermanentDelete from NoteCard to NoteActions - Implement handleRestore and handlePermanentDelete in NoteCard Co-Authored-By: Claude Opus 4.7 --- memento-note/app/api/notebooks/route.ts | 4 +-- memento-note/components/note-card.tsx | 33 ++++++++++++++++++++++++- 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/memento-note/app/api/notebooks/route.ts b/memento-note/app/api/notebooks/route.ts index ccf0b08..d5075cb 100644 --- a/memento-note/app/api/notebooks/route.ts +++ b/memento-note/app/api/notebooks/route.ts @@ -21,7 +21,7 @@ export async function GET(request: NextRequest) { orderBy: { name: 'asc' } }, _count: { - select: { notes: { where: { isArchived: false } } } + select: { notes: { where: { isArchived: false, trashedAt: null } } } } }, orderBy: { order: 'asc' } @@ -82,7 +82,7 @@ export async function POST(request: NextRequest) { include: { labels: true, _count: { - select: { notes: { where: { isArchived: false } } } + select: { notes: { where: { isArchived: false, trashedAt: null } } } } } }) diff --git a/memento-note/components/note-card.tsx b/memento-note/components/note-card.tsx index fa2ec13..028e634 100644 --- a/memento-note/components/note-card.tsx +++ b/memento-note/components/note-card.tsx @@ -24,7 +24,7 @@ import { Pin, Bell, GripVertical, X, Link2, FolderOpen, StickyNote, LucideIcon, import { useState, useEffect, useTransition, useOptimistic, memo } from 'react' import { useSession } from 'next-auth/react' import { useRouter, useSearchParams } from 'next/navigation' -import { deleteNote, toggleArchive, togglePin, updateColor, updateNote, updateSize, getNoteAllUsers, leaveSharedNote, removeFusedBadge, createNote } from '@/app/actions/notes' +import { deleteNote, toggleArchive, togglePin, updateColor, updateNote, updateSize, getNoteAllUsers, leaveSharedNote, removeFusedBadge, createNote, restoreNote, permanentDeleteNote } from '@/app/actions/notes' import { cn } from '@/lib/utils' import { formatDistanceToNow, Locale } from 'date-fns' import { enUS } from 'date-fns/locale/en-US' @@ -263,6 +263,34 @@ export const NoteCard = memo(function NoteCard({ } } + const handleRestore = async () => { + setIsDeleting(true) + setIsHidden(true) + try { + await restoreNote(note.id) + triggerRefresh() + toast.success(t('trash.noteRestored')) + } catch (error) { + console.error('Failed to restore note:', error) + setIsHidden(false) + setIsDeleting(false) + } + } + + const handlePermanentDelete = async () => { + setIsDeleting(true) + setIsHidden(true) + try { + await permanentDeleteNote(note.id) + triggerRefresh() + toast.success(t('trash.notePermanentlyDeleted')) + } catch (error) { + console.error('Failed to permanently delete note:', error) + setIsHidden(false) + setIsDeleting(false) + } + } + const handleTogglePin = async () => { startTransition(async () => { addOptimisticNote({ isPinned: !note.isPinned }) @@ -612,6 +640,9 @@ export const NoteCard = memo(function NoteCard({ onSizeChange={handleSizeChange} onDelete={() => setShowDeleteDialog(true)} onShareCollaborators={() => setShowCollaboratorDialog(true)} + isTrashView={isTrashView} + onRestore={handleRestore} + onPermanentDelete={handlePermanentDelete} className="absolute bottom-0 left-0 right-0 p-2 opacity-100 md:opacity-0 group-hover:opacity-100 transition-opacity" /> )}