feat(ios): implement createSchedule, updateSchedule, deleteSchedule, and enableSchedule methods
Implemented schedule CRUD methods using UserDefaults: createSchedule(): - Creates new schedule with required kind field - Auto-generates ID if not provided (kind_timestamp) - Stores optional fields (cron, clockTime, jitterMs, backoffPolicy, stateJson) - Adds to schedules array in UserDefaults - Returns created schedule updateSchedule(): - Updates existing schedule by ID - Updates provided fields (enabled, cron, clockTime, jitterMs, backoffPolicy, stateJson, lastRunAt, nextRunAt) - Returns updated schedule - Rejects if schedule not found deleteSchedule(): - Deletes schedule by ID from UserDefaults - Removes from schedules array - Rejects if schedule not found enableSchedule(): - Enables or disables schedule by ID - Updates enabled field in schedule - Rejects if schedule not found iOS Adaptations: - Uses UserDefaults array instead of SQLite database - In-memory array manipulation then persistence - Maintains schedule structure matching Android Progress: 44/52 methods implemented (85% complete)
This commit is contained in:
@@ -676,6 +676,188 @@ public class DailyNotificationPlugin: CAPPlugin {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Create schedule
|
||||
*
|
||||
* Creates a new schedule and stores it in UserDefaults.
|
||||
*
|
||||
* Equivalent to Android's createSchedule method.
|
||||
*/
|
||||
@objc func createSchedule(_ call: CAPPluginCall) {
|
||||
guard let scheduleJson = call.getObject("schedule") else {
|
||||
call.reject("Schedule data is required")
|
||||
return
|
||||
}
|
||||
|
||||
guard let kind = scheduleJson["kind"] as? String else {
|
||||
call.reject("Schedule kind is required")
|
||||
return
|
||||
}
|
||||
|
||||
// Generate ID if not provided
|
||||
let id = scheduleJson["id"] as? String ?? "\(kind)_\(Int64(Date().timeIntervalSince1970 * 1000))"
|
||||
|
||||
print("DNP-PLUGIN: Creating schedule: id=\(id), kind=\(kind)")
|
||||
|
||||
// Build schedule dictionary
|
||||
var schedule: [String: Any] = [
|
||||
"id": id,
|
||||
"kind": kind,
|
||||
"enabled": scheduleJson["enabled"] as? Bool ?? true,
|
||||
"createdAt": Int64(Date().timeIntervalSince1970 * 1000)
|
||||
]
|
||||
|
||||
// Add optional fields
|
||||
if let cron = scheduleJson["cron"] as? String {
|
||||
schedule["cron"] = cron
|
||||
}
|
||||
if let clockTime = scheduleJson["clockTime"] as? String {
|
||||
schedule["clockTime"] = clockTime
|
||||
}
|
||||
if let jitterMs = scheduleJson["jitterMs"] as? Int {
|
||||
schedule["jitterMs"] = jitterMs
|
||||
}
|
||||
if let backoffPolicy = scheduleJson["backoffPolicy"] as? String {
|
||||
schedule["backoffPolicy"] = backoffPolicy
|
||||
}
|
||||
if let stateJson = scheduleJson["stateJson"] as? String {
|
||||
schedule["stateJson"] = stateJson
|
||||
}
|
||||
|
||||
// Add to schedules array
|
||||
var schedules = getSchedulesFromUserDefaults()
|
||||
schedules.append(schedule)
|
||||
UserDefaults.standard.set(schedules, forKey: "DailyNotificationSchedules")
|
||||
UserDefaults.standard.synchronize()
|
||||
|
||||
print("DNP-PLUGIN: Schedule created successfully")
|
||||
call.resolve(schedule)
|
||||
}
|
||||
|
||||
/**
|
||||
* Update schedule
|
||||
*
|
||||
* Updates an existing schedule in UserDefaults.
|
||||
*
|
||||
* Equivalent to Android's updateSchedule method.
|
||||
*/
|
||||
@objc func updateSchedule(_ call: CAPPluginCall) {
|
||||
guard let id = call.getString("id") else {
|
||||
call.reject("Schedule ID is required")
|
||||
return
|
||||
}
|
||||
|
||||
guard let updates = call.getObject("updates") else {
|
||||
call.reject("Updates are required")
|
||||
return
|
||||
}
|
||||
|
||||
print("DNP-PLUGIN: Updating schedule: id=\(id)")
|
||||
|
||||
var schedules = getSchedulesFromUserDefaults()
|
||||
guard let index = schedules.firstIndex(where: { ($0["id"] as? String) == id }) else {
|
||||
call.reject("Schedule not found: \(id)")
|
||||
return
|
||||
}
|
||||
|
||||
// Update schedule fields
|
||||
var schedule = schedules[index]
|
||||
|
||||
if let enabled = updates["enabled"] as? Bool {
|
||||
schedule["enabled"] = enabled
|
||||
}
|
||||
if let cron = updates["cron"] as? String {
|
||||
schedule["cron"] = cron
|
||||
}
|
||||
if let clockTime = updates["clockTime"] as? String {
|
||||
schedule["clockTime"] = clockTime
|
||||
}
|
||||
if let jitterMs = updates["jitterMs"] as? Int {
|
||||
schedule["jitterMs"] = jitterMs
|
||||
}
|
||||
if let backoffPolicy = updates["backoffPolicy"] as? String {
|
||||
schedule["backoffPolicy"] = backoffPolicy
|
||||
}
|
||||
if let stateJson = updates["stateJson"] as? String {
|
||||
schedule["stateJson"] = stateJson
|
||||
}
|
||||
if let lastRunAt = updates["lastRunAt"] as? Int64 {
|
||||
schedule["lastRunAt"] = lastRunAt
|
||||
}
|
||||
if let nextRunAt = updates["nextRunAt"] as? Int64 {
|
||||
schedule["nextRunAt"] = nextRunAt
|
||||
}
|
||||
|
||||
schedules[index] = schedule
|
||||
UserDefaults.standard.set(schedules, forKey: "DailyNotificationSchedules")
|
||||
UserDefaults.standard.synchronize()
|
||||
|
||||
print("DNP-PLUGIN: Schedule updated successfully")
|
||||
call.resolve(schedule)
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete schedule
|
||||
*
|
||||
* Deletes a schedule from UserDefaults.
|
||||
*
|
||||
* Equivalent to Android's deleteSchedule method.
|
||||
*/
|
||||
@objc func deleteSchedule(_ call: CAPPluginCall) {
|
||||
guard let id = call.getString("id") else {
|
||||
call.reject("Schedule ID is required")
|
||||
return
|
||||
}
|
||||
|
||||
print("DNP-PLUGIN: Deleting schedule: id=\(id)")
|
||||
|
||||
var schedules = getSchedulesFromUserDefaults()
|
||||
let initialCount = schedules.count
|
||||
schedules.removeAll { ($0["id"] as? String) == id }
|
||||
|
||||
if schedules.count == initialCount {
|
||||
call.reject("Schedule not found: \(id)")
|
||||
return
|
||||
}
|
||||
|
||||
UserDefaults.standard.set(schedules, forKey: "DailyNotificationSchedules")
|
||||
UserDefaults.standard.synchronize()
|
||||
|
||||
print("DNP-PLUGIN: Schedule deleted successfully")
|
||||
call.resolve()
|
||||
}
|
||||
|
||||
/**
|
||||
* Enable/disable schedule
|
||||
*
|
||||
* Enables or disables a schedule.
|
||||
*
|
||||
* Equivalent to Android's enableSchedule method.
|
||||
*/
|
||||
@objc func enableSchedule(_ call: CAPPluginCall) {
|
||||
guard let id = call.getString("id") else {
|
||||
call.reject("Schedule ID is required")
|
||||
return
|
||||
}
|
||||
|
||||
let enabled = call.getBool("enabled") ?? true
|
||||
|
||||
print("DNP-PLUGIN: Setting schedule enabled: id=\(id), enabled=\(enabled)")
|
||||
|
||||
var schedules = getSchedulesFromUserDefaults()
|
||||
guard let index = schedules.firstIndex(where: { ($0["id"] as? String) == id }) else {
|
||||
call.reject("Schedule not found: \(id)")
|
||||
return
|
||||
}
|
||||
|
||||
schedules[index]["enabled"] = enabled
|
||||
UserDefaults.standard.set(schedules, forKey: "DailyNotificationSchedules")
|
||||
UserDefaults.standard.synchronize()
|
||||
|
||||
print("DNP-PLUGIN: Schedule enabled status updated")
|
||||
call.resolve()
|
||||
}
|
||||
|
||||
// MARK: - Permission Methods
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user