Files
Reflect/Shared/Models/MoodEntryModel.swift
Trey t 31fb2a7fe2 Add weather feature with WeatherKit integration for mood entries
Fetch and display weather data (temp, condition, hi/lo, humidity) when
users log a mood. Weather is stored as JSON on MoodEntryModel and shown
as a card in EntryDetailView. Premium-gated with location permission
prompt. Includes BGTask retry for failed fetches and full analytics.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 00:16:26 -05:00

104 lines
2.4 KiB
Swift

//
// MoodEntryModel.swift
// Reflect
//
// SwiftData model replacing Core Data MoodEntry
//
import Foundation
import SwiftData
// MARK: - Entry Type Enum
enum EntryType: Int, Codable {
case listView = 0
case widget = 1
case watch = 2
case shortcut = 3
case filledInMissing = 4
case notification = 5
case header = 6
case siri = 7
case controlCenter = 8
case liveActivity = 9
}
// MARK: - SwiftData Model
@Model
final class MoodEntryModel {
// Primary attributes - CloudKit requires default values
var forDate: Date = Date()
var moodValue: Int = 0
var timestamp: Date = Date()
var weekDay: Int = 1
var entryType: Int = 0
// Metadata - CloudKit requires default values
var canEdit: Bool = true
var canDelete: Bool = true
// Journal & Media (NEW)
var notes: String?
var photoID: UUID?
// Weather
var weatherJSON: String?
// Computed properties
var mood: Mood {
Mood(rawValue: moodValue) ?? .missing
}
var moodString: String {
mood.strValue
}
init(
forDate: Date,
mood: Mood,
entryType: EntryType,
canEdit: Bool = true,
canDelete: Bool = true,
notes: String? = nil,
photoID: UUID? = nil,
weatherJSON: String? = nil
) {
self.forDate = forDate
self.moodValue = mood.rawValue
self.timestamp = Date()
self.weekDay = Calendar.current.component(.weekday, from: forDate)
self.entryType = entryType.rawValue
self.canEdit = canEdit
self.canDelete = canDelete
self.notes = notes
self.photoID = photoID
self.weatherJSON = weatherJSON
}
// Convenience initializer for raw values
init(
forDate: Date,
moodValue: Int,
entryType: Int,
timestamp: Date = Date(),
weekDay: Int? = nil,
canEdit: Bool = true,
canDelete: Bool = true,
notes: String? = nil,
photoID: UUID? = nil,
weatherJSON: String? = nil
) {
self.forDate = forDate
self.moodValue = moodValue
self.timestamp = timestamp
self.weekDay = weekDay ?? Calendar.current.component(.weekday, from: forDate)
self.entryType = entryType
self.canEdit = canEdit
self.canDelete = canDelete
self.notes = notes
self.photoID = photoID
self.weatherJSON = weatherJSON
}
}