"use client"; import { useMemo, useState, useEffect } from "react"; import { useWorkSessions } from "@/hooks/use-work-sessions"; import { WorkSessionStatus } from "@/types"; import { OfflineState } from "@/components/ui/offline-state"; import { WorkSessionTable } from "./work-session-table"; import { WorkSessionFilters } from "./work-session-filters"; import { SessionTrendChart } from "./session-trend-chart"; import { usePageRefresh } from "@/hooks"; /** * Work-sessions content, rendered as the "Work Sessions" tab of /git. * Filter state is LOCAL, deliberately not URL params: every URL write forks * ScrollRestoration's route key and force-scrolls
to top, so a * per-keystroke q= param made typing in the search box bounce the page. */ export function WorkSessionsView() { const [searchQuery, setSearchQuery] = useState(""); const [statusFilter, setStatusFilter] = useState([]); const handleSearchChange = setSearchQuery; const handleStatusChange = setStatusFilter; // Fetch work sessions const { data: sessions, isLoading, error, refetch } = useWorkSessions(); const { register, unregister, refresh } = usePageRefresh(); useEffect(() => { const cb = () => { void refetch(); }; register(cb); return () => unregister(cb); }, [register, unregister, refetch]); // Filter sessions client-side for search and multi-select status filter const filteredSessions = useMemo(() => { if (!sessions) return []; return sessions.filter((session) => { // Search filter - match branch name if ( searchQuery && !session.branch_name.toLowerCase().includes(searchQuery.toLowerCase()) ) { return false; } // Status filter (if any selected, session must match one of them) if (statusFilter.length > 0 && !statusFilter.includes(session.status)) { return false; } return true; }); }, [sessions, searchQuery, statusFilter]); // Check if it's a connection error (backend not running) const isOffline = error && (error.message?.includes("Network Error") || error.message?.includes("ECONNREFUSED") || (error as { code?: string })?.code === "ERR_NETWORK"); return (
{/* Header */}

Work Sessions

Track git branches and pull requests for active work

{/* Filters - Sticky */}
{/* Content */} {isOffline ? ( void refresh()} /> ) : ( <> )}
); }