"use client"; import { RiAddCircleLine, RiTodoLine } from "@remixicon/react"; import { useMemo, useState } from "react"; import { toast } from "sonner"; import { arquivarAnotacaoAction, deleteNoteAction, } from "@/app/(dashboard)/anotacoes/actions"; import { ConfirmActionDialog } from "@/components/shared/confirm-action-dialog"; import { EmptyState } from "@/components/shared/empty-state"; import { Button } from "@/components/ui/button"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { Card } from "../ui/card"; import { NoteCard } from "./note-card"; import { NoteDetailsDialog } from "./note-details-dialog"; import { NoteDialog } from "./note-dialog"; import type { Note } from "./types"; interface NotesPageProps { notes: Note[]; archivedNotes: Note[]; } export function NotesPage({ notes, archivedNotes }: NotesPageProps) { const [activeTab, setActiveTab] = useState("ativas"); const [createOpen, setCreateOpen] = useState(false); const [editOpen, setEditOpen] = useState(false); const [noteToEdit, setNoteToEdit] = useState(null); const [detailsOpen, setDetailsOpen] = useState(false); const [noteDetails, setNoteDetails] = useState(null); const [removeOpen, setRemoveOpen] = useState(false); const [noteToRemove, setNoteToRemove] = useState(null); const [arquivarOpen, setArquivarOpen] = useState(false); const [noteToArquivar, setNoteToArquivar] = useState(null); const sortedNotes = useMemo( () => [...notes].sort( (a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime(), ), [notes], ); const sortedArchivedNotes = useMemo( () => [...archivedNotes].sort( (a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime(), ), [archivedNotes], ); const isArquivadas = activeTab === "arquivadas"; const handleCreateOpenChange = (open: boolean) => { setCreateOpen(open); }; const handleEditOpenChange = (open: boolean) => { setEditOpen(open); if (!open) { setNoteToEdit(null); } }; const handleDetailsOpenChange = (open: boolean) => { setDetailsOpen(open); if (!open) { setNoteDetails(null); } }; const handleRemoveOpenChange = (open: boolean) => { setRemoveOpen(open); if (!open) { setNoteToRemove(null); } }; const handleArquivarOpenChange = (open: boolean) => { setArquivarOpen(open); if (!open) { setNoteToArquivar(null); } }; const handleEditRequest = (note: Note) => { setNoteToEdit(note); setEditOpen(true); }; const handleDetailsRequest = (note: Note) => { setNoteDetails(note); setDetailsOpen(true); }; const handleRemoveRequest = (note: Note) => { setNoteToRemove(note); setRemoveOpen(true); }; const handleArquivarRequest = (note: Note) => { setNoteToArquivar(note); setArquivarOpen(true); }; const handleArquivarConfirm = async () => { if (!noteToArquivar) { return; } const result = await arquivarAnotacaoAction({ id: noteToArquivar.id, arquivada: !isArquivadas, }); if (result.success) { toast.success(result.message); return; } toast.error(result.error); throw new Error(result.error); }; const handleRemoveConfirm = async () => { if (!noteToRemove) { return; } const result = await deleteNoteAction({ id: noteToRemove.id }); if (result.success) { toast.success(result.message); return; } toast.error(result.error); throw new Error(result.error); }; const removeTitle = noteToRemove ? noteToRemove.title.trim().length ? `Remover anotação "${noteToRemove.title}"?` : "Remover anotação?" : "Remover anotação?"; const arquivarTitle = noteToArquivar ? noteToArquivar.title.trim().length ? isArquivadas ? `Desarquivar anotação "${noteToArquivar.title}"?` : `Arquivar anotação "${noteToArquivar.title}"?` : isArquivadas ? "Desarquivar anotação?" : "Arquivar anotação?" : isArquivadas ? "Desarquivar anotação?" : "Arquivar anotação?"; const renderNoteList = (list: Note[], isArchived: boolean) => { if (list.length === 0) { return ( } title={ isArchived ? "Nenhuma anotação arquivada" : "Nenhuma anotação registrada" } description={ isArchived ? "As anotações arquivadas aparecerão aqui." : "Crie anotações personalizadas para acompanhar lembretes, decisões ou observações financeiras importantes." } /> ); } return (
{list.map((note) => ( ))}
); }; return ( <>
Nova anotação } />
Ativas Arquivadas {renderNoteList(sortedNotes, false)} {renderNoteList(sortedArchivedNotes, true)}
); }