Files
Kecalek_python/ios_client 0.8.5/Kecalek/ViewModels/ProfileViewModel.swift
2026-03-14 12:43:56 +01:00

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
}
}