Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Case sensitive tag #200

Merged
merged 1 commit into from
Jun 26, 2024
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
98 changes: 52 additions & 46 deletions src/shared/lib/hooks/use-search-params-setter.ts
Original file line number Diff line number Diff line change
@@ -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<SerializableParamValue>): 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
};

export default useSearchParamsSetter;