112 lines
4.3 KiB
Swift
112 lines
4.3 KiB
Swift
import SwiftUI
|
|
|
|
struct ProfileView: View {
|
|
var appState: AppState
|
|
var isOwnProfile: Bool
|
|
var userId: String?
|
|
@State private var viewModel = ProfileViewModel()
|
|
@Environment(\.dismiss) private var dismiss
|
|
|
|
var body: some View {
|
|
NavigationStack {
|
|
Form {
|
|
// Avatar
|
|
Section {
|
|
HStack {
|
|
Spacer()
|
|
VStack(spacing: 8) {
|
|
if let avatarData = viewModel.avatarData,
|
|
let uiImage = UIImage(data: avatarData) {
|
|
Image(uiImage: uiImage)
|
|
.resizable()
|
|
.aspectRatio(contentMode: .fill)
|
|
.frame(width: 80, height: 80)
|
|
.clipShape(Circle())
|
|
} else {
|
|
CircularAvatarView(
|
|
name: viewModel.profile?.username ?? "?",
|
|
size: 80,
|
|
isGroup: false
|
|
)
|
|
}
|
|
|
|
if isOwnProfile {
|
|
Button("Change Photo") {
|
|
// Photo picker would go here
|
|
}
|
|
.font(.caption)
|
|
}
|
|
}
|
|
Spacer()
|
|
}
|
|
.listRowBackground(Color.clear)
|
|
}
|
|
|
|
// Info
|
|
Section("Info") {
|
|
if let username = viewModel.profile?.username {
|
|
LabeledContent("Username", value: username)
|
|
}
|
|
if let email = viewModel.profile?.email {
|
|
LabeledContent("Email", value: email)
|
|
}
|
|
}
|
|
|
|
if isOwnProfile {
|
|
// Editable fields
|
|
Section("Contact") {
|
|
TextField("Phone", text: $viewModel.phone)
|
|
.keyboardType(.phonePad)
|
|
Toggle("Phone visible to contacts", isOn: $viewModel.phoneVisible)
|
|
|
|
TextField("Location", text: $viewModel.location)
|
|
Toggle("Location visible to contacts", isOn: $viewModel.locationVisible)
|
|
}
|
|
} else {
|
|
// Read-only view
|
|
if let phone = viewModel.profile?.phone, viewModel.profile?.phoneVisible == true {
|
|
Section("Contact") {
|
|
LabeledContent("Phone", value: phone)
|
|
}
|
|
}
|
|
if let location = viewModel.profile?.location, viewModel.profile?.locationVisible == true {
|
|
Section("Location") {
|
|
LabeledContent("Location", value: location)
|
|
}
|
|
}
|
|
}
|
|
|
|
if let error = viewModel.errorMessage {
|
|
Section {
|
|
Text(error)
|
|
.foregroundStyle(.red)
|
|
}
|
|
}
|
|
}
|
|
.navigationTitle(isOwnProfile ? "My Profile" : "Profile")
|
|
.navigationBarTitleDisplayMode(.inline)
|
|
.toolbar {
|
|
ToolbarItem(placement: .topBarTrailing) {
|
|
if isOwnProfile {
|
|
Button("Save") {
|
|
Task {
|
|
await viewModel.saveProfile(chatClient: appState.chatClient)
|
|
dismiss()
|
|
}
|
|
}
|
|
.disabled(viewModel.isSaving)
|
|
} else {
|
|
Button("Done") { dismiss() }
|
|
}
|
|
}
|
|
ToolbarItem(placement: .cancellationAction) {
|
|
Button("Cancel") { dismiss() }
|
|
}
|
|
}
|
|
.task {
|
|
await viewModel.loadProfile(userId: userId, chatClient: appState.chatClient)
|
|
}
|
|
}
|
|
}
|
|
}
|