chore: directory migration - gateway→server, web→client/electron
This commit is contained in:
153
client/harmony/entry/src/main/ets/pages/SessionsPage.ets
Normal file
153
client/harmony/entry/src/main/ets/pages/SessionsPage.ets
Normal file
@ -0,0 +1,153 @@
|
||||
/*
|
||||
* AgentMail 鸿蒙客户端 — 会话列表页
|
||||
* GET /me/sessions 展示所有会话摘要
|
||||
*/
|
||||
import { ApiClient, ApiError } from '../api/ApiClient';
|
||||
import { MailApi } from '../api/MailApi';
|
||||
import { Session } from '../model/Models';
|
||||
|
||||
@Entry
|
||||
@Component
|
||||
struct SessionsPage {
|
||||
@State sessions: Session[] = [];
|
||||
@State loading: boolean = false;
|
||||
@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.loadSessions();
|
||||
}
|
||||
}
|
||||
|
||||
async loadSessions(): Promise<void> {
|
||||
const m: MailApi | null = this.mailApi;
|
||||
if (m === null) {
|
||||
return;
|
||||
}
|
||||
this.loading = true;
|
||||
this.error = '';
|
||||
try {
|
||||
const resp = await m.sessions();
|
||||
this.sessions = resp.sessions;
|
||||
} catch (e) {
|
||||
const ae = e as ApiError;
|
||||
this.error = ae.code === 0 ? ae.message : '加载失败';
|
||||
} finally {
|
||||
this.loading = false;
|
||||
}
|
||||
}
|
||||
|
||||
build() {
|
||||
Column() {
|
||||
// 顶栏
|
||||
Row() {
|
||||
Text('会话')
|
||||
.fontSize(20).fontWeight(FontWeight.Bold).fontColor('#333333')
|
||||
}
|
||||
.width('100%').height(56)
|
||||
.padding({ left: 16 })
|
||||
.backgroundColor('#FFFFFF')
|
||||
|
||||
if (this.loading) {
|
||||
Column() {
|
||||
LoadingProgress().width(40).height(40)
|
||||
Text('加载中…').fontSize(14).fontColor('#999999').margin({ top: 8 })
|
||||
}
|
||||
.width('100%').layoutWeight(1)
|
||||
.justifyContent(FlexAlign.Center)
|
||||
} else if (this.error.length > 0) {
|
||||
Column() {
|
||||
Text(this.error).fontSize(14).fontColor('#FF4444')
|
||||
Button('重试').margin({ top: 12 }).onClick(() => { this.loadSessions(); })
|
||||
}
|
||||
.width('100%').layoutWeight(1)
|
||||
.justifyContent(FlexAlign.Center)
|
||||
} else if (this.sessions.length === 0) {
|
||||
Column() {
|
||||
Text('📭 暂无会话').fontSize(16).fontColor('#999999')
|
||||
}
|
||||
.width('100%').layoutWeight(1)
|
||||
.justifyContent(FlexAlign.Center)
|
||||
} else {
|
||||
List({ space: 1 }) {
|
||||
ForEach(this.sessions, (s: Session) => {
|
||||
ListItem() {
|
||||
this.SessionItem(s)
|
||||
}
|
||||
.height(90)
|
||||
}, (s: Session) => s.session_id)
|
||||
}
|
||||
.width('100%').layoutWeight(1)
|
||||
.divider({ strokeWidth: 1, color: '#EEEEEE', startMargin: 16, endMargin: 16 })
|
||||
}
|
||||
|
||||
// 底栏
|
||||
Row() {
|
||||
Text('共 ' + this.sessions.length + ' 个会话').fontSize(12).fontColor('#999999')
|
||||
}
|
||||
.width('100%').height(40).padding({ left: 16 })
|
||||
.backgroundColor('#FFFFFF')
|
||||
}
|
||||
.width('100%').height('100%')
|
||||
.backgroundColor('#F5F7FA')
|
||||
}
|
||||
|
||||
@Builder
|
||||
SessionItem(s: Session) {
|
||||
Row() {
|
||||
Column() {
|
||||
Row() {
|
||||
Text(s.session_alias.length > 0 ? s.session_alias : s.subject)
|
||||
.fontSize(14).fontWeight(FontWeight.Bold).fontColor('#333333')
|
||||
.maxLines(1).textOverflow({ overflow: TextOverflow.Ellipsis })
|
||||
.layoutWeight(1)
|
||||
|
||||
// 预算进度
|
||||
if (s.max_rounds > 0) {
|
||||
Text(s.used_rounds + '/' + s.max_rounds)
|
||||
.fontSize(11).fontColor(s.used_rounds >= s.max_rounds ? '#FF4444' : '#666666')
|
||||
.backgroundColor(s.used_rounds >= s.max_rounds ? '#FFEBEE' : '#F5F5F5')
|
||||
.borderRadius(4).padding({ left: 4, right: 4, top: 1, bottom: 1 })
|
||||
}
|
||||
|
||||
// 未读
|
||||
if (s.unread_count > 0) {
|
||||
Text(s.unread_count + '')
|
||||
.fontSize(11).fontColor('#FFFFFF')
|
||||
.backgroundColor('#FF4444')
|
||||
.borderRadius(10).width(20).height(20)
|
||||
.textAlign(TextAlign.Center)
|
||||
.margin({ left: 6 })
|
||||
}
|
||||
}
|
||||
.width('100%')
|
||||
|
||||
Text('对方: ' + s.from_agent).fontSize(12).fontColor('#666666').margin({ top: 4 })
|
||||
|
||||
Row() {
|
||||
Text(s.permission_mode.length > 0 ? s.permission_mode : '—')
|
||||
.fontSize(11).fontColor('#666666')
|
||||
.backgroundColor('#F0F0F0').borderRadius(4)
|
||||
.padding({ left: 4, right: 4, top: 1, bottom: 1 })
|
||||
Blank()
|
||||
Text(s.mail_count + ' 封').fontSize(11).fontColor('#999999')
|
||||
Text(' · ' + s.status).fontSize(11).fontColor(s.status === 'active' ? '#4CAF50' : '#999999')
|
||||
}
|
||||
.width('100%').margin({ top: 4 })
|
||||
}
|
||||
.layoutWeight(1).height('100%')
|
||||
.alignItems(HorizontalAlign.Start)
|
||||
.justifyContent(FlexAlign.SpaceBetween)
|
||||
}
|
||||
.width('100%').height('100%')
|
||||
.padding({ left: 16, right: 16, top: 12, bottom: 12 })
|
||||
.alignItems(VerticalAlign.Center)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user