Files
Reflect/ReflectWidget/ReflectGraphicWidget.swift
Trey t 0442eab1f8 Rebrand entire project from Feels to Reflect
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>
2026-02-26 11:47:16 -06:00

95 lines
2.6 KiB
Swift

//
// ReflectGraphicWidget.swift
// ReflectWidget
//
// Graphic mood widget (small only)
//
import WidgetKit
import SwiftUI
import Intents
// MARK: - Widget Configuration
struct ReflectGraphicWidget: Widget {
let kind: String = "ReflectGraphicWidget"
var body: some WidgetConfiguration {
IntentConfiguration(kind: kind,
intent: ConfigurationIntent.self,
provider: Provider()) { entry in
ReflectGraphicWidgetEntryView(entry: entry)
}
.configurationDisplayName("Mood Graphic")
.description("")
.supportedFamilies([.systemSmall])
.contentMarginsDisabled()
}
}
// MARK: - Entry View
struct ReflectGraphicWidgetEntryView: View {
@Environment(\.sizeCategory) var sizeCategory
@Environment(\.widgetFamily) var family
var entry: Provider.Entry
@ViewBuilder
var body: some View {
SmallGraphicWidgetView(entry: entry)
}
}
// MARK: - Small Graphic Widget View
struct SmallGraphicWidgetView: View {
var entry: Provider.Entry
var timeLineView: [WatchTimelineView]
init(entry: Provider.Entry) {
self.entry = entry
let realData = TimeLineCreator.createViews(daysBack: 2)
// Check if we have any real mood data (not all missing)
let hasRealData = realData.contains { view in
let moodTint: MoodTintable.Type = UserDefaultsStore.moodTintable()
return view.color != moodTint.color(forMood: .missing)
}
timeLineView = hasRealData ? realData : TimeLineCreator.createSampleViews(count: 2)
}
private var iconViewModel: IconViewModel {
if let first = timeLineView.first {
return IconViewModel(backgroundImage: first.graphic,
bgColor: first.color,
bgOverlayColor: first.secondaryColor,
centerImage: first.graphic,
innerColor: first.color)
} else {
return IconViewModel.great
}
}
var body: some View {
Color.clear
.containerBackground(for: .widget) {
IconView(iconViewModel: iconViewModel)
}
}
}
// MARK: - Previews
#Preview("Graphic - Great", as: .systemSmall) {
ReflectGraphicWidget()
} timeline: {
SimpleEntry(
date: Date(),
configuration: ConfigurationIntent(),
timeLineViews: nil,
hasSubscription: true,
hasVotedToday: true,
promptText: ""
)
}