diff --git a/src/shared/lib/hooks/use-search-params-setter.ts b/src/shared/lib/hooks/use-search-params-setter.ts index c5cbd7b..2852f9e 100644 --- a/src/shared/lib/hooks/use-search-params-setter.ts +++ b/src/shared/lib/hooks/use-search-params-setter.ts @@ -1,96 +1,102 @@ -import { usePathname, useRouter, useSearchParams } from "next/navigation" -import { useCallback } from "react" - +import { usePathname, useRouter, useSearchParams } from "next/navigation"; +import { useCallback } from "react"; const useSearchParamsSetter = () => { - const searchParams = useSearchParams() - const pathname = usePathname() - const router = useRouter() + const searchParams = useSearchParams(); + const pathname = usePathname(); + const router = useRouter(); + const pushSearchParams = useCallback( (params: URLSearchParams | ((current: URLSearchParams) => URLSearchParams | null), ) => { - let next: URLSearchParams | null - const current = new URLSearchParams(searchParams || undefined) + let next: URLSearchParams | null; + const current = new URLSearchParams(searchParams || undefined); if (typeof params === 'function') { - next = params(current) + next = params(current); } else { - next = params + next = params; } if (!next) { - return + return; } - const nextUrl = pathname + "?" + next.toString() - router.push(nextUrl, { scroll: false }) - return { nextUrl, next } - }, [searchParams, pathname]) + const nextUrl = pathname + "?" + next.toString(); + router.push(nextUrl, { scroll: false }); + return { nextUrl, next }; + }, [searchParams, pathname]); const pushSearchParamsKeyValue = useCallback((key: string, value: ParamValue, { deleteKeys }: CallbackOptions = {}) => { return pushSearchParams((current) => { switch (typeof deleteKeys) { case 'string': if (deleteKeys === 'all') { - current = new URLSearchParams() + current = new URLSearchParams(); } + break; case 'object': if (Array.isArray(deleteKeys)) { - for (const key of deleteKeys) { - current.delete(key) + for (const deleteKey of deleteKeys) { + current.delete(deleteKey); } } + break; } - return setParam(current, key, value) - }) - }, [searchParams, pathname]) + return setParam(current, key, value); + }); + }, [pushSearchParams]); - - return { pushSearchParams, pushSearchParamsKeyValue, searchParams: searchParams } -} + return { pushSearchParams, pushSearchParamsKeyValue, searchParams: searchParams }; +}; const setParam = (params: URLSearchParams, key: string, value: ParamValue, append = false) => { - if (value === null || value === '') { - params.delete(key) - return params + params.delete(key); + return params; + } + // Normalize the tags parameter to lowercase + if (key === 'tags' && typeof value === 'string') { + value = value.toLowerCase(); } switch (typeof value) { case 'object': if (Array.isArray(value)) { - params.delete(key) + params.delete(key); for (const vv of value) { - params = setParam(params, key, vv, true) + params = setParam(params, key, vv, true); } - return params + return params; } + break; } if (append) { - params.append(key, _serializeParam(value)) + params.append(key, _serializeParam(value)); } else { - params.set(key, _serializeParam(value)) + params.set(key, _serializeParam(value)); } - return params -} - + return params; +}; -type ParamValue = SerializableParamValue | SerializableParamValue[] | null -type SerializableParamValue = string | number | boolean +type ParamValue = SerializableParamValue | SerializableParamValue[] | null; +type SerializableParamValue = string | number | boolean; const _serializeParam = (value: SerializableParamValue): string => { switch (typeof value) { case 'string': - return value + return value; case 'number': - return value.toString() + return value.toString(); case 'boolean': - return value ? 'y' : 'n' + return value ? 'y' : 'n'; } -} +}; + const serializeParam = (value: SerializableParamValue | Array): string | string[] => { if (Array.isArray(value)) { - return value.map(s => _serializeParam(s)) + return value.map(s => _serializeParam(s)); } - return _serializeParam(value) -} + return _serializeParam(value); +}; type CallbackOptions = { deleteKeys?: 'all' | string[] -} -export default useSearchParamsSetter \ No newline at end of file +}; + +export default useSearchParamsSetter; \ No newline at end of file