-const groupBy = <T>(
- array: T[],
- predicate: (value: T, index: number, array: T[]) => string
-) =>
- array.reduce((acc, value, index, array) => {
- (acc[predicate(value, index, array)] ||= []).push(value);
- return acc;
- }, {} as { [key: string]: T[] });
-
-export type QueryParams<T extends Record<string, any>> = {
- [key in keyof T]?: string;
-};
-
-export function getQueryParams<T extends Record<string, any>>(processors: {
- [K in keyof T]: (param: string) => T[K];
-}): T {
- if (isBrowser()) {
- const searchParams = new URLSearchParams(window.location.search);
-
- return Array.from(Object.entries(processors)).reduce(
- (acc, [key, process]) => ({
- ...acc,
- [key]: process(searchParams.get(key)),
- }),
- {} as T
- );
- }
-
- return {} as T;
-}
-
-export function getQueryString<T extends Record<string, string | undefined>>(
- obj: T
-) {
- return Object.entries(obj)
- .filter(([, val]) => val !== undefined && val !== null)
- .reduce(
- (acc, [key, val], index) => `${acc}${index > 0 ? "&" : ""}${key}=${val}`,
- "?"
- );
-}
-