import { IconLabel } from '@/components/common/IconLabel'; import { useLocale, useMessages } from '@/components/hooks'; import { Maximize } from '@/components/icons'; import { getThemeColors } from '@/lib/colors'; import { formatDate } from '@/lib/date'; import { Button, Column, Text, Tooltip, TooltipTrigger, useTheme } from '@umami/react-zen'; import { isSameDay } from 'date-fns'; import { useMemo } from 'react'; import styles from './ChartAnnotationMarkers.module.css'; const MAX_TOOLTIP_ANNOTATIONS = 3; export interface ChartAnnotation { id: string; date: Date; markerDate?: Date; label: string; allDay?: boolean; isClickable?: boolean; isGroupClickable?: boolean; } export interface AnnotationMarker { annotations: ChartAnnotation[]; x: number; y: number; } export function formatAnnotationDate(annotation: ChartAnnotation, locale: string) { return formatDate(annotation.date, annotation.allDay === false ? 'PP p' : 'PP', locale); } export function ChartAnnotationMarkers({ markers, onClick, onMoreClick, }: { markers: AnnotationMarker[]; onClick?: (annotations: ChartAnnotation[]) => void; onMoreClick?: (annotations: ChartAnnotation[]) => void; }) { const { theme } = useTheme(); const { locale } = useLocale(); const { t, labels } = useMessages(); const { colors } = useMemo(() => getThemeColors(theme), [theme]); return ( <> {markers.map(({ annotations, x, y }) => { const [first] = annotations; const hasOneDate = annotations.every(annotation => isSameDay(annotation.date, first.date)); const isClickable = !!onClick && (hasOneDate ? first.isClickable !== false : annotations.every(annotation => annotation.isGroupClickable === true)); const visibleAnnotations = annotations.slice(0, MAX_TOOLTIP_ANNOTATIONS); return ( {visibleAnnotations.map(annotation => ( {formatAnnotationDate(annotation, locale)} {annotation.label} ))} {annotations.length > 1 && (onMoreClick ? ( ) : ( } style={{ opacity: 0.8 }}> {t(labels.view)} ))} ); })} ); }