ke: 鸿蒙 UI 整改:emoji→AmIcon 图标、宽屏侧栏、Md 第三方库、通知可配置项

- common/Icons.ets(生成器产出):43 枚与 WebUI icons.tsx 同几何的 Path 图标
- NavItems.ts:icon(emoji) → iconKey,与 WebUI 导航同图标
- 全页面 emoji 清除(空态改单行灰字,按钮/头像/刷新等换 AmIcon)
- MailDetailPage 接入 @luvi/lv-markdown-in(第三方,替代手写解析器)
- WideSidebar + MainPage isWide(≥768vp):宽屏侧栏 60vp 图标轨、藏底部条、onAreaChange 断点
- 通知=可配置项(默认关):PushService.isEnabled/setEnabled + reportToken 最前 gate (关=不取token/不弹权限/不打网关)+ SettingsPage Toggle + 服务端通道状态提示
- EntryAbility.onCreate 解析 want:冷启点通知也能路由(原来只有 onNewWant)
- 判据:harmony-widescreen(4) + harmony-push-optin(4) 新增;harmony-nav 同步 iconKey/条件 padding
This commit is contained in:
2026-09-16 07:46:52 +08:00
parent 9c6e9c66ad
commit cfe7808af4
19 changed files with 766 additions and 89 deletions

View File

@ -14,8 +14,20 @@ export interface NavItem {
key: string;
/** 显示文案(与 WebUI 逐字一致) */
label: string;
/** 图标字形(鸿蒙侧用文本字形,不用猜 sys.media 名字) */
icon: string;
/**
* 图标名 —— 指向 `common/Icons.ets` 的 `ICON_PATHS`,与 WebUI 的图标集**同几何**。
*
* 2026-09-15 之前这里是 emoji 字形(`✉️`/`📅`/`👤`),理由是"不用猜 sys.media 名字"。
* 那条理由只解释了"为什么不用系统资源名",却把 emoji 当成了唯一替代 —— 结果是:
* · WebUI 在 `icons.tsx` 第一行就写着「**纯 SVG 图标,全站不使用 emoji**」,
* 两边**同一个产品却两套图标语言**;
* · emoji 由系统字体渲染,颜色不受 `fontColor` 控制、随厂商与版本变形,
* 选中/未选中只能靠整体透明度示意,做不到 WebUI 那种"线性描边图标 + 品牌色"。
*
* 现在改用 ArkUI 原生 `Path`(`common/Icons.ets`,由 WebUI 的 TSX 自动生成),
* 既不需要猜 `sys.media` 名字,又能吃主题色(深色模式一处也不漏)。
*/
iconKey: string;
}
/**
@ -30,9 +42,9 @@ export interface NavItem {
* 「顶层是 通信/日历/联系人 三个平级 pane」写判据的。
*/
export const NAV_ITEMS: NavItem[] = [
{ key: 'comm', label: '通信', icon: '✉️' },
{ key: 'calendar', label: '日历', icon: '📅' },
{ key: 'contacts', label: '联系人', icon: '👤' }
{ key: 'comm', label: '通信', iconKey: 'inbox' },
{ key: 'calendar', label: '日历', iconKey: 'calendar' },
{ key: 'contacts', label: '联系人', iconKey: 'contacts' }
];
/** 命中区下限(vp)。**44 是可点区域的下限**,不是"看起来够大"的估计 */

View File

@ -12,6 +12,18 @@
export const PROVIDER_HMS: string = 'hms';
/*
* ★ 2026-09-15:接入系统通知 = **可配置项**(用户强调多次——“用户可以自由部署自己的 agentmail”)。
* 默认 **关**:自部署/无服务端推送凭证时,客户端不取 token、不弹权限、不上报、不打网关。
* 这个常量是**契约**(判据跑它),实际落点在 PushService.isEnabled 的读不到即 false。
*/
export const DEFAULT_PUSH_ENABLED: boolean = false;
/** 签名:'on' | 'off'(开关的显示口径;无服务器状态时显示 'server-unknown') */
export function pushEnabledLabel(enabled: boolean): string {
return enabled ? 'on' : 'off';
}
/** 上报体:`POST /api/v1/me/devices/push-token` */
export interface PushRegisterBody {
provider: string;