UNPKG

@ledgerhq/live-common

Version:
58 lines 2.44 kB
import { useEffect, useMemo, useRef } from "react"; import debounce from "lodash/debounce"; /** * This function returns true if the acccounts with funds changed between the accounts and the oldAccounts properties. * Meaning that at least one account with a positive balance has been added, removed, the balance of an existing empty * account is now positive or the balance of an existing account was positive and is now 0. * Else this function returns false. */ export function hasAccountsWithFundsChanged(accounts, oldAccounts) { for (const account of accounts) { const matchingOldAccount = oldAccounts.find(acc => acc.id === account.id); // Means that account has been added if (!matchingOldAccount) { if (account.balance.isGreaterThan(0)) { return true; } else { continue; } } // Means that account has been modified const hasAccountBeenEmptied = account?.balance.isZero() && matchingOldAccount?.balance.isGreaterThan(0); const hasAccountReceivedFunds = account?.balance.isGreaterThan(0) && matchingOldAccount?.balance.isZero(); if (hasAccountBeenEmptied || hasAccountReceivedFunds) { return true; } } for (const oldAccount of oldAccounts) { const matchingAccount = accounts.find(acc => acc.id === oldAccount.id); // Means that oldAccount has been deleted if (!matchingAccount) { if (oldAccount.balance.isGreaterThan(0)) { return true; } else { continue; } } } return false; } /** * Watches for changes in the accounts with funds (see comment on the function above for more details) and it triggers * the callback function when a change occurs. */ function useAccountsWithFundsListener(accounts, callback, callbackForAccounts, debounceTimer = 3000) { const oldAccounts = useRef([]); const debouncedUseEffect = useMemo(() => debounce(() => { if (hasAccountsWithFundsChanged(accounts, oldAccounts.current)) { callback(); } callbackForAccounts(accounts); oldAccounts.current = accounts; }, debounceTimer), [accounts]); useEffect(debouncedUseEffect, [debouncedUseEffect]); } export default useAccountsWithFundsListener; //# sourceMappingURL=useAccountsWithFundsListener.js.map