// // Copyright 2026 Novaloop AG // // SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial. // Please see LICENSE files in the repository root for full details. // import Foundation enum HealthChatInviteMemberScreenViewModelAction { case dismiss } struct HealthChatInviteMemberScreenViewState: BindableState { /// The backend requires a personal note of at least this many characters. static let minimumNoteLength = 10 var bindings = HealthChatInviteMemberScreenViewStateBindings() var canSend: Bool { isEmailValid && isNoteValid } var isEmailValid: Bool { let email = bindings.email.trimmingCharacters(in: .whitespaces) let components = email.split(separator: "@") return components.count == 2 && components[1].contains(".") } var isNoteValid: Bool { bindings.personalNote.trimmingCharacters(in: .whitespacesAndNewlines).count >= Self.minimumNoteLength } } struct HealthChatInviteMemberScreenViewStateBindings { var email = "" var personalNote = "" var alertInfo: AlertInfo? } enum HealthChatInviteMemberScreenAlertType: Hashable { case sendFailed } enum HealthChatInviteMemberScreenViewAction { case send case cancel }