chore: directory migration - gateway→server, web→client/electron
This commit is contained in:
210
client/harmony/entry/src/main/ets/pages/InboxPage.ets
Normal file
210
client/harmony/entry/src/main/ets/pages/InboxPage.ets
Normal 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)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user