// // 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 Compound import SwiftUI struct HealthChatInviteMemberScreen: View { @Bindable var context: HealthChatInviteMemberScreenViewModel.Context var body: some View { Form { Section { ListRow(label: .plain(title: HealthChatL10n.screenInviteMemberEmailPlaceholder), kind: .textField(text: $context.email, axis: .horizontal)) .keyboardType(.emailAddress) .textInputAutocapitalization(.never) .autocorrectionDisabled() } Section { ListRow(label: .plain(title: HealthChatL10n.screenInviteMemberNotePlaceholder), kind: .textField(text: $context.personalNote, axis: .vertical)) .lineLimit(4...) } footer: { Text(HealthChatL10n.screenInviteMemberNoteFooter) .compoundListSectionFooter() } } .compoundList() .scrollDismissesKeyboard(.immediately) .navigationTitle(HealthChatL10n.screenInviteMemberTitle) .navigationBarTitleDisplayMode(.inline) .toolbar { toolbar } .alert(item: $context.alertInfo) } // MARK: - Private @ToolbarContentBuilder private var toolbar: some ToolbarContent { ToolbarItem(placement: .cancellationAction) { Button(L10n.actionCancel) { context.send(viewAction: .cancel) } } ToolbarItem(placement: .confirmationAction) { Button(L10n.actionSend) { context.send(viewAction: .send) } .disabled(!context.viewState.canSend) } } } // MARK: - Previews struct HealthChatInviteMemberScreen_Previews: PreviewProvider, TestablePreview { static let viewModel = HealthChatInviteMemberScreenViewModel(apiService: HealthChatAPIServiceMock(), userIndicatorController: UserIndicatorControllerMock()) static var previews: some View { ElementNavigationStack { HealthChatInviteMemberScreen(context: viewModel.context) } .previewDisplayName("Invite") } }