import { useSession } from "next-auth/react"; import Head from "next/head"; import { ReactElement, useEffect, useState } from "react"; import Layout from "../components/layout"; import Settings from "../components/settings"; import Link from "next/link"; import type { NextPageWithLayout } from "./_app"; import { BellSnoozeIcon, CheckBadgeIcon, EnvelopeIcon, EyeIcon, SunIcon, XCircleIcon, } from "@heroicons/react/24/outline"; import { FormProvider, useForm } from "react-hook-form"; import Router from "next/router"; import { NEXT_PUBLIC_WEBAPP_URL } from "@documenso/lib"; import toast from "react-hot-toast"; import { uploadDocument } from "@documenso/features"; import prisma from "@documenso/prisma"; import { ReadStatus, SendStatus, SigningStatus, DocumentStatus, } from "@prisma/client"; import { getUserFromToken } from "@documenso/lib/server"; 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 />
); }; // 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; const drafts = await prisma.document.findMany({ where: { userId: user.id, status: DocumentStatus.DRAFT, }, }); // todo optimize querys const sent = await prisma.recipient.groupBy({ by: ["documentId"], where: { sendStatus: SendStatus.SENT, }, }); const opened = await prisma.recipient.groupBy({ by: ["documentId"], where: { readStatus: ReadStatus.OPENED, }, }); const completed = await prisma.document.findMany({ where: { userId: user.id, status: DocumentStatus.COMPLETED, }, }); return { props: { dashboard: { drafts: drafts.length, sent: sent.length, viewed: opened.length, signed: completed.length, }, }, }; } export default DashboardPage;