From e921cc8d606d057c801fa57624f07b71d80f3cd7 Mon Sep 17 00:00:00 2001 From: Ehsan Barooni <66495214+ebarooni.noreply@barooni.dev> Date: Tue, 4 Feb 2025 22:46:45 +0100 Subject: [PATCH] refactor(types): breakdown definitions file (#164) Migrate `checkAllPermissions` to new approach. --- .../CapacitorCalendarPlugin.swift | 14 +++--- .../Implementation/CapacitorCalendar.swift | 44 ++++++++++--------- .../Enums/CalendarPermissionScope.swift | 2 +- .../Results/CheckAllPermissionsResult.swift | 15 +++++++ .../Results/CheckPermissionResult.swift | 2 - .../Utils/ImplementationHelper.swift | 26 +++++++++++ 6 files changed, 71 insertions(+), 32 deletions(-) create mode 100644 ios/Sources/CapacitorCalendarPlugin/Models/Results/CheckAllPermissionsResult.swift create mode 100644 ios/Sources/CapacitorCalendarPlugin/Utils/ImplementationHelper.swift diff --git a/ios/Sources/CapacitorCalendarPlugin/CapacitorCalendarPlugin.swift b/ios/Sources/CapacitorCalendarPlugin/CapacitorCalendarPlugin.swift index 940f954..2c09641 100644 --- a/ios/Sources/CapacitorCalendarPlugin/CapacitorCalendarPlugin.swift +++ b/ios/Sources/CapacitorCalendarPlugin/CapacitorCalendarPlugin.swift @@ -22,15 +22,11 @@ public class CapacitorCalendarPlugin: CAPPlugin, CAPBridgedPlugin { } @objc public func checkAllPermissions(_ call: CAPPluginCall) { - Task { - do { - let calendarPermissionsState = try await calendar.checkAllPermissions() - let remindersPermissionsState = try await reminders.checkAllPermissions() - call.resolve(calendarPermissionsState.merging(remindersPermissionsState) { (_, new) in new }) - } catch { - call.reject("[CapacitorCalendar.\(#function)] Could not determine the status of the requested permissions") - return - } + do { + let result = try implementation.checkAllPermissions() + call.resolve(result.toJSON()) + } catch let error { + call.reject(error.localizedDescription) } } diff --git a/ios/Sources/CapacitorCalendarPlugin/Implementation/CapacitorCalendar.swift b/ios/Sources/CapacitorCalendarPlugin/Implementation/CapacitorCalendar.swift index 8bfc5a5..b7371f0 100644 --- a/ios/Sources/CapacitorCalendarPlugin/Implementation/CapacitorCalendar.swift +++ b/ios/Sources/CapacitorCalendarPlugin/Implementation/CapacitorCalendar.swift @@ -10,34 +10,38 @@ class CapacitorCalendarNew { func checkPermission(input: CheckPermissionInput) throws -> CheckPermissionResult { let scope = input.getScope() - let status: EKAuthorizationStatus + let state: EKAuthorizationStatus switch scope { case .readCalendar, .writeCalendar: - status = EKEventStore.authorizationStatus(for: .event) + state = EKEventStore.authorizationStatus(for: .event) case .readReminders, .writeReminders: - status = EKEventStore.authorizationStatus(for: .reminder) + state = EKEventStore.authorizationStatus(for: .reminder) } - var result: CheckPermissionResult - - switch status { - case .authorized, .fullAccess: - result = CheckPermissionResult(status: CAPPermissionState.granted) - case .denied, .restricted: - result = CheckPermissionResult(status: CAPPermissionState.denied) - case .writeOnly: - if scope == .writeCalendar || scope == .writeReminders { - result = CheckPermissionResult(status: CAPPermissionState.granted) - } else { - result = CheckPermissionResult(status: CAPPermissionState.prompt) + let detectedState = try ImplementationHelper.permissionStateToResult(state: state, scope: scope) + return CheckPermissionResult(status: detectedState) + } + + func checkAllPermissions() throws -> CheckAllPermissionsResult { + let calendarState = EKEventStore.authorizationStatus(for: .event) + let remindersState = EKEventStore.authorizationStatus(for: .reminder) + var permissionsResult: [String: String] = [:] + + for scope in CalendarPermissionScope.allCases { + let state: EKAuthorizationStatus + + switch scope { + case .readCalendar, .writeCalendar: + state = calendarState + case .readReminders, .writeReminders: + state = remindersState } - case .notDetermined: - result = CheckPermissionResult(status: CAPPermissionState.prompt) - default: - throw PluginError.unhandledPermissionState + + let detectedState = try ImplementationHelper.permissionStateToResult(state: state, scope: scope) + permissionsResult[scope.rawValue] = detectedState.rawValue } - return result + return CheckAllPermissionsResult(statesDict: permissionsResult) } } diff --git a/ios/Sources/CapacitorCalendarPlugin/Models/Enums/CalendarPermissionScope.swift b/ios/Sources/CapacitorCalendarPlugin/Models/Enums/CalendarPermissionScope.swift index bf41ec2..72fbc89 100644 --- a/ios/Sources/CapacitorCalendarPlugin/Models/Enums/CalendarPermissionScope.swift +++ b/ios/Sources/CapacitorCalendarPlugin/Models/Enums/CalendarPermissionScope.swift @@ -1,4 +1,4 @@ -enum CalendarPermissionScope: String { +enum CalendarPermissionScope: String, CaseIterable { case readCalendar = "readCalendar" case readReminders = "readReminders" case writeCalendar = "writeCalendar" diff --git a/ios/Sources/CapacitorCalendarPlugin/Models/Results/CheckAllPermissionsResult.swift b/ios/Sources/CapacitorCalendarPlugin/Models/Results/CheckAllPermissionsResult.swift new file mode 100644 index 0000000..7b882cd --- /dev/null +++ b/ios/Sources/CapacitorCalendarPlugin/Models/Results/CheckAllPermissionsResult.swift @@ -0,0 +1,15 @@ +import Capacitor + +struct CheckAllPermissionsResult { + private let statesDict: [String: String] + + init(statesDict: [String: String]) { + self.statesDict = statesDict + } + + func toJSON() -> JSObject { + var result = JSObject() + result["result"] = statesDict as JSObject + return result + } +} diff --git a/ios/Sources/CapacitorCalendarPlugin/Models/Results/CheckPermissionResult.swift b/ios/Sources/CapacitorCalendarPlugin/Models/Results/CheckPermissionResult.swift index f46ae29..75217f0 100644 --- a/ios/Sources/CapacitorCalendarPlugin/Models/Results/CheckPermissionResult.swift +++ b/ios/Sources/CapacitorCalendarPlugin/Models/Results/CheckPermissionResult.swift @@ -3,11 +3,9 @@ import Capacitor struct CheckPermissionResult { private let status: CAPPermissionState - private let scope: CalendarPermissionScope init(status: CAPPermissionState) { self.status = status - self.scope = scope } func toJSON() -> JSObject { diff --git a/ios/Sources/CapacitorCalendarPlugin/Utils/ImplementationHelper.swift b/ios/Sources/CapacitorCalendarPlugin/Utils/ImplementationHelper.swift new file mode 100644 index 0000000..c849564 --- /dev/null +++ b/ios/Sources/CapacitorCalendarPlugin/Utils/ImplementationHelper.swift @@ -0,0 +1,26 @@ +import EventKit + +struct ImplementationHelper { + static func permissionStateToResult(state: EKAuthorizationStatus, scope: CalendarPermissionScope ) throws -> CAPPermissionState { + var result: CAPPermissionState + + switch state { + case .authorized, .fullAccess: + result = CAPPermissionState.granted + case .denied, .restricted: + result = CAPPermissionState.denied + case .writeOnly: + if scope == .writeCalendar || scope == .writeReminders { + result = CAPPermissionState.granted + } else { + result = CAPPermissionState.prompt + } + case .notDetermined: + result = CAPPermissionState.prompt + default: + throw PluginError.unhandledPermissionState + } + + return result + } +}