src/features/reporting-page/reporting-page.tsx (82 lines of code) (raw):
import { ChevronLeft, ChevronRight } from "lucide-react";
import Link from "next/link";
import { FC, Suspense } from "react";
import { Button } from "../ui/button";
import { DisplayError } from "../ui/error/display-error";
import { PageLoader } from "../ui/page-loader";
import { ScrollArea } from "../ui/scroll-area";
import {
Table,
TableBody,
TableHead,
TableHeader,
TableRow,
} from "../ui/table";
import { ReportingHero } from "./reporting-hero";
import { FindAllChatThreadsForAdmin } from "./reporting-services/reporting-service";
import ChatThreadRow from "./table-row";
const SEARCH_PAGE_SIZE = 100;
interface ChatReportingProps {
page: number;
}
export const ChatReportingPage: FC<ChatReportingProps> = async (props) => {
return (
<ScrollArea className="flex-1">
<main className="flex flex-1 flex-col">
<ReportingHero />
<Suspense fallback={<PageLoader />} key={props.page}>
<ReportingContent {...props} />
</Suspense>
</main>
</ScrollArea>
);
};
async function ReportingContent(props: ChatReportingProps) {
let pageNumber = props.page < 0 ? 0 : props.page;
let nextPage = pageNumber + 1;
let previousPage = pageNumber - 1;
const chatHistoryResponse = await FindAllChatThreadsForAdmin(
SEARCH_PAGE_SIZE,
props.page * SEARCH_PAGE_SIZE
);
if (chatHistoryResponse.status !== "OK") {
return <DisplayError errors={chatHistoryResponse.errors} />;
}
const chatThreads = chatHistoryResponse.response;
const hasMoreResults = chatThreads.length === SEARCH_PAGE_SIZE;
return (
<div className="container max-w-4xl py-3">
<Table>
<TableHeader>
<TableRow>
<TableHead>Conversation</TableHead>
<TableHead className="w-[200px]">User</TableHead>
<TableHead className="w-[100px]">Date</TableHead>
</TableRow>
</TableHeader>
<TableBody>
{chatThreads &&
chatThreads.map((chatThread) => (
<ChatThreadRow key={chatThread.id} {...chatThread} />
))}
</TableBody>
</Table>
<div className="flex gap-2 p-2 justify-end">
{previousPage >= 0 && (
<Button asChild size={"icon"} variant={"outline"}>
<Link href={"/reporting?pageNumber=" + previousPage}>
<ChevronLeft />
</Link>
</Button>
)}
{hasMoreResults && (
<Button asChild size={"icon"} variant={"outline"}>
<Link href={"/reporting?pageNumber=" + nextPage}>
<ChevronRight />
</Link>
</Button>
)}
</div>
</div>
);
}