99 lines
2.8 KiB
Swift
99 lines
2.8 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 clientUserId = await chatClient.userId
|
|
let uid = userId ?? clientUserId ?? ""
|
|
if !uid.isEmpty {
|
|
avatarData = await chatClient.getAvatar(userId: uid)
|
|
}
|
|
}
|
|
|
|
@discardableResult
|
|
func saveProfile(chatClient: ChatClient) async -> Bool {
|
|
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"
|
|
}
|
|
return success
|
|
}
|
|
|
|
func uploadAvatar(imageData: Data, chatClient: ChatClient) async {
|
|
isSaving = true
|
|
errorMessage = nil
|
|
let (success, msg) = await chatClient.updateAvatar(imageData: imageData)
|
|
isSaving = false
|
|
|
|
if success {
|
|
// Reload avatar from server (it was resized/compressed)
|
|
let clientUserId = await chatClient.userId ?? ""
|
|
avatarData = await chatClient.getAvatar(userId: clientUserId)
|
|
} else {
|
|
errorMessage = msg.isEmpty ? "Failed to upload avatar" : msg
|
|
}
|
|
}
|
|
|
|
// MARK: - Username Change
|
|
|
|
func changeUsername(newUsername: String, chatClient: ChatClient) async -> Bool {
|
|
isSaving = true
|
|
errorMessage = nil
|
|
let (success, msg) = await chatClient.changeUsername(newUsername: newUsername)
|
|
isSaving = false
|
|
if !success {
|
|
errorMessage = msg
|
|
}
|
|
return success
|
|
}
|
|
|
|
// MARK: - Password Change
|
|
|
|
func changePassword(oldPassword: String, newPassword: String, chatClient: ChatClient) async -> Bool {
|
|
isSaving = true
|
|
errorMessage = nil
|
|
let (success, msg) = await chatClient.changePassword(oldPassword: oldPassword, newPassword: newPassword)
|
|
isSaving = false
|
|
if !success {
|
|
errorMessage = msg
|
|
}
|
|
return success
|
|
}
|
|
}
|