ChatMastermind/app/ChatMasterMind/ContentView.swift
2023-06-26 17:53:16 +02:00

160 lines
4.7 KiB
Swift

//
// ContentView.swift
// ChatMasterMind
//
// Created by Oleksandr Kozachuk on 2023-06-24.
//
import SwiftUI
import SwiftData
import MarkdownView
struct ContentView: View {
@Environment(\.modelContext) private var modelContext
@Query private var chatHistoryList: [ChatHistory]
var body: some View {
NavigationView {
List {
ForEach(chatHistoryList) { chatHistory in
NavigationLink(destination: ChatHistoryDetailView(chatHistory: chatHistory)) {
Text(chatHistory.name)
}
}
.onDelete(perform: deleteItems)
}
.toolbar {
#if os(iOS)
ToolbarItem(placement: .navigationBarTrailing) {
EditButton()
}
#endif
ToolbarItem {
Button(action: newChat) {
Label("New chat", systemImage: "plus")
}
}
}
Text("Select an chat")
}
}
private func newChat() {
withAnimation {
let newChatHistory = ChatHistory(name: "test1")
modelContext.insert(newChatHistory)
}
}
private func deleteItems(offsets: IndexSet) {
withAnimation {
for index in offsets {
modelContext.delete(chatHistoryList[index])
}
}
}
}
struct ChatHistoryDetailView: View {
@Environment(\.modelContext) private var modelContext
var chatHistory: ChatHistory
@State private var newQuestion: String = ""
@State private var pairToEdit: ChatPair? = nil
@State private var newAnswer: String = ""
var body: some View {
VStack {
List {
ForEach(chatHistory.chatPairs) { chatPair in
VStack(alignment: .leading) {
MarkdownView(text: chatPair.question)
if let answer = chatPair.answer {
MarkdownView(text: answer)
.tint(.secondary)
}
Button(action: {
pairToEdit = chatPair
newAnswer = chatPair.answer ?? ""
}) {
Text("Edit")
.foregroundColor(.blue)
}
}
Text("Timestamp: \(chatPair.timestamp)")
.foregroundColor(.secondary)
.font(.footnote)
}
}
HStack {
TextEditor(text: $newQuestion)
.frame(height: 100)
.overlay(RoundedRectangle(cornerRadius: 5).stroke(Color.gray))
Button(action: {
addChatPair()
}) {
Text("Add")
}
Button(action: {
cancelEdit()
}) {
Text("Cancel")
}
}
.padding()
}
.navigationTitle(chatHistory.name)
.sheet(item: $pairToEdit) { pairToEdit in
VStack {
Text(pairToEdit.question)
TextEditor(text: $newAnswer)
.overlay(RoundedRectangle(cornerRadius: 5).stroke(Color.gray))
.frame(maxHeight: .infinity)
Button(action: {
editChatPair(pairToEdit)
}) {
Text("Save")
}
}
.padding()
}
}
private func addChatPair() {
guard !newQuestion.isEmpty else { return }
withAnimation {
let newPair = ChatPair(question: newQuestion)
chatHistory.chatPairs.append(newPair)
newQuestion = ""
do {
try modelContext.save()
} catch {
print("Error saving model context: \(error)")
}
}
}
private func editChatPair(_ chatPair: ChatPair) {
guard !newAnswer.isEmpty else { return }
withAnimation {
chatHistory.editChatPair(withId: chatPair.id, question: nil, answer: newAnswer)
newAnswer = ""
pairToEdit = nil
do {
try modelContext.save()
} catch {
print("Error saving model context: \(error)")
}
}
}
private func cancelEdit() {
newAnswer = ""
pairToEdit = nil
}
}
#Preview {
ContentView()
.modelContainer(for: ChatHistory.self, inMemory: true)
}