import Head from "next/head"; import { ReactElement } from "react"; import Layout from "../components/layout"; import Link from "next/link"; import type { NextPageWithLayout } from "./_app"; import { BellSnoozeIcon, CheckBadgeIcon, EnvelopeIcon, EyeIcon, SunIcon, XCircleIcon, } from "@heroicons/react/24/outline"; import { uploadDocument } from "@documenso/features"; import prisma from "@documenso/prisma"; import { ReadStatus, SendStatus, DocumentStatus, Document as PrismaDocument, } from "@prisma/client"; import { getUserFromToken } from "@documenso/lib/server"; import { getDocumentsForUserFromToken } from "@documenso/lib/query"; type FormValues = { document: File; }; const DashboardPage: NextPageWithLayout = (props: any) => { const stats = [ { name: "Draft", stat: "0", icon: SunIcon, link: "/documents?filter=", }, { name: "Sent", stat: "0", icon: EnvelopeIcon, link: "/documents?filter=", }, { name: "Viewed", stat: "0", icon: EyeIcon, link: "/documents?filter=", }, { name: "Signed", stat: "0", icon: CheckBadgeIcon, link: "/documents?filter=", }, { name: "Expired", stat: "0", icon: BellSnoozeIcon, link: "/documents?filter=", }, { name: "Declined", stat: "0", icon: XCircleIcon, link: "/documents?filter=", }, ]; return ( <> Dashboard | Documenso

Dashboard

{stats.map((item) => (
{item.name}
{getStat(item.name, props)}
))}
{ uploadDocument(event); }} hidden />
{ document?.getElementById("fileUploadHelper")?.click(); }} className="relative block w-full rounded-lg border-2 border-dashed border-gray-300 p-12 text-center hover:border-neon focus:outline-none focus:ring-2 focus:ring-indigo-500 focus:ring-offset-2" > Upload a new PDF document
); }; // todo layout as component DashboardPage.getLayout = function getLayout(page: ReactElement) { return {page}; }; function getStat(name: string, props: any) { if (name === "Draft") return props.dashboard.drafts; if (name === "Sent") return props.dashboard.sent; if (name === "Viewed") return props.dashboard.viewed; if (name === "Signed") return props.dashboard.signed; return 0; } export async function getServerSideProps(context: any) { const user = await getUserFromToken(context.req, context.res); if (!user) return; // todo optimize querys // todo no intersection groups const documents: PrismaDocument[] = await getDocumentsForUserFromToken( context ); const drafts: PrismaDocument[] = documents.filter( (d) => d.status === DocumentStatus.DRAFT ); const completed: PrismaDocument[] = documents.filter( (d) => d.status === DocumentStatus.COMPLETED ); const sent = await prisma.recipient.groupBy({ by: ["documentId"], where: { sendStatus: SendStatus.SENT, readStatus: ReadStatus.NOT_OPENED, }, }); const opened = await prisma.recipient.groupBy({ by: ["documentId"], where: { sendStatus: SendStatus.SENT, readStatus: ReadStatus.OPENED, }, }); return { props: { dashboard: { drafts: drafts.length, sent: sent.length, viewed: opened.length, signed: completed.length, }, }, }; } export default DashboardPage;