383 lines
14 KiB
Vue
383 lines
14 KiB
Vue
<script>
|
|
/** 账号短信/邮件提醒偏好:available 表示渠道可用,enabled 表示用户选择,两者不能混为一项。 */
|
|
import "~/assets/styles/NotificationPreferences.DcH8Noxd.css";
|
|
import { toDisplayString } from "vue";
|
|
import { onMounted } from "vue";
|
|
import { useId } from "vue";
|
|
import { onBeforeUnmount } from "vue";
|
|
import { createBlock } from "vue";
|
|
import { ref } from "vue";
|
|
import { withCtx } from "vue";
|
|
import { createCommentVNode } from "vue";
|
|
import { reactive } from "vue";
|
|
import { createElementBlock } 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 { useApi } from "~/lib/auth.js";
|
|
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 toggleswitch from "primevue/toggleswitch";
|
|
var x = [`aria-labelledby`],
|
|
S = {
|
|
class: `preferences-heading`,
|
|
},
|
|
C = [`id`],
|
|
w = [`id`],
|
|
T = [`aria-busy`],
|
|
E = {
|
|
class: `preference-row`,
|
|
},
|
|
D = {
|
|
class: `preference-copy`,
|
|
},
|
|
O = [`for`],
|
|
k = [`id`],
|
|
A = {
|
|
class: `preference-row`,
|
|
},
|
|
j = {
|
|
class: `preference-copy`,
|
|
},
|
|
M = [`for`],
|
|
N = [`id`],
|
|
P = {
|
|
key: 2,
|
|
class: `preferences-status`,
|
|
role: `status`,
|
|
},
|
|
F = Object.assign(
|
|
_plugin_vue_export_helper_t(
|
|
defineComponent({
|
|
__name: `NotificationPreferences`,
|
|
setup(p) {
|
|
let v = useApi(),
|
|
F = useId(),
|
|
I = reactive({
|
|
email_enabled: !1,
|
|
sms_enabled: !1,
|
|
email_available: !1,
|
|
sms_available: !1,
|
|
}),
|
|
L = ref(!1),
|
|
R = ref(!1),
|
|
z = ref(!1),
|
|
B = ref(``),
|
|
V = ref(``),
|
|
H = ref(``),
|
|
U = 0,
|
|
W = !1;
|
|
function G(e) {
|
|
// 四个字段必须是真正布尔值,避免字符串 "false" 被界面当作已开启。
|
|
let t = [
|
|
`email_enabled`,
|
|
`sms_enabled`,
|
|
`email_available`,
|
|
`sms_available`,
|
|
];
|
|
if (!e || t.some((t) => typeof e[t] != `boolean`))
|
|
throw Error(`提醒设置响应异常,请重试`);
|
|
for (let n of t) I[n] = e[n];
|
|
}
|
|
async function K() {
|
|
if (W || R.value || z.value) return;
|
|
let e = ++U;
|
|
((R.value = !0), (B.value = ``));
|
|
try {
|
|
let t = await v.get(`/account/notification-preferences`);
|
|
if (W || e !== U) return;
|
|
(G(t), (L.value = !0));
|
|
} catch (t) {
|
|
if (W || e !== U) return;
|
|
((B.value =
|
|
t instanceof Error ? t.message : `提醒设置加载失败,请重试`),
|
|
(L.value = !1));
|
|
} finally {
|
|
!W && e === U && (R.value = !1);
|
|
}
|
|
}
|
|
async function q(e, t) {
|
|
// 开启前确认渠道可用;乐观切换失败时回滚原值,成功时采用后端完整状态。
|
|
let n = e === `email_enabled` ? I.email_available : I.sms_available;
|
|
if (
|
|
W ||
|
|
!L.value ||
|
|
R.value ||
|
|
z.value ||
|
|
typeof t != `boolean` ||
|
|
I[e] === t ||
|
|
(t && !n)
|
|
)
|
|
return;
|
|
let r = ++U,
|
|
i = I[e];
|
|
((I[e] = t), (z.value = !0), (V.value = ``), (H.value = ``));
|
|
try {
|
|
let n = await v.put(`/account/notification-preferences`, {
|
|
[e]: t,
|
|
});
|
|
if (W || r !== U) return;
|
|
(G(n), (H.value = `提醒设置已保存`));
|
|
} catch (t) {
|
|
if (W || r !== U) return;
|
|
((I[e] = i),
|
|
(V.value =
|
|
t instanceof Error ? t.message : `保存失败,请重试`));
|
|
} finally {
|
|
!W && r === U && (z.value = !1);
|
|
}
|
|
}
|
|
return (
|
|
onMounted(K),
|
|
onBeforeUnmount(() => {
|
|
((W = !0), U++);
|
|
}),
|
|
(t, n) => {
|
|
let r = button,
|
|
a = message,
|
|
c = toggleswitch;
|
|
return (
|
|
openBlock(),
|
|
createElementBlock(
|
|
`section`,
|
|
{
|
|
class: `notification-preferences`,
|
|
"aria-labelledby": `${unref(F)}-title`,
|
|
},
|
|
[
|
|
createElementVNode(`div`, S, [
|
|
createElementVNode(`div`, null, [
|
|
createElementVNode(
|
|
`h3`,
|
|
{
|
|
id: `${unref(F)}-title`,
|
|
},
|
|
`提醒设置`,
|
|
8,
|
|
C,
|
|
),
|
|
createElementVNode(
|
|
`p`,
|
|
{
|
|
id: `${unref(F)}-description`,
|
|
},
|
|
`关闭后不接收普通提醒,站内消息和验证码不受影响。`,
|
|
8,
|
|
w,
|
|
),
|
|
]),
|
|
unref(B)
|
|
? (openBlock(),
|
|
createBlock(
|
|
r,
|
|
{
|
|
key: 0,
|
|
label: `重新加载`,
|
|
icon: `pi pi-refresh`,
|
|
size: `small`,
|
|
severity: `secondary`,
|
|
outlined: ``,
|
|
loading: unref(R),
|
|
onClick: K,
|
|
},
|
|
null,
|
|
8,
|
|
[`loading`],
|
|
))
|
|
: createCommentVNode(``, !0),
|
|
]),
|
|
unref(B)
|
|
? (openBlock(),
|
|
createBlock(
|
|
a,
|
|
{
|
|
key: 0,
|
|
severity: `error`,
|
|
closable: !1,
|
|
class: `preferences-message`,
|
|
},
|
|
{
|
|
default: withCtx(() => [
|
|
createTextVNode(toDisplayString(unref(B)), 1),
|
|
]),
|
|
_: 1,
|
|
},
|
|
))
|
|
: createCommentVNode(``, !0),
|
|
unref(V)
|
|
? (openBlock(),
|
|
createBlock(
|
|
a,
|
|
{
|
|
key: 1,
|
|
severity: `error`,
|
|
closable: !1,
|
|
class: `preferences-message`,
|
|
},
|
|
{
|
|
default: withCtx(() => [
|
|
createTextVNode(toDisplayString(unref(V)), 1),
|
|
]),
|
|
_: 1,
|
|
},
|
|
))
|
|
: createCommentVNode(``, !0),
|
|
createElementVNode(
|
|
`div`,
|
|
{
|
|
class: `preference-rows`,
|
|
"aria-busy": unref(R) || unref(z),
|
|
},
|
|
[
|
|
createElementVNode(`div`, E, [
|
|
createElementVNode(`div`, D, [
|
|
createElementVNode(
|
|
`label`,
|
|
{
|
|
for: `${unref(F)}-email`,
|
|
class: `preference-label`,
|
|
},
|
|
`邮箱提醒`,
|
|
8,
|
|
O,
|
|
),
|
|
unref(L) && !unref(I).email_available
|
|
? (openBlock(),
|
|
createElementBlock(
|
|
`small`,
|
|
{
|
|
key: 0,
|
|
id: `${unref(F)}-email-hint`,
|
|
class: `preference-hint`,
|
|
},
|
|
`当前不可用,请检查绑定信息或联系管理员`,
|
|
8,
|
|
k,
|
|
))
|
|
: createCommentVNode(``, !0),
|
|
]),
|
|
createVNode(
|
|
c,
|
|
{
|
|
"input-id": `${unref(F)}-email`,
|
|
modelValue: unref(I).email_enabled,
|
|
disabled:
|
|
!unref(L) ||
|
|
unref(R) ||
|
|
unref(z) ||
|
|
(!unref(I).email_available &&
|
|
!unref(I).email_enabled),
|
|
"aria-label": `邮箱提醒`,
|
|
pt: {
|
|
input: {
|
|
"aria-describedby":
|
|
unref(L) && !unref(I).email_available
|
|
? `${unref(F)}-description ${unref(F)}-email-hint`
|
|
: `${unref(F)}-description`,
|
|
},
|
|
},
|
|
"onUpdate:modelValue": (n[0] ||= (e) =>
|
|
q(`email_enabled`, e)),
|
|
},
|
|
null,
|
|
8,
|
|
[`input-id`, `modelValue`, `disabled`, `pt`],
|
|
),
|
|
]),
|
|
createElementVNode(`div`, A, [
|
|
createElementVNode(`div`, j, [
|
|
createElementVNode(
|
|
`label`,
|
|
{
|
|
for: `${unref(F)}-sms`,
|
|
class: `preference-label`,
|
|
},
|
|
`短信提醒`,
|
|
8,
|
|
M,
|
|
),
|
|
unref(L) && !unref(I).sms_available
|
|
? (openBlock(),
|
|
createElementBlock(
|
|
`small`,
|
|
{
|
|
key: 0,
|
|
id: `${unref(F)}-sms-hint`,
|
|
class: `preference-hint`,
|
|
},
|
|
`当前不可用,请检查绑定信息或联系管理员`,
|
|
8,
|
|
N,
|
|
))
|
|
: createCommentVNode(``, !0),
|
|
]),
|
|
createVNode(
|
|
c,
|
|
{
|
|
"input-id": `${unref(F)}-sms`,
|
|
modelValue: unref(I).sms_enabled,
|
|
disabled:
|
|
!unref(L) ||
|
|
unref(R) ||
|
|
unref(z) ||
|
|
(!unref(I).sms_available &&
|
|
!unref(I).sms_enabled),
|
|
"aria-label": `短信提醒`,
|
|
pt: {
|
|
input: {
|
|
"aria-describedby":
|
|
unref(L) && !unref(I).sms_available
|
|
? `${unref(F)}-description ${unref(F)}-sms-hint`
|
|
: `${unref(F)}-description`,
|
|
},
|
|
},
|
|
"onUpdate:modelValue": (n[1] ||= (e) =>
|
|
q(`sms_enabled`, e)),
|
|
},
|
|
null,
|
|
8,
|
|
[`input-id`, `modelValue`, `disabled`, `pt`],
|
|
),
|
|
]),
|
|
],
|
|
8,
|
|
T,
|
|
),
|
|
unref(R) || unref(z) || unref(H)
|
|
? (openBlock(),
|
|
createElementBlock(
|
|
`p`,
|
|
P,
|
|
toDisplayString(
|
|
unref(R)
|
|
? `正在加载提醒设置…`
|
|
: unref(z)
|
|
? `正在保存…`
|
|
: unref(H),
|
|
),
|
|
1,
|
|
))
|
|
: createCommentVNode(``, !0),
|
|
],
|
|
8,
|
|
x,
|
|
)
|
|
);
|
|
}
|
|
);
|
|
},
|
|
}),
|
|
[[`__scopeId`, `data-v-f4132ec8`]],
|
|
),
|
|
{
|
|
__name: `NotificationPreferences`,
|
|
},
|
|
);
|
|
export {};
|
|
export default F;
|
|
</script>
|