2023-06-25 05:38:43 +00:00
|
|
|
import { useCurrentStateAndParams, useRouter } from '@uirouter/react';
|
|
|
|
|
2024-12-09 04:48:34 +00:00
|
|
|
/** 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. */
|
2023-06-25 05:38:43 +00:00
|
|
|
export function useParamState<T>(
|
|
|
|
param: string,
|
2023-11-14 12:54:44 +00:00
|
|
|
parseParam: (param: string | undefined) => T | undefined = (param) =>
|
|
|
|
param as unknown as T
|
2023-06-25 05:38:43 +00:00
|
|
|
) {
|
|
|
|
const {
|
|
|
|
params: { [param]: paramValue },
|
|
|
|
} = useCurrentStateAndParams();
|
|
|
|
const router = useRouter();
|
|
|
|
const state = parseParam(paramValue);
|
|
|
|
|
|
|
|
return [
|
|
|
|
state,
|
2023-11-14 12:54:44 +00:00
|
|
|
(value?: T) => {
|
2024-06-06 18:07:39 +00:00
|
|
|
router.stateService.go('.', { [param]: value }, { reload: false });
|
2023-06-25 05:38:43 +00:00
|
|
|
},
|
|
|
|
] as const;
|
|
|
|
}
|
2024-12-09 04:48:34 +00:00
|
|
|
|
|
|
|
/** Use this when you need to use/update multiple params at once. */
|
|
|
|
export function useParamsState<T extends Record<string, unknown>>(
|
|
|
|
parseParams: (params: Record<string, string | undefined>) => T
|
|
|
|
) {
|
|
|
|
const { params: stateParams } = useCurrentStateAndParams();
|
|
|
|
const router = useRouter();
|
|
|
|
|
2025-01-24 16:02:52 +00:00
|
|
|
const state = parseParams(stateParams);
|
2024-12-09 04:48:34 +00:00
|
|
|
|
|
|
|
function setState(newState: Partial<T>) {
|
2025-01-24 16:02:52 +00:00
|
|
|
router.stateService.go('.', newState, { reload: false });
|
2024-12-09 04:48:34 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return [state, setState] as const;
|
|
|
|
}
|