update user agreement dialog

This commit is contained in:
Timi
2026-09-18 22:17:53 +08:00
parent 7d0bd38de2
commit b9dc39bf55
+54 -40
View File
@@ -23,18 +23,18 @@
> >
<div class="dialog-content"> <div class="dialog-content">
<t-tabs <t-tabs
v-model="activeAgreementCode" v-model="activeAgreementId"
class="tabs" class="tabs"
theme="line" theme="line"
bottom-line-mode="full" bottom-line-mode="full"
:split="false" :split="false"
:space-evenly="true" :space-evenly="false"
:swipeable="true" :swipeable="true"
> >
<t-tab-panel <t-tab-panel
v-for="item in agreementList" v-for="item in agreementList"
:key="item.code" :key="item.id"
:value="item.code" :value="item.id"
:label="item.title" :label="item.title"
lazy lazy
> >
@@ -64,30 +64,14 @@ import { ArticleAPI, AttachmentAPI, SettingAPI, type Article } from "timi-web-ap
import { ArticleView } from "timi-tdesign-mobile"; import { ArticleView } from "timi-tdesign-mobile";
import { getErrorMessage } from "@/utils/error"; import { getErrorMessage } from "@/utils/error";
type AgreementCode = "SERVICE_LICENSE" | "PRIVACY_LICENSE" | "OPEN_SOURCE_LICENSE";
type AgreementItem = { type AgreementItem = {
code: AgreementCode; id: string;
title: string; title: string;
article?: Article; article?: Article;
errorMessage?: string; errorMessage?: string;
loading: boolean; loading: boolean;
}; };
const baseAgreementList: Array<Pick<AgreementItem, "code" | "title">> = [
{
code: "SERVICE_LICENSE",
title: "服务协议"
},
{
code: "PRIVACY_LICENSE",
title: "隐私协议"
},
{
code: "OPEN_SOURCE_LICENSE",
title: "开源软件协议"
}
];
defineOptions({ defineOptions({
name: "UserAgreement" name: "UserAgreement"
}); });
@@ -103,17 +87,47 @@ const emit = defineEmits<{
}>(); }>();
const dialogVisible = ref(false); const dialogVisible = ref(false);
const agreementList = ref<AgreementItem[]>(createAgreementList()); const agreementList = ref<AgreementItem[]>([]);
const activeAgreementCode = ref<AgreementCode>("SERVICE_LICENSE"); const activeAgreementId = ref("");
function createAgreementList(): AgreementItem[] { function normalizeAgreementItem(value: unknown): Pick<AgreementItem, "id" | "title"> | undefined {
return baseAgreementList.map(item => ({ if (!value || typeof value !== "object") {
return undefined;
}
const source = value as Record<string, unknown>;
const id = typeof source.id === "string" ? source.id.trim() : "";
const title = typeof source.title === "string" ? source.title.trim() : "";
if (!id || !title) {
return undefined;
}
return { id, title };
}
function parseAgreementList(value?: string): Array<Pick<AgreementItem, "id" | "title">> {
if (!value?.trim()) {
return [];
}
try {
const sourceList: unknown = JSON.parse(value);
if (!Array.isArray(sourceList)) {
return [];
}
return sourceList
.map(item => normalizeAgreementItem(item))
.filter((item): item is Pick<AgreementItem, "id" | "title"> => !!item);
} catch {
return [];
}
}
function createAgreementList(list: Array<Pick<AgreementItem, "id" | "title">>): AgreementItem[] {
return list.map(item => ({
...item, ...item,
loading: false loading: false
})); }));
} }
function handleCheckboxChange(checked: boolean): void { async function handleCheckboxChange(checked: boolean): Promise<void> {
if (!checked) { if (!checked) {
emit("update:modelValue", false); emit("update:modelValue", false);
return; return;
@@ -121,19 +135,21 @@ function handleCheckboxChange(checked: boolean): void {
emit("update:modelValue", false); emit("update:modelValue", false);
dialogVisible.value = true; dialogVisible.value = true;
activeAgreementCode.value = "SERVICE_LICENSE"; activeAgreementId.value = "";
void loadAgreements(); await loadAgreements();
} }
async function loadAgreements(): Promise<void> { async function loadAgreements(): Promise<void> {
agreementList.value = createAgreementList().map(item => ({ try {
const settingMap = await SettingAPI.map("GAO_SYSTEM", undefined, ["AGREEMENT"]);
const configuredAgreementList = parseAgreementList(settingMap.AGREEMENT?.value);
agreementList.value = createAgreementList(configuredAgreementList).map(item => ({
...item, ...item,
loading: true loading: true
})); }));
try { activeAgreementId.value = configuredAgreementList[0]?.id || "";
const settingMap = await SettingAPI.map("GAO_SYSTEM");
agreementList.value = await Promise.all(agreementList.value.map(async item => { agreementList.value = await Promise.all(agreementList.value.map(async item => {
const articleId = settingMap[item.code]?.value?.trim(); const articleId = item.id;
if (!articleId) { if (!articleId) {
return { return {
...item, ...item,
@@ -158,11 +174,13 @@ async function loadAgreements(): Promise<void> {
})); }));
} catch (error) { } catch (error) {
const errorMessage = getErrorMessage(error, "协议配置加载失败"); const errorMessage = getErrorMessage(error, "协议配置加载失败");
agreementList.value = createAgreementList().map(item => ({ agreementList.value = [{
...item, id: "AGREEMENT_ERROR",
title: "用户协议",
loading: false, loading: false,
errorMessage errorMessage
})); }];
activeAgreementId.value = "AGREEMENT_ERROR";
} }
} }
@@ -247,12 +265,8 @@ function agreeAgreement(): void {
overflow-y: auto; overflow-y: auto;
} }
:deep(.t-tabs__scroll) {
overflow-x: hidden;
}
:deep(.t-tabs__item) { :deep(.t-tabs__item) {
padding: 0; padding: 0 .5rem;
font-size: .75rem; font-size: .75rem;
} }
} }