import { useMemo } from "react"; import type { ColumnSnapshot, ColumnState, DeckAccount, DeckColumn, FullscreenState, } from "../types/app"; import { TimelineColumn, type TimelineConfig } from "./TimelineColumn"; import { ChatColumn } from "./ChatColumn"; interface ColumnBoardProps { columns: DeckColumn[]; accounts: DeckAccount[]; onRemove: (id: string) => void; onStateChange: (columnId: string, state: ColumnState) => void; onSnapshot: (columnId: string, snapshot: ColumnSnapshot) => void; onEnterFullscreen: (payload: FullscreenState) => void; } export function ColumnBoard({ columns, accounts, onRemove, onStateChange, onSnapshot, onEnterFullscreen, }: ColumnBoardProps) { const accountMap = useMemo( () => Object.fromEntries(accounts.map(account => [account.id, account])), [accounts], ); if (!columns.length) { return (

No columns yet

Build your deck

Add some columns from the left panel to start streaming timelines.

); } return (
{columns.map((column, columnIndex) => { const account = accountMap[column.accountId]; if (!account) { return (

Account missing

{column.title}

The account for this column was removed.

); } if (isChatColumn(column)) { return ( onRemove(column.id)} /> ); } return ( onRemove(column.id)} onStateChange={onStateChange} onSnapshot={onSnapshot} onEnterFullscreen={onEnterFullscreen} columnIndex={columnIndex} /> ); })}
); } function isChatColumn(column: DeckColumn): column is DeckColumn & { kind: "chat" } { return column.kind === "chat"; }