Files
Reflect/Shared/Persisence/DataControllerADD.swift
Trey t bea2d3bbc9 Update Neon colors and show color circles in theme picker
- Update NeonMoodTint to use synthwave colors matching Neon voting style
  (cyan, lime, yellow, orange, magenta)
- Replace text label with 5 color circles in theme preview Colors row
- Remove unused textColor customization code and picker views
- Add .id(moodTint) to Month/Year views for color refresh
- Clean up various unused color-related code

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-30 00:08:01 -06:00

89 lines
3.0 KiB
Swift

//
// DataControllerADD.swift
// Feels
//
// SwiftData CREATE operations.
//
import SwiftData
import Foundation
extension DataController {
func add(mood: Mood, forDate date: Date, entryType: EntryType) {
// Delete ALL existing entries for this date (handles duplicates)
let existing = getAllEntries(byDate: date)
for entry in existing {
modelContext.delete(entry)
}
if !existing.isEmpty {
try? modelContext.save()
}
let entry = MoodEntryModel(
forDate: date,
mood: mood,
entryType: entryType
)
modelContext.insert(entry)
EventLogger.log(event: "add_entry", withData: ["entry_type": entryType.rawValue])
saveAndRunDataListeners()
}
func fillInMissingDates() {
let currentOnboarding = UserDefaultsStore.getOnboarding()
var endDate = ShowBasedOnVoteLogics.getCurrentVotingDate(onboardingData: currentOnboarding)
// Since it's for views, take away the last date so vote is enabled
endDate = Calendar.current.date(byAdding: .day, value: -1, to: endDate)!
let descriptor = FetchDescriptor<MoodEntryModel>(
sortBy: [SortDescriptor(\.forDate, order: .reverse)]
)
guard let entries = try? modelContext.fetch(descriptor),
let firstEntry = entries.last else { return }
let allDates: [Date] = Date.dates(from: firstEntry.forDate, toDate: endDate, includingToDate: true).map {
Calendar.current.date(bySettingHour: 0, minute: 0, second: 0, of: $0)!
}
let existingDates: Set<Date> = Set(entries.map {
Calendar.current.date(bySettingHour: 0, minute: 0, second: 0, of: $0.forDate)!
})
let missing = Array(Set(allDates).subtracting(existingDates)).sorted(by: >)
guard !missing.isEmpty else { return }
// Batch insert all missing dates without triggering listeners
for date in missing {
// Add 12 hours to avoid UTC offset issues
let adjustedDate = Calendar.current.date(byAdding: .hour, value: 12, to: date)!
let entry = MoodEntryModel(
forDate: adjustedDate,
mood: .missing,
entryType: .filledInMissing
)
modelContext.insert(entry)
}
// Single save and listener notification at the end
saveAndRunDataListeners()
EventLogger.log(event: "filled_in_missing_entries", withData: ["count": missing.count])
}
func fixWrongWeekdays() {
let data = getData(startDate: Date(timeIntervalSince1970: 0), endDate: Date(), includedDays: [])
for entry in data {
entry.weekDay = Calendar.current.component(.weekday, from: entry.forDate)
}
save()
}
func removeNoForDates() {
// Note: With SwiftData's non-optional forDate, this is essentially a no-op
// Keeping for API compatibility
EventLogger.log(event: "removed_entry_no_for_date", withData: ["count": 0])
}
}