WIP: map route updates and custom item drag/drop fixes (broken)
- Fixed map header not updating in ItineraryTableViewWrapper using Coordinator pattern - Added routeVersion UUID to force Map re-render when routes change - Fixed determineAnchor to scan backwards for correct anchor context - Added location support to CustomItineraryItem (lat/lng/address) - Added MapKit place search to AddItemSheet - Added extensive debug logging for route waypoint calculation Known issues: - Custom items still not routing correctly after drag/drop - Anchor type determination may still have bugs Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -638,6 +638,10 @@ struct CKCustomItineraryItem {
|
||||
static let sortOrderKey = "sortOrder"
|
||||
static let createdAtKey = "createdAt"
|
||||
static let modifiedAtKey = "modifiedAt"
|
||||
// Location fields for mappable items
|
||||
static let latitudeKey = "latitude"
|
||||
static let longitudeKey = "longitude"
|
||||
static let addressKey = "address"
|
||||
|
||||
let record: CKRecord
|
||||
|
||||
@@ -660,6 +664,10 @@ struct CKCustomItineraryItem {
|
||||
record[CKCustomItineraryItem.sortOrderKey] = item.sortOrder
|
||||
record[CKCustomItineraryItem.createdAtKey] = item.createdAt
|
||||
record[CKCustomItineraryItem.modifiedAtKey] = item.modifiedAt
|
||||
// Location fields (nil values are not stored in CloudKit)
|
||||
record[CKCustomItineraryItem.latitudeKey] = item.latitude
|
||||
record[CKCustomItineraryItem.longitudeKey] = item.longitude
|
||||
record[CKCustomItineraryItem.addressKey] = item.address
|
||||
self.record = record
|
||||
}
|
||||
|
||||
@@ -681,6 +689,11 @@ struct CKCustomItineraryItem {
|
||||
let anchorId = record[CKCustomItineraryItem.anchorIdKey] as? String
|
||||
let sortOrder = record[CKCustomItineraryItem.sortOrderKey] as? Int ?? 0
|
||||
|
||||
// Location fields (optional - nil if not stored)
|
||||
let latitude = record[CKCustomItineraryItem.latitudeKey] as? Double
|
||||
let longitude = record[CKCustomItineraryItem.longitudeKey] as? Double
|
||||
let address = record[CKCustomItineraryItem.addressKey] as? String
|
||||
|
||||
return CustomItineraryItem(
|
||||
id: itemId,
|
||||
tripId: tripId,
|
||||
@@ -691,7 +704,10 @@ struct CKCustomItineraryItem {
|
||||
anchorDay: anchorDay,
|
||||
sortOrder: sortOrder,
|
||||
createdAt: createdAt,
|
||||
modifiedAt: modifiedAt
|
||||
modifiedAt: modifiedAt,
|
||||
latitude: latitude,
|
||||
longitude: longitude,
|
||||
address: address
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
//
|
||||
|
||||
import Foundation
|
||||
import CoreLocation
|
||||
|
||||
struct CustomItineraryItem: Identifiable, Codable, Hashable {
|
||||
let id: UUID
|
||||
@@ -17,6 +18,22 @@ struct CustomItineraryItem: Identifiable, Codable, Hashable {
|
||||
let createdAt: Date
|
||||
var modifiedAt: Date
|
||||
|
||||
// Optional location for mappable items (from MapKit search)
|
||||
var latitude: Double?
|
||||
var longitude: Double?
|
||||
var address: String?
|
||||
|
||||
/// Whether this item has a location and can be shown on the map
|
||||
var isMappable: Bool {
|
||||
latitude != nil && longitude != nil
|
||||
}
|
||||
|
||||
/// Get coordinate if mappable
|
||||
var coordinate: CLLocationCoordinate2D? {
|
||||
guard let lat = latitude, let lon = longitude else { return nil }
|
||||
return CLLocationCoordinate2D(latitude: lat, longitude: lon)
|
||||
}
|
||||
|
||||
init(
|
||||
id: UUID = UUID(),
|
||||
tripId: UUID,
|
||||
@@ -27,7 +44,10 @@ struct CustomItineraryItem: Identifiable, Codable, Hashable {
|
||||
anchorDay: Int,
|
||||
sortOrder: Int = 0,
|
||||
createdAt: Date = Date(),
|
||||
modifiedAt: Date = Date()
|
||||
modifiedAt: Date = Date(),
|
||||
latitude: Double? = nil,
|
||||
longitude: Double? = nil,
|
||||
address: String? = nil
|
||||
) {
|
||||
self.id = id
|
||||
self.tripId = tripId
|
||||
@@ -39,6 +59,9 @@ struct CustomItineraryItem: Identifiable, Codable, Hashable {
|
||||
self.sortOrder = sortOrder
|
||||
self.createdAt = createdAt
|
||||
self.modifiedAt = modifiedAt
|
||||
self.latitude = latitude
|
||||
self.longitude = longitude
|
||||
self.address = address
|
||||
}
|
||||
|
||||
enum ItemCategory: String, Codable, CaseIterable {
|
||||
|
||||
@@ -60,6 +60,10 @@ actor CustomItemService {
|
||||
existingRecord[CKCustomItineraryItem.anchorDayKey] = item.anchorDay
|
||||
existingRecord[CKCustomItineraryItem.sortOrderKey] = item.sortOrder
|
||||
existingRecord[CKCustomItineraryItem.modifiedAtKey] = now
|
||||
// Location fields (nil values clear the field in CloudKit)
|
||||
existingRecord[CKCustomItineraryItem.latitudeKey] = item.latitude
|
||||
existingRecord[CKCustomItineraryItem.longitudeKey] = item.longitude
|
||||
existingRecord[CKCustomItineraryItem.addressKey] = item.address
|
||||
|
||||
do {
|
||||
try await publicDatabase.save(existingRecord)
|
||||
|
||||
Reference in New Issue
Block a user