'use client'; import { createContext, memo, Suspense, useContext, useEffect, useMemo, useState, } from 'react'; import type { IChartSerie } from '@openpanel/trpc/src/routers/chart'; import type { IChartInput } from '@openpanel/validation'; import { ChartLoading } from './ChartLoading'; import { MetricCardLoading } from './MetricCard'; export interface ChartContextType extends IChartInput { editMode?: boolean; hideID?: boolean; onClick?: (item: IChartSerie) => void; limit?: number; } type ChartProviderProps = { children: React.ReactNode; } & ChartContextType; const ChartContext = createContext({ events: [], breakdowns: [], chartType: 'linear', lineType: 'monotone', interval: 'day', name: '', range: '7d', metric: 'sum', previous: false, projectId: '', limit: undefined, }); export function ChartProvider({ children, editMode, previous, hideID, limit, ...props }: ChartProviderProps) { return ( ({ ...props, editMode: editMode ?? false, previous: previous ?? false, hideID: hideID ?? false, limit, }), [editMode, previous, hideID, limit, props] )} > {children} ); } export function withChartProivder( WrappedComponent: React.FC ) { const WithChartProvider = (props: ComponentProps & ChartContextType) => { const [mounted, setMounted] = useState(false); useEffect(() => { setMounted(true); }, []); if (!mounted) { return props.chartType === 'metric' ? ( ) : ( ); } return ( ) : ( ) } > ); }; WithChartProvider.displayName = `WithChartProvider(${ WrappedComponent.displayName ?? WrappedComponent.name ?? 'Component' })`; return memo(WithChartProvider); } export function useChartContext() { return useContext(ChartContext)!; }