import type { Domain } from '@h5web/shared'; import { formatBound } from '@h5web/shared'; import type { ReactNode } from 'react'; import { forwardRef, useImperativeHandle, useRef } from 'react'; import type { DomainErrors } from '../../../vis/models'; import { DomainError } from '../../../vis/models'; import ToggleBtn from '../ToggleBtn'; import type { BoundEditorHandle } from './BoundEditor'; import BoundEditor from './BoundEditor'; import styles from './DomainTooltip.module.css'; import ErrorMessage from './ErrorMessage'; interface Props { id: string; open: boolean; sliderDomain: Domain; dataDomain: Domain; errors: DomainErrors; isAutoMin: boolean; isAutoMax: boolean; onAutoMinToggle: () => void; onAutoMaxToggle: () => void; isEditingMin: boolean; isEditingMax: boolean; onEditMin: (force: boolean) => void; onEditMax: (force: boolean) => void; onChangeMin: (val: number) => void; onChangeMax: (val: number) => void; onSwap: () => void; children?: ReactNode; } interface Handle { cancelEditing: () => void; } const DomainTooltip = forwardRef((props, ref) => { const { id, open, sliderDomain, dataDomain, errors, children } = props; const { isAutoMin, isAutoMax, isEditingMin, isEditingMax } = props; const { onAutoMinToggle, onAutoMaxToggle, onEditMin, onEditMax, onChangeMin, onChangeMax, onSwap, } = props; const { minGreater, minError, maxError } = errors; const minEditorRef = useRef(null); const maxEditorRef = useRef(null); /* Expose `cancelEditing` function to parent component through ref handle so that editing can be cancelled when the user closes the domain tooltip. */ useImperativeHandle(ref, () => ({ cancelEditing: () => { minEditorRef.current?.cancel(); maxEditorRef.current?.cancel(); }, })); return ( ); }); export type { Handle as DomainTooltipHandle }; export default DomainTooltip;