Files
element-web/src/hooks/useAsyncRefreshMemo.ts
Michael Telatynski ef1597ff2d Enable react-compiler eslint to spot antipatterns (#28652)
* Switch to React18 useId

Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>

* Enable react-compiler eslint

Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>

* Fix an easy one

Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>

* Disable in tests

Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>

* Fix usage of useRef as memoization

Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>

* Fix mutation of external values in hooks

Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>

* Make React compiler happy about some frankly non-issues

Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>

* Fix MapMock

Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>

* Iterate

Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>

* Iterate

Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>

* Iterate

Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>

* Revert MemberListViewModel.tsx changes and disable linter per line

Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>

* Make viewmodel compatible with react-compiler linter

- Remove searchQuery ref/state and instead pass this query to the
  loadMember function.
- Now we no longer need a separate search function

---------

Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
Co-authored-by: R Midhun Suresh <hi@midhun.dev>
2025-01-16 12:26:00 +00:00

41 lines
1.5 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 { 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
* @return 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];
}