99 lines
2.9 KiB
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")
|
|
}
|
|
}
|
|
}
|