|
"use client" |
|
|
|
import { |
|
ColumnDef, |
|
ColumnFiltersState, |
|
SortingState, |
|
VisibilityState, |
|
flexRender, |
|
getCoreRowModel, |
|
getFacetedRowModel, |
|
getFacetedUniqueValues, |
|
getFilteredRowModel, |
|
getPaginationRowModel, |
|
getSortedRowModel, |
|
useReactTable, |
|
} from "@tanstack/react-table" |
|
|
|
import { |
|
Table, |
|
TableBody, |
|
TableCell, |
|
TableHead, |
|
TableHeader, |
|
TableRow, |
|
} from "@/components/ui/table" |
|
|
|
import { columns } from "@/components/business/videos/columns" |
|
import { Video } from "@/app/types" |
|
import { useState } from "react" |
|
|
|
export function VideosQueue({ |
|
videos = [], |
|
onSelectVideo, |
|
}: { |
|
videos: Video[] |
|
onSelectVideo: (task: Video) => void |
|
}) { |
|
const [rowSelection, setRowSelection] = useState({}) |
|
const [columnVisibility, setColumnVisibility] = |
|
useState<VisibilityState>({}) |
|
const [columnFilters, setColumnFilters] = useState<ColumnFiltersState>( |
|
[] |
|
) |
|
const [sorting, setSorting] = useState<SortingState>([]) |
|
|
|
const table = useReactTable({ |
|
data: videos, |
|
columns: columns as ColumnDef<Video, any>[], |
|
state: { |
|
sorting, |
|
columnVisibility, |
|
rowSelection, |
|
columnFilters, |
|
}, |
|
enableRowSelection: true, |
|
onRowSelectionChange: setRowSelection, |
|
onSortingChange: setSorting, |
|
onColumnFiltersChange: setColumnFilters, |
|
onColumnVisibilityChange: setColumnVisibility, |
|
getCoreRowModel: getCoreRowModel(), |
|
getFilteredRowModel: getFilteredRowModel(), |
|
getPaginationRowModel: getPaginationRowModel(), |
|
getSortedRowModel: getSortedRowModel(), |
|
getFacetedRowModel: getFacetedRowModel(), |
|
getFacetedUniqueValues: getFacetedUniqueValues(), |
|
}) |
|
|
|
return ( |
|
<div className="rounded-lg border"> |
|
<Table> |
|
<TableHeader> |
|
{table.getHeaderGroups().map((headerGroup) => ( |
|
<TableRow key={headerGroup.id}> |
|
{headerGroup.headers.map((header) => { |
|
return ( |
|
<TableHead key={header.id}> |
|
{header.isPlaceholder |
|
? null |
|
: flexRender( |
|
header.column.columnDef.header, |
|
header.getContext() |
|
)} |
|
</TableHead> |
|
) |
|
})} |
|
</TableRow> |
|
))} |
|
</TableHeader> |
|
<TableBody> |
|
{table.getRowModel().rows?.length ? ( |
|
table.getRowModel().rows.map((row) => ( |
|
<TableRow |
|
key={row.original.id} |
|
data-state={row.getIsSelected() && "selected"} |
|
> |
|
{row.getVisibleCells().map((cell) => ( |
|
<TableCell key={cell.id} |
|
className="cursor-pointer" |
|
onClick={() => { |
|
const videoId = `${row.getValue("id") || ""}` |
|
const video = videos.find(({ id }) => id === videoId) |
|
if (video) { |
|
onSelectVideo(video) |
|
} |
|
}}> |
|
{flexRender( |
|
cell.column.columnDef.cell, |
|
cell.getContext() |
|
)} |
|
</TableCell> |
|
))} |
|
</TableRow> |
|
)) |
|
) : ( |
|
<TableRow> |
|
<TableCell |
|
colSpan={columns.length} |
|
className="h-24 text-center" |
|
> |
|
No recent video. |
|
</TableCell> |
|
</TableRow> |
|
)} |
|
</TableBody> |
|
</Table> |
|
</div> |
|
) |
|
} |