Private
Public Access
1
0
Files
Kordophone/kordophone2/MessageEntryView.swift

83 lines
2.2 KiB
Swift

//
// 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)
}
}