diff --git a/NextcloudTalk/EmojiTextField.swift b/NextcloudTalk/EmojiTextField.swift index 49fc6e2ee..4cb833c3b 100644 --- a/NextcloudTalk/EmojiTextField.swift +++ b/NextcloudTalk/EmojiTextField.swift @@ -7,7 +7,7 @@ import UIKit import SwiftUI import Dynamic -struct EmojiTextFieldWrapper: UIViewRepresentable { +struct SingleEmojiTextFieldWrapper: UIViewRepresentable { @State var placeholder: String @Binding var text: String @@ -22,14 +22,14 @@ struct EmojiTextFieldWrapper: UIViewRepresentable { uiView.placeholder = placeholder } - func makeCoordinator() -> EmojiTextFieldWrapper.Coordinator { + func makeCoordinator() -> SingleEmojiTextFieldWrapper.Coordinator { Coordinator(parent: self) } class Coordinator: NSObject, UITextFieldDelegate { - var parent: EmojiTextFieldWrapper + var parent: SingleEmojiTextFieldWrapper - init(parent: EmojiTextFieldWrapper) { + init(parent: SingleEmojiTextFieldWrapper) { self.parent = parent } diff --git a/NextcloudTalk/UserStatusMessageSwiftUIView.swift b/NextcloudTalk/UserStatusMessageSwiftUIView.swift index 5b36be4b6..951af110d 100644 --- a/NextcloudTalk/UserStatusMessageSwiftUIView.swift +++ b/NextcloudTalk/UserStatusMessageSwiftUIView.swift @@ -12,16 +12,15 @@ struct UserStatusMessageSwiftUIView: View { @Binding var changed: Bool @State var showClearAtAlert: Bool = false - @State private var changedStatusFromPredefined: Bool = false - @State private var customStatusSelected: Bool = false - @State private var selectedPredifinedStatus: NKUserStatus? - @State private var statusPredefinedStatuses: [NKUserStatus] = [] + @State private var selectedPredefinedMessageId: String? + @State private var predefinedStatuses: [NKUserStatus] = [] @State private var selectedIcon: String = "" @State private var selectedMessage: String = "" @State private var selectedClearAt: Double = 0 @State private var selectedClearAtString: String = "" - @State private var changedSmth: Bool = false + + @State private var userHasStatusSet: Bool = false @State private var isLoading: Bool = true @FocusState private var textFieldIsFocused: Bool @@ -47,39 +46,30 @@ struct UserStatusMessageSwiftUIView: View { List { Section(header: Text(NSLocalizedString("What is your status?", comment: ""))) { HStack(spacing: 10) { - EmojiTextFieldWrapper(placeholder: "😀", text: $selectedIcon) + SingleEmojiTextFieldWrapper(placeholder: "😀", text: $selectedIcon) .frame(maxWidth: 23) .opacity(selectedIcon.isEmpty ? 0.5 : 1.0) - .onChange(of: selectedIcon) { newString in - changedSmth = true - customStatusSelected = !changedStatusFromPredefined - changedStatusFromPredefined = false - if newString.count > 1 { - selectedIcon = String(newString.first!) - } + .onChange(of: selectedIcon) { _ in + selectedPredefinedMessageId = nil } .tint(.primary) .focused($textFieldIsFocused) Divider() TextField(NSLocalizedString("What is your status?", comment: ""), text: $selectedMessage) .onChange(of: selectedMessage) { _ in - changedSmth = true - customStatusSelected = !changedStatusFromPredefined - changedStatusFromPredefined = false + selectedPredefinedMessageId = nil } .tint(.primary) .focused($textFieldIsFocused) } } Section { - ForEach(statusPredefinedStatuses, id: \.id) { status in + ForEach(predefinedStatuses, id: \.id) { status in Button(action: { - changedStatusFromPredefined = true - selectedPredifinedStatus = status - customStatusSelected = false - selectedIcon = selectedPredifinedStatus!.icon ?? "Empty" - selectedMessage = selectedPredifinedStatus!.message ?? "Empty" - selectedClearAt = selectedPredifinedStatus!.clearAt?.timeIntervalSince1970 ?? 0 + selectedPredefinedMessageId = status.id + selectedIcon = status.icon ?? "" + selectedMessage = status.message ?? "" + selectedClearAt = status.clearAt?.timeIntervalSince1970 ?? 0 selectedClearAtString = getPredefinedClearStatusText(clearAt: status.clearAt, clearAtTime: status.clearAtTime, clearAtType: status.clearAtType) setClearAt(clearAt: selectedClearAtString) }) { @@ -119,11 +109,11 @@ struct UserStatusMessageSwiftUIView: View { comment: ""), action: clearActiveUserStatus, style: .tertiary, height: 40, - disabled: Binding.constant(selectedMessage.isEmpty && selectedIcon.isEmpty)) + disabled: Binding.constant(!userHasStatusSet)) NCButtonSwiftUI(title: NSLocalizedString("Set status message", comment: ""), action: setActiveUserStatus, style: .primary, height: 40, - disabled: Binding.constant(selectedMessage.isEmpty || changedSmth == false)) + disabled: Binding.constant(selectedMessage.isEmpty && selectedIcon.isEmpty)) .padding(.bottom, 16) } } else { @@ -133,12 +123,12 @@ struct UserStatusMessageSwiftUIView: View { comment: ""), action: clearActiveUserStatus, style: .tertiary, height: 40, - disabled: Binding.constant(selectedMessage.isEmpty && selectedIcon.isEmpty)) + disabled: Binding.constant(!userHasStatusSet)) .padding(.bottom, 16) NCButtonSwiftUI(title: NSLocalizedString("Set status message", comment: ""), action: setActiveUserStatus, style: .primary, height: 40, - disabled: Binding.constant(selectedMessage.isEmpty || changedSmth == false)) + disabled: Binding.constant(selectedMessage.isEmpty && selectedIcon.isEmpty)) .padding(.bottom, 16) Spacer() } @@ -192,17 +182,19 @@ struct UserStatusMessageSwiftUIView: View { func getStatus() { isLoading = true NCAPIController.sharedInstance().setupNCCommunication(for: NCDatabaseManager.sharedInstance().activeAccount()) - NextcloudKit.shared.getUserStatus { _, clearAt, icon, message, _, _, _, _, _, _, error in + NextcloudKit.shared.getUserStatus { _, clearAt, icon, message, messageId, _, _, _, _, _, error in if error.errorCode == 0 { - selectedIcon = icon ?? "😀" + userHasStatusSet = !(icon?.isEmpty ?? true) || !(message?.isEmpty ?? true) + selectedIcon = icon ?? "" selectedMessage = message ?? "" + selectedPredefinedMessageId = messageId selectedClearAt = clearAt?.timeIntervalSince1970 ?? 0 selectedClearAtString = getPredefinedClearStatusText(clearAt: clearAt, clearAtTime: nil, clearAtType: nil) } } NextcloudKit.shared.getUserStatusPredefinedStatuses { _, userStatuses, _, error in if error.errorCode == 0 { - statusPredefinedStatuses = userStatuses! + predefinedStatuses = userStatuses ?? [] withAnimation { isLoading = false } @@ -211,8 +203,8 @@ struct UserStatusMessageSwiftUIView: View { } func setActiveUserStatus() { - if !customStatusSelected, let selectedPredifinedStatus { - NextcloudKit.shared.setCustomMessagePredefined(messageId: selectedPredifinedStatus.id!, clearAt: selectedClearAt) { _, error in + if let selectedPredefinedMessageId { + NextcloudKit.shared.setCustomMessagePredefined(messageId: selectedPredefinedMessageId, clearAt: selectedClearAt) { _, error in if error.errorCode == 0 { dismiss() changed.toggle() @@ -222,7 +214,8 @@ struct UserStatusMessageSwiftUIView: View { } } } else { - NextcloudKit.shared.setCustomMessageUserDefined(statusIcon: selectedIcon.isEmpty ? "😀" : selectedIcon, message: selectedMessage, clearAt: selectedClearAt) { _, error in + let statusIcon = selectedIcon.isEmpty ? nil : selectedIcon + NextcloudKit.shared.setCustomMessageUserDefined(statusIcon: statusIcon, message: selectedMessage, clearAt: selectedClearAt) { _, error in if error.errorCode == 0 { dismiss() changed.toggle() @@ -246,8 +239,8 @@ struct UserStatusMessageSwiftUIView: View { } func triggerErrorAlert(title: String, message: String) { - errorAlertTitle = NSLocalizedString("Could not clear status message", comment: "") - errorAlertMessage = NSLocalizedString("Could not clear status message", comment: "") + errorAlertTitle = title + errorAlertMessage = message showErrorAlert.toggle() } @@ -285,7 +278,6 @@ struct UserStatusMessageSwiftUIView: View { func setClearAt(clearAt: String) { selectedClearAt = getClearAt(clearAt) selectedClearAtString = clearAt - customStatusSelected = true } func getPredefinedClearStatusText(clearAt: NSDate?, clearAtTime: String?, clearAtType: String?) -> String {