|
1 | | -import React, { createContext, Fragment, useCallback, useContext, useEffect, useMemo, useRef, useState } from "react"; |
| 1 | +import React, { createContext, Fragment, SetStateAction, useCallback, useContext, useEffect, useMemo, useRef, useState } from "react"; |
2 | 2 | import { jsonToURLSearchParams, urlSearchParamsToJson } from "../form/form-data-api"; |
3 | 3 | import { RouterNavigator } from "../router/router-navigator"; |
4 | 4 | import type { BroutherFlags, ConfiguredRoute, Location, PathFormat } from "../types"; |
@@ -360,22 +360,23 @@ export const useFormActions = <R extends object>(): ActionState<R> => useBrouthe |
360 | 360 | */ |
361 | 361 | export const useQueryStringState = <T extends {} | string>( |
362 | 362 | _?: T |
363 | | -): [qs: T extends string ? QueryString.Parse<T> : T, set: (newQuery: T | ((prev: T) => T)) => void] => { |
| 363 | +): T extends string ? [qs: QueryString.Parse<T>, set: (q: SetStateAction<QueryString.Parse<T>>) => void] : [qs: T, set: SetStateAction<T>] => { |
| 364 | + type Hold = T extends string ? QueryString.Parse<T> : T; |
364 | 365 | const { href, page, navigation } = useBrouther(); |
365 | 366 | const urlSearchParams = useUrlSearchParams(); |
366 | | - const qs = useMemo( |
| 367 | + const qs: Hold = useMemo( |
367 | 368 | () => (page === null ? ({} as any) : transformData(urlSearchParams, mapUrlToQueryStringRecord(page.originalPath, fromStringToValue))), |
368 | 369 | [href, page, urlSearchParams] |
369 | 370 | ); |
370 | 371 | const callback = useCallback( |
371 | | - (query: T | ((prev: T) => T)) => { |
| 372 | + (query: SetStateAction<Hold>) => { |
372 | 373 | const location = new URL(window.location.href); |
373 | | - const current = urlSearchParamsToJson<T>(new URLSearchParams(window.location.search)); |
374 | | - const result = typeof query === "function" ? query(current) : { ...(current as any), ...(query as any) }; |
| 374 | + const current = urlSearchParamsToJson<Hold>(new URLSearchParams(window.location.search)); |
| 375 | + const result = typeof query === "function" ? (query as Function)(current) : { ...(current as any), ...(query as any) }; |
375 | 376 | location.search = jsonToURLSearchParams(result).toString(); |
376 | 377 | navigation.push(location.href); |
377 | 378 | }, |
378 | 379 | [navigation] |
379 | 380 | ); |
380 | | - return [qs, callback]; |
| 381 | + return [qs as Hold, callback as (q: Hold | ((h: Hold) => Hold)) => void] as any; |
381 | 382 | }; |
0 commit comments