import { Suspense, useState } from "react"; import { Plural, Trans, useLingui } from "@lingui/react/macro"; import { Text } from "@mantine/core"; import Sheet from "@/components/sheet/sheet"; import { ListSkeleton } from "@/components/skeletons"; import { useSessions } from "../../queries"; import type { SessionSummary } from "../../types"; import { PaginatedList, RelativeTime, TelemetryListItem } from "../shared"; import SessionTimelineView from "./session-timeline"; export const defaultSessionParams = { days: 7, page: 1 } as const; const playerName = (player?: SessionSummary["player"]): string | null => { if (!player) return null; return [player.first_name, player.last_name].filter(Boolean).join(" ") || null; }; const durationLabel = (session: SessionSummary): string => { const ms = Date.parse(session.lastSeen.replace(" ", "T")) - Date.parse(session.started.replace(" ", "T")); const minutes = Math.round(ms / 60000); return minutes < 1 ? "<1m" : `${minutes}m`; }; export const SessionsList = () => { const { t } = useLingui(); const [page, setPage] = useState(1); const [selected, setSelected] = useState(null); const { data } = useSessions({ days: 7, page }); return ( <> session.session_id} empty={t`No sessions yet`} page={data.page} totalPages={data.totalPages} onPageChange={setPage} renderItem={(session) => ( , , durationLabel(session), ]} error={ session.errors > 0 ? ( ) : undefined } onClick={() => setSelected(session)} /> )} /> setSelected(null)} > {selected && ( }> )} {data.totalItems > 0 && ( Last 7 days )} ); }; export default SessionsList;