Files
console-dev/app/components/config/PromoCodeField.vue
T

197 lines
6.5 KiB
Vue

<script>
/** 优惠码输入框:提交后更新 v-model 并请求父级 recalc,不在组件内自行计算折扣。 */
import "~/assets/styles/PromoCodeField.qFEkB6Hm.css";
import { toDisplayString } from "vue";
import { normalizeClass } from "vue";
import { mergeModels } from "vue";
import { useModel } from "vue";
import { watch } from "vue";
import { createBlock } from "vue";
import { ref } from "vue";
import { createCommentVNode } from "vue";
import { isRef } from "vue";
import { createElementBlock } from "vue";
import { createElementVNode } from "vue";
import { unref } from "vue";
import { defineComponent } from "vue";
import { createVNode } from "vue";
import { openBlock } from "vue";
import { withKeys } from "vue";
import button from "primevue/button";
import { t as _plugin_vue_export_helper_t } from "~/lib/_plugin-vue_export-helper.js";
import inputtext from "primevue/inputtext";
var y = [`open`],
b = {
class: `promo-body`,
},
x = Object.assign(
_plugin_vue_export_helper_t(
defineComponent({
__name: `PromoCodeField`,
props: mergeModels(
{
discount: {},
loading: {
type: Boolean,
},
disabled: {
type: Boolean,
},
},
{
modelValue: {
default: ``,
},
modelModifiers: {},
},
),
emits: mergeModels([`recalc`], [`update:modelValue`]),
setup(n, { emit: f }) {
let _ = useModel(n, `modelValue`),
x = n,
S = f,
C = ref(``),
w = ref(!1),
T = ref(`idle`);
function E() {
// 仅提交去空白的非空优惠码,w 用于把下一轮报价结束关联到本次应用动作。
if (x.disabled || x.loading) return;
let e = C.value.trim();
e &&
((w.value = !0), (T.value = `idle`), (_.value = e), S(`recalc`));
}
function D() {
x.disabled ||
x.loading ||
((C.value = ``),
(_.value = ``),
(T.value = `idle`),
(w.value = !1),
S(`recalc`));
}
return (
watch(
// 等父级 loading 从真变假后,根据实际折扣判断成功或无效,不把发事件当验证成功。
() => x.loading,
(e, t) => {
t &&
!e &&
w.value &&
((w.value = !1),
(T.value = (x.discount ?? 0) > 0 ? `ok` : `fail`));
},
),
watch(_, (e) => {
!e && !w.value && ((C.value = ``), (T.value = `idle`));
}),
(r, i) => {
let o = inputtext,
f = button;
return (
openBlock(),
createElementBlock(
`details`,
{
class: `promo`,
open: !!_.value,
},
[
(i[1] ||= createElementVNode(
`summary`,
null,
`我有优惠码,立即使用`,
-1,
)),
createElementVNode(`div`, b, [
createVNode(
o,
{
modelValue: unref(C),
"onUpdate:modelValue": (i[0] ||= (e) =>
isRef(C) ? (C.value = e) : null),
"aria-label": `优惠码`,
placeholder: `选填,输入后点「使用」`,
disabled: n.disabled,
class: `promo-input`,
onKeyup: withKeys(E, [`enter`]),
},
null,
8,
[`modelValue`, `disabled`],
),
createVNode(
f,
{
label: `使用`,
size: `small`,
severity: `secondary`,
outlined: ``,
disabled: n.disabled || !unref(C).trim(),
loading: unref(w),
onClick: E,
},
null,
8,
[`disabled`, `loading`],
),
_.value
? (openBlock(),
createBlock(
f,
{
key: 0,
label: `取消`,
size: `small`,
severity: `secondary`,
text: ``,
disabled: n.disabled,
onClick: D,
},
null,
8,
[`disabled`],
))
: createCommentVNode(``, !0),
]),
unref(T) === `idle`
? createCommentVNode(``, !0)
: (openBlock(),
createElementBlock(
`p`,
{
key: 0,
class: normalizeClass([
`promo-tip`,
{
ok: unref(T) === `ok`,
fail: unref(T) === `fail`,
},
]),
role: `status`,
},
toDisplayString(
unref(T) === `ok`
? `优惠码已生效,已优惠 ¥${(n.discount ?? 0).toFixed(2)}`
: `该优惠码不可用`,
),
3,
)),
],
8,
y,
)
);
}
);
},
}),
[[`__scopeId`, `data-v-a17e621a`]],
),
{
__name: `PromoCodeField`,
},
);
export {};
export default x;
</script>