diff --git a/src/app/(main)/huawei-review/page.tsx b/src/app/(main)/huawei-review/page.tsx new file mode 100644 index 0000000..4274991 --- /dev/null +++ b/src/app/(main)/huawei-review/page.tsx @@ -0,0 +1,103 @@ +'use client'; + +import { useCallback, useEffect, useState } from 'react'; +import { Alert, App, Button, Card, Descriptions, Radio, Skeleton, Tag } from 'antd'; +import { api, errMsg } from '@/lib/api'; +import { formatUtcTime } from '@/lib/format'; + +// 华为审核开关:控制新手引导「快速设置」权限步能否被用户退出。 +// 华为应用市场审核要求该页必须可关闭(引导视频页不在要求内),平时保持「不能关闭」以保住权限开启率, +// 送审期间切「可关闭」。落在 app_config 的 huawei_review 行,客户端经 /api/v1/platform/huawei-review 拉。 +type Mode = 'default' | 'review'; + +interface HuaweiReview { + mode: Mode; + updated_at: string | null; +} + +const MODE_LABEL: Record = { + default: '不能关闭', + review: '可关闭', +}; + +export default function HuaweiReviewPage() { + const { message } = App.useApp(); + const [loading, setLoading] = useState(true); + const [saving, setSaving] = useState(false); + // saved = 服务端当前值(用于「有没有改动」判断);mode = 编辑中的值 + const [saved, setSaved] = useState(null); + const [mode, setMode] = useState('default'); + + const load = useCallback(async () => { + try { + const r = await api.get('/admin/api/huawei-review'); + setSaved(r.data); + setMode(r.data.mode); + } catch (e) { + message.error(errMsg(e, '华为审核开关加载失败')); + } finally { + setLoading(false); + } + }, [message]); + + useEffect(() => { + load(); + }, [load]); + + const save = async () => { + setSaving(true); + try { + const r = await api.patch('/admin/api/huawei-review', { mode }); + setSaved(r.data); + setMode(r.data.mode); + message.success('已保存。客户端下次进新手引导时拉取生效'); + } catch (e) { + message.error(errMsg(e, '保存失败')); + } finally { + setSaving(false); + } + }; + + const dirty = saved !== null && saved.mode !== mode; + + return ( + + 保存 + + } + > + + {loading ? ( + + ) : ( + <> + + + {saved ? ( + {MODE_LABEL[saved.mode]} + ) : ( + '-' + )} + + + {saved?.updated_at ? formatUtcTime(saved.updated_at) : '从未修改过(默认不能关闭)'} + + +
华为快速设置页是否可关闭
+ setMode(e.target.value as Mode)}> + 不能关闭 + 可关闭 + + + )} +
+ ); +} diff --git a/src/app/(main)/layout.tsx b/src/app/(main)/layout.tsx index b2c7c8d..c1c37a0 100644 --- a/src/app/(main)/layout.tsx +++ b/src/app/(main)/layout.tsx @@ -16,6 +16,7 @@ import { MoneyCollectOutlined, NotificationOutlined, ProfileOutlined, + SafetyCertificateOutlined, SettingOutlined, ShareAltOutlined, TeamOutlined, @@ -78,6 +79,7 @@ const NAV_GROUPS: NavGroup[] = [ children: [ { key: '/config', icon: , label: '系统配置' }, { key: '/ad-revenue', icon: , label: '广告配置' }, + { key: '/huawei-review', icon: , label: '华为审核开关' }, { key: '/users', icon: , label: '用户管理' }, ], },