/** * @upsetjs/react * https://github.com/upsetjs/upsetjs * * Copyright (c) 2021 Samuel Gratzl */ import { ISetLike, queryElemOverlap, queryOverlap, UpSetQuery } from '@upsetjs/model'; import React, { PropsWithChildren, useMemo } from 'react'; import type { UpSetAddon, UpSetAddonProps } from '../interfaces'; import CombinationSelectionChart from './CombinationSelectionChart'; import type { UpSetDataInfo } from '../derive/deriveDataDependent'; import type { UpSetSizeInfo } from '../derive/deriveSizeDependent'; import type { UpSetStyleInfo } from '../derive/deriveStyleDependent'; import SetSelectionChart from './SetSelectionChart'; const EMPTY_ARRAY: any[] = []; export type UpSetQueriesProps = PropsWithChildren<{ size: UpSetSizeInfo; style: UpSetStyleInfo; data: UpSetDataInfo; hasHover?: boolean; secondary: boolean; queries: readonly UpSetQuery[]; }>; export const UpSetQueries = /*!#__PURE__*/ React.memo(function UpSetQueries({ size, data, style, hasHover, secondary, queries, }: UpSetQueriesProps) { const someAddon = size.sets.addons.some((s) => s.renderQuery != null) || size.cs.addons.some((s) => s.renderQuery != null); const qs = useMemo( () => queries.map((q) => ({ ...q, overlap: queryOverlap(q, 'intersection', data.toElemKey), elemOverlap: someAddon ? queryElemOverlap(q, 'intersection', data.toElemKey) : null, })), [queries, someAddon, data.toElemKey] ); function wrapAddon>( addon: UpSetAddon, query: UpSetQuery, index: number, overlapper: (set: S) => readonly T[] | null, secondary: boolean ) { return { ...addon, render: (props: UpSetAddonProps) => { const overlap = overlapper(props.set); return addon.renderQuery ? addon.renderQuery({ query, overlap, index, secondary, ...props }) : null; }, }; } return ( {qs.map((q, i) => ( 0} tooltip={hasHover && !(secondary || i > 0) ? undefined : q.name} setAddons={ size.sets.addons.length === 0 ? EMPTY_ARRAY : size.sets.addons.map((a, i) => wrapAddon(a, q, i, q.elemOverlap!, secondary || i > 0)) } /> ))} {qs.map((q, i) => ( 0} tooltip={hasHover && !(secondary || i > 0) ? undefined : q.name} combinationAddons={ size.cs.addons.length === 0 ? EMPTY_ARRAY : size.cs.addons.map((a, i) => wrapAddon(a, q, i, q.elemOverlap!, secondary || i > 0)) } /> ))} ); }); export default UpSetQueries as (props: UpSetQueriesProps) => React.ReactElement;