sendou.ink/app/hooks/useTimeoutState.ts
Kalle fd48bced91
Migrate Prettier/Eslint/Stylelint setup to Biome (#1772)
* Initial

* CSS lint

* Test CI

* Add 1v1, 2v2, and 3v3 Tags (#1771)

* Initial

* CSS lint

* Test CI

* Rename step

---------

Co-authored-by: xi <104683822+ximk@users.noreply.github.com>
2024-06-24 13:07:17 +03:00

34 lines
822 B
TypeScript

import * as React from "react";
// TODO: fix causes memory leak
/** @link https://stackoverflow.com/a/64983274 */
export const useTimeoutState = <T>(
defaultState: T,
): [
T,
(action: React.SetStateAction<T>, opts?: { timeout: number }) => void,
] => {
const [state, _setState] = React.useState<T>(defaultState);
const [currentTimeoutId, setCurrentTimeoutId] = React.useState<
NodeJS.Timeout | undefined
>();
const setState = React.useCallback(
(action: React.SetStateAction<T>, opts?: { timeout: number }) => {
if (currentTimeoutId != null) {
clearTimeout(currentTimeoutId);
}
_setState(action);
const id = setTimeout(
() => _setState(defaultState),
opts?.timeout ?? 4000,
);
setCurrentTimeoutId(id);
},
[currentTimeoutId, defaultState],
);
return [state, setState];
};