@blocklet/payment-react
Version:
Reusable react components for payment kit v2
211 lines (209 loc) • 6.45 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _jsxRuntime = require("react/jsx-runtime");
var _react = require("react");
var _material = require("@mui/material");
var _context = require("@arcblock/ux/lib/Locale/context");
var _Toast = _interopRequireDefault(require("@arcblock/ux/lib/Toast"));
var _ufo = require("ufo");
var _ahooks = require("ahooks");
var _ux = require("@arcblock/ux");
var _payment = require("../contexts/payment");
var _util = require("../libs/util");
var _api = _interopRequireDefault(require("../libs/api"));
var _loadingButton = _interopRequireDefault(require("./loading-button"));
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
const fetchSubscriptionDetail = async params => {
const url = `/api/subscriptions/${params.subscriptionId}`;
const res = await _api.default.get(params.authToken ? (0, _ufo.joinURL)(url, `?authToken=${params.authToken}`) : url);
return res.data;
};
const fetchRecoverInfo = async params => {
const url = `/api/subscriptions/${params.subscriptionId}/recover-info`;
const res = await _api.default.get(params.authToken ? (0, _ufo.joinURL)(url, `?authToken=${params.authToken}`) : url);
return res.data;
};
const recoverSubscription = async params => {
const url = `/api/subscriptions/${params.subscriptionId}/recover`;
const res = await _api.default.put(params.authToken ? (0, _ufo.joinURL)(url, `?authToken=${params.authToken}`) : url);
return res.data;
};
function RecoverSubscription({
subscriptionId,
dialogProps = {
open: true
},
onResumed = () => {},
successToast = true,
authToken = void 0
}) {
const {
t,
locale
} = (0, _context.useLocaleContext)();
const {
connect
} = (0, _payment.usePaymentContext)();
const [recoverLoading, setRecoverLoading] = (0, _react.useState)(false);
const [dialogOpen, setDialogOpen] = (0, _react.useState)(dialogProps.open || false);
const {
data,
error,
loading
} = (0, _ahooks.useRequest)(() => fetchRecoverInfo({
subscriptionId,
authToken
}), {
ready: !!subscriptionId
});
const isCrossOriginRequest = (0, _util.isCrossOrigin)();
const needStake = data?.needStake ?? false;
const handleSuccess = async () => {
try {
const subscription = await fetchSubscriptionDetail({
subscriptionId,
authToken
});
if (successToast) {
_Toast.default.success(t("payment.customer.recover.success"));
}
setDialogOpen(false);
onResumed(subscription);
setRecoverLoading(false);
} catch (err) {
console.error("Failed to fetch updated subscription:", err);
_Toast.default.error((0, _util.formatError)(err));
setRecoverLoading(false);
}
};
const handleRecoverWithStake = () => {
setRecoverLoading(true);
try {
connect.open({
locale,
containerEl: void 0,
saveConnect: false,
action: "re-stake",
prefix: (0, _ufo.joinURL)((0, _util.getPrefix)(), "/api/did"),
useSocket: !isCrossOriginRequest,
extraParams: {
subscriptionId
},
messages: {
scan: t("common.connect.defaultScan"),
title: t("payment.customer.recover.reStakeTitle"),
confirm: t("common.connect.confirm")
},
onSuccess: handleSuccess,
onClose: () => {
connect.close();
setRecoverLoading(false);
},
onError: err => {
_Toast.default.error((0, _util.formatError)(err));
setRecoverLoading(false);
}
});
} catch (err) {
_Toast.default.error((0, _util.formatError)(err));
setRecoverLoading(false);
}
};
const handleDirectRecover = async () => {
setRecoverLoading(true);
try {
const result = await recoverSubscription({
subscriptionId,
authToken
});
if (result.needStake) {
handleRecoverWithStake();
return;
}
const {
subscription
} = result;
if (successToast) {
_Toast.default.success(t("payment.customer.recover.success"));
}
setDialogOpen(false);
onResumed(subscription);
setRecoverLoading(false);
} catch (err) {
_Toast.default.error((0, _util.formatError)(err));
setRecoverLoading(false);
}
};
const handleRecover = () => {
if (needStake) {
handleRecoverWithStake();
} else {
handleDirectRecover();
}
};
const handleClose = () => {
setDialogOpen(false);
dialogProps.onClose?.();
};
if (loading) {
return null;
}
return /* @__PURE__ */(0, _jsxRuntime.jsx)(_ux.Dialog, {
PaperProps: {
style: {
minHeight: "auto"
}
},
...(dialogProps || {}),
open: dialogOpen,
title: dialogProps?.title || t("payment.customer.recover.title"),
sx: {
"& .MuiDialogContent-root": {
pt: 0
}
},
onClose: handleClose,
children: error ? /* @__PURE__ */(0, _jsxRuntime.jsx)(_material.Alert, {
severity: "error",
children: error.message
}) : /* @__PURE__ */(0, _jsxRuntime.jsxs)(_material.Stack, {
sx: {
gap: 2
},
children: [/* @__PURE__ */(0, _jsxRuntime.jsx)(_material.Typography, {
variant: "body2",
sx: {
color: "text.secondary"
},
children: t("payment.customer.recover.description", {
date: (0, _util.formatToDate)(Number(data?.subscription?.current_period_end || "0") * 1e3)
})
}), needStake && /* @__PURE__ */(0, _jsxRuntime.jsx)(_material.Alert, {
severity: "warning",
children: t("payment.customer.recover.stakeRequiredDescription")
}), /* @__PURE__ */(0, _jsxRuntime.jsxs)(_material.Stack, {
direction: "row",
sx: {
justifyContent: "flex-end",
gap: 2,
mt: 2
},
children: [/* @__PURE__ */(0, _jsxRuntime.jsx)(_material.Button, {
variant: "outlined",
color: "primary",
onClick: handleClose,
children: t("common.cancel")
}), /* @__PURE__ */(0, _jsxRuntime.jsx)(_loadingButton.default, {
variant: "contained",
size: "small",
loading: recoverLoading,
onClick: handleRecover,
children: t("common.confirm")
})]
})]
})
});
}
module.exports = RecoverSubscription;