sendou.ink/app/hooks/useSearchParamState.tsx
Kalle ecd5a2a2f7
TO Tools (#1077)
* Add DB tables

* Toggle TO Tools in new calendar event page

* TO tools page initial

* Add counter pick map pool UI

* Save tie breaker map pool

* Save team name

* Layout initial

* Load users own team

* Make team name input required

* Rename team

* Divide to sections

* Submit team map pool

* New style for counter pick map pool section expand

* Fix tiebreaker map pool not saved when new event made

* Split to many forms

* According for team name

* Small UI consistency tweaks

* Add explanation to tie breaker maps

* Remove redundant prop

* Fix new calendar event todos

* Use required hidden input component in new build page

* Fix to tools page showing even when toToolsEnabled = 0

* Delete team

* Map list generation tests initial

* Add tournament map list generation tests

* First version of map list generation

* Add seeded RNG

* Rearrange files

* Generation with strats initial

* Default map pool + allow one team not to have any maps

* Implement map generation via backtracking

* Make order of stages irrelevant

* Add one more TODO

* Seed

* Fixes

* Tournament map list generator initial

* More functional maplist

* Fix any

* Persist in search params initial

* Add date to calendar seed

* Revert "Persist in search params initial"

This reverts commit f01a9e6982.

* Allow admin to start tournament

* Rate maplist instead of optimal / suboptimal

* Add fallback if map list generation errors out

* Hide TO Tools if not admin

* Submit team roster and delete members

* Teams page

* Give roster s p a c e

* Clear user combobox on sent + layout tweaks

* Gracefully handle updating after tournament has started

* Add title

* Persist map list in search params

* Add i18n
2022-11-13 14:41:13 +02:00

44 lines
1.1 KiB
TypeScript

import { useSearchParams } from "@remix-run/react";
import * as React from "react";
/** State backed search params. Used when you want to update search params without triggering navigation (runs loaders, rerenders the whole page extra time) */
export function useSearchParamState<T>({
defaultValue,
name,
revive,
}: {
defaultValue: T;
name: string;
revive: (value: string) => T | null | undefined;
}) {
const [initialSearchParams] = useSearchParams();
const [state, setState] = React.useState<T>(resolveInitialState());
const handleChange = React.useCallback(
(newValue: T) => {
setState(newValue);
const searchParams = new URLSearchParams(window.location.search);
searchParams.set(name, String(newValue));
window.history.replaceState(
{},
"",
`${window.location.pathname}?${String(searchParams)}`
);
},
[name]
);
return [state, handleChange] as const;
function resolveInitialState() {
const value = initialSearchParams.get(name);
if (value === null || value === undefined) {
return defaultValue;
}
return revive(value) ?? defaultValue;
}
}