AutoCat/AutoCat/Screens/NotesScreen/NotesScreen.swift

99 lines
2.9 KiB
Swift

//
// NotesScreen.swift
// AutoCat
//
// Created by Selim Mustafaev on 24.06.2024.
// Copyright © 2024 Selim Mustafaev. All rights reserved.
//
import SwiftUI
import AutoCatCore
struct NotesScreen: View {
@State var viewModel: NotesViewModel
@State var showNewNoteAlert = false
@State var showEditNoteAlert = false
@State var selectedNoteId = ""
@State var noteText = ""
init(vehicle: VehicleDto, onUpdate: @escaping (VehicleDto) -> Void) {
let resolver = ServiceContainer.shared
self.viewModel = NotesViewModel(
storageService: resolver.resolve(StorageServiceProtocol.self),
apiService: resolver.resolve(ApiServiceProtocol.self),
vehicle: vehicle,
onUpdate: onUpdate
)
}
var body: some View {
List(viewModel.vehicle.notes) { note in
VStack(alignment: .leading) {
Text(note.text)
HStack {
Spacer()
Text(Formatters.standard.string(from: Date(timeIntervalSince1970: note.date)))
.font(.footnote)
.foregroundColor(.secondary)
}
}
.swipeActions(allowsFullSwipe: false) {
makeActions(for: note)
}
.contextMenu {
makeActions(for: note, useLabels: true)
}
}
.listStyle(.inset)
.navigationTitle("Notes")
.titleModeInline()
.toolbar {
ToolbarItem(placement: .primaryAction) {
Button {
noteText = ""
showNewNoteAlert = true
} label: {
Image(systemName: "plus")
}
.noteAlert(title: "New note", body: $noteText, isPresented: $showNewNoteAlert) { text in
Task { await viewModel.addNote(text: text) }
}
}
}
.hud($viewModel.hud)
.noteAlert(title: "Edit note",
body: $noteText,
isPresented: $showEditNoteAlert) { text in
Task { await viewModel.editNote(id: selectedNoteId, text: text) }
}
}
@ViewBuilder
func makeActions(for note: VehicleNoteDto, useLabels: Bool = false) -> some View {
Button() {
selectedNoteId = note.id
noteText = note.text
showEditNoteAlert = true
} label: {
Label(useLabels ? "Edit" : "", systemImage: "pencil")
}
Button() {
viewModel.copyNote(note)
} label: {
Label(useLabels ? "Copy" : "", systemImage: "doc.on.doc")
}
Button(role: .destructive) {
Task { await viewModel.deleteNote(id: note.id) }
} label: {
Label(useLabels ? "Delete" : "", systemImage: "trash")
}
}
}