forked from git.gladyson/openmonetis
Substitui rotas separadas de inativos/arquivados por tabs inline em Cartões, Contas e Anotações, seguindo o padrão já usado em Categorias. Remove sub-links da sidebar e padroniza nomenclatura para "Arquivados". Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
101 lines
2.4 KiB
TypeScript
101 lines
2.4 KiB
TypeScript
import { and, eq } from "drizzle-orm";
|
|
import { type Anotacao, anotacoes } from "@/db/schema";
|
|
import { db } from "@/lib/db";
|
|
|
|
export type Task = {
|
|
id: string;
|
|
text: string;
|
|
completed: boolean;
|
|
};
|
|
|
|
export type NoteData = {
|
|
id: string;
|
|
title: string;
|
|
description: string;
|
|
type: "nota" | "tarefa";
|
|
tasks?: Task[];
|
|
arquivada: boolean;
|
|
createdAt: string;
|
|
};
|
|
|
|
export async function fetchNotesForUser(userId: string): Promise<NoteData[]> {
|
|
const noteRows = await db.query.anotacoes.findMany({
|
|
where: and(eq(anotacoes.userId, userId), eq(anotacoes.arquivada, false)),
|
|
orderBy: (
|
|
note: typeof anotacoes.$inferSelect,
|
|
{ desc }: { desc: (field: unknown) => unknown },
|
|
) => [desc(note.createdAt)],
|
|
});
|
|
|
|
return noteRows.map((note: Anotacao) => {
|
|
let tasks: Task[] | undefined;
|
|
|
|
// Parse tasks if they exist
|
|
if (note.tasks) {
|
|
try {
|
|
tasks = JSON.parse(note.tasks);
|
|
} catch (error) {
|
|
console.error("Failed to parse tasks for note", note.id, error);
|
|
tasks = undefined;
|
|
}
|
|
}
|
|
|
|
return {
|
|
id: note.id,
|
|
title: (note.title ?? "").trim(),
|
|
description: (note.description ?? "").trim(),
|
|
type: (note.type ?? "nota") as "nota" | "tarefa",
|
|
tasks,
|
|
arquivada: note.arquivada,
|
|
createdAt: note.createdAt.toISOString(),
|
|
};
|
|
});
|
|
}
|
|
|
|
export async function fetchAllNotesForUser(
|
|
userId: string,
|
|
): Promise<{ activeNotes: NoteData[]; archivedNotes: NoteData[] }> {
|
|
const [activeNotes, archivedNotes] = await Promise.all([
|
|
fetchNotesForUser(userId),
|
|
fetchArquivadasForUser(userId),
|
|
]);
|
|
|
|
return { activeNotes, archivedNotes };
|
|
}
|
|
|
|
export async function fetchArquivadasForUser(
|
|
userId: string,
|
|
): Promise<NoteData[]> {
|
|
const noteRows = await db.query.anotacoes.findMany({
|
|
where: and(eq(anotacoes.userId, userId), eq(anotacoes.arquivada, true)),
|
|
orderBy: (
|
|
note: typeof anotacoes.$inferSelect,
|
|
{ desc }: { desc: (field: unknown) => unknown },
|
|
) => [desc(note.createdAt)],
|
|
});
|
|
|
|
return noteRows.map((note: Anotacao) => {
|
|
let tasks: Task[] | undefined;
|
|
|
|
// Parse tasks if they exist
|
|
if (note.tasks) {
|
|
try {
|
|
tasks = JSON.parse(note.tasks);
|
|
} catch (error) {
|
|
console.error("Failed to parse tasks for note", note.id, error);
|
|
tasks = undefined;
|
|
}
|
|
}
|
|
|
|
return {
|
|
id: note.id,
|
|
title: (note.title ?? "").trim(),
|
|
description: (note.description ?? "").trim(),
|
|
type: (note.type ?? "nota") as "nota" | "tarefa",
|
|
tasks,
|
|
arquivada: note.arquivada,
|
|
createdAt: note.createdAt.toISOString(),
|
|
};
|
|
});
|
|
}
|