From 03c434074a9d41262d2f7abcac7444790cd88cc0 Mon Sep 17 00:00:00 2001 From: Doug <6060466+pixlwave@users.noreply.github.com> Date: Fri, 7 Aug 2026 17:24:19 +0100 Subject: [PATCH] Show loading/failure states when setting/clearing user status. (#5993) --- .../SettingsScreenViewModel.swift | 56 +++++++++++++------ 1 file changed, 38 insertions(+), 18 deletions(-) diff --git a/ElementX/Sources/Screens/Settings/SettingsScreen/SettingsScreenViewModel.swift b/ElementX/Sources/Screens/Settings/SettingsScreen/SettingsScreenViewModel.swift index dd337240c..b0d8f707c 100644 --- a/ElementX/Sources/Screens/Settings/SettingsScreen/SettingsScreenViewModel.swift +++ b/ElementX/Sources/Screens/Settings/SettingsScreen/SettingsScreenViewModel.swift @@ -162,35 +162,55 @@ class SettingsScreenViewModel: SettingsScreenViewModelType, SettingsScreenViewMo } private func setUserStatus(_ status: UserStatus.Raw) async { - // Loading state tbc + showSavingIndicator() + defer { hideSavingIndicator() } + state.bindings.isPresentingStatusPicker = false state.bindings.isShowingCustomStatusField = false - switch await clientProxy.setUserStatus(status) { - case .success: - break // Loading/error state tbc - case .failure: - userIndicatorController.submitIndicator(.init(id: UUID().uuidString, - type: .toast, - title: L10n.errorUnknown, - icon: \.close)) + if case .failure = await clientProxy.setUserStatus(status) { + showFailureIndicator() } } /// Clears both the `UserStatus.Raw` and `UserStatus.Call` values simultaneously. private func clearUserStatus() async { - // Loading state tbc + showSavingIndicator() + defer { hideSavingIndicator() } + state.bindings.isPresentingStatusPicker = false state.bindings.isShowingCustomStatusField = false - switch await clientProxy.clearUserStatus() { - case .success: - break // Loading/error state tbc - case .failure: - userIndicatorController.submitIndicator(.init(id: UUID().uuidString, - type: .toast, - title: L10n.errorUnknown, - icon: \.close)) + if case .failure = await clientProxy.clearUserStatus() { + showFailureIndicator() } } + + // MARK: - Indicators + + private static var savingIndicatorID: String { + "\(Self.self)-Saving" + } + + private static var failureIndicatorID: String { + "\(Self.self)-Failure" + } + + private func showSavingIndicator() { + userIndicatorController.submitIndicator(UserIndicator(id: Self.savingIndicatorID, + type: .toast(progress: .indeterminate), + title: L10n.commonSaving, + persistent: true)) + } + + private func hideSavingIndicator() { + userIndicatorController.retractIndicatorWithId(Self.savingIndicatorID) + } + + private func showFailureIndicator() { + userIndicatorController.submitIndicator(UserIndicator(id: Self.failureIndicatorID, + type: .toast, + title: L10n.commonFailed, + icon: \.close)) + } }