// // MessageEntryView.swift // kordophone2 // // Created by James Magahern on 8/24/25. // import SwiftUI struct MessageEntryView: View { @Binding var viewModel: ViewModel @Environment(\.selectedConversation) private var selectedConversation var body: some View { VStack(spacing: 0.0) { Rectangle() .fill(.separator) .frame(height: 1.0) HStack { TextField("", text: $viewModel.draftText, axis: .vertical) .focusEffectDisabled(true) .textFieldStyle(.plain) .lineLimit(nil) .scrollContentBackground(.hidden) .fixedSize(horizontal: false, vertical: true) .font(.body) .scrollDisabled(true) .padding(8.0) .background { RoundedRectangle(cornerRadius: 6.0) .fill(.background) } Button("Send") { viewModel.sendDraft(to: selectedConversation) } .disabled(viewModel.draftText.isEmpty) .keyboardShortcut(.defaultAction) } .padding(10.0) } } // MARK: - Types @Observable class ViewModel { var draftText: String = "" func sendDraft(to convo: Display.Conversation?) { guard let convo else { return } guard !draftText.isEmpty else { return } let messageText = self.draftText .trimmingCharacters(in: .whitespacesAndNewlines) self.draftText = "" Task { let xpc = XPCClient() do { try await xpc.sendMessage(conversationId: convo.id, message: messageText) } catch { print("Sending error: \(error)") } } } } } #Preview { @Previewable @State var model = MessageEntryView.ViewModel() VStack { Spacer() MessageEntryView(viewModel: $model) } }