import React, { useMemo } from 'react' import { useGG, tooltipState, themeState, formatMissing, } from '@graphique/graphique' import { min } from 'd3-array' import { useAtom } from 'jotai' import { type GeomAes } from '../types' export interface LineMarkerProps { x: (d: Datum) => number | undefined y: (d: Datum) => number | undefined markerRadius: number markerStroke: string aes: GeomAes } export const LineMarker = ({ x, y, markerRadius, markerStroke, aes, }: LineMarkerProps) => { const { ggState } = useGG() || {} const { copiedScales, width, height, margin, id, scales } = ggState || {} const [{ datum }] = useAtom(tooltipState) const [{ defaultStroke, geoms }] = useAtom(themeState) || {} const { line } = geoms || {} const left = useMemo( () => min([datum && x(datum[0]), width - (margin?.right ?? 0)] as number[]), [datum, x, width], ) return height && margin ? ( <> {left && datum && ( {datum.map((d, i) => { const formattedGroup = copiedScales?.groupAccessor ? formatMissing(copiedScales?.groupAccessor(d)) : '__group' const inRange = (y(d) as number) <= copiedScales?.yScale.range()[0] && (y(d) as number) >= copiedScales?.yScale.range()[1] const inGroups = scales?.groups ? scales.groups.includes(formattedGroup) : true const thisFill = line?.stroke || (copiedScales?.strokeScale && aes?.stroke ? copiedScales.strokeScale(aes.stroke(d)) : defaultStroke) return ( typeof y(d) !== 'undefined' && inRange && inGroups && ( ) ) })} )} ) : null }