/* Copyright 2024 New Vector Ltd. Copyright 2020 The Matrix.org Foundation C.I.C. SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only Please see LICENSE files in the repository root for full details. */ import { useState, useEffect, DependencyList } from "react"; type Fn = () => Promise; export function useAsyncMemo(fn: Fn, deps: DependencyList, initialValue: T): T; export function useAsyncMemo(fn: Fn, deps: DependencyList, initialValue?: T): T | undefined; export function useAsyncMemo(fn: Fn, deps: DependencyList, initialValue?: T): T | undefined { const [value, setValue] = useState(initialValue); useEffect(() => { let discard = false; fn().then((v) => { if (!discard) { setValue(v); } }); return () => { discard = true; }; }, deps); // eslint-disable-line react-hooks/exhaustive-deps return value; }