import { Box, CircularProgress, Flex, IconButton, Link, Tooltip } from "@chakra-ui/react"; import { createColumnHelper } from "@tanstack/react-table"; import { Mail, ThumbsDown, ThumbsUp, User } from "lucide-react"; import NextLink from "next/link"; import { FetchTrollBoardResponse, TrollboardEntity, TrollboardTimeFrame } from "src/types/Trollboard"; import { DataTable, DataTableColumnDef } from "../DataTable/DataTable"; import { createJsonExpandRowModel } from "../DataTable/jsonExpandRowModel"; import { Discord } from "../Icons/Discord"; import { useBoardPagination } from "./useBoardPagination"; import { useBoardRowProps } from "./useBoardRowProps"; import { useFetchBoard } from "./useFetchBoard"; const columnHelper = createColumnHelper(); const toPercentage = (num: number) => `${Math.round(num * 100)}%`; const jsonExpandRowModel = createJsonExpandRowModel(); const columns: DataTableColumnDef[] = [ { ...columnHelper.accessor("rank", { cell: jsonExpandRowModel.renderCell, }), span: jsonExpandRowModel.span, }, columnHelper.accessor("display_name", { header: "Display name", cell: ({ getValue, row }) => { const isEmail = row.original.auth_method === "local"; return ( {getValue()} {isEmail ? : } ); }, }), columnHelper.accessor("troll_score", { header: "Troll score", }), columnHelper.accessor("red_flags", { header: "Red flags", }), columnHelper.accessor((row) => [row.upvotes, row.downvotes] as const, { id: "vote", cell: ({ getValue }) => { const [up, down] = getValue(); return ( {up} {down} ); }, }), columnHelper.accessor((row) => row.spam + row.spam_prompts, { header: "Spam", }), columnHelper.accessor("toxicity", { cell: ({ getValue }) => toPercentage(getValue() || 0), }), columnHelper.accessor((row) => row.user_id, { header: "Actions", cell: ({ row }) => ( } > ), }), ]; export const TrollboardTable = ({ limit, rowPerPage, timeFrame, }: { timeFrame: TrollboardTimeFrame; limit: number; rowPerPage: number; }) => { const { data: trollboardRes, isLoading, error, lastUpdated, } = useFetchBoard(`/api/admin/trollboard?time_frame=${timeFrame}&limit=${limit}`); const { data, ...paginationProps } = useBoardPagination({ rowPerPage, data: jsonExpandRowModel.toExpandable(trollboardRes?.trollboard), limit, }); const rowProps = useBoardRowProps(); if (isLoading) { return ; } if (error) { return Unable to load leaderboard; } return ( ); };