Migrate from Core Data to SwiftData

- Replace Core Data with SwiftData for iOS 18+
- Create MoodEntryModel as @Model class replacing MoodEntry entity
- Create SharedModelContainer for App Group container sharing
- Create DataController with CRUD extensions replacing PersistenceController
- Update all views and view models to use MoodEntryModel
- Update widget extension to use SwiftData
- Remove old Core Data files (Persistence*.swift, .xcdatamodeld)
- Add EntryType enum with all entry type cases
- Fix widget label truncation with proper spacing and text scaling

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Trey t
2025-12-10 15:08:05 -06:00
parent 443f4dfc55
commit aaaf04f05e
51 changed files with 926 additions and 962 deletions

View File

@@ -13,21 +13,21 @@ typealias Month = Int
protocol ChartDataBuildable {
associatedtype ChartType: ChartViewItemBuildable
// [Year: [Month: [View]]
func buildGridData(withData data: [MoodEntry]) -> [Year: [Month: [ChartType]]]
func buildGridData(withData data: [MoodEntryModel]) -> [Year: [Month: [ChartType]]]
}
extension ChartDataBuildable {
public func buildGridData(withData data: [MoodEntry]) -> [Year: [Month: [ChartType]]] {
public func buildGridData(withData data: [MoodEntryModel]) -> [Year: [Month: [ChartType]]] {
var returnData = [Int: [Int: [ChartType]]]()
if let earliestEntry = data.first,
let lastEntry = data.last {
let calendar = Calendar.current
let components = calendar.dateComponents([.year], from: earliestEntry.forDate!)
let components = calendar.dateComponents([.year], from: earliestEntry.forDate)
let earliestYear = components.year!
let latestComponents = calendar.dateComponents([.year], from: lastEntry.forDate!)
let latestComponents = calendar.dateComponents([.year], from: lastEntry.forDate)
let latestYear = latestComponents.year!
for year in earliestYear...latestYear {
@@ -49,10 +49,10 @@ extension ChartDataBuildable {
components.month = month
components.year = year
let startDateOfMonth = Calendar.current.date(from: components)!
let items = data.filter({ entry in
let components = calendar.dateComponents([.month, .year], from: startDateOfMonth)
let entryComponents = calendar.dateComponents([.month, .year], from: entry.forDate!)
let entryComponents = calendar.dateComponents([.month, .year], from: entry.forDate)
return (components.month == entryComponents.month && components.year == entryComponents.year)
})
@@ -64,16 +64,16 @@ extension ChartDataBuildable {
return returnData
}
private func createViewFor(monthEntries: [MoodEntry], forMonth month: Date) -> [ChartType] {
private func createViewFor(monthEntries: [MoodEntryModel], forMonth month: Date) -> [ChartType] {
var filledOutArray = [ChartType]()
let calendar = Calendar.current
let range = calendar.range(of: .day, in: .month, for: month)!
let numDays = range.count
for day in 1...numDays {
if let item = monthEntries.filter({ entry in
let components = calendar.dateComponents([.day], from: entry.forDate!)
let components = calendar.dateComponents([.day], from: entry.forDate)
let date = components.day
return day == date
}).first {