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">
|
||||
<plist version="1.0">
|
||||
<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>
|
||||
<array>
|
||||
<string>yandexmaps</string>
|
||||
|
||||
@ -28,6 +28,13 @@ struct EventsScreen: View {
|
||||
.hud($viewModel.hud)
|
||||
.navigationTitle(viewModel.vehicle.number)
|
||||
.toolbar {
|
||||
if viewModel.isPasteAvailable {
|
||||
ToolbarItem(placement: .primaryAction) {
|
||||
Button("", systemImage: "document.on.clipboard") {
|
||||
viewModel.confirmPaste()
|
||||
}
|
||||
}
|
||||
}
|
||||
ToolbarItem(placement: .primaryAction) {
|
||||
Button("", systemImage: "plus") {
|
||||
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 {
|
||||
@ -92,7 +111,7 @@ struct EventsScreen: View {
|
||||
}
|
||||
|
||||
Button() {
|
||||
|
||||
viewModel.copyEvent(event)
|
||||
} label: {
|
||||
Label(useLabels ? "Copy" : "", systemImage: "doc.on.doc")
|
||||
}
|
||||
|
||||
@ -9,6 +9,15 @@
|
||||
import SwiftUI
|
||||
import AutoCatCore
|
||||
import CoreLocation
|
||||
import UniformTypeIdentifiers
|
||||
import MobileCoreServices
|
||||
|
||||
extension UTType {
|
||||
|
||||
static var vehicleEvent: UTType {
|
||||
UTType(exportedAs: "pro.aliencat.vehicle.event", conformingTo: .json)
|
||||
}
|
||||
}
|
||||
|
||||
@MainActor
|
||||
@Observable
|
||||
@ -28,9 +37,17 @@ class EventsViewModel: ACHudContainer {
|
||||
var mode: EventsScreenMode = .map
|
||||
var events: [EventModel] = []
|
||||
|
||||
var showPasteAlert: Bool = false
|
||||
var pastedEvent: VehicleEventDto?
|
||||
|
||||
var isPasteAvailable: Bool {
|
||||
UIPasteboard.general.data(forPasteboardType: UTType.vehicleEvent.identifier) != nil
|
||||
}
|
||||
|
||||
init(vehicle: VehicleDto) {
|
||||
|
||||
self.vehicle = vehicle
|
||||
|
||||
updateEvents()
|
||||
}
|
||||
|
||||
@ -111,4 +128,52 @@ class EventsViewModel: ACHudContainer {
|
||||
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