// // Copyright 2025 Element Creations Ltd. // Copyright 2022-2025 New Vector Ltd. // // SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial. // Please see LICENSE files in the repository root for full details. // import SwiftUI enum SettingsScreenViewModelAction { case close case userDetails case userStatusEmojiPicker(EmojiPickerScreenContinuation) case linkNewDevice case manageAccount(url: URL) case analytics case appLock case reportBug case about case blockedUsers case secureBackup case notifications case advancedSettings case labs case developerOptions case logout case deactivateAccount } enum SettingsScreenSecuritySectionMode { case none case secureBackup } struct SettingsScreenViewState: BindableState { var deviceID: String? var userProfile: UserProfile var showUserStatusInput = false var showLinkNewDeviceButton: Bool var accountProfileURL: URL? var showAccountDeactivation: Bool var showDeveloperOptions: Bool var securitySectionMode = SettingsScreenSecuritySectionMode.none var showSecuritySectionBadge = false var showBlockedUsers = false let showAnalyticsSettings: Bool let isBugReportServiceEnabled: Bool let navigationBarVisibility: Visibility let appHooks: AppHooks var bindings = SettingsScreenViewStateBindings() var userStatusRowMode: SettingsScreenUserStatusRow.Mode { if bindings.isShowingCustomStatusField { .customStatusInput(emoji: bindings.customStatusEmoji) } else if let displayedStatus = userProfile.status.displayed { .showingStatus(displayedStatus) } else { .pickStatusButton } } } struct SettingsScreenViewStateBindings { var isPresentingStatusPicker = false var customStatusEmoji: Character = "😄" var isShowingCustomStatusField = false { didSet { if !isShowingCustomStatusField { customStatusEmoji = "😄" // Reset the emoji. } } } var isPresentingAccountDeactivationConfirmation = false } enum SettingsScreenViewAction { case close case userDetails case userStatus(UserStatusAction) case analytics case appLock case reportBug case about case blockedUsers case secureBackup case linkNewDevice case manageAccount(url: URL) case notifications case enableDeveloperOptions case developerOptions case advancedSettings case labs case logout case deactivateAccount enum UserStatusAction { /// Show status picker sheet to select a preset status. case pickStatus /// Dismiss the picker sheet and show the custom status input. case customStatus /// Show the emoji picker to select the emoji for the custom status. case pickCustomEmoji /// Set the user's status to the provided value. case set(UserStatus.Raw) /// Clears the user's currently displayed status. case clear /// Cancel user status picking/input. case cancel } }