Complete rename across all bundle IDs, App Groups, CloudKit containers, StoreKit product IDs, data store filenames, URL schemes, logger subsystems, Swift identifiers, user-facing strings (7 languages), file names, directory names, Xcode project, schemes, assets, and documentation. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
78 lines
1.9 KiB
Swift
78 lines
1.9 KiB
Swift
//
|
|
// WidgetModels.swift
|
|
// ReflectWidget
|
|
//
|
|
// Data models for widget timeline entries
|
|
//
|
|
|
|
import WidgetKit
|
|
import SwiftUI
|
|
import Intents
|
|
|
|
// MARK: - Timeline View Model
|
|
|
|
class WatchTimelineView: Identifiable {
|
|
let id = UUID()
|
|
let image: Image
|
|
let graphic: Image
|
|
let date: Date
|
|
let color: Color
|
|
let secondaryColor: Color
|
|
let mood: Mood
|
|
|
|
init(image: Image, graphic: Image, date: Date, color: Color, secondaryColor: Color, mood: Mood) {
|
|
self.image = image
|
|
self.date = date
|
|
self.color = color
|
|
self.graphic = graphic
|
|
self.secondaryColor = secondaryColor
|
|
self.mood = mood
|
|
}
|
|
}
|
|
|
|
// MARK: - Timeline Widget Entry
|
|
|
|
struct SimpleEntry: TimelineEntry {
|
|
let date: Date
|
|
let configuration: ConfigurationIntent
|
|
let timeLineViews: [WatchTimelineView]?
|
|
let showStats: Bool
|
|
let hasSubscription: Bool
|
|
let hasVotedToday: Bool
|
|
let promptText: String
|
|
|
|
init(date: Date, configuration: ConfigurationIntent, timeLineViews: [WatchTimelineView]?, showStats: Bool = false, hasSubscription: Bool = false, hasVotedToday: Bool = true, promptText: String = "") {
|
|
self.date = date
|
|
self.configuration = configuration
|
|
self.timeLineViews = timeLineViews
|
|
self.showStats = showStats
|
|
self.hasSubscription = hasSubscription
|
|
self.hasVotedToday = hasVotedToday
|
|
self.promptText = promptText
|
|
}
|
|
}
|
|
|
|
// MARK: - Vote Widget Entry
|
|
|
|
struct VoteWidgetEntry: TimelineEntry {
|
|
let date: Date
|
|
let votingDate: Date
|
|
let hasSubscription: Bool
|
|
let hasVotedToday: Bool
|
|
let todaysMood: Mood?
|
|
let stats: MoodStats?
|
|
let promptText: String
|
|
}
|
|
|
|
// MARK: - Mood Stats
|
|
|
|
struct MoodStats {
|
|
let totalEntries: Int
|
|
let moodCounts: [Mood: Int]
|
|
|
|
func percentage(for mood: Mood) -> Double {
|
|
guard totalEntries > 0 else { return 0 }
|
|
return Double(moodCounts[mood, default: 0]) / Double(totalEntries) * 100
|
|
}
|
|
}
|