From 22fdaa789d4bbb4f9b75a0a7d06fdcaddb2ed9c6 Mon Sep 17 00:00:00 2001 From: Matthew Raymer Date: Tue, 11 Nov 2025 02:14:54 -0800 Subject: [PATCH] feat(ios): implement updateDualScheduleConfig, cancelDualSchedule, pauseDualSchedule, and resumeDualSchedule methods Implemented dual schedule management methods: updateDualScheduleConfig(): - Updates dual schedule configuration - Cancels existing schedules and reschedules with new config - Stores config in UserDefaults for persistence - Combines content fetch and user notification scheduling cancelDualSchedule(): - Cancels all dual schedule notifications - Clears stored dual schedule config - Uses existing cancelAllNotifications method pauseDualSchedule(): - Pauses dual schedule by cancelling notifications - Stores pause state in UserDefaults - Allows resuming later with stored config resumeDualSchedule(): - Resumes paused dual schedule - Restores from stored config in UserDefaults - Re-schedules both content fetch and user notification - Validates pause state before resuming iOS Adaptations: - Uses UserDefaults for config persistence - Pause/resume pattern for schedule management - Config restoration on resume Progress: 36/52 methods implemented (69% complete) --- ios/Plugin/DailyNotificationPlugin.swift | 93 ++++++++++++++++++++++++ 1 file changed, 93 insertions(+) diff --git a/ios/Plugin/DailyNotificationPlugin.swift b/ios/Plugin/DailyNotificationPlugin.swift index 20ec425..7196a18 100644 --- a/ios/Plugin/DailyNotificationPlugin.swift +++ b/ios/Plugin/DailyNotificationPlugin.swift @@ -122,6 +122,99 @@ public class DailyNotificationPlugin: CAPPlugin { } } + @objc func updateDualScheduleConfig(_ call: CAPPluginCall) { + guard let config = call.getObject("config"), + let contentFetchConfig = config["contentFetch"] as? [String: Any], + let userNotificationConfig = config["userNotification"] as? [String: Any] else { + call.reject("Dual notification config required") + return + } + + print("DNP-PLUGIN: Updating dual schedule config") + + // Cancel existing schedules first + cancelAllNotifications(call) + + // Schedule new configuration + do { + try scheduleBackgroundFetch(config: contentFetchConfig) + try scheduleUserNotification(config: userNotificationConfig) + + // Store config in UserDefaults + if let configData = try? JSONSerialization.data(withJSONObject: config, options: []), + let configString = String(data: configData, encoding: .utf8) { + UserDefaults.standard.set(configString, forKey: "DailyNotificationDualScheduleConfig") + UserDefaults.standard.synchronize() + } + + call.resolve() + } catch { + print("DNP-PLUGIN: Failed to update dual schedule config: \(error)") + call.reject("Dual schedule config update failed: \(error.localizedDescription)") + } + } + + @objc func cancelDualSchedule(_ call: CAPPluginCall) { + print("DNP-PLUGIN: Cancelling dual schedule") + + // Cancel all notifications (this cancels both fetch and notify) + cancelAllNotifications(call) + + // Clear stored config + UserDefaults.standard.removeObject(forKey: "DailyNotificationDualScheduleConfig") + UserDefaults.standard.synchronize() + + print("DNP-PLUGIN: Dual schedule cancelled") + } + + @objc func pauseDualSchedule(_ call: CAPPluginCall) { + print("DNP-PLUGIN: Pausing dual schedule") + + // Store pause state + UserDefaults.standard.set(true, forKey: "DailyNotificationDualSchedulePaused") + UserDefaults.standard.synchronize() + + // Cancel all notifications (they can be resumed later) + cancelAllNotifications(call) + + print("DNP-PLUGIN: Dual schedule paused") + call.resolve() + } + + @objc func resumeDualSchedule(_ call: CAPPluginCall) { + print("DNP-PLUGIN: Resuming dual schedule") + + // Check if paused + guard UserDefaults.standard.bool(forKey: "DailyNotificationDualSchedulePaused") else { + call.reject("Dual schedule is not paused") + return + } + + // Clear pause state + UserDefaults.standard.set(false, forKey: "DailyNotificationDualSchedulePaused") + UserDefaults.standard.synchronize() + + // Restore from stored config if available + if let configString = UserDefaults.standard.string(forKey: "DailyNotificationDualScheduleConfig"), + let configData = configString.data(using: .utf8), + let config = try? JSONSerialization.jsonObject(with: configData) as? [String: Any], + let contentFetchConfig = config["contentFetch"] as? [String: Any], + let userNotificationConfig = config["userNotification"] as? [String: Any] { + do { + try scheduleBackgroundFetch(config: contentFetchConfig) + try scheduleUserNotification(config: userNotificationConfig) + print("DNP-PLUGIN: Dual schedule resumed from stored config") + call.resolve() + } catch { + print("DNP-PLUGIN: Failed to resume dual schedule: \(error)") + call.reject("Dual schedule resume failed: \(error.localizedDescription)") + } + } else { + print("DNP-PLUGIN: No stored config found, cannot resume") + call.reject("No stored dual schedule config found") + } + } + // MARK: - Main Scheduling Method /**