diff --git a/core/navigation/hooks/useParam/createParamHooks.ts b/core/navigation/hooks/useParam/createParamHooks.ts index 2d8aef72a82d8dc077f5aafab33b4be34284d554..13bc747a3e230ee9135a57a856c0b8eca7517b33 100644 --- a/core/navigation/hooks/useParam/createParamHooks.ts +++ b/core/navigation/hooks/useParam/createParamHooks.ts @@ -74,39 +74,16 @@ const createParamHooks = <Props extends Record<string, unknown> = Record<string, return [nativeState, setNativeState] } - const useUUIDParam = < - Name extends keyof Props, - NullableUnparsedParsedType extends Props[Name] | undefined = Props[Name] | undefined, - ParseFunction extends undefined | ((value?: string | string[]) => NonNullable<NullableUnparsedParsedType>) = ( - value?: string | string[] - ) => NonNullable<NullableUnparsedParsedType>, - InitialValue = NullableUnparsedParsedType | undefined, - ParsedType = InitialValue extends undefined - ? NullableUnparsedParsedType - : ParseFunction extends undefined - ? NullableUnparsedParsedType - : NonNullable<NullableUnparsedParsedType>, - >( - ...[name, maybeConfig]: Params<Props, Name, NullableUnparsedParsedType, ParseFunction, InitialValue, ParsedType> - ): Returns<Props, Name, NullableUnparsedParsedType, ParseFunction, InitialValue, ParsedType> => { - const { parse = (value?: string | string[]) => value, initial } = maybeConfig || { parse: coerceToUUIDString } - const nativeRoute = useRoute() - - const stableParse = useStableCallback(parse) - - const [nativeState, setNativeState] = useState<ParsedType | InitialValue>(() => { - const state = (nativeRoute?.params as any)?.[name] - return (stableParse(state) as ParsedType) ?? (initial as InitialValue) + const useUUIDParam = ( + name: Parameters<typeof useParam>[0], + maybeConfig?: Omit<Parameters<typeof useParam>[1], 'parse'> + ) => + useParam(name, { + ...maybeConfig, + initial: maybeConfig?.initial, + parse: coerceToUUIDString, }) - useEffect(() => { - const state = (nativeRoute?.params as any)?.[name] - setNativeState((stableParse(state) as ParsedType) || (initial as InitialValue)) - }, [setNativeState, stableParse, nativeRoute?.params, name, initial]) - - return [nativeState, setNativeState] - } - const useUpdateParams = ( // eslint-disable-next-line @typescript-eslint/no-unused-vars options?: UpdateOptions diff --git a/core/navigation/hooks/useParam/createParamHooks.web.ts b/core/navigation/hooks/useParam/createParamHooks.web.ts index a1cd81986069e7442436629575be90e597143046..48b1657ad844a65a61d2e0489f10dce05081d98d 100644 --- a/core/navigation/hooks/useParam/createParamHooks.web.ts +++ b/core/navigation/hooks/useParam/createParamHooks.web.ts @@ -118,86 +118,15 @@ const createParamHooks = <Props extends Record<string, unknown> = Record<string, return [state, setState] } - const useUUIDParam = < - Name extends keyof Props, - NullableUnparsedParsedType extends Props[Name] | undefined = Props[Name] | undefined, - ParseFunction extends undefined | ((value?: string | string[]) => NonNullable<NullableUnparsedParsedType>) = ( - value?: string | string[] - ) => NonNullable<NullableUnparsedParsedType>, - InitialValue = NullableUnparsedParsedType | undefined, - ParsedType = InitialValue extends undefined - ? NullableUnparsedParsedType - : ParseFunction extends undefined - ? NullableUnparsedParsedType - : NonNullable<NullableUnparsedParsedType>, - >( - ...[name, maybeConfig]: Params<Props, Name, NullableUnparsedParsedType, ParseFunction, InitialValue, ParsedType> - ): Returns<Props, Name, NullableUnparsedParsedType, ParseFunction, InitialValue, ParsedType> => { - const { - parse = (value?: string | string[]) => value, - initial, - stringify = (value: ParsedType) => `${value}`, - paramsToClearOnSetState, - options, - } = maybeConfig || { parse: coerceToUUIDString } - const nextRouter = useRouter() - - const stableParse = useStableCallback(parse) - const stableStringify = useStableCallback(stringify) - const stableParamsToClear = useStable(paramsToClearOnSetState) - - const initialValue = useRef(initial) - const hasSetState = useRef(false) - - const setState = useCallback( - (value: ParsedType) => { - hasSetState.current = true - const { pathname, query } = Router - const newQuery = { ...query } - if (value != null && (value as any) !== '') { - newQuery[name as string] = stableStringify(value) - } else { - delete newQuery[name as string] - } - - if (stableParamsToClear.current) { - for (const paramKey of stableParamsToClear.current) { - delete newQuery[paramKey as string] - } - } - - const willChangeExistingParam = query[name as string] && newQuery[name as string] - - const action = options?.web?.replace || willChangeExistingParam ? Router.replace : Router.push - - action( - { - pathname, - query: newQuery, - }, - undefined, - { - shallow: true, - } - ) - }, - [stableParamsToClear, name, options?.web?.replace, stableStringify] - ) - - const webParam = nextRouter?.query?.[name as string] - - const state = useMemo<ParsedType>(() => { - let state: ParsedType - if (webParam === undefined && !hasSetState.current) { - state = initialValue.current as any - } else { - state = stableParse(webParam) as ParsedType - } - return state - }, [stableParse, webParam]) - - return [state, setState] - } + const useUUIDParam = ( + name: Parameters<typeof useParam>[0], + maybeConfig?: Omit<Parameters<typeof useParam>[1], 'parse'> + ) => + useParam(name, { + ...maybeConfig, + initial: maybeConfig?.initial, + parse: coerceToUUIDString, + }) const useUpdateParams = ( options?: UpdateOptions diff --git a/core/screens/spaces/tasks/TaskDetails.tsx b/core/screens/spaces/tasks/TaskDetails.tsx index a8b2e96c54993cdf2099e5968a81c07e36006fa1..0a6fbbb789f640146032446e931580082b58fa68 100644 --- a/core/screens/spaces/tasks/TaskDetails.tsx +++ b/core/screens/spaces/tasks/TaskDetails.tsx @@ -22,7 +22,6 @@ import HoliContainer from '@holi/ui/components/atoms/HoliContainer' import HoliText from '@holi/ui/components/atoms/HoliText' import { type HoliTheme, useTheme } from '@holi/ui/styles/theme' import { ScrollViewRefreshable } from '@holi/core/helpers/withRefreshControl' -import { coerceToUUIDString } from '@holi/core/helpers' export type TaskDetailsParams = { spaceIdOrName: string @@ -33,7 +32,7 @@ const { useParam, useUUIDParam } = createParamHooks<TaskDetailsParams>() const TaskDetails = () => { const [spaceIdOrName] = useParam('spaceIdOrName') // spaceIdOrName can either be space.id or space.name (slug) - const [taskId] = useUUIDParam('taskId', { parse: coerceToUUIDString, initial: undefined }) + const [taskId] = useUUIDParam('taskId') const setScreenOptions = useSetScreenOptions() const { replaceRoute } = useRouting() const { displayError } = useErrorHandling()