@future-widget-lab/ui-filters
Version:
A set of primitives for handling filters through search parameters in React applications.
72 lines (63 loc) • 1.95 kB
text/typescript
import { parse } from 'flatted';
import type { Filters } from '../../types/filters.type';
export type DeserializeFiltersOptions = {
/**
* @description
* The serialized representation of the filters.
*/
serializedFilters: string | null;
/**
* @description
* Use this helper to create a valid filters collection out of the search parameter value where filters are stored.
*
* Defaults to flatted's `parse` if not present (See https://www.npmjs.com/package/flatted).
*/
deserializer?: (value: string) => Filters;
/**
* A hook that is fired when before the filters collection is deserialized.
*
* Consumers can use this to perform any kind of side-effects or validation.
*/
onBeforeDeserializer?: () => void;
/**
* A hook that is fired when after the filters collection is deserialized.
*
* Consumers can use this to perform any kind of side-effects.
*/
onAfterDeserializer?: (filters: Filters) => void;
/**
* A hook that is fired when an error occurs during the deserialization of the filters collection.
*
* Consumers can use this to perform any kind of side-effects.
*/
onDeserializerError?: (error: Error) => void;
};
/**
* @description
* Use this helper to perform the filters deserialization.
*
* Return a filters collection given a search params set and a search param name.
*
* Returns an empty collection if no search parameter is found or an error occurs.
*/
export const deserializeFilters = (options: DeserializeFiltersOptions): Filters => {
const {
serializedFilters,
deserializer = parse,
onBeforeDeserializer,
onAfterDeserializer,
onDeserializerError
} = options;
onBeforeDeserializer?.();
try {
if (!serializedFilters) {
return {} as Filters;
}
const parsedFilters = deserializer(serializedFilters);
onAfterDeserializer?.(parsedFilters);
return parsedFilters;
} catch (error) {
onDeserializerError?.(error as Error);
return {} as Filters;
}
};