@ledgerhq/live-common
Version:
Common ground for the Ledger Live apps
82 lines • 3.36 kB
JavaScript
import { useCallback, useMemo, useState } from "react";
import { FLOW_STATUS } from "../../wizard/types";
import { useSendFlowAccount } from "./useSendFlowAccount";
import { getSendUiConfig } from "../uiConfig";
/**
* Core Send flow business logic - platform agnostic
* Manages account, transaction, recipient, operation, and status state
* Apps inject platform-specific operation hooks (e.g. Redux)
*/
export function useSendFlowBusinessLogic({ initParams, useOperationHook, useTransactionHook, }) {
const [flowStatus, setFlowStatus] = useState(FLOW_STATUS.IDLE);
const [recipientSearchValue, setRecipientSearchValue] = useState("");
const [recipient, setRecipient] = useState(() => {
if (!initParams?.recipient)
return null;
return { address: initParams.recipient };
});
const accountHook = useSendFlowAccount({
initialAccount: initParams?.account,
initialParentAccount: initParams?.parentAccount,
});
const transactionHook = useTransactionHook({
account: accountHook.state.account,
parentAccount: accountHook.state.parentAccount,
});
const operationHook = useOperationHook({
account: accountHook.state.account,
parentAccount: accountHook.state.parentAccount,
});
const uiConfig = useMemo(() => getSendUiConfig(accountHook.state.currency), [accountHook.state.currency]);
const setAccountAndNavigate = useCallback((account, parentAccount) => {
accountHook.setAccount(account, parentAccount);
transactionHook.actions.setAccount(account, parentAccount);
}, [accountHook, transactionHook.actions]);
const handleRecipientSet = useCallback((newRecipient) => {
setRecipient(newRecipient);
transactionHook.actions.setRecipient(newRecipient);
}, [transactionHook.actions]);
const recipientSearch = useMemo(() => ({
value: recipientSearchValue,
setValue: setRecipientSearchValue,
clear: () => setRecipientSearchValue(""),
}), [recipientSearchValue]);
const state = useMemo(() => ({
account: accountHook.state,
transaction: transactionHook.state,
recipient,
operation: operationHook.state,
isLoading: transactionHook.state.bridgePending,
flowStatus,
}), [accountHook.state, transactionHook.state, recipient, operationHook.state, flowStatus]);
const statusActions = useMemo(() => ({
setStatus: setFlowStatus,
setError: () => setFlowStatus(FLOW_STATUS.ERROR),
setSuccess: () => setFlowStatus(FLOW_STATUS.SUCCESS),
resetStatus: () => setFlowStatus(FLOW_STATUS.IDLE),
}), []);
const transactionActions = useMemo(() => ({
...transactionHook.actions,
setRecipient: handleRecipientSet,
}), [transactionHook.actions, handleRecipientSet]);
return useMemo(() => ({
state,
transaction: transactionActions,
operation: operationHook.actions,
status: statusActions,
uiConfig,
recipientSearch,
recipient,
setAccountAndNavigate,
}), [
state,
transactionActions,
operationHook.actions,
statusActions,
uiConfig,
recipientSearch,
recipient,
setAccountAndNavigate,
]);
}
//# sourceMappingURL=useSendFlowBusinessLogic.js.map