import { useRechartDataModel } from '@/hooks/use-rechart-data-model'; import { useTheme } from '@/hooks/use-theme'; import { useVisibleSeries } from '@/hooks/use-visible-series'; import { useTRPC } from '@/integrations/trpc/react'; import { pushModal } from '@/modals'; import type { IChartData } from '@/trpc/client'; import { cn } from '@/utils/cn'; import { getChartColor } from '@/utils/theme'; import { useQuery } from '@tanstack/react-query'; import { BookmarkIcon, UsersIcon } from 'lucide-react'; import React, { useCallback } from 'react'; import { Bar, BarChart, CartesianGrid, ReferenceLine, ResponsiveContainer, Tooltip, XAxis, YAxis, } from 'recharts'; import { useXAxisProps, useYAxisProps } from '../common/axis'; import { ChartClickMenu, type ChartClickMenuItem, } from '../common/chart-click-menu'; import { ReportChartTooltip } from '../common/report-chart-tooltip'; import { ReportTable } from '../common/report-table'; import { useReportChartContext } from '../context'; interface Props { data: IChartData; } function BarHover({ x, y, width, height, top, left, right, bottom }: any) { const themeMode = useTheme(); const styles = getComputedStyle(document.documentElement); const def100 = styles.getPropertyValue('--def-100'); const def300 = styles.getPropertyValue('--def-300'); const bg = themeMode?.theme === 'dark' ? def100 : def300; return ( ); } export function Chart({ data }: Props) { const { isEditMode, report: { previous, interval, projectId, startDate, endDate, range, series: reportSeries, breakdowns, }, options: { hideXAxis, hideYAxis }, } = useReportChartContext(); const trpc = useTRPC(); const references = useQuery( trpc.reference.getChartReferences.queryOptions( { projectId, startDate, endDate, range, }, { staleTime: 1000 * 60 * 10, }, ), ); const { series, setVisibleSeries } = useVisibleSeries(data); const rechartData = useRechartDataModel(series); const yAxisProps = useYAxisProps({ hide: hideYAxis, }); const xAxisProps = useXAxisProps({ hide: hideXAxis, interval, }); const getMenuItems = useCallback( (e: any, clickedData: any): ChartClickMenuItem[] => { const items: ChartClickMenuItem[] = []; if (!clickedData?.date) { return items; } // View Users - only show if we have projectId if (projectId) { items.push({ label: 'View Users', icon: , onClick: () => { pushModal('ViewChartUsers', { type: 'chart', chartData: data, report: { projectId, series: reportSeries, breakdowns: breakdowns || [], interval, startDate, endDate, range, previous, chartType: 'histogram', metric: 'sum', }, date: clickedData.date, }); }, }); } // Add Reference - always show items.push({ label: 'Add Reference', icon: , onClick: () => { pushModal('AddReference', { datetime: new Date(clickedData.date).toISOString(), }); }, }); return items; }, [ projectId, data, reportSeries, breakdowns, interval, startDate, endDate, range, previous, ], ); return ( } cursor={} /> {previous ? series.map((serie) => { return ( ); }) : null} {series.map((serie) => { return ( ); })} {references.data?.map((ref) => ( ))} {isEditMode && ( )} ); }