@ledgerhq/live-common
Version:
Common ground for the Ledger Live apps
46 lines • 2.16 kB
JavaScript
import { formatAmountForInput, processRawInput } from "../../amount/utils/amountInput";
import { BigNumber } from "bignumber.js";
import { useCallback, useMemo, useRef, useState } from "react";
/**
* Shared hook for CoinControl amount input state.
* Accepts accountUnit from the caller so apps can use useMaybeAccountUnit or similar.
* onAmountChange is string-based; desktop views should adapt from ChangeEvent (e.target.value).
*/
export function useCoinControlAmountInput({ transaction, status, onUpdateTransaction, locale, accountUnit, }) {
const initialFormattedValue = useMemo(() => {
const amount = transaction.useAllAmount && status.amount != null
? status.amount
: transaction.amount ?? null;
return amount ? formatAmountForInput(accountUnit, amount, locale) : null;
}, [accountUnit, locale, status.amount, transaction.amount, transaction.useAllAmount]);
const [inputValue, setInputValue] = useState(initialFormattedValue);
const debounceTimeoutRef = useRef(null);
const cancelPendingUpdates = useCallback(() => {
if (debounceTimeoutRef.current) {
clearTimeout(debounceTimeoutRef.current);
debounceTimeoutRef.current = null;
}
}, []);
const debouncedUpdateTransaction = useCallback((patch) => {
cancelPendingUpdates();
debounceTimeoutRef.current = setTimeout(() => {
onUpdateTransaction(patch);
debounceTimeoutRef.current = null;
}, 500);
}, [cancelPendingUpdates, onUpdateTransaction]);
const handleAmountChange = useCallback((rawValue) => {
const processed = processRawInput(rawValue, accountUnit, locale);
setInputValue(processed.display);
debouncedUpdateTransaction({
amount: processed.value.integerValue(BigNumber.ROUND_DOWN),
useAllAmount: false,
});
}, [debouncedUpdateTransaction, accountUnit, locale]);
return {
amountValue: inputValue,
onAmountChange: handleAmountChange,
cancelPendingUpdates,
debounceTimeoutRef,
};
}
//# sourceMappingURL=useCoinControlAmountInput.js.map