From 28f8b4a0f161c8b497947abd5ce7a05cc8890242 Mon Sep 17 00:00:00 2001 From: kutesir Date: Fri, 29 May 2026 10:36:39 +0300 Subject: [PATCH] Remove widget extension Delete KisaniCalWidget target, Shared/WidgetDataStore, WidgetBridge, App Group entitlements, and all syncWidget() calls. --- KisaniCal.xcodeproj/project.pbxproj | 144 ------ .../xcshareddata/WorkspaceSettings.xcsettings | 6 +- .../UserInterfaceState.xcuserstate | Bin 25582 -> 25936 bytes KisaniCal/ContentView.swift | 6 +- KisaniCal/WidgetBridge.swift | 41 -- KisaniCalWidget/KisaniCalWidget.entitlements | 10 - KisaniCalWidget/KisaniCalWidget.swift | 414 ------------------ Shared/WidgetDataStore.swift | 61 --- project.yml | 23 - 9 files changed, 3 insertions(+), 702 deletions(-) rename KisaniCal/KisaniCal.entitlements => KisaniCal.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings (58%) delete mode 100644 KisaniCal/WidgetBridge.swift delete mode 100644 KisaniCalWidget/KisaniCalWidget.entitlements delete mode 100644 KisaniCalWidget/KisaniCalWidget.swift delete mode 100644 Shared/WidgetDataStore.swift diff --git a/KisaniCal.xcodeproj/project.pbxproj b/KisaniCal.xcodeproj/project.pbxproj index 02210a5..85b6af9 100644 --- a/KisaniCal.xcodeproj/project.pbxproj +++ b/KisaniCal.xcodeproj/project.pbxproj @@ -10,10 +10,7 @@ 096804560A2F0A7D74E64780 /* TaskItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCC2AFB4FA765383740767CB /* TaskItem.swift */; }; 13E4B9854F595394FC9D5912 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BC5E179A9189B0A8C3F856F6 /* ContentView.swift */; }; 1A22EE21460821170E44B1DF /* ExerciseModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5722CC4B59E3939724142710 /* ExerciseModels.swift */; }; - 3256F64040E5BBCD30644047 /* WidgetDataStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = A3364C849866EAAA5FEB46A1 /* WidgetDataStore.swift */; }; 3C793FD5DA00D3E9C0D51FEC /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 72FDF9C8DD37134576356B89 /* Assets.xcassets */; }; - 46D78859DD34FDE6172F213D /* KisaniCalWidget.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 363924D4E7E82486E23C1C57 /* KisaniCalWidget.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; - 4F829CF0B3BD04CD2EAB8C73 /* WidgetBridge.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8934E4F21B90C9650F71D0A2 /* WidgetBridge.swift */; }; 67CE1747E5DB3FDA79D0FDFD /* OnboardingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 106EEF572C6F8990408329F0 /* OnboardingView.swift */; }; 6921CB73A3257502FF778381 /* SplashView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE2D50B4B4AC227BD21F4B60 /* SplashView.swift */; }; 7CEBC340BFA9238D121946AC /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 57714B79AFFF60DA90EB86E3 /* Preview Assets.xcassets */; }; @@ -24,57 +21,25 @@ A3B2D6622A2EE35C8D5A3C9B /* SettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 72308FEE0226F45414C04DDD /* SettingsView.swift */; }; A9FF93259AE8FF0ABF69D71A /* DesignTokens.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD4A35C0E1270E2E15C03F23 /* DesignTokens.swift */; }; BEAFF968632A34C70B11C5AC /* MatrixView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D44530A77DF12A17E52AAF34 /* MatrixView.swift */; }; - C1B3FC29820FCAF069D2C6FE /* KisaniCalWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 825C519927190A5CDB3CD4A8 /* KisaniCalWidget.swift */; }; C79C33BE2802E81AA00175CC /* TodayView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C786EBC7DF879D64EB28165E /* TodayView.swift */; }; CBE7295BF5ADE08FE93AFAAF /* FloatingTabState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9100804DB1E61EA882CC54DA /* FloatingTabState.swift */; }; - CF130E143FC6FFE2FE853FB6 /* WidgetDataStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = A3364C849866EAAA5FEB46A1 /* WidgetDataStore.swift */; }; D591A72235A53D4038FBC2B4 /* KisaniCalApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 001F67ADC72FBAEC03EB7E01 /* KisaniCalApp.swift */; }; EF03EC9F974B14D100DD5528 /* NotificationManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 93D045FE3DEB1D22D908A29F /* NotificationManager.swift */; }; /* End PBXBuildFile section */ -/* Begin PBXContainerItemProxy section */ - D4A1B57264F223C8871E1BC9 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = AF6DE7A812408E3742522E90 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 532C52E96C1EE1E30A7E9157; - remoteInfo = KisaniCalWidget; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXCopyFilesBuildPhase section */ - B3BE3000B362E4DDC4EE9E76 /* Embed Foundation Extensions */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 13; - files = ( - 46D78859DD34FDE6172F213D /* KisaniCalWidget.appex in Embed Foundation Extensions */, - ); - name = "Embed Foundation Extensions"; - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXCopyFilesBuildPhase section */ - /* Begin PBXFileReference section */ 001F67ADC72FBAEC03EB7E01 /* KisaniCalApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KisaniCalApp.swift; sourceTree = ""; }; 106EEF572C6F8990408329F0 /* OnboardingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnboardingView.swift; sourceTree = ""; }; - 1AA7498EFED7692022F3E7E1 /* KisaniCal.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = KisaniCal.entitlements; sourceTree = ""; }; 20DAD771EFCC8B3B1DBD4DD6 /* WorkoutView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WorkoutView.swift; sourceTree = ""; }; 23A4491BFA50721082024756 /* SharedComponents.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SharedComponents.swift; sourceTree = ""; }; - 363924D4E7E82486E23C1C57 /* KisaniCalWidget.appex */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = "wrapper.app-extension"; path = KisaniCalWidget.appex; sourceTree = BUILT_PRODUCTS_DIR; }; 5722CC4B59E3939724142710 /* ExerciseModels.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExerciseModels.swift; sourceTree = ""; }; 57714B79AFFF60DA90EB86E3 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; 72308FEE0226F45414C04DDD /* SettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsView.swift; sourceTree = ""; }; 72FDF9C8DD37134576356B89 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - 74EE7C2E74094E3E27FD78E4 /* KisaniCalWidget.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = KisaniCalWidget.entitlements; sourceTree = ""; }; 768D4E314252E2A90A06CCF2 /* AddExerciseSheet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddExerciseSheet.swift; sourceTree = ""; }; - 825C519927190A5CDB3CD4A8 /* KisaniCalWidget.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KisaniCalWidget.swift; sourceTree = ""; }; - 8934E4F21B90C9650F71D0A2 /* WidgetBridge.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WidgetBridge.swift; sourceTree = ""; }; 9100804DB1E61EA882CC54DA /* FloatingTabState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FloatingTabState.swift; sourceTree = ""; }; 93D045FE3DEB1D22D908A29F /* NotificationManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationManager.swift; sourceTree = ""; }; 9BD1F84B4F45B12CB9B9F1B2 /* KisaniCal.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = KisaniCal.app; sourceTree = BUILT_PRODUCTS_DIR; }; - A3364C849866EAAA5FEB46A1 /* WidgetDataStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WidgetDataStore.swift; sourceTree = ""; }; ADF6CCD95A587E26E30F5712 /* CalendarView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CalendarView.swift; sourceTree = ""; }; BC5E179A9189B0A8C3F856F6 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; BD4A35C0E1270E2E15C03F23 /* DesignTokens.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DesignTokens.swift; sourceTree = ""; }; @@ -85,15 +50,6 @@ /* End PBXFileReference section */ /* Begin PBXGroup section */ - 10E8E769F7D262FF425B460B /* KisaniCalWidget */ = { - isa = PBXGroup; - children = ( - 74EE7C2E74094E3E27FD78E4 /* KisaniCalWidget.entitlements */, - 825C519927190A5CDB3CD4A8 /* KisaniCalWidget.swift */, - ); - path = KisaniCalWidget; - sourceTree = ""; - }; 21B93C269F283F11B415B18C /* Components */ = { isa = PBXGroup; children = ( @@ -103,14 +59,6 @@ path = Components; sourceTree = ""; }; - 2217B7EEC45957B820311EC7 /* Shared */ = { - isa = PBXGroup; - children = ( - A3364C849866EAAA5FEB46A1 /* WidgetDataStore.swift */, - ); - path = Shared; - sourceTree = ""; - }; 23CBCF100C5EF55E737379CA /* Models */ = { isa = PBXGroup; children = ( @@ -124,8 +72,6 @@ isa = PBXGroup; children = ( F70DA4746C68CD405435DAB6 /* KisaniCal */, - 10E8E769F7D262FF425B460B /* KisaniCalWidget */, - 2217B7EEC45957B820311EC7 /* Shared */, 51BD1B5DEDE9FAD9CA2FF6DA /* Products */, ); sourceTree = ""; @@ -134,7 +80,6 @@ isa = PBXGroup; children = ( 9BD1F84B4F45B12CB9B9F1B2 /* KisaniCal.app */, - 363924D4E7E82486E23C1C57 /* KisaniCalWidget.appex */, ); name = Products; sourceTree = ""; @@ -175,9 +120,7 @@ children = ( 72FDF9C8DD37134576356B89 /* Assets.xcassets */, BC5E179A9189B0A8C3F856F6 /* ContentView.swift */, - 1AA7498EFED7692022F3E7E1 /* KisaniCal.entitlements */, 001F67ADC72FBAEC03EB7E01 /* KisaniCalApp.swift */, - 8934E4F21B90C9650F71D0A2 /* WidgetBridge.swift */, 21B93C269F283F11B415B18C /* Components */, FB9BF734B9E493EEB09ACE21 /* Managers */, 23CBCF100C5EF55E737379CA /* Models */, @@ -205,12 +148,10 @@ buildPhases = ( 82EA49FE155821D424C46912 /* Sources */, E1F1A3EE4469B851B972E4AE /* Resources */, - B3BE3000B362E4DDC4EE9E76 /* Embed Foundation Extensions */, ); buildRules = ( ); dependencies = ( - 3FA0FA885B1A4FC539D57049 /* PBXTargetDependency */, ); name = KisaniCal; packageProductDependencies = ( @@ -219,23 +160,6 @@ productReference = 9BD1F84B4F45B12CB9B9F1B2 /* KisaniCal.app */; productType = "com.apple.product-type.application"; }; - 532C52E96C1EE1E30A7E9157 /* KisaniCalWidget */ = { - isa = PBXNativeTarget; - buildConfigurationList = 6B8469B838ACDD00336D1CAD /* Build configuration list for PBXNativeTarget "KisaniCalWidget" */; - buildPhases = ( - B3D66A55B74C7B9AE6099149 /* Sources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = KisaniCalWidget; - packageProductDependencies = ( - ); - productName = KisaniCalWidget; - productReference = 363924D4E7E82486E23C1C57 /* KisaniCalWidget.appex */; - productType = "com.apple.product-type.app-extension"; - }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ @@ -248,9 +172,6 @@ 297C0C2BFBA10AB52D5D49CE = { ProvisioningStyle = Automatic; }; - 532C52E96C1EE1E30A7E9157 = { - ProvisioningStyle = Automatic; - }; }; }; buildConfigurationList = EF1C4F3BDA4AA7E008FC2CDE /* Build configuration list for PBXProject "KisaniCal" */; @@ -268,7 +189,6 @@ projectRoot = ""; targets = ( 297C0C2BFBA10AB52D5D49CE /* KisaniCal */, - 532C52E96C1EE1E30A7E9157 /* KisaniCalWidget */, ); }; /* End PBXProject section */ @@ -305,38 +225,18 @@ 6921CB73A3257502FF778381 /* SplashView.swift in Sources */, 096804560A2F0A7D74E64780 /* TaskItem.swift in Sources */, C79C33BE2802E81AA00175CC /* TodayView.swift in Sources */, - 4F829CF0B3BD04CD2EAB8C73 /* WidgetBridge.swift in Sources */, - 3256F64040E5BBCD30644047 /* WidgetDataStore.swift in Sources */, 9E3F966F6B6AF2E4F8109E51 /* WorkoutView.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - B3D66A55B74C7B9AE6099149 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - C1B3FC29820FCAF069D2C6FE /* KisaniCalWidget.swift in Sources */, - CF130E143FC6FFE2FE853FB6 /* WidgetDataStore.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; /* End PBXSourcesBuildPhase section */ -/* Begin PBXTargetDependency section */ - 3FA0FA885B1A4FC539D57049 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 532C52E96C1EE1E30A7E9157 /* KisaniCalWidget */; - targetProxy = D4A1B57264F223C8871E1BC9 /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - /* Begin XCBuildConfiguration section */ 0CEA6637F45C32A237FBA20D /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; - CODE_SIGN_ENTITLEMENTS = KisaniCal/KisaniCal.entitlements; CODE_SIGN_IDENTITY = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; ENABLE_PREVIEWS = YES; @@ -417,40 +317,6 @@ }; name = Release; }; - 47C8DA15444717168992CD67 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_ENTITLEMENTS = KisaniCalWidget/KisaniCalWidget.entitlements; - CODE_SIGN_STYLE = Automatic; - GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_KEY_NSExtensionPointIdentifier = "com.apple.widgetkit-extension"; - IPHONEOS_DEPLOYMENT_TARGET = 17.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.kutesir.KisaniCal.widget; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_VERSION = 5.9; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 9F668AA275094D23AACA2F61 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_ENTITLEMENTS = KisaniCalWidget/KisaniCalWidget.entitlements; - CODE_SIGN_STYLE = Automatic; - GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_KEY_NSExtensionPointIdentifier = "com.apple.widgetkit-extension"; - IPHONEOS_DEPLOYMENT_TARGET = 17.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.kutesir.KisaniCal.widget; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_VERSION = 5.9; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Release; - }; BD527AA54887489CC665FB9D /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -519,7 +385,6 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; - CODE_SIGN_ENTITLEMENTS = KisaniCal/KisaniCal.entitlements; CODE_SIGN_IDENTITY = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; ENABLE_PREVIEWS = YES; @@ -547,15 +412,6 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - 6B8469B838ACDD00336D1CAD /* Build configuration list for PBXNativeTarget "KisaniCalWidget" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 47C8DA15444717168992CD67 /* Debug */, - 9F668AA275094D23AACA2F61 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Debug; - }; B60FDD2C88D1D33CF1EC02B3 /* Build configuration list for PBXNativeTarget "KisaniCal" */ = { isa = XCConfigurationList; buildConfigurations = ( diff --git a/KisaniCal/KisaniCal.entitlements b/KisaniCal.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings similarity index 58% rename from KisaniCal/KisaniCal.entitlements rename to KisaniCal.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings index 6598947..54782e3 100644 --- a/KisaniCal/KisaniCal.entitlements +++ b/KisaniCal.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -2,9 +2,7 @@ - com.apple.security.application-groups - - group.com.kutesir.KisaniCal - + IDEWorkspaceSharedSettings_AutocreateContextsIfNeeded + diff --git a/KisaniCal.xcodeproj/project.xcworkspace/xcuserdata/kutesir.xcuserdatad/UserInterfaceState.xcuserstate b/KisaniCal.xcodeproj/project.xcworkspace/xcuserdata/kutesir.xcuserdatad/UserInterfaceState.xcuserstate index 077aa3259b5abc4bac2587162b829b1d55359157..7851de8151da6dfcade1b46e90ba543e59895707 100644 GIT binary patch delta 13163 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 E1JBeTPyhe` delta 12298 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 IPwD9Y2lkT*= start && $0 < end } ?? false, - isOverdue: t.dueDate.map { $0 < start } ?? false - ) - } - WidgetDataStore.saveTasks(Array(entries)) - WidgetCenter.shared.reloadAllTimelines() - } -} - -extension WorkoutViewModel { - func syncWidget() { - let weekday = Calendar.current.component(.weekday, from: Date()) - let todayProgram = program(for: Date()) - let workout = WidgetDataStore.WidgetWorkout( - name: activeProgram?.name ?? "Workout", - sectionsCount: activeProgram?.sections.count ?? 0, - hasWorkoutToday: todayProgram != nil - ) - WidgetDataStore.saveWorkout(workout) - WidgetCenter.shared.reloadAllTimelines() - } -} diff --git a/KisaniCalWidget/KisaniCalWidget.entitlements b/KisaniCalWidget/KisaniCalWidget.entitlements deleted file mode 100644 index 6598947..0000000 --- a/KisaniCalWidget/KisaniCalWidget.entitlements +++ /dev/null @@ -1,10 +0,0 @@ - - - - - com.apple.security.application-groups - - group.com.kutesir.KisaniCal - - - diff --git a/KisaniCalWidget/KisaniCalWidget.swift b/KisaniCalWidget/KisaniCalWidget.swift deleted file mode 100644 index 27921f7..0000000 --- a/KisaniCalWidget/KisaniCalWidget.swift +++ /dev/null @@ -1,414 +0,0 @@ -import WidgetKit -import SwiftUI - -// MARK: - Colors (no UIKit dependency) - -private enum WC { - static let accent = Color(red: 232/255, green: 98/255, blue: 42/255) - static let green = Color(red: 62/255, green: 207/255, blue: 142/255) - static let blue = Color(red: 77/255, green: 157/255, blue: 224/255) - - static func bg(_ s: ColorScheme) -> Color { - s == .dark ? Color(red: 9/255, green: 9/255, blue: 9/255) - : Color(red: 245/255, green: 243/255, blue: 240/255) - } - static func surface(_ s: ColorScheme) -> Color { - s == .dark ? Color(red: 19/255, green: 19/255, blue: 19/255) - : Color(red: 255/255, green: 253/255, blue: 250/255) - } - static func text(_ s: ColorScheme) -> Color { - s == .dark ? Color(red: 240/255, green: 237/255, blue: 232/255) - : Color(red: 26/255, green: 23/255, blue: 20/255) - } - static func text2(_ s: ColorScheme) -> Color { text(s).opacity(0.48) } - static func text3(_ s: ColorScheme) -> Color { text(s).opacity(0.30) } - static func border(_ s: ColorScheme) -> Color { - s == .dark ? Color.white.opacity(0.07) : Color.black.opacity(0.09) - } -} - -// MARK: - Timeline Entry - -struct KisaniEntry: TimelineEntry { - let date: Date - let todayTasks: [WidgetDataStore.WidgetTask] - let overdueTasks: [WidgetDataStore.WidgetTask] - let workout: WidgetDataStore.WidgetWorkout? -} - -// MARK: - Provider - -struct KisaniProvider: TimelineProvider { - func placeholder(in context: Context) -> KisaniEntry { - KisaniEntry( - date: Date(), - todayTasks: previewTasks, - overdueTasks: [], - workout: WidgetDataStore.WidgetWorkout( - name: "Shoulders & Arms", sectionsCount: 4, hasWorkoutToday: true) - ) - } - - func getSnapshot(in context: Context, completion: @escaping (KisaniEntry) -> Void) { - completion(entry()) - } - - func getTimeline(in context: Context, completion: @escaping (Timeline) -> Void) { - let next = Calendar.current.date(byAdding: .minute, value: 30, to: Date())! - completion(Timeline(entries: [entry()], policy: .after(next))) - } - - private func entry() -> KisaniEntry { - let all = WidgetDataStore.loadTasks() - let today = all.filter { $0.isToday } - let overdue = all.filter { $0.isOverdue } - let workout = WidgetDataStore.loadWorkout() - return KisaniEntry(date: Date(), todayTasks: today, overdueTasks: overdue, workout: workout) - } - - private var previewTasks: [WidgetDataStore.WidgetTask] { - [ - .init(id: UUID(), title: "Azure exam prep", dueDate: Date(), isToday: true, isOverdue: false), - .init(id: UUID(), title: "Push AWS project", dueDate: Date(), isToday: true, isOverdue: false), - .init(id: UUID(), title: "Review PR #42", dueDate: Date(), isToday: false, isOverdue: true), - ] - } -} - -// MARK: - Widget Bundle - -@main -struct KisaniCalWidgetBundle: WidgetBundle { - var body: some Widget { - KisaniCalWidget() - } -} - -struct KisaniCalWidget: Widget { - let kind = "KisaniCalWidget" - - var body: some WidgetConfiguration { - StaticConfiguration(kind: kind, provider: KisaniProvider()) { entry in - KisaniWidgetView(entry: entry) - .containerBackground(for: .widget) { Color.clear } - } - .configurationDisplayName("Kisani Cal") - .description("Today's tasks and workout at a glance.") - .supportedFamilies([.systemSmall, .systemMedium, .systemLarge]) - } -} - -// MARK: - Root Widget View - -struct KisaniWidgetView: View { - @Environment(\.widgetFamily) private var family - let entry: KisaniEntry - - var body: some View { - switch family { - case .systemSmall: SmallWidget(entry: entry) - case .systemMedium: MediumWidget(entry: entry) - default: LargeWidget(entry: entry) - } - } -} - -// MARK: - Shared Sub-Views - -private struct DateBadge: View { - @Environment(\.colorScheme) private var cs - let size: CGFloat - - private static let monthFmt: DateFormatter = { - let f = DateFormatter(); f.dateFormat = "MMM"; return f - }() - - var body: some View { - let day = Calendar.current.component(.day, from: Date()) - VStack(spacing: 0) { - Text(Self.monthFmt.string(from: Date()).uppercased()) - .font(.system(size: size * 0.18, weight: .bold, design: .monospaced)) - .foregroundColor(.white) - .kerning(1) - .frame(maxWidth: .infinity) - .frame(height: size * 0.32) - .background(WC.accent) - Text("\(day)") - .font(.system(size: size * 0.48, weight: .bold, design: .monospaced)) - .foregroundColor(WC.text(cs)) - .frame(maxWidth: .infinity) - .frame(height: size * 0.68) - .background(WC.surface(cs)) - } - .frame(width: size, height: size) - .clipShape(RoundedRectangle(cornerRadius: size * 0.22)) - .overlay( - RoundedRectangle(cornerRadius: size * 0.22) - .stroke(WC.border(cs), lineWidth: 1) - ) - } -} - -private struct TaskRow: View { - @Environment(\.colorScheme) private var cs - let task: WidgetDataStore.WidgetTask - - private static let fmt: DateFormatter = { - let f = DateFormatter(); f.dateFormat = "d MMM"; return f - }() - - var body: some View { - HStack(spacing: 5) { - Circle() - .stroke(task.isOverdue ? WC.accent : WC.text3(cs), lineWidth: 1.2) - .frame(width: 7, height: 7) - Text(task.title) - .font(.system(size: 11, weight: .regular, design: .default)) - .foregroundColor(WC.text(cs)) - .lineLimit(1) - Spacer(minLength: 0) - if let d = task.dueDate { - Text(task.isOverdue ? "Overdue" : Self.fmt.string(from: d)) - .font(.system(size: 9, weight: .regular, design: .monospaced)) - .foregroundColor(task.isOverdue ? WC.accent : WC.text3(cs)) - } - } - } -} - -private struct WorkoutRow: View { - @Environment(\.colorScheme) private var cs - let workout: WidgetDataStore.WidgetWorkout - - var body: some View { - HStack(spacing: 6) { - WorkoutSegBar(count: workout.sectionsCount) - .frame(width: 22, height: 22) - Text(workout.name) - .font(.system(size: 11, weight: .semibold, design: .default)) - .foregroundColor(WC.text(cs)) - .lineLimit(1) - Spacer(minLength: 0) - Text("Workout") - .font(.system(size: 9, weight: .regular, design: .monospaced)) - .foregroundColor(WC.blue) - } - } -} - -private struct WorkoutSegBar: View { - @Environment(\.colorScheme) private var cs - let count: Int - - var body: some View { - let n = max(1, min(6, count)) - VStack(spacing: 1.5) { - ForEach(0.. 0 { - Text("\(overdueCount) overdue · \(todayCount) today") - .foregroundColor(WC.accent) - } else if todayCount > 0 { - Text("\(todayCount) task\(todayCount == 1 ? "" : "s") today") - .foregroundColor(WC.text2(cs)) - } else { - Text("All clear") - .foregroundColor(WC.text3(cs)) - } - } - .font(.system(size: 9, weight: .regular, design: .monospaced)) - } - } - .padding(14) - } - } -} - -// MARK: - Medium Widget - -private struct MediumWidget: View { - @Environment(\.colorScheme) private var cs - let entry: KisaniEntry - - private var displayTasks: [WidgetDataStore.WidgetTask] { - let all = entry.overdueTasks + entry.todayTasks - return Array(all.prefix(3)) - } - - var body: some View { - ZStack { - WC.bg(cs).ignoresSafeArea() - - HStack(alignment: .top, spacing: 14) { - // Left: badge + brand - VStack(spacing: 8) { - DateBadge(size: 64) - HStack(spacing: 0) { - Text("kisani") - .font(.system(size: 9, weight: .regular, design: .monospaced)) - .foregroundColor(WC.text2(cs)) - Text("CAL.") - .font(.system(size: 9, weight: .bold, design: .monospaced)) - .foregroundColor(WC.accent) - } - } - - // Right: tasks + workout - VStack(alignment: .leading, spacing: 5) { - if displayTasks.isEmpty && entry.workout == nil { - Spacer() - Text("Nothing scheduled") - .font(.system(size: 11, design: .monospaced)) - .foregroundColor(WC.text3(cs)) - Spacer() - } else { - ForEach(displayTasks) { task in - TaskRow(task: task) - } - if let workout = entry.workout, workout.hasWorkoutToday, - displayTasks.count < 3 { - if !displayTasks.isEmpty { - Divider().opacity(0.4) - } - WorkoutRow(workout: workout) - } - Spacer(minLength: 0) - } - } - .frame(maxWidth: .infinity, alignment: .leading) - } - .padding(14) - } - } -} - -// MARK: - Large Widget - -private struct LargeWidget: View { - @Environment(\.colorScheme) private var cs - let entry: KisaniEntry - - private static let dayFmt: DateFormatter = { - let f = DateFormatter(); f.dateFormat = "EEEE, MMM d"; return f - }() - - private var allTasks: [WidgetDataStore.WidgetTask] { - Array((entry.overdueTasks + entry.todayTasks).prefix(6)) - } - - var body: some View { - ZStack { - WC.bg(cs).ignoresSafeArea() - - VStack(alignment: .leading, spacing: 0) { - // Header row - HStack(spacing: 12) { - DateBadge(size: 56) - - VStack(alignment: .leading, spacing: 3) { - HStack(spacing: 0) { - Text("kisani") - .font(.system(size: 14, weight: .regular, design: .monospaced)) - .foregroundColor(WC.text2(cs)) - Text("CAL") - .font(.system(size: 14, weight: .bold, design: .monospaced)) - .foregroundColor(WC.text(cs)) - Text(".") - .font(.system(size: 14, weight: .bold, design: .monospaced)) - .foregroundColor(WC.accent) - } - Text(Self.dayFmt.string(from: Date())) - .font(.system(size: 10, design: .monospaced)) - .foregroundColor(WC.text2(cs)) - } - - Spacer() - - let total = entry.todayTasks.count + entry.overdueTasks.count - VStack(alignment: .trailing, spacing: 2) { - Text("\(total)") - .font(.system(size: 22, weight: .bold, design: .monospaced)) - .foregroundColor(entry.overdueTasks.isEmpty ? WC.text(cs) : WC.accent) - Text("tasks") - .font(.system(size: 9, design: .monospaced)) - .foregroundColor(WC.text3(cs)) - } - } - .padding(.horizontal, 14) - .padding(.top, 14) - .padding(.bottom, 12) - - Divider().opacity(0.4).padding(.horizontal, 14) - - // Task list - VStack(alignment: .leading, spacing: 7) { - if allTasks.isEmpty { - HStack { - Spacer() - Text("Nothing due today") - .font(.system(size: 11, design: .monospaced)) - .foregroundColor(WC.text3(cs)) - Spacer() - } - .padding(.vertical, 8) - } else { - ForEach(allTasks) { task in - TaskRow(task: task) - } - } - } - .padding(.horizontal, 14) - .padding(.vertical, 10) - - Spacer(minLength: 0) - - // Workout row - if let workout = entry.workout, workout.hasWorkoutToday { - Divider().opacity(0.4).padding(.horizontal, 14) - WorkoutRow(workout: workout) - .padding(.horizontal, 14) - .padding(.vertical, 10) - } - } - } - } -} diff --git a/Shared/WidgetDataStore.swift b/Shared/WidgetDataStore.swift deleted file mode 100644 index 92bf08f..0000000 --- a/Shared/WidgetDataStore.swift +++ /dev/null @@ -1,61 +0,0 @@ -import Foundation - -// Shared between app and widget extension via App Group UserDefaults. -// Types are pure Codable — no UIKit / AppColors dependency. - -struct WidgetDataStore { - static let suiteName = "group.com.kutesir.KisaniCal" - static let tasksKey = "kisani.widget.tasks" - static let workoutKey = "kisani.widget.workout" - - // MARK: - Shared types - - struct WidgetTask: Codable, Identifiable { - let id: UUID - let title: String - let dueDate: Date? - let isToday: Bool - let isOverdue: Bool - } - - struct WidgetWorkout: Codable { - let name: String - let sectionsCount: Int - let hasWorkoutToday: Bool - } - - // MARK: - Write (app target) - - static func saveTasks(_ tasks: [WidgetTask]) { - guard let data = try? JSONEncoder().encode(tasks), - let ud = UserDefaults(suiteName: suiteName) else { return } - ud.set(data, forKey: tasksKey) - } - - static func saveWorkout(_ workout: WidgetWorkout?) { - guard let ud = UserDefaults(suiteName: suiteName) else { return } - if let workout, let data = try? JSONEncoder().encode(workout) { - ud.set(data, forKey: workoutKey) - } else { - ud.removeObject(forKey: workoutKey) - } - } - - // MARK: - Read (widget target) - - static func loadTasks() -> [WidgetTask] { - guard let ud = UserDefaults(suiteName: suiteName), - let data = ud.data(forKey: tasksKey), - let list = try? JSONDecoder().decode([WidgetTask].self, from: data) - else { return [] } - return list - } - - static func loadWorkout() -> WidgetWorkout? { - guard let ud = UserDefaults(suiteName: suiteName), - let data = ud.data(forKey: workoutKey), - let workout = try? JSONDecoder().decode(WidgetWorkout.self, from: data) - else { return nil } - return workout - } -} diff --git a/project.yml b/project.yml index bb37048..8267f64 100644 --- a/project.yml +++ b/project.yml @@ -13,7 +13,6 @@ targets: deploymentTarget: "16.0" sources: - path: KisaniCal - - path: Shared settings: base: SWIFT_VERSION: 5.9 @@ -29,27 +28,5 @@ targets: ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME: AccentColor CODE_SIGN_STYLE: Automatic ENABLE_PREVIEWS: YES - CODE_SIGN_ENTITLEMENTS: KisaniCal/KisaniCal.entitlements INFOPLIST_KEY_NSCalendarsUsageDescription: "Kisani Cal shows your calendar events alongside tasks." INFOPLIST_KEY_NSCalendarsFullAccessUsageDescription: "Kisani Cal shows your calendar events alongside tasks." - dependencies: - - target: KisaniCalWidget - embed: true - - KisaniCalWidget: - type: app-extension - platform: iOS - deploymentTarget: "17.0" - sources: - - path: KisaniCalWidget - - path: Shared - settings: - base: - SWIFT_VERSION: 5.9 - PRODUCT_BUNDLE_IDENTIFIER: com.kutesir.KisaniCal.widget - GENERATE_INFOPLIST_FILE: YES - INFOPLIST_KEY_NSExtensionPointIdentifier: com.apple.widgetkit-extension - CODE_SIGN_STYLE: Automatic - CODE_SIGN_ENTITLEMENTS: KisaniCalWidget/KisaniCalWidget.entitlements - SKIP_INSTALL: YES - LD_RUNPATH_SEARCH_PATHS: "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"