@blocklet/payment-react
Version:
Reusable react components for payment kit v2
138 lines (137 loc) • 4.32 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
module.exports = CheckoutForm;
var _jsxRuntime = require("react/jsx-runtime");
var _ahooks = require("ahooks");
var _noop = _interopRequireDefault(require("lodash/noop"));
var _react = require("react");
var _ufo = require("ufo");
var _withTracker = require("@arcblock/ux/lib/withTracker");
var _api = _interopRequireDefault(require("../libs/api"));
var _util = require("../libs/util");
var _payment = _interopRequireDefault(require("../payment"));
var _theme = require("../theme");
var _donationForm = _interopRequireDefault(require("../payment/donation-form"));
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
const promises = {};
const startFromPaymentLink = (id, params) => {
if (!promises[id]) {
promises[id] = _api.default.post(`/api/checkout-sessions/start/${id}?${(0, _util.mergeExtraParams)(params)}`).then(res => res?.data).finally(() => {
setTimeout(() => {
delete promises[id];
}, 3e3);
});
}
return promises[id];
};
const fetchCheckoutSession = async id => {
const {
data
} = await _api.default.get(`/api/checkout-sessions/retrieve/${id}`);
return data;
};
function CheckoutForm({
id,
mode = "inline",
onPaid = _noop.default,
onError = console.error,
onChange,
goBack,
extraParams = {},
action = "",
theme = "default",
formType = "payment",
...restProps
}) {
if (!id.startsWith("plink_") && !id.startsWith("cs_")) {
throw new Error("Either a checkoutSession or a paymentLink id is required.");
}
const type = id.startsWith("plink_") ? "paymentLink" : "checkoutSession";
const [state, setState] = (0, _ahooks.useSetState)({
completed: false,
appError: null
});
const {
error: apiError,
data
} = (0, _ahooks.useRequest)(() => type === "paymentLink" ? startFromPaymentLink(id, extraParams) : fetchCheckoutSession(id));
(0, _react.useEffect)(() => {
if (type === "paymentLink" && mode === "standalone" && data) {
window.history.replaceState(null, "", (0, _ufo.joinURL)((0, _util.getPrefix)(), `/checkout/pay/${data.checkoutSession.id}?${(0, _util.mergeExtraParams)(extraParams)}`));
}
}, [type, mode, data, extraParams]);
const handlePaid = result => {
setState({
completed: true
});
onPaid?.(result);
const paySuccessEvent = {
action: "paySuccess",
// @ts-ignore 后续升级的话就会报错了,移除这个 lint 即可
mode: data?.checkoutSession?.mode,
success: true
};
_withTracker.ReactGA.event(paySuccessEvent.action, paySuccessEvent);
};
const handleError = err => {
console.error(err);
setState({
appError: err
});
onError?.(err);
const payFailedEvent = {
action: "payFailed",
// @ts-ignore后续升级的话就会报错了,移除这个 lint 即可
mode: data?.checkoutSession?.mode,
errorMessage: err.message,
success: false
};
_withTracker.ReactGA.event(payFailedEvent.action, payFailedEvent);
};
const Checkout = formType === "donation" ? /* @__PURE__ */(0, _jsxRuntime.jsx)(_donationForm.default, {
checkoutSession: data?.checkoutSession,
paymentMethods: data?.paymentMethods,
paymentIntent: data?.paymentIntent,
paymentLink: data?.paymentLink,
customer: data?.customer,
completed: state.completed,
error: apiError,
onPaid: handlePaid,
onError: handleError,
onChange,
goBack,
mode,
action,
id,
...restProps
}) : /* @__PURE__ */(0, _jsxRuntime.jsx)(_payment.default, {
checkoutSession: data?.checkoutSession,
paymentMethods: data?.paymentMethods,
paymentIntent: data?.paymentIntent,
paymentLink: data?.paymentLink,
customer: data?.customer,
completed: state.completed,
error: apiError,
onPaid: handlePaid,
onError: handleError,
onChange,
goBack,
mode,
action,
...restProps
});
if (theme === "inherit") {
return Checkout;
}
if (theme && typeof theme === "object") {
return /* @__PURE__ */(0, _jsxRuntime.jsx)(_theme.PaymentThemeProvider, {
theme,
children: Checkout
});
}
return /* @__PURE__ */(0, _jsxRuntime.jsx)(_theme.PaymentThemeProvider, {
children: Checkout
});
}