refactor(itinerary): replace CustomItineraryItem with ItineraryItem across codebase

- Update CKModels.swift to remove deleted type references
- Migrate LocalCustomItem to LocalItineraryItem in SavedTrip.swift
- Update AppDelegate to handle subscription removal
- Refactor AddItemSheet to create ItineraryItem with CustomInfo
- Update ItineraryTableViewController and Wrapper for new model
- Refactor TripDetailView state, methods and callbacks
- Fix TripMapView to display custom items with new model structure

This completes the migration from the legacy CustomItineraryItem/TravelDayOverride
model to the unified ItineraryItem model with ItemKind enum.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Trey t
2026-01-17 21:51:32 -06:00
parent b008af1c71
commit cd00384010
7 changed files with 273 additions and 354 deletions

View File

@@ -101,67 +101,62 @@ final class TripVote {
}
}
// MARK: - Local Custom Item (Cache)
// MARK: - Local Itinerary Item (Cache)
@Model
final class LocalCustomItem {
final class LocalItineraryItem {
@Attribute(.unique) var id: UUID
var tripId: UUID
var category: String
var title: String
var day: Int
var sortOrder: Double
var createdAt: Date
var kindData: Data // Encoded ItineraryItem.Kind
var modifiedAt: Date
var pendingSync: Bool // True if needs to sync to CloudKit
init(
id: UUID = UUID(),
tripId: UUID,
category: CustomItineraryItem.ItemCategory,
title: String,
day: Int,
sortOrder: Double = 0.0,
createdAt: Date = Date(),
kindData: Data,
modifiedAt: Date = Date(),
pendingSync: Bool = false
) {
self.id = id
self.tripId = tripId
self.category = category.rawValue
self.title = title
self.day = day
self.sortOrder = sortOrder
self.createdAt = createdAt
self.kindData = kindData
self.modifiedAt = modifiedAt
self.pendingSync = pendingSync
}
var toItem: CustomItineraryItem? {
guard let category = CustomItineraryItem.ItemCategory(rawValue: category)
var toItem: ItineraryItem? {
let decoder = JSONDecoder()
guard let kind = try? decoder.decode(ItemKind.self, from: kindData)
else { return nil }
return CustomItineraryItem(
return ItineraryItem(
id: id,
tripId: tripId,
category: category,
title: title,
day: day,
sortOrder: sortOrder,
createdAt: createdAt,
kind: kind,
modifiedAt: modifiedAt
)
}
static func from(_ item: CustomItineraryItem, pendingSync: Bool = false) -> LocalCustomItem {
LocalCustomItem(
static func from(_ item: ItineraryItem, pendingSync: Bool = false) -> LocalItineraryItem? {
let encoder = JSONEncoder()
guard let kindData = try? encoder.encode(item.kind)
else { return nil }
return LocalItineraryItem(
id: item.id,
tripId: item.tripId,
category: item.category,
title: item.title,
day: item.day,
sortOrder: item.sortOrder,
createdAt: item.createdAt,
kindData: kindData,
modifiedAt: item.modifiedAt,
pendingSync: pendingSync
)