Copying events
This commit is contained in:
parent
cb02fe6746
commit
197f93037a
@ -2,6 +2,19 @@
|
|||||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
<plist version="1.0">
|
<plist version="1.0">
|
||||||
<dict>
|
<dict>
|
||||||
|
<key>UTExportedTypeDeclarations</key>
|
||||||
|
<array>
|
||||||
|
<dict>
|
||||||
|
<key>UTTypeConformsTo</key>
|
||||||
|
<array>
|
||||||
|
<string>public.json</string>
|
||||||
|
</array>
|
||||||
|
<key>UTTypeIdentifier</key>
|
||||||
|
<string>pro.aliencat.vehicle.event</string>
|
||||||
|
<key>UTTypeTagSpecification</key>
|
||||||
|
<dict/>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
<key>LSApplicationQueriesSchemes</key>
|
<key>LSApplicationQueriesSchemes</key>
|
||||||
<array>
|
<array>
|
||||||
<string>yandexmaps</string>
|
<string>yandexmaps</string>
|
||||||
|
|||||||
@ -28,6 +28,13 @@ struct EventsScreen: View {
|
|||||||
.hud($viewModel.hud)
|
.hud($viewModel.hud)
|
||||||
.navigationTitle(viewModel.vehicle.number)
|
.navigationTitle(viewModel.vehicle.number)
|
||||||
.toolbar {
|
.toolbar {
|
||||||
|
if viewModel.isPasteAvailable {
|
||||||
|
ToolbarItem(placement: .primaryAction) {
|
||||||
|
Button("", systemImage: "document.on.clipboard") {
|
||||||
|
viewModel.confirmPaste()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
ToolbarItem(placement: .primaryAction) {
|
ToolbarItem(placement: .primaryAction) {
|
||||||
Button("", systemImage: "plus") {
|
Button("", systemImage: "plus") {
|
||||||
Task { await viewModel.addNewEvent() }
|
Task { await viewModel.addNewEvent() }
|
||||||
@ -39,6 +46,18 @@ struct EventsScreen: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
.alert("Paste event",
|
||||||
|
isPresented: $viewModel.showPasteAlert,
|
||||||
|
presenting: viewModel.pastedEvent) { event in
|
||||||
|
Button("Cancel", role: .cancel, action: {})
|
||||||
|
Button("OK") {
|
||||||
|
viewModel.pasteEvent(event)
|
||||||
|
}
|
||||||
|
.keyboardShortcut(.defaultAction)
|
||||||
|
} message: { event in
|
||||||
|
Text(viewModel.getConfirmMessge(from: event))
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var map: some View {
|
var map: some View {
|
||||||
@ -92,7 +111,7 @@ struct EventsScreen: View {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Button() {
|
Button() {
|
||||||
|
viewModel.copyEvent(event)
|
||||||
} label: {
|
} label: {
|
||||||
Label(useLabels ? "Copy" : "", systemImage: "doc.on.doc")
|
Label(useLabels ? "Copy" : "", systemImage: "doc.on.doc")
|
||||||
}
|
}
|
||||||
|
|||||||
@ -9,6 +9,15 @@
|
|||||||
import SwiftUI
|
import SwiftUI
|
||||||
import AutoCatCore
|
import AutoCatCore
|
||||||
import CoreLocation
|
import CoreLocation
|
||||||
|
import UniformTypeIdentifiers
|
||||||
|
import MobileCoreServices
|
||||||
|
|
||||||
|
extension UTType {
|
||||||
|
|
||||||
|
static var vehicleEvent: UTType {
|
||||||
|
UTType(exportedAs: "pro.aliencat.vehicle.event", conformingTo: .json)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@MainActor
|
@MainActor
|
||||||
@Observable
|
@Observable
|
||||||
@ -28,9 +37,17 @@ class EventsViewModel: ACHudContainer {
|
|||||||
var mode: EventsScreenMode = .map
|
var mode: EventsScreenMode = .map
|
||||||
var events: [EventModel] = []
|
var events: [EventModel] = []
|
||||||
|
|
||||||
|
var showPasteAlert: Bool = false
|
||||||
|
var pastedEvent: VehicleEventDto?
|
||||||
|
|
||||||
|
var isPasteAvailable: Bool {
|
||||||
|
UIPasteboard.general.data(forPasteboardType: UTType.vehicleEvent.identifier) != nil
|
||||||
|
}
|
||||||
|
|
||||||
init(vehicle: VehicleDto) {
|
init(vehicle: VehicleDto) {
|
||||||
|
|
||||||
self.vehicle = vehicle
|
self.vehicle = vehicle
|
||||||
|
|
||||||
updateEvents()
|
updateEvents()
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -111,4 +128,52 @@ class EventsViewModel: ACHudContainer {
|
|||||||
self.vehicle = vehicle
|
self.vehicle = vehicle
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func getMapLink(for event: VehicleEventDto) -> URL? {
|
||||||
|
var urlString = "http://maps.apple.com/?sll=\(event.latitude),\(event.longitude)"
|
||||||
|
if let address = event.address?.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) {
|
||||||
|
urlString = urlString + "&address=" + address
|
||||||
|
}
|
||||||
|
return URL(string: urlString)
|
||||||
|
}
|
||||||
|
|
||||||
|
func copyEvent(_ event: EventModel) {
|
||||||
|
guard let eventDto = vehicle.events.first(where: { $0.id == event.id }) else {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
let sharedData: [String: Any?] = [
|
||||||
|
UTType.url.identifier: getMapLink(for: eventDto),
|
||||||
|
UTType.vehicleEvent.identifier: try? JSONEncoder().encode(eventDto)
|
||||||
|
]
|
||||||
|
|
||||||
|
let items = sharedData.compactMapValues { $0 }
|
||||||
|
|
||||||
|
if !items.isEmpty {
|
||||||
|
UIPasteboard.general.items = [items]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func confirmPaste() {
|
||||||
|
guard let data = UIPasteboard.general.data(forPasteboardType: UTType.vehicleEvent.identifier),
|
||||||
|
var eventDto = try? JSONDecoder().decode(VehicleEventDto.self, from: data)
|
||||||
|
else {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
eventDto.id = UUID().uuidString
|
||||||
|
pastedEvent = eventDto
|
||||||
|
showPasteAlert = true
|
||||||
|
}
|
||||||
|
|
||||||
|
func getConfirmMessge(from event: VehicleEventDto) -> String {
|
||||||
|
let date = Formatters.marker.string(from: Date(timeIntervalSince1970: event.date))
|
||||||
|
let location = event.address ?? "\(event.latitude), \(event.longitude)"
|
||||||
|
|
||||||
|
return date + "\n" + location
|
||||||
|
}
|
||||||
|
|
||||||
|
func pasteEvent(_ event: VehicleEventDto) {
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user