Files

645 lines
26 KiB
Vue

<script>
// 续费弹窗以实例和优惠码快照绑定报价,避免使用已过期的周期价格提交。
import "~/assets/styles/InstanceRenewDialog.BHDAL6d3.css";
import { toDisplayString } from "vue";
import { useId } from "vue";
import { onBeforeUnmount } from "vue";
import { mergeModels } from "vue";
import { useModel } from "vue";
import { watch } from "vue";
import { createBlock } from "vue";
import { ref } from "vue";
import { withCtx } from "vue";
import { createCommentVNode } from "vue";
import { computed } from "vue";
import { isRef } from "vue";
import { createElementBlock } from "vue";
import { Fragment } from "vue";
import { createElementVNode } from "vue";
import { createTextVNode } from "vue";
import { unref } from "vue";
import { defineComponent } from "vue";
import { createVNode } from "vue";
import { openBlock } from "vue";
import { withKeys } from "vue";
import { useApi } from "~/lib/auth.js";
import dialog from "primevue/dialog";
import button from "primevue/button";
import { t as _plugin_vue_export_helper_t } from "~/lib/_plugin-vue_export-helper.js";
import message from "primevue/message";
import inputtext from "primevue/inputtext";
import select from "primevue/select";
import OperationNotice from "~/components/OperationNotice.vue";
import OperatePasswordGate from "~/components/OperatePasswordGate.vue";
import password from "~/components/PasswordField.vue";
import skeleton from "primevue/skeleton";
import { n as renewal_quote_n } from "~/lib/renewal-quote.js";
import { r as renewal_quote_r } from "~/lib/renewal-quote.js";
import { t as renewal_quote_t } from "~/lib/renewal-quote.js";
var ue = {
key: 0,
class: `rd`,
},
de = {
key: 1,
class: `rd`,
},
fe = {
class: `rd-row`,
},
pe = [`id`],
me = {
key: 0,
class: `rd-hint`,
},
he = {
class: `rd-row`,
},
ge = [`id`],
_e = [`for`],
ve = [`aria-labelledby`],
ye = {
class: `rd-code`,
},
T = {
key: 3,
class: `rd-promo rd-grow`,
},
E = {
class: `rd-row`,
},
D = [`for`],
O = {
class: `rd-quote`,
},
k = {
key: 0,
class: `rd-quote-row`,
},
A = {
class: `rd-discount`,
},
j = {
class: `rd-quote-row`,
},
M = {
class: `rd-price`,
},
N = Object.assign(
_plugin_vue_export_helper_t(
defineComponent({
__name: `InstanceRenewDialog`,
props: mergeModels(
{
hostId: {},
},
{
modelValue: {
type: Boolean,
default: !1,
},
modelModifiers: {},
},
),
emits: mergeModels([`paid`], [`update:modelValue`]),
setup(r, { emit: _ }) {
let x = useModel(r, `modelValue`),
N = r,
P = _,
F = useApi(),
I = ref(``),
L = useId(),
R = ref(!1),
z = ref(!1),
B = ref([]),
V = ref(``),
H = ref(``),
U = ref([]),
W = ref(``),
G = ref(``),
K = 0,
q = ref(``),
J = computed(
() => B.value.find((e) => e.billing_cycle === V.value) ?? null,
),
Y = () => JSON.stringify([N.hostId, U.value]),
X = computed(
() =>
x.value &&
!R.value &&
!z.value &&
!!V.value &&
!!J.value &&
q.value === Y(),
),
be = computed(() => J.value?.price ?? ``),
Z = computed(() => Number(J.value?.client_level_discount ?? 0));
// 获取并规范化周期报价;弹窗关闭、实例变化或优惠码变化后丢弃旧结果。
async function Q() {
let e = ++K,
t = N.hostId,
n = Y(),
r = () => e === K && x.value && t === N.hostId && n === Y();
((R.value = !0), (H.value = ``), (q.value = ``), (B.value = []));
try {
let e = {};
U.value.length && (e[`customfield[promo_code]`] = U.value);
let i = await renewal_quote_t(
() => F.get(`/host/${t}/renew`, e),
r,
);
return r()
? ((B.value = renewal_quote_r(i.host)),
B.value.some((e) => e.billing_cycle === V.value) ||
(V.value =
B.value.find((e) => e.is_current_cycle === 1)
?.billing_cycle ??
B.value[0]?.billing_cycle ??
``),
(q.value = n),
!0)
: !1;
} catch (e) {
return (r() && (H.value = renewal_quote_n(e)), !1);
} finally {
e === K && (R.value = !1);
}
}
(watch(
x,
(e) => {
if (!e) {
(K++, (R.value = !1), (q.value = ``));
return;
}
((V.value = ``),
(U.value = []),
(W.value = ``),
(G.value = ``),
Q());
},
{
immediate: !0,
},
),
watch(
() => N.hostId,
() => {
x.value &&
((V.value = ``), (U.value = []), (W.value = ``), Q());
},
),
onBeforeUnmount(() => {
(K++, (R.value = !1));
}));
// 优惠码只有报价成功且后台确认可用才生效,否则恢复原优惠码重新报价。
async function $() {
let e = W.value.trim();
if (!e || R.value || z.value) return;
let t = U.value.slice();
if (((U.value = [e]), !(await Q()))) {
let n = H.value;
U.value.length === 1 &&
U.value[0] === e &&
((U.value = t),
await Q(),
n && (H.value = `优惠码报价失败,已恢复原报价:${n}`));
return;
}
if (Number(J.value?.manual_promo_code_success ?? 0) !== 1) {
((U.value = t), await Q(), (H.value = `该优惠码不可用`));
return;
}
W.value = ``;
}
async function xe() {
R.value || z.value || ((U.value = []), await Q());
}
// 仅提交当前有效报价对应的周期和优惠码;接口成功后通知父级刷新支付流程。
async function Se() {
if (X.value) {
((z.value = !0), (H.value = ``), (I.value = ``));
try {
let e = {
billing_cycle: V.value,
};
(U.value.length &&
(e.customfield = {
promo_code: U.value,
}),
G.value && (e.client_operate_password = G.value),
await F.post(`/host/${N.hostId}/renew`, e),
(x.value = !1),
P(`paid`));
} catch (e) {
I.value = e instanceof Error ? e.message : `续费失败`;
} finally {
z.value = !1;
}
}
}
return (t, n) => {
let r = OperationNotice,
i = skeleton,
a = select,
s = button,
u = inputtext,
_ = password,
b = OperatePasswordGate,
C = message,
w = dialog;
return (
openBlock(),
createElementBlock(
Fragment,
null,
[
createVNode(
r,
{
message: unref(I),
severity: `error`,
},
null,
8,
[`message`],
),
createVNode(
w,
{
visible: x.value,
"onUpdate:visible": (n[4] ||= (e) => (x.value = e)),
header: `续费`,
modal: ``,
draggable: !1,
style: {
width: `460px`,
maxWidth: `calc(100vw - 32px)`,
},
},
{
footer: withCtx(() => [
createVNode(s, {
label: `取消`,
severity: `secondary`,
text: ``,
onClick: (n[3] ||= (e) => (x.value = !1)),
}),
createVNode(
s,
{
label: `提交续费`,
loading: unref(z),
disabled: !unref(X),
onClick: Se,
},
null,
8,
[`loading`, `disabled`],
),
]),
default: withCtx(() => [
unref(R)
? (openBlock(),
createElementBlock(`div`, ue, [
createVNode(i, {
height: `120px`,
}),
]))
: unref(B).length
? (openBlock(),
createElementBlock(`div`, de, [
createElementVNode(`div`, fe, [
createElementVNode(
`span`,
{
id: `${unref(L)}-cycle-label`,
class: `rd-label`,
},
`续费周期`,
8,
pe,
),
createVNode(
a,
{
"input-id": `${unref(L)}-cycle`,
"aria-labelledby": `${unref(L)}-cycle-label`,
modelValue: unref(V),
"onUpdate:modelValue": (n[0] ||= (e) =>
isRef(V) ? (V.value = e) : null),
options: unref(B),
optionLabel: `name_show`,
optionValue: `billing_cycle`,
placeholder: `选择续费周期`,
class: `rd-grow`,
disabled: unref(R) || unref(z),
},
null,
8,
[
`input-id`,
`aria-labelledby`,
`modelValue`,
`options`,
`disabled`,
],
),
]),
unref(B).length === 1
? (openBlock(),
createElementBlock(
`p`,
me,
`该产品当前仅支持此续费周期。`,
))
: createCommentVNode(``, !0),
createElementVNode(`div`, he, [
unref(U).length
? (openBlock(),
createElementBlock(
`span`,
{
key: 0,
id: `${unref(L)}-promo-label`,
class: `rd-label`,
},
`优惠码`,
8,
ge,
))
: (openBlock(),
createElementBlock(
`label`,
{
key: 1,
for: `${unref(L)}-promo`,
},
`优惠码`,
8,
_e,
)),
unref(U).length
? (openBlock(),
createElementBlock(
`div`,
{
key: 2,
class: `rd-promo rd-grow`,
role: `group`,
"aria-labelledby": `${unref(L)}-promo-label`,
},
[
createElementVNode(
`span`,
ye,
toDisplayString(unref(U)[0]),
1,
),
createVNode(
s,
{
label: `取消`,
size: `small`,
severity: `secondary`,
text: ``,
disabled: unref(R) || unref(z),
onClick: xe,
},
null,
8,
[`disabled`],
),
],
8,
ve,
))
: (openBlock(),
createElementBlock(`div`, T, [
createVNode(
u,
{
id: `${unref(L)}-promo`,
modelValue: unref(W),
"onUpdate:modelValue": (n[1] ||= (
e,
) =>
isRef(W) ? (W.value = e) : null),
placeholder: `选填`,
class: `rd-grow`,
disabled: unref(R) || unref(z),
onKeyup: withKeys($, [`enter`]),
},
null,
8,
[`id`, `modelValue`, `disabled`],
),
createVNode(
s,
{
label: `使用`,
size: `small`,
severity: `secondary`,
outlined: ``,
disabled:
!unref(W).trim() ||
unref(R) ||
unref(z),
onClick: $,
},
null,
8,
[`disabled`],
),
])),
]),
createVNode(b, null, {
default: withCtx(() => [
createElementVNode(`div`, E, [
createElementVNode(
`label`,
{
for: `${unref(L)}-operate-password`,
},
`操作密码`,
8,
D,
),
createVNode(
_,
{
modelValue: unref(G),
"onUpdate:modelValue": (n[2] ||= (
e,
) =>
isRef(G) ? (G.value = e) : null),
"input-id": `${unref(L)}-operate-password`,
feedback: !1,
"toggle-mask": ``,
class: `rd-grow`,
placeholder: `账户已设置时填写`,
disabled: unref(z),
},
null,
8,
[`modelValue`, `input-id`, `disabled`],
),
]),
]),
_: 1,
}),
createElementVNode(`div`, O, [
unref(Z) > 0
? (openBlock(),
createElementBlock(`div`, k, [
(n[5] ||= createElementVNode(
`span`,
null,
`会员折扣`,
-1,
)),
createElementVNode(
`span`,
A,
`-¥` +
toDisplayString(
unref(Z).toFixed(2),
),
1,
),
]))
: createCommentVNode(``, !0),
createElementVNode(`div`, j, [
(n[6] ||= createElementVNode(
`span`,
null,
`应付金额`,
-1,
)),
createElementVNode(
`span`,
M,
`¥` + toDisplayString(unref(be)),
1,
),
]),
]),
unref(H)
? (openBlock(),
createBlock(
C,
{
key: 1,
severity: `error`,
closable: !1,
},
{
default: withCtx(() => [
createTextVNode(
toDisplayString(unref(H)),
1,
),
createVNode(
s,
{
label: `重新获取价格`,
size: `small`,
severity: `secondary`,
text: ``,
disabled: unref(z),
onClick: Q,
},
null,
8,
[`disabled`],
),
]),
_: 1,
},
))
: createCommentVNode(``, !0),
(n[7] ||= createElementVNode(
`p`,
{
class: `rd-hint`,
},
`续费订单创建后需前往订单页完成支付。`,
-1,
)),
]))
: unref(H)
? (openBlock(),
createBlock(
C,
{
key: 3,
severity: `error`,
closable: !1,
},
{
default: withCtx(() => [
createTextVNode(
toDisplayString(unref(H)),
1,
),
createVNode(
s,
{
label: `重新获取价格`,
size: `small`,
severity: `secondary`,
text: ``,
disabled: unref(z),
onClick: Q,
},
null,
8,
[`disabled`],
),
]),
_: 1,
},
))
: (openBlock(),
createBlock(
C,
{
key: 2,
severity: `info`,
closable: !1,
},
{
default: withCtx(() => [
...(n[8] ||= [
createTextVNode(
`当前产品暂不可续费。`,
-1,
),
]),
]),
_: 1,
},
)),
]),
_: 1,
},
8,
[`visible`],
),
],
64,
)
);
};
},
}),
[[`__scopeId`, `data-v-01429388`]],
),
{
__name: `InstanceRenewDialog`,
},
);
export {};
export default N;
</script>