import { useCurrentStateAndParams, useRouter } from '@uirouter/react'; /** Only use when you need to use/update a single param at a time. Using this to update multiple params will cause the state to get out of sync. */ export function useParamState( param: string, parseParam: (param: string | undefined) => T | undefined = (param) => param as unknown as T ) { const { params: { [param]: paramValue }, } = useCurrentStateAndParams(); const router = useRouter(); const state = parseParam(paramValue); return [ state, (value?: T) => { router.stateService.go('.', { [param]: value }, { reload: false }); }, ] as const; } /** Use this when you need to use/update multiple params at once. */ export function useParamsState>( params: string[], parseParams: (params: Record) => T ) { const { params: stateParams } = useCurrentStateAndParams(); const router = useRouter(); const state = parseParams( params.reduce( (acc, param) => { acc[param] = stateParams[param]; return acc; }, {} as Record ) ); function setState(newState: Partial) { const newStateParams = Object.entries(newState).reduce( (acc, [key, value]) => { acc[key] = value; return acc; }, {} as Record ); router.stateService.go('.', newStateParams, { reload: false }); } return [state, setState] as const; }