edit bio
This commit is contained in:
parent
a207a4dccb
commit
92bdf58cde
@ -172,6 +172,35 @@ struct ProfilePermissionsRequestPayload: Encodable {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct ProfileUpdateRequestPayload: Encodable {
|
extension ProfilePermissionsRequestPayload {
|
||||||
let profilePermissions: ProfilePermissionsRequestPayload
|
init(payload: ProfilePermissionsPayload) {
|
||||||
|
self.init(
|
||||||
|
isSearchable: payload.isSearchable,
|
||||||
|
allowMessageForwarding: payload.allowMessageForwarding,
|
||||||
|
allowMessagesFromNonContacts: payload.allowMessagesFromNonContacts,
|
||||||
|
showProfilePhotoToNonContacts: payload.showProfilePhotoToNonContacts,
|
||||||
|
lastSeenVisibility: payload.lastSeenVisibility,
|
||||||
|
showBioToNonContacts: payload.showBioToNonContacts,
|
||||||
|
showStoriesToNonContacts: payload.showStoriesToNonContacts,
|
||||||
|
allowServerChats: payload.allowServerChats,
|
||||||
|
publicInvitePermission: payload.publicInvitePermission,
|
||||||
|
groupInvitePermission: payload.groupInvitePermission,
|
||||||
|
callPermission: payload.callPermission,
|
||||||
|
forceAutoDeleteMessagesInPrivate: payload.forceAutoDeleteMessagesInPrivate,
|
||||||
|
maxMessageAutoDeleteSeconds: payload.maxMessageAutoDeleteSeconds,
|
||||||
|
autoDeleteAfterDays: payload.autoDeleteAfterDays
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct ProfileUpdateRequestPayload: Encodable {
|
||||||
|
let fullName: String?
|
||||||
|
let bio: String?
|
||||||
|
let profilePermissions: ProfilePermissionsRequestPayload
|
||||||
|
|
||||||
|
init(fullName: String? = nil, bio: String? = nil, profilePermissions: ProfilePermissionsRequestPayload) {
|
||||||
|
self.fullName = fullName
|
||||||
|
self.bio = bio
|
||||||
|
self.profilePermissions = profilePermissions
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -2235,6 +2235,9 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"Профиль пока не загружен. Попробуйте позже." : {
|
||||||
|
"comment" : "Profile not ready error"
|
||||||
|
},
|
||||||
"Прямого сброса пароля нет: сменить его можно только из настроек, уже будучи в аккаунте. Если привязана почта или другое 2FA-устройство, воспользуйтесь входом по коду - он подтвердит вашу личность и пустит в аккаунт. После входа откройте настройки → безопасность и задайте новый пароль." : {
|
"Прямого сброса пароля нет: сменить его можно только из настроек, уже будучи в аккаунте. Если привязана почта или другое 2FA-устройство, воспользуйтесь входом по коду - он подтвердит вашу личность и пустит в аккаунт. После входа откройте настройки → безопасность и задайте новый пароль." : {
|
||||||
|
|
||||||
},
|
},
|
||||||
@ -2540,6 +2543,9 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"Сохранение..." : {
|
||||||
|
|
||||||
},
|
},
|
||||||
"Сохраните секретный ключ и введите код из приложения, чтобы завершить настройку." : {
|
"Сохраните секретный ключ и введите код из приложения, чтобы завершить настройку." : {
|
||||||
"comment" : "Сообщение после активации 2FA"
|
"comment" : "Сообщение после активации 2FA"
|
||||||
|
|||||||
@ -4,6 +4,8 @@ struct EditProfileView: View {
|
|||||||
// State for form fields
|
// State for form fields
|
||||||
@State private var displayName = ""
|
@State private var displayName = ""
|
||||||
@State private var description = ""
|
@State private var description = ""
|
||||||
|
@State private var originalDisplayName = ""
|
||||||
|
@State private var originalDescription = ""
|
||||||
|
|
||||||
// State for profile data and avatar
|
// State for profile data and avatar
|
||||||
@State private var profile: ProfileDataPayload?
|
@State private var profile: ProfileDataPayload?
|
||||||
@ -12,6 +14,7 @@ struct EditProfileView: View {
|
|||||||
|
|
||||||
// State for loading and errors
|
// State for loading and errors
|
||||||
@State private var isLoading = false
|
@State private var isLoading = false
|
||||||
|
@State private var isSaving = false
|
||||||
@State private var alertMessage: String?
|
@State private var alertMessage: String?
|
||||||
@State private var showAlert = false
|
@State private var showAlert = false
|
||||||
|
|
||||||
@ -78,12 +81,19 @@ struct EditProfileView: View {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Button(action: {
|
Button(action: {
|
||||||
// Действие для сохранения профиля
|
Task {
|
||||||
print("DisplayName: \(displayName)")
|
await applyProfileChanges()
|
||||||
print("Description: \(description)")
|
|
||||||
}) {
|
|
||||||
Text("Применить")
|
|
||||||
}
|
}
|
||||||
|
}) {
|
||||||
|
if isSaving {
|
||||||
|
ProgressView()
|
||||||
|
.frame(maxWidth: .infinity, alignment: .center)
|
||||||
|
} else {
|
||||||
|
Text("Применить")
|
||||||
|
.frame(maxWidth: .infinity, alignment: .center)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.disabled(!hasProfileChanges || isLoading || isSaving)
|
||||||
}
|
}
|
||||||
.navigationTitle("Профиль")
|
.navigationTitle("Профиль")
|
||||||
.onAppear(perform: loadProfile)
|
.onAppear(perform: loadProfile)
|
||||||
@ -96,9 +106,9 @@ struct EditProfileView: View {
|
|||||||
Text(message)
|
Text(message)
|
||||||
}
|
}
|
||||||
|
|
||||||
if isLoading {
|
if isLoading || isSaving {
|
||||||
Color.black.opacity(0.4).ignoresSafeArea()
|
Color.black.opacity(0.4).ignoresSafeArea()
|
||||||
ProgressView("Загрузка...")
|
ProgressView(isLoading ? "Загрузка..." : "Сохранение...")
|
||||||
.padding()
|
.padding()
|
||||||
.background(Color.secondary.colorInvert())
|
.background(Color.secondary.colorInvert())
|
||||||
.cornerRadius(10)
|
.cornerRadius(10)
|
||||||
@ -127,9 +137,13 @@ struct EditProfileView: View {
|
|||||||
do {
|
do {
|
||||||
let profile = try await profileService.fetchMyProfile()
|
let profile = try await profileService.fetchMyProfile()
|
||||||
await MainActor.run {
|
await MainActor.run {
|
||||||
|
let loadedName = profile.fullName ?? ""
|
||||||
|
let loadedBio = profile.bio ?? ""
|
||||||
self.profile = profile
|
self.profile = profile
|
||||||
self.displayName = profile.fullName ?? ""
|
self.displayName = loadedName
|
||||||
self.description = profile.bio ?? ""
|
self.description = loadedBio
|
||||||
|
self.originalDisplayName = loadedName
|
||||||
|
self.originalDescription = loadedBio
|
||||||
self.isLoading = false
|
self.isLoading = false
|
||||||
}
|
}
|
||||||
} catch {
|
} catch {
|
||||||
@ -141,6 +155,51 @@ struct EditProfileView: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private var hasProfileChanges: Bool {
|
||||||
|
displayName != originalDisplayName || description != originalDescription
|
||||||
|
}
|
||||||
|
|
||||||
|
@MainActor
|
||||||
|
private func applyProfileChanges() async {
|
||||||
|
guard !isSaving else { return }
|
||||||
|
guard let currentProfile = profile else {
|
||||||
|
alertMessage = NSLocalizedString("Профиль пока не загружен. Попробуйте позже.", comment: "Profile not ready error")
|
||||||
|
showAlert = true
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
isSaving = true
|
||||||
|
|
||||||
|
let request = ProfileUpdateRequestPayload(
|
||||||
|
fullName: displayName,
|
||||||
|
bio: description,
|
||||||
|
profilePermissions: ProfilePermissionsRequestPayload(payload: currentProfile.profilePermissions)
|
||||||
|
)
|
||||||
|
|
||||||
|
do {
|
||||||
|
_ = try await profileService.updateProfile(request)
|
||||||
|
let refreshedProfile = try await profileService.fetchMyProfile()
|
||||||
|
let updatedName = refreshedProfile.fullName ?? ""
|
||||||
|
let updatedBio = refreshedProfile.bio ?? ""
|
||||||
|
profile = refreshedProfile
|
||||||
|
displayName = updatedName
|
||||||
|
description = updatedBio
|
||||||
|
originalDisplayName = updatedName
|
||||||
|
originalDescription = updatedBio
|
||||||
|
} catch {
|
||||||
|
let message: String
|
||||||
|
if let error = error as? LocalizedError, let description = error.errorDescription {
|
||||||
|
message = description
|
||||||
|
} else {
|
||||||
|
message = error.localizedDescription
|
||||||
|
}
|
||||||
|
alertMessage = message
|
||||||
|
showAlert = true
|
||||||
|
}
|
||||||
|
|
||||||
|
isSaving = false
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct ImagePicker: UIViewControllerRepresentable {
|
struct ImagePicker: UIViewControllerRepresentable {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user