import React, { useCallback } from 'react'; import isEqual from 'lodash/isEqual'; import { QueryParamProvider, useQueryParams } from 'use-query-params'; import { ReactRouter5Adapter } from 'use-query-params/adapters/react-router-5'; import { COMPONENT_STATE_META } from '@bundle-stats/utils'; interface QueryStateProviderProps { children: React.ReactNode; } export const QueryStateProvider = (props: QueryStateProviderProps) => ( ); export const useComponentQueryState = (componentName: string) => { const [queryState, setQueryState] = useQueryParams({ [componentName]: COMPONENT_STATE_META[componentName], }); const componentState = queryState[componentName]; const setState = useCallback( (updates: Record) => { const newState = { ...componentState, ...updates }; // Deep check to prevent unnecessary state changes if (isEqual(componentState, newState)) { return; } setQueryState({ [componentName]: newState }); }, [componentState, setQueryState], ); return [componentState, setState]; };