
- 在MainFeature中新增导航路径和设置页面状态管理,支持页面导航。 - 更新MainView以集成导航功能,添加测试按钮以触发导航。 - 在MeFeature中新增设置按钮点击事件,交由MainFeature处理。 - 增强MeView以支持设置按钮,提升用户体验。
125 lines
6.2 KiB
Swift
125 lines
6.2 KiB
Swift
import SwiftUI
|
||
import ComposableArchitecture
|
||
|
||
struct MeView: View {
|
||
let store: StoreOf<MeFeature>
|
||
|
||
var body: some View {
|
||
GeometryReader { geometry in
|
||
ZStack {
|
||
Image("bg")
|
||
.resizable()
|
||
.aspectRatio(contentMode: .fill)
|
||
.frame(maxWidth: .infinity, maxHeight: .infinity)
|
||
.clipped()
|
||
.ignoresSafeArea(.all)
|
||
VStack(spacing: 0) {
|
||
// 顶部栏,右上角设置按钮
|
||
HStack {
|
||
Spacer()
|
||
WithViewStore(self.store, observe: { $0 }) { viewStore in
|
||
Button(action: {
|
||
viewStore.send(.settingButtonTapped)
|
||
}) {
|
||
Image(systemName: "gearshape")
|
||
.font(.system(size: 22, weight: .medium))
|
||
.foregroundColor(.white)
|
||
}
|
||
.padding(.trailing, 16)
|
||
.padding(.top, 8)
|
||
}
|
||
}
|
||
// 用户信息区域
|
||
WithViewStore(self.store, observe: { $0 }) { viewStore in
|
||
if viewStore.isLoadingUserInfo {
|
||
ProgressView()
|
||
.progressViewStyle(CircularProgressViewStyle(tint: .white))
|
||
.frame(height: 130)
|
||
} else if let error = viewStore.userInfoError {
|
||
Text(error)
|
||
.font(.system(size: 14))
|
||
.foregroundColor(.red)
|
||
.frame(height: 130)
|
||
} else if let userInfo = viewStore.userInfo {
|
||
VStack(spacing: 8) {
|
||
if let avatarUrl = userInfo.avatar, !avatarUrl.isEmpty {
|
||
AsyncImage(url: URL(string: avatarUrl)) { image in
|
||
image.resizable().aspectRatio(contentMode: .fill).clipShape(Circle())
|
||
} placeholder: {
|
||
Image(systemName: "person.fill").font(.system(size: 40)).foregroundColor(.white)
|
||
}
|
||
.frame(width: 90, height: 90)
|
||
} else {
|
||
Image(systemName: "person.fill").font(.system(size: 40)).foregroundColor(.white)
|
||
.frame(width: 90, height: 90)
|
||
}
|
||
Text(userInfo.nick ?? "用户昵称")
|
||
.font(.system(size: 18, weight: .medium))
|
||
.foregroundColor(.white)
|
||
Text("ID: \(userInfo.uid ?? 0)")
|
||
.font(.system(size: 14))
|
||
.foregroundColor(.white.opacity(0.7))
|
||
}
|
||
.frame(height: 130)
|
||
} else {
|
||
Spacer().frame(height: 130)
|
||
}
|
||
}
|
||
// 动态内容区域
|
||
WithViewStore(self.store, observe: { $0 }) { viewStore in
|
||
if viewStore.isLoadingMoments && viewStore.moments.isEmpty {
|
||
ProgressView("加载中...")
|
||
.frame(maxWidth: .infinity, maxHeight: .infinity)
|
||
} else if let error = viewStore.momentsError {
|
||
VStack(spacing: 16) {
|
||
Image(systemName: "exclamationmark.triangle.fill")
|
||
.font(.system(size: 40))
|
||
.foregroundColor(.yellow)
|
||
Text(error)
|
||
.foregroundColor(.red)
|
||
Button("重试") {
|
||
viewStore.send(.onAppear)
|
||
}
|
||
}
|
||
.frame(maxWidth: .infinity, maxHeight: .infinity)
|
||
} else if viewStore.moments.isEmpty {
|
||
VStack(spacing: 16) {
|
||
Image(systemName: "tray")
|
||
.font(.system(size: 40))
|
||
.foregroundColor(.gray)
|
||
Text("暂无动态")
|
||
.foregroundColor(.white.opacity(0.8))
|
||
}
|
||
.frame(maxWidth: .infinity, maxHeight: .infinity)
|
||
} else {
|
||
ScrollView {
|
||
LazyVStack(spacing: 12) {
|
||
ForEach(Array(viewStore.moments.enumerated()), id: \ .element.dynamicId) { index, moment in
|
||
OptimizedDynamicCardView(moment: moment, allMoments: viewStore.moments, currentIndex: index)
|
||
.padding(.horizontal, 12)
|
||
}
|
||
if viewStore.hasMore {
|
||
ProgressView()
|
||
.onAppear {
|
||
viewStore.send(.loadMore)
|
||
}
|
||
}
|
||
}
|
||
.padding(.top, 8)
|
||
}
|
||
.refreshable {
|
||
viewStore.send(.refresh)
|
||
}
|
||
}
|
||
}
|
||
Spacer()
|
||
}
|
||
.frame(maxWidth: .infinity, alignment: .top)
|
||
}
|
||
}
|
||
.onAppear {
|
||
ViewStore(self.store, observe: { $0 }).send(.onAppear)
|
||
}
|
||
}
|
||
}
|