67 lines
1.7 KiB
Swift
67 lines
1.7 KiB
Swift
import Foundation
|
|
import SwiftUI
|
|
|
|
@Observable
|
|
final class ProfileViewModel {
|
|
var profile: UserProfile?
|
|
var avatarData: Data?
|
|
var isLoading = false
|
|
var isSaving = false
|
|
var errorMessage: String?
|
|
|
|
// Editable fields
|
|
var phone = ""
|
|
var phoneVisible = false
|
|
var location = ""
|
|
var locationVisible = false
|
|
|
|
func loadProfile(userId: String? = nil, chatClient: ChatClient) async {
|
|
isLoading = true
|
|
profile = await chatClient.getProfile(userId: userId)
|
|
isLoading = false
|
|
|
|
if let p = profile {
|
|
phone = p.phone ?? ""
|
|
phoneVisible = p.phoneVisible
|
|
location = p.location ?? ""
|
|
locationVisible = p.locationVisible
|
|
}
|
|
|
|
// Load avatar
|
|
let uid = userId ?? await chatClient.userId ?? ""
|
|
if !uid.isEmpty {
|
|
avatarData = await chatClient.getAvatar(userId: uid)
|
|
}
|
|
}
|
|
|
|
func saveProfile(chatClient: ChatClient) async {
|
|
isSaving = true
|
|
errorMessage = nil
|
|
|
|
let success = await chatClient.updateProfile(
|
|
phone: phone.isEmpty ? nil : phone,
|
|
phoneVisible: phoneVisible,
|
|
location: location.isEmpty ? nil : location,
|
|
locationVisible: locationVisible
|
|
)
|
|
|
|
isSaving = false
|
|
|
|
if !success {
|
|
errorMessage = "Failed to update profile"
|
|
}
|
|
}
|
|
|
|
func uploadAvatar(imageData: Data, chatClient: ChatClient) async {
|
|
isSaving = true
|
|
let success = await chatClient.updateAvatar(imageData: imageData)
|
|
isSaving = false
|
|
|
|
if success {
|
|
avatarData = imageData
|
|
} else {
|
|
errorMessage = "Failed to upload avatar"
|
|
}
|
|
}
|
|
}
|