import { HeatmapVis, useDomain, useSafeDomain, useVisDomain } from '@h5web/lib'; import type { ArrayShape, AxisMapping, Dataset, NumArray, NumericType, } from '@h5web/shared'; import type { TypedArray } from 'ndarray'; import { createPortal } from 'react-dom'; import type { DimensionMapping } from '../../../dimension-mapper/models'; import { useDataContext } from '../../../providers/DataProvider'; import { useMappedArray, useSlicedDimsAndMapping } from '../hooks'; import { DEFAULT_DOMAIN, getSliceSelection } from '../utils'; import HeatmapToolbar from './HeatmapToolbar'; import type { HeatmapConfig } from './config'; interface Props { dataset: Dataset; value: number[] | TypedArray; axisLabels?: AxisMapping; axisValues?: AxisMapping; dimMapping: DimensionMapping; title: string; toolbarContainer: HTMLDivElement | undefined; config: HeatmapConfig; } function MappedHeatmapVis(props: Props) { const { dataset, value, dimMapping, axisLabels, axisValues, title, toolbarContainer, config, } = props; const { customDomain, colorMap, scaleType, layout, showGrid, invertColorMap, flipYAxis, } = config; const { shape: dims } = dataset; const [slicedDims, slicedMapping] = useSlicedDimsAndMapping(dims, dimMapping); const [dataArray] = useMappedArray(value, slicedDims, slicedMapping); const dataDomain = useDomain(dataArray, scaleType) || DEFAULT_DOMAIN; const visDomain = useVisDomain(customDomain, dataDomain); const [safeDomain] = useSafeDomain(visDomain, dataDomain, scaleType); const xDimIndex = dimMapping.indexOf('x'); const yDimIndex = dimMapping.indexOf('y'); const { getExportURL } = useDataContext(); const selection = getSliceSelection(dimMapping); return ( <> {toolbarContainer && createPortal( getExportURL(dataset, selection, value, format)) } />, toolbarContainer )} ); } export default MappedHeatmapVis;