Source

Utilities/URLSearchParams.js

/**
 * This module exports functions to work with the URL search parameters.
 * The functions require window.location and window.history to be available.
 *  @param filters
 *  @param filtersConfig
 */
export const updateURLSearchParams = (filters = {}, filtersConfig) => {
  const filtersVerified = Object.fromEntries(
    Object.entries(filters)
      .filter(([key]) => filtersConfig[key] !== undefined)
      .map(([key, value]) => {
        const { paramName, transformToParam } = filtersConfig[key];
        return [paramName, transformToParam ? transformToParam(value) : value];
      }),
  );
  const newSearch = new URLSearchParams(filtersVerified).toString();
  const newPathname = window.location.pathname + '?' + newSearch;
  window.history.replaceState(null, '', newPathname);
};

export const readURLSearchParams = (params = '', filtersConfig) => {
  const searchParams = new URLSearchParams(params);
  const filtersVerified = Array.from(searchParams.entries())
    .filter(([key]) =>
      // check whether the parameter is present in the filters configuration
      Object.values(filtersConfig).find(({ paramName }) => paramName === key),
    )
    .map(([key, value]) => {
      // transform back to the filters representation
      const [filterName, { transformFromParam }] = Object.entries(
        filtersConfig,
      ).find(([, config]) => config.paramName === key);

      return [
        filterName,
        transformFromParam ? transformFromParam(value) : value,
      ];
    });

  return Object.fromEntries(filtersVerified);
};