feat(ios): refine native interface and app icon

Unify bottom actions, selection controls, navigation structure, spacing, and theme colors across iOS pages. Replace the app icon with a higher-contrast native-style asset and include its source SVG.
This commit is contained in:
chick
2026-09-12 14:09:02 +08:00
parent 31b2f33d15
commit 0f2866a853
16 changed files with 1293 additions and 1035 deletions
@@ -15,9 +15,7 @@ struct NotificationsView: View {
}
var body: some View {
ZStack {
AITheme.canvas.ignoresSafeArea()
ScrollView {
ScrollView {
LazyVStack(spacing: 12) {
if let actionMessage = model.actionMessage {
AIStatusBanner(
@@ -44,18 +42,29 @@ struct NotificationsView: View {
}
}
.padding(16)
}
.padding(.bottom, 8)
}
.navigationTitle("通知中心")
.aiBottomActionBar {
Button {
Task { await model.retryAll() }
} label: {
Label("立即投递", systemImage: "paperplane")
}
.buttonStyle(AIButtonStyle(kind: .primary, size: .regular, fillsWidth: true))
.disabled(model.isLoading)
Button {
Task { await model.retryAll() }
} label: {
HStack(spacing: 8) {
if model.isRetryingAll {
ProgressView()
.controlSize(.small)
}
Text(
model.isRetryingAll
? "投递中"
: (model.overview?.queue.total == 0 ? "暂无待投递" : "立即投递")
)
}
}
.buttonStyle(AIButtonStyle(kind: .primary, size: .regular, fillsWidth: true))
.disabled(model.isLoading || model.isRetryingAll || model.overview?.queue.total == 0)
}
.background(AITheme.canvas.ignoresSafeArea())
.navigationTitle("通知中心")
.confirmationDialog(
"删除这条通知队列记录?操作不可恢复。",
isPresented: Binding(
@@ -176,13 +185,12 @@ struct NotificationsView: View {
}
} else {
ForEach(overview.queue.items) { item in
AICard {
AIListCard(
title: eventTypeLabel(item.eventType),
subtitle: "\(item.instanceName) · \(timestampText(item.createdAt))",
status: statusLabel(item.status),
statusTint: statusTint(item.status)
) {
AIListCard(
title: eventTypeLabel(item.eventType),
subtitle: "\(item.instanceName) · \(timestampText(item.createdAt))",
status: statusLabel(item.status),
statusTint: statusTint(item.status)
) {
HStack(spacing: 8) {
Button {
Task { await model.retryQueue(item) }
@@ -190,27 +198,17 @@ struct NotificationsView: View {
Label("重试", systemImage: "arrow.clockwise")
}
.buttonStyle(
AIButtonStyle(
kind: .secondary,
size: .compact,
fixedWidth: AITheme.listActionButtonWidth
)
AIButtonStyle(kind: .secondary, size: .compact, fillsWidth: true)
)
.disabled(model.busyQueueID == item.id)
.disabled(model.busyQueueID != nil)
Button {
pendingDeleteQueueID = item.id
} label: {
Label("删除", systemImage: "trash")
}
.buttonStyle(
AIButtonStyle(
kind: .danger,
size: .compact,
fixedWidth: AITheme.listActionButtonWidth
)
)
}
.buttonStyle(AIButtonStyle(kind: .danger, size: .compact, fillsWidth: true))
.disabled(model.busyQueueID != nil)
}
}
}