diff --git a/Riot/Modules/CreateRoom/EnterNewRoomDetails/EnterNewRoomDetailsViewController.swift b/Riot/Modules/CreateRoom/EnterNewRoomDetails/EnterNewRoomDetailsViewController.swift index d177dcd52..e68aedb51 100644 --- a/Riot/Modules/CreateRoom/EnterNewRoomDetails/EnterNewRoomDetailsViewController.swift +++ b/Riot/Modules/CreateRoom/EnterNewRoomDetails/EnterNewRoomDetailsViewController.swift @@ -81,16 +81,6 @@ final class EnterNewRoomDetailsViewController: UIViewController { } } - private func showActivityIndicator() { - if self.activityPresenter.isPresenting == false { - self.activityPresenter.presentActivityIndicator(on: self.view, animated: true) - } - } - - private func hideActivityIndicator() { - self.activityPresenter.removeCurrentActivityIndicator(animated: true) - } - private func updateSections() { let row_0_0 = Row(type: .avatar(image: viewModel.roomCreationParameters.avatarImage), text: nil, accessoryType: .none) { // open image picker @@ -238,7 +228,7 @@ final class EnterNewRoomDetailsViewController: UIViewController { theme.applyStyle(onNavigationBar: navigationBar) } - self.mainTableView.reloadData() + mainTableView.reloadData() } private func registerThemeServiceDidChangeThemeNotification() { @@ -276,12 +266,14 @@ final class EnterNewRoomDetailsViewController: UIViewController { private func render(viewState: EnterNewRoomDetailsViewState) { switch viewState { case .loading: - self.renderLoading() + renderLoading() case .loaded: updateSections() case .error(let error): - self.render(error: error) + render(error: error) } + + updateCreateButtonState() } private func renderLoading() { @@ -302,6 +294,15 @@ final class EnterNewRoomDetailsViewController: UIViewController { private func createButtonAction() { self.viewModel.process(viewAction: .create) } + + private func updateCreateButtonState() { + switch viewModel.viewState { + case .loading: + createBarButtonItem.isEnabled = false + default: + createBarButtonItem.isEnabled = (viewModel.roomCreationParameters.name?.count ?? 0 > Constants.roomNameMinimumNumberOfChars) + } + } } // MARK: - UITableViewDataSource @@ -539,6 +540,7 @@ extension EnterNewRoomDetailsViewController: UITextFieldDelegate { let result = resultCount <= Constants.roomNameMaximumNumberOfChars if result { viewModel.roomCreationParameters.name = resultString + updateCreateButtonState() } return result case Constants.roomAddressTextFieldTag: diff --git a/Riot/Modules/CreateRoom/EnterNewRoomDetails/EnterNewRoomDetailsViewModel.swift b/Riot/Modules/CreateRoom/EnterNewRoomDetails/EnterNewRoomDetailsViewModel.swift index 4967b5161..0e4721b6e 100644 --- a/Riot/Modules/CreateRoom/EnterNewRoomDetails/EnterNewRoomDetailsViewModel.swift +++ b/Riot/Modules/CreateRoom/EnterNewRoomDetails/EnterNewRoomDetailsViewModel.swift @@ -35,12 +35,19 @@ final class EnterNewRoomDetailsViewModel: EnterNewRoomDetailsViewModelType { weak var coordinatorDelegate: EnterNewRoomDetailsViewModelCoordinatorDelegate? var roomCreationParameters: RoomCreationParameters = RoomCreationParameters() + private(set) var viewState: EnterNewRoomDetailsViewState { + didSet { + self.viewDelegate?.enterNewRoomDetailsViewModel(self, didUpdateViewState: viewState) + } + } + // MARK: - Setup init(session: MXSession) { self.session = session roomCreationParameters.isEncrypted = session.vc_homeserverConfiguration().isE2EEByDefaultEnabled && RiotSettings.shared.roomCreationScreenRoomIsEncrypted roomCreationParameters.isPublic = RiotSettings.shared.roomCreationScreenRoomIsPublic + viewState = .loaded } deinit { @@ -66,7 +73,7 @@ final class EnterNewRoomDetailsViewModel: EnterNewRoomDetailsViewModelType { // MARK: - Private private func loadData() { - update(viewState: .loaded) + viewState = .loaded } private func chooseAvatar(sourceView: UIView) { @@ -113,7 +120,7 @@ final class EnterNewRoomDetailsViewModel: EnterNewRoomDetailsViewModelType { parameters.initialStateEvents = [MXRoomCreationParameters.initialStateEventForEncryption(withAlgorithm: kMXCryptoMegolmAlgorithm)] } - update(viewState: .loading) + viewState = .loading currentOperation = session.createRoom(parameters: parameters) { (response) in switch response { @@ -121,7 +128,7 @@ final class EnterNewRoomDetailsViewModel: EnterNewRoomDetailsViewModelType { self.uploadAvatarIfRequired(ofRoom: room) self.currentOperation = nil case .failure(let error): - self.update(viewState: .error(error)) + self.viewState = .error(error) self.currentOperation = nil } } @@ -148,7 +155,7 @@ final class EnterNewRoomDetailsViewModel: EnterNewRoomDetailsViewModelType { }, failure: { [weak self] (error) in guard let self = self else { return } guard let error = error else { return } - self.update(viewState: .error(error)) + self.viewState = .error(error) }) } @@ -159,16 +166,12 @@ final class EnterNewRoomDetailsViewModel: EnterNewRoomDetailsViewModelType { self.coordinatorDelegate?.enterNewRoomDetailsViewModel(self, didCreateNewRoom: room) self.currentOperation = nil case .failure(let error): - self.update(viewState: .error(error)) + self.viewState = .error(error) self.currentOperation = nil } } } - - private func update(viewState: EnterNewRoomDetailsViewState) { - self.viewDelegate?.enterNewRoomDetailsViewModel(self, didUpdateViewState: viewState) - } - + private func cancelOperations() { self.currentOperation?.cancel() } diff --git a/Riot/Modules/CreateRoom/EnterNewRoomDetails/EnterNewRoomDetailsViewModelType.swift b/Riot/Modules/CreateRoom/EnterNewRoomDetails/EnterNewRoomDetailsViewModelType.swift index be053323d..5ad3623ec 100644 --- a/Riot/Modules/CreateRoom/EnterNewRoomDetails/EnterNewRoomDetailsViewModelType.swift +++ b/Riot/Modules/CreateRoom/EnterNewRoomDetails/EnterNewRoomDetailsViewModelType.swift @@ -37,4 +37,6 @@ protocol EnterNewRoomDetailsViewModelType { func process(viewAction: EnterNewRoomDetailsViewAction) var roomCreationParameters: RoomCreationParameters { get set } + + var viewState: EnterNewRoomDetailsViewState { get } } diff --git a/Riot/Modules/KeyBackup/ManualExport/EncryptionKeysExportPresenter.swift b/Riot/Modules/KeyBackup/ManualExport/EncryptionKeysExportPresenter.swift index 1020b0564..d18c9a991 100644 --- a/Riot/Modules/KeyBackup/ManualExport/EncryptionKeysExportPresenter.swift +++ b/Riot/Modules/KeyBackup/ManualExport/EncryptionKeysExportPresenter.swift @@ -67,27 +67,26 @@ final class EncryptionKeysExportPresenter: NSObject { toExportKeysToFile: self.keyExportFileURL, onLoading: { [weak self] (loading) in - guard let sself = self else { + guard let self = self else { return } if loading { - sself.activityViewPresenter.removeCurrentActivityIndicator(animated: false) - sself.activityViewPresenter.presentActivityIndicator(on: viewController.view, animated: true) + self.activityViewPresenter.presentActivityIndicator(on: viewController.view, animated: true) } else { - sself.activityViewPresenter.removeCurrentActivityIndicator(animated: true) + self.activityViewPresenter.removeCurrentActivityIndicator(animated: true) } }, onComplete: { [weak self] (success) in - guard let sself = self else { + guard let self = self else { return } guard success else { - sself.encryptionKeysExportView = nil + self.encryptionKeysExportView = nil return } - sself.presentInteractionDocumentController() + self.presentInteractionDocumentController() }) self.encryptionKeysExportView = keysExportView diff --git a/Riot/Modules/Settings/Discovery/ThreePidDetails/SettingsDiscoveryThreePidDetailsViewController.swift b/Riot/Modules/Settings/Discovery/ThreePidDetails/SettingsDiscoveryThreePidDetailsViewController.swift index eb2e01a54..2652e207d 100644 --- a/Riot/Modules/Settings/Discovery/ThreePidDetails/SettingsDiscoveryThreePidDetailsViewController.swift +++ b/Riot/Modules/Settings/Discovery/ThreePidDetails/SettingsDiscoveryThreePidDetailsViewController.swift @@ -212,9 +212,7 @@ final class SettingsDiscoveryThreePidDetailsViewController: UIViewController { } private func renderLoading() { - if self.activityPresenter.isPresenting == false { - self.activityPresenter.presentActivityIndicator(on: self.view, animated: true) - } + self.activityPresenter.presentActivityIndicator(on: self.view, animated: true) self.operationButton.isEnabled = false } diff --git a/changelog.d/4746.bugfix b/changelog.d/4746.bugfix new file mode 100644 index 000000000..e3892306e --- /dev/null +++ b/changelog.d/4746.bugfix @@ -0,0 +1 @@ +Disabled the create room button while creating a room, preventing duplicates from being created. \ No newline at end of file