From ba773aaa9da5798a458ee58f7ce37db070ada7d8 Mon Sep 17 00:00:00 2001 From: Christian Cleberg Date: Sat, 11 Apr 2026 19:47:47 -0500 Subject: feat: add contribution graph widget with adaptive layout Add small and medium widget families showing a trailing contribution heatmap. Cell size is derived from available height to fill 7 rows, columns scale with width. Trailing empty weeks are trimmed. --- Shared/ContributionWidgetContext.swift | 36 ++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 Shared/ContributionWidgetContext.swift (limited to 'Shared') diff --git a/Shared/ContributionWidgetContext.swift b/Shared/ContributionWidgetContext.swift new file mode 100644 index 0000000..3fadc8a --- /dev/null +++ b/Shared/ContributionWidgetContext.swift @@ -0,0 +1,36 @@ +import Foundation +#if canImport(WidgetKit) +import WidgetKit +#endif + +enum ContributionGraphWidgetConfiguration { + static let kind = "ContributionGraphWidget" +} + +enum ContributionWidgetContextStore { + private static let actorKey = "contributionWidget.actor" + + static func loadActor(defaults: UserDefaults? = sharedDefaults()) -> String? { + defaults?.string(forKey: actorKey) + } + + static func saveActor(_ actor: String, defaults: UserDefaults? = sharedDefaults()) { + defaults?.set(actor, forKey: actorKey) + reloadWidgetTimelines() + } + + static func clear(defaults: UserDefaults? = sharedDefaults()) { + defaults?.removeObject(forKey: actorKey) + reloadWidgetTimelines() + } + + private static func sharedDefaults() -> UserDefaults? { + UserDefaults(suiteName: HutchAppGroup.identifier) + } + + private static func reloadWidgetTimelines() { + #if canImport(WidgetKit) + WidgetCenter.shared.reloadTimelines(ofKind: ContributionGraphWidgetConfiguration.kind) + #endif + } +} -- cgit v1.2.3