UNPKG

@daimo/pay

Version:

Seamless crypto payments. Onboard users from any chain, any coin into your app with one click.

108 lines (105 loc) 3.02 kB
import { useContext, useSyncExternalStore, useMemo, useCallback } from 'react'; import { waitForPaymentState } from '../payment/paymentStore.js'; import { PaymentContext } from '../provider/PaymentProvider.js'; function useDaimoPay() { const store = useContext(PaymentContext); if (!store) { throw new Error("useDaimoPay must be used within <PaymentProvider>"); } const paymentFsmState = useSyncExternalStore( store.subscribe, store.getState, store.getState ); const order = useMemo(() => { if (paymentFsmState.type === "idle") return null; return paymentFsmState.order ?? null; }, [paymentFsmState]); const paymentState = paymentFsmState.type; const paymentErrorMessage = paymentFsmState.type === "error" ? paymentFsmState.message : null; const dispatch = useCallback((e) => store.dispatch(e), [store]); const createPreviewOrder = useCallback( async (payParams) => { dispatch({ type: "set_pay_params", payParams }); const previewOrderState = await waitForPaymentState(store, "preview"); return previewOrderState; }, [dispatch, store] ); const setPayId = useCallback( async (payId) => { dispatch({ type: "set_pay_id", payId }); const previewOrderState = await waitForPaymentState( store, "unhydrated", "payment_unpaid", "payment_started", "payment_completed", "payment_bounced" ); return previewOrderState; }, [dispatch, store] ); const hydrateOrder = useCallback( async (refundAddress) => { dispatch({ type: "hydrate_order", refundAddress }); const hydratedOrderState = await waitForPaymentState( store, "payment_unpaid" ); return hydratedOrderState; }, [dispatch, store] ); const paySource = useCallback( () => dispatch({ type: "pay_source" }), [dispatch] ); const payEthSource = useCallback( async (args) => { dispatch({ type: "pay_ethereum_source", ...args }); const paidState = await waitForPaymentState( store, "payment_started", "payment_completed", "payment_bounced" ); return paidState; }, [dispatch, store] ); const paySolanaSource = useCallback( async (args) => { dispatch({ type: "pay_solana_source", ...args }); const paidState = await waitForPaymentState( store, "payment_started", "payment_completed", "payment_bounced" ); return paidState; }, [dispatch, store] ); const reset = useCallback(() => dispatch({ type: "reset" }), [dispatch]); const setChosenUsd = useCallback( (usd) => dispatch({ type: "set_chosen_usd", usd }), [dispatch] ); return { order, paymentState, paymentErrorMessage, createPreviewOrder, hydrateOrder, setPayId, paySource, payEthSource, paySolanaSource, reset, setChosenUsd }; } export { useDaimoPay }; //# sourceMappingURL=useDaimoPay.js.map