Adds getting/sending messages
This commit is contained in:
80
kordophone2/MessageEntryView.swift
Normal file
80
kordophone2/MessageEntryView.swift
Normal file
@@ -0,0 +1,80 @@
|
||||
//
|
||||
// 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)
|
||||
.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
|
||||
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)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user