UNPKG

@future-widget-lab/ui-filters

Version:

A set of primitives for handling filters through search parameters in React applications.

74 lines (59 loc) 1.91 kB
import { stringify } from 'flatted'; import type { Filters, FilterValue } from '../../types/filters.type'; import { removeFilter } from '../remove-filter/remove-filter.helper'; export type RemoveFilterValueOptions = { /** * @description * The filters collection. */ filters: Filters; /** * @description * The name of the filter which should be updated. */ name: string; /** * @description * The value that is being removed from the given filter name. */ value: FilterValue; }; /** * @description * Use this helper to remove an existing filter value from the specified filter name. * * Comparison checks are performed as follows: * - Object values are serialized into strings for accurate comparison. * - Primitives values (strings, numbers, etc.) are compared directly without serialization. */ export const removeFilterValue = (options: RemoveFilterValueOptions) => { const { filters, name, value } = options; const filterValues = filters[name] ?? []; if (filterValues.length === 0) { return filters; } if (typeof value === 'object') { const updatedFilterValues = filterValues.filter((previousFilterValue) => { if (typeof previousFilterValue === 'object') { return stringify(previousFilterValue) !== stringify(value); } return previousFilterValue !== stringify(value); }); if (updatedFilterValues.length === 0) { return removeFilter({ filters, name: options.name }); } filters[options.name] = updatedFilterValues; return filters; } const updatedFilterValues = filterValues.filter((previousFilterValue) => { if (typeof previousFilterValue === 'object') { return stringify(previousFilterValue) !== value; } return previousFilterValue !== value; }); if (updatedFilterValues.length === 0) { return removeFilter({ filters, name: options.name }); } filters[options.name] = updatedFilterValues; return filters; };