import React, { ReactElement, useContext } from 'react'; import { FilterValues } from './types'; import { IconName } from '../../Icon'; import { StyledLabeledFilter, StyledLabeledFilterContent, } from './StyledFilters'; import { getDefaultValue, formatValue as defaultFormatValue } from './utils'; import FilterDropdown from './FilterDropdown'; import FiltersContext, { useDirtyCheck, useFilterState, } from './FiltersContext'; import SelectedTag from './SelectedTag'; export type FilterProps = { children: ({ value, onChange, }: { onChange: (v: T[K]) => void; value: T[K]; }) => ReactElement; clearable?: boolean; defaultValue?: T[K]; filterKey: K; formatValue?: (v: T[K]) => string; icon?: IconName; label?: string; noCaret?: boolean; }; function LabeledFilter({ label, content, }: { content: ReactElement; label: string | undefined; }) { return ( {label} {content} ); } const Filter = ({ label, icon, noCaret = false, filterKey, children, defaultValue, formatValue = defaultFormatValue, clearable = true, }: FilterProps) => { const [value, onChange, changeAndSave] = useFilterState(filterKey); const dirty = useDirtyCheck(filterKey); const { isGrouped } = useContext(FiltersContext); const resetValueIfClearable = clearable ? () => changeAndSave(defaultValue ?? (getDefaultValue(value) as T[K])) : undefined; const content = children({ value, onChange }); return ( <> {isGrouped ? ( ) : ( )} {dirty && ( )} ); }; export default Filter;