import React, { createContext, useContext, useState, ReactNode } from 'react'; /** * Dashboard Filter Context * * Provides global filter state (date range, region, etc.) to all dashboard widgets. * When filters change, all connected widgets re-fetch data automatically. */ interface FilterState { dateRange: { start: Date; end: Date }; region: string; category: string; } interface FilterContextType { filters: FilterState; setFilters: (filters: Partial) => void; resetFilters: () => void; } const DEFAULT_FILTERS: FilterState = { dateRange: { start: new Date(Date.now() - 30 * 24 * 60 * 60 * 1000), // 30 days ago end: new Date(), }, region: 'all', category: 'all', }; const FilterContext = createContext(undefined); export function FilterProvider({ children }: { children: ReactNode }) { const [filters, setFiltersState] = useState(DEFAULT_FILTERS); const setFilters = (newFilters: Partial) => { setFiltersState((prev) => ({ ...prev, ...newFilters })); }; const resetFilters = () => { setFiltersState(DEFAULT_FILTERS); }; return ( {children} ); } export function useFilters() { const context = useContext(FilterContext); if (!context) { throw new Error('useFilters must be used within FilterProvider'); } return context; } // Example widget using filters function RevenueWidget() { const { filters } = useFilters(); // Re-fetches when filters change const { data } = useQuery({ queryKey: ['revenue', filters], queryFn: () => fetchRevenue(filters.dateRange, filters.region), }); return
Revenue: {data?.total}
; } // Example filter controls export function DashboardFilters() { const { filters, setFilters, resetFilters } = useFilters(); return (
setFilters({ dateRange: { ...filters.dateRange, start: new Date(e.target.value) }, }) } style={{ padding: '8px', borderRadius: '6px', border: '1px solid #e2e8f0' }} /> to setFilters({ dateRange: { ...filters.dateRange, end: new Date(e.target.value) }, }) } style={{ padding: '8px', borderRadius: '6px', border: '1px solid #e2e8f0' }} />
); } export default DashboardFilters;