chore: directory migration - gateway→server, web→client/electron

This commit is contained in:
2026-09-08 19:16:35 +08:00
parent fd9f99a3f9
commit f9d757b5e5
243 changed files with 5095 additions and 228 deletions

View File

@ -0,0 +1,210 @@
/*
* AgentMail 鸿蒙客户端 — 收件箱页
* GET /me/inbox 分页,列表展示邮件摘要
*/
import { ApiClient, ApiError } from '../api/ApiClient';
import { MailApi } from '../api/MailApi';
import { MailSummary, Me } from '../model/Models';
import { promptAction, router } from '@kit.ArkUI';
@Entry
@Component
struct InboxPage {
@State mails: MailSummary[] = [];
@State loading: boolean = false;
@State limit: number = 20;
@State total: number = 0;
@State unread: number = 0;
@State me: Me = new Me();
@State error: string = '';
private client: ApiClient | null = null;
private mailApi: MailApi | null = null;
aboutToAppear(): void {
const ctx = this.getUIContext().getHostContext();
if (ctx !== undefined) {
const client: ApiClient = ApiClient.getInstance(ctx);
this.client = client;
this.mailApi = new MailApi(client);
this.loadInbox();
}
}
async loadInbox(): Promise<void> {
const c: ApiClient | null = this.client;
const m: MailApi | null = this.mailApi;
if (c === null || m === null) {
return;
}
this.loading = true;
this.error = '';
try {
const resp = await m.inbox('all', this.limit);
this.mails = resp.mails;
this.total = resp.total;
// 客户端统计未读(API 未提供顶层 unread)
let unreadCount: number = 0;
for (let i = 0; i < this.mails.length; i++) {
if (this.mails[i].status === 'unread') {
unreadCount++;
}
}
this.unread = unreadCount;
} catch (e) {
const ae = e as ApiError;
this.error = ae.message.length > 0 ? ae.message : '加载失败';
} finally {
this.loading = false;
}
}
build() {
Column() {
// 顶栏
Row() {
Text('收件箱')
.fontSize(20).fontWeight(FontWeight.Bold).fontColor('#333333')
Blank()
if (this.unread > 0) {
Text(this.unread + ' 未读')
.fontSize(13).fontColor('#FFFFFF')
.backgroundColor('#FF4444')
.borderRadius(10)
.padding({ left: 8, right: 8, top: 2, bottom: 2 })
}
}
.width('100%')
.height(56)
.padding({ left: 16, right: 16 })
.backgroundColor('#FFFFFF')
// 列表
if (this.loading) {
Column() {
LoadingProgress().width(40).height(40)
Text('加载中…').fontSize(14).fontColor('#999999').margin({ top: 8 })
}
.width('100%').height('80%')
.justifyContent(FlexAlign.Center)
} else if (this.error.length > 0) {
Column() {
Text(this.error).fontSize(14).fontColor('#FF4444')
Button('重试').margin({ top: 12 }).onClick(() => { this.loadInbox(); })
}
.width('100%').height('80%')
.justifyContent(FlexAlign.Center)
} else if (this.mails.length === 0) {
Column() {
Text('📭 收件箱为空').fontSize(16).fontColor('#999999')
}
.width('100%').height('80%')
.justifyContent(FlexAlign.Center)
} else {
List({ space: 1 }) {
ForEach(this.mails, (mail: MailSummary) => {
ListItem() {
this.MailItem(mail)
}
.height(80)
.backgroundColor(mail.status === 'unread' ? '#F0F7FF' : '#FFFFFF')
.onClick(() => {
this.getUIContext().getRouter().pushUrl({
url: 'pages/MailDetailPage',
params: { mail_id: mail.mail_id }
});
})
}, (mail: MailSummary) => mail.mail_id)
}
.width('100%')
.layoutWeight(1)
.divider({ strokeWidth: 1, color: '#EEEEEE', startMargin: 16, endMargin: 16 })
}
// 底部 Tab 栏(预留系统导航栏空间)
Column() {
Row() {
Column() {
Text('📬').fontSize(20)
Text('收件箱').fontSize(11).fontColor('#1A73E8')
}
.layoutWeight(1).height('100%')
.justifyContent(FlexAlign.Center)
.backgroundColor('#E3F2FD')
Column() {
Text('💬').fontSize(20)
Text('会话').fontSize(11).fontColor('#666666')
}
.layoutWeight(1).height('100%')
.justifyContent(FlexAlign.Center)
.onClick(() => {
this.getUIContext().getRouter().pushUrl({ url: 'pages/SessionsPage' });
})
Column() {
Text('👤').fontSize(20)
Text('联系人').fontSize(11).fontColor('#666666')
}
.layoutWeight(1).height('100%')
.justifyContent(FlexAlign.Center)
}
.width('100%').height(56)
.backgroundColor('#FFFFFF')
}
.width('100%')
}
.width('100%').height('100%')
.backgroundColor('#F5F7FA')
}
@Builder
MailItem(mail: MailSummary) {
Row() {
// 未读圆点
Column() {
if (mail.status === 'unread') {
Circle({ width: 8, height: 8 }).fill('#1A73E8')
}
}
.width(20).height('100%')
.justifyContent(FlexAlign.Center)
// 正文
Column() {
Row() {
Text(mail.from_name).fontSize(14).fontWeight(mail.is_read ? FontWeight.Normal : FontWeight.Bold).fontColor('#333333')
Blank()
Text(mail.created_at).fontSize(11).fontColor('#999999')
}
.width('100%')
Text(mail.subject).fontSize(13).fontColor('#333333')
.maxLines(1).textOverflow({ overflow: TextOverflow.Ellipsis })
.margin({ top: 2 })
Text(mail.body_preview).fontSize(12).fontColor('#999999')
.maxLines(1).textOverflow({ overflow: TextOverflow.Ellipsis })
.margin({ top: 2 })
}
.layoutWeight(1).height('100%')
.alignItems(HorizontalAlign.Start)
.padding({ left: 8 })
// 附件图标
if (mail.has_attachments) {
Text('📎').fontSize(14).margin({ right: 8 })
}
// 权限档位徽标
if (mail.permission_mode.length > 0) {
Text(mail.permission_mode)
.fontSize(10).fontColor('#666666')
.backgroundColor('#EEEEEE').borderRadius(4)
.padding({ left: 4, right: 4, top: 1, bottom: 1 })
}
}
.width('100%').height('100%')
.padding({ left: 12, right: 12 })
.alignItems(VerticalAlign.Center)
}
}