/* * Copyright (c) 2021 - 2025, Ludvig Lundgren and the autobrr contributors. * SPDX-License-Identifier: GPL-2.0-or-later */ import React, { useState, useEffect } from "react"; import { useSuspenseQuery } from "@tanstack/react-query"; import { useReactTable, getCoreRowModel, flexRender, ColumnDef } from "@tanstack/react-table"; import { EyeIcon, EyeSlashIcon } from "@heroicons/react/24/solid"; import { EmptyListState } from "@components/emptystates"; import * as DataTable from "@components/data-table"; import { RandomLinuxIsos, RandomIsoTracker } from "@utils"; import { ReleasesLatestQueryOptions } from "@api/queries"; import { IndexerCell } from "@components/data-table"; import { SettingsContext } from "@utils/Context"; interface TableProps { columns: ColumnDef[]; data: Release[]; } function Table({ columns, data }: TableProps) { const tableInstance = useReactTable({ columns, data, getCoreRowModel: getCoreRowModel(), }) if (data.length === 0) { return (
) } return (
{tableInstance.getHeaderGroups().map((headerGroup) => ( {headerGroup.headers.map((header) => ( ) )} ))} {tableInstance.getRowModel().rows.map((row) => ( {row.getVisibleCells().map((cell) => ( ))} ))}
{header.isPlaceholder ? null : flexRender( header.column.columnDef.header, header.getContext() )}
{flexRender(cell.column.columnDef.cell, cell.getContext())}
); } export const ActivityTable = () => { const columns = React.useMemo[]>(() => [ { header: "Age", accessorKey: "timestamp", cell: DataTable.AgeCell }, { header: "Release", accessorKey: "name", cell: DataTable.TitleCell }, { header: "Actions", accessorKey: "action_status", cell: DataTable.ReleaseStatusCell }, { header: "Indexer", accessorKey: "indexer.identifier", cell: IndexerCell, } ], []); const { isLoading, data } = useSuspenseQuery(ReleasesLatestQueryOptions()); const [modifiedData, setModifiedData] = useState([]); const [settings, setSettings] = SettingsContext.use(); useEffect(() => { if (settings.incognitoMode && data?.data) { const randomIsoNames = RandomLinuxIsos(data.data.length); const randomTorrentSiteNames = RandomIsoTracker(data.data.length); const newData: Release[] = data.data.map((item, index) => { const siteName = randomTorrentSiteNames[index % randomTorrentSiteNames.length]; return { ...item, name: randomIsoNames[index], indexer: { id: 0, name: siteName, identifier: siteName, identifier_external: siteName, }, }; }); setModifiedData(newData); } else { setModifiedData([]); } }, [settings.incognitoMode, data?.data]); if (isLoading) { return (

Recent activity

); } const toggleReleaseNames = () => { setSettings(prev => ({ ...prev, incognitoMode: !prev.incognitoMode })); }; const displayData = settings.incognitoMode ? modifiedData : (data?.data ?? []); return (

Recent activity

); };