feat(ios): implement updateStarredPlans method

Implemented starred plans update method matching Android functionality:

updateStarredPlans():
- Accepts planIds array from call options
- Handles multiple array formats (String array, Any array, single string)
- Stores planIds as JSON array string in UserDefaults
- Uses same key name as Android (starredPlanIds in daily_notification_timesafari)
- Returns success, count, and updatedAt timestamp
- Matches Android SharedPreferences storage pattern

iOS Adaptations:
- Uses UserDefaults with suite name for preference grouping
- JSON serialization for array storage (matching Android JSONArray format)
- Error handling for serialization failures

Progress: 17/52 methods implemented (33% complete)
This commit is contained in:
Matthew Raymer
2025-11-11 01:57:24 -08:00
parent 928733f87f
commit 17ede3ab20

View File

@@ -667,6 +667,74 @@ public class DailyNotificationPlugin: CAPPlugin {
call.resolve(result) call.resolve(result)
} }
// MARK: - Configuration Methods
/**
* Update starred plan IDs
*
* Stores plan IDs in UserDefaults for native fetcher to use.
* Matches Android SharedPreferences storage pattern.
*
* Equivalent to Android's updateStarredPlans method.
*/
@objc func updateStarredPlans(_ call: CAPPluginCall) {
guard let options = call.options else {
call.reject("Options are required")
return
}
// Extract planIds array from options
guard let planIdsValue = options["planIds"] else {
call.reject("planIds array is required")
return
}
var planIds: [String] = []
// Handle different array formats from Capacitor
if let planIdsArray = planIdsValue as? [String] {
planIds = planIdsArray
} else if let planIdsArray = planIdsValue as? [Any] {
planIds = planIdsArray.compactMap { $0 as? String }
} else if let singlePlanId = planIdsValue as? String {
planIds = [singlePlanId]
} else {
call.reject("planIds must be an array of strings")
return
}
print("DNP-PLUGIN: Updating starred plans: count=\(planIds.count)")
// Store in UserDefaults (matching Android SharedPreferences)
// Use suite name to match Android prefs name pattern
let prefsName = "daily_notification_timesafari"
let keyStarredPlanIds = "starredPlanIds"
// Convert planIds to JSON array string (matching Android format)
do {
let jsonData = try JSONSerialization.data(withJSONObject: planIds, options: [])
let jsonString = String(data: jsonData, encoding: .utf8) ?? "[]"
// Store in UserDefaults with suite name
let userDefaults = UserDefaults(suiteName: prefsName) ?? UserDefaults.standard
userDefaults.set(jsonString, forKey: keyStarredPlanIds)
userDefaults.synchronize()
let result: [String: Any] = [
"success": true,
"planIdsCount": planIds.count,
"updatedAt": Int64(Date().timeIntervalSince1970 * 1000)
]
print("DNP-PLUGIN: Starred plans updated: count=\(planIds.count)")
call.resolve(result)
} catch {
print("DNP-PLUGIN: Failed to serialize planIds: \(error)")
call.reject("Failed to update starred plans: \(error.localizedDescription)")
}
}
// MARK: - Private Implementation Methods // MARK: - Private Implementation Methods
private func setupBackgroundTasks() { private func setupBackgroundTasks() {