// // AppGroupUserDefaults.swift // digitalpilates // // Native module for accessing App Group UserDefaults // Allows sharing data between main app and widget // import Foundation import React @objc(AppGroupUserDefaults) class AppGroupUserDefaults: NSObject, RCTBridgeModule { static func moduleName() -> String! { return "AppGroupUserDefaults" } static func requiresMainQueueSetup() -> Bool { return false } // MARK: - String Methods @objc func setString(_ groupId: String, key: String, value: String, resolver: @escaping RCTPromiseResolveBlock, rejecter: @escaping RCTPromiseRejectBlock) { DispatchQueue.global(qos: .background).async { guard let userDefaults = UserDefaults(suiteName: groupId) else { rejecter("ERROR", "Failed to create UserDefaults with suite name: \(groupId)", nil) return } userDefaults.set(value, forKey: key) userDefaults.synchronize() DispatchQueue.main.async { resolver(nil) } } } @objc func getString(_ groupId: String, key: String, resolver: @escaping RCTPromiseResolveBlock, rejecter: @escaping RCTPromiseRejectBlock) { DispatchQueue.global(qos: .background).async { guard let userDefaults = UserDefaults(suiteName: groupId) else { rejecter("ERROR", "Failed to create UserDefaults with suite name: \(groupId)", nil) return } let value = userDefaults.string(forKey: key) DispatchQueue.main.async { resolver(value) } } } // MARK: - Number Methods @objc func setNumber(_ groupId: String, key: String, value: NSNumber, resolver: @escaping RCTPromiseResolveBlock, rejecter: @escaping RCTPromiseRejectBlock) { DispatchQueue.global(qos: .background).async { guard let userDefaults = UserDefaults(suiteName: groupId) else { rejecter("ERROR", "Failed to create UserDefaults with suite name: \(groupId)", nil) return } userDefaults.set(value, forKey: key) userDefaults.synchronize() DispatchQueue.main.async { resolver(nil) } } } @objc func getNumber(_ groupId: String, key: String, resolver: @escaping RCTPromiseResolveBlock, rejecter: @escaping RCTPromiseRejectBlock) { DispatchQueue.global(qos: .background).async { guard let userDefaults = UserDefaults(suiteName: groupId) else { rejecter("ERROR", "Failed to create UserDefaults with suite name: \(groupId)", nil) return } let value = userDefaults.object(forKey: key) as? NSNumber ?? NSNumber(value: 0) DispatchQueue.main.async { resolver(value) } } } // MARK: - Remove Key Method @objc func removeKey(_ groupId: String, key: String, resolver: @escaping RCTPromiseResolveBlock, rejecter: @escaping RCTPromiseRejectBlock) { DispatchQueue.global(qos: .background).async { guard let userDefaults = UserDefaults(suiteName: groupId) else { rejecter("ERROR", "Failed to create UserDefaults with suite name: \(groupId)", nil) return } userDefaults.removeObject(forKey: key) userDefaults.synchronize() DispatchQueue.main.async { resolver(nil) } } } }