@blocklet/payment-react
Version:
Reusable react components for payment kit v2
151 lines (150 loc) • 5.09 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
module.exports = CheckoutV2;
var _jsxRuntime = require("react/jsx-runtime");
var _react = require("react");
var _ahooks = require("ahooks");
var _ufo = require("ufo");
var _material = require("@mui/material");
var _paymentReactHeadless = require("@blocklet/payment-react-headless");
var _api = _interopRequireDefault(require("../libs/api"));
var _util = require("../libs/util");
var _theme = require("../theme");
var _mobile = require("../hooks/mobile");
var _checkoutLayout = _interopRequireDefault(require("./layouts/checkout-layout"));
var _scenarioRouter = _interopRequireDefault(require("./panels/left/scenario-router"));
var _paymentPanel = _interopRequireDefault(require("./panels/right/payment-panel"));
var _checkoutDialogs = _interopRequireDefault(require("./components/dialogs/checkout-dialogs"));
var _loadingView = _interopRequireDefault(require("./views/loading-view"));
var _errorView = _interopRequireDefault(require("./views/error-view"));
var _successView = _interopRequireDefault(require("./views/success-view"));
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
const plinkPromises = {};
function startFromPaymentLink(id, params) {
if (!plinkPromises[id]) {
plinkPromises[id] = _api.default.post(`/api/checkout-sessions/start/${id}?${(0, _util.mergeExtraParams)(params)}`).then(res => res?.data).finally(() => {
setTimeout(() => {
delete plinkPromises[id];
}, 3e3);
});
}
return plinkPromises[id];
}
function CheckoutRouter({
onPaid = void 0,
onError = void 0,
mode = "inline"
}) {
const {
isLoading,
error,
errorCode,
session
} = (0, _paymentReactHeadless.useSessionContext)();
const submit = (0, _paymentReactHeadless.useSubmitFeature)();
const {
isMobile
} = (0, _mobile.useMobile)();
(0, _react.useEffect)(() => {
if (error && onError) {
onError(new Error(error));
}
}, [error, onError]);
(0, _react.useEffect)(() => {
if (submit.status === "completed" && submit.result && onPaid) {
onPaid(submit.result);
}
}, [submit.status, submit.result, onPaid]);
if (isLoading) {
return /* @__PURE__ */(0, _jsxRuntime.jsx)(_loadingView.default, {
mode
});
}
if (error) {
return /* @__PURE__ */(0, _jsxRuntime.jsx)(_errorView.default, {
error,
errorCode,
mode
});
}
const isCompleted = submit.status === "completed";
const mobileCompleted = isCompleted && isMobile;
return /* @__PURE__ */(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
children: [/* @__PURE__ */(0, _jsxRuntime.jsx)(_checkoutLayout.default, {
left: mobileCompleted ? null : /* @__PURE__ */(0, _jsxRuntime.jsx)(_material.Box, {
sx: {
flex: 1,
display: "flex",
flexDirection: "column",
...(isCompleted ? {
opacity: 0.45,
pointerEvents: "none",
filter: "grayscale(0.3)",
transition: "all 0.5s ease"
} : {})
},
children: /* @__PURE__ */(0, _jsxRuntime.jsx)(_scenarioRouter.default, {})
}),
right: isCompleted ? /* @__PURE__ */(0, _jsxRuntime.jsx)(_successView.default, {
submit,
session
}) : /* @__PURE__ */(0, _jsxRuntime.jsx)(_paymentPanel.default, {}),
mode
}), !isCompleted && /* @__PURE__ */(0, _jsxRuntime.jsx)(_checkoutDialogs.default, {})]
});
}
function CheckoutV2({
id,
onPaid,
onError,
theme = "default",
mode = "inline",
extraParams = {}
}) {
if (!id.startsWith("plink_") && !id.startsWith("cs_")) {
throw new Error("Either a checkoutSession or a paymentLink id is required.");
}
const isPaymentLink = id.startsWith("plink_");
const [resolvedSessionId, setResolvedSessionId] = (0, _react.useState)(isPaymentLink ? null : id);
(0, _ahooks.useRequest)(async () => {
if (!isPaymentLink) return null;
const data = await startFromPaymentLink(id, extraParams);
const csId = data?.checkoutSession?.id;
if (csId) {
setResolvedSessionId(csId);
if (mode === "standalone") {
window.history.replaceState(null, "", (0, _ufo.joinURL)((0, _util.getPrefix)(), `/checkout/pay/${csId}?${(0, _util.mergeExtraParams)(extraParams)}`));
}
}
return data;
}, {
ready: isPaymentLink
});
if (!resolvedSessionId) {
return /* @__PURE__ */(0, _jsxRuntime.jsx)(_loadingView.default, {
mode
});
}
const content = /* @__PURE__ */(0, _jsxRuntime.jsx)(_paymentReactHeadless.CheckoutProvider, {
sessionId: resolvedSessionId,
children: /* @__PURE__ */(0, _jsxRuntime.jsx)(CheckoutRouter, {
onPaid,
onError,
mode
})
});
if (theme === "inherit") {
return content;
}
if (theme && typeof theme === "object") {
return /* @__PURE__ */(0, _jsxRuntime.jsx)(_theme.PaymentThemeProvider, {
theme,
children: content
});
}
return /* @__PURE__ */(0, _jsxRuntime.jsx)(_theme.PaymentThemeProvider, {
children: content
});
}