Files
ThreadNet-Web/apps/web/src/hooks/useAsyncRefreshMemo.ts
T
Michael TelatynskiandGitHub 15c85ec50f Switch from eslint to oxlint (#34166)
* Fix type imports

* Fix jsdoc

* Fixup types

* Fix stray awaits on non-thenables

* Fixup imports

* Fix splats

* Fix this-context on callbacks

* Memoise react contexts

* Prefer find/flatMap

* Make oxlint happier about our React keys

* Avoid unsafe default function params

* Fixup jsdoc

* Fixup contexts

* Switch from eslint to oxlint

* Some oxlint-related tweaks

* Iterate

* Partial revert to defer some changes and shrink diff

* Iterate

* Add eslint-plugin-element-call and enable the copyright rule

* Set strictStorePkgContentCheck

* Iterate

* Make sonar happy

* Fix new lints
2026-07-10 09:47:41 +00:00

41 lines
1.6 KiB
TypeScript

/*
Copyright 2024 New Vector Ltd.
Copyright 2023 The Matrix.org Foundation C.I.C.
SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial
Please see LICENSE files in the repository root for full details.
*/
import { type DependencyList, useCallback, useEffect, useState } from "react";
type Fn<T> = () => Promise<T>;
/**
* Works just like useMemo or our own useAsyncMemo, but additionally exposes a method to refresh the cached value
* as if the dependency had changed
* @param fn function to memoize
* @param deps React hooks dependencies for the function
* @param initialValue initial value
* @returns tuple of cached value and refresh callback
*/
export function useAsyncRefreshMemo<T>(fn: Fn<T>, deps: DependencyList, initialValue: T): [T, () => void];
export function useAsyncRefreshMemo<T>(fn: Fn<T>, deps: DependencyList, initialValue?: T): [T | undefined, () => void];
export function useAsyncRefreshMemo<T>(fn: Fn<T>, deps: DependencyList, initialValue?: T): [T | undefined, () => void] {
const [value, setValue] = useState<T | undefined>(initialValue);
const refresh = useCallback(() => {
let discard = false;
fn()
.then((v) => {
if (!discard) {
setValue(v);
}
})
.catch((err) => console.error(err));
return () => {
discard = true;
};
}, deps); // eslint-disable-line react-hooks/exhaustive-deps,react-compiler/react-compiler
useEffect(refresh, [refresh]);
return [value, refresh];
}