import Foundation import AppConsent import os extension OSLog { static let sfbxlog: OSLog = OSLog(subsystem: "io.sfbx.appconsent", category: "AppConsent") } @objc(AppconsentClearReactnative) class AppconsentClearReactnative: NSObject { private var notice: ACNotice? @objc func constantsToExport() -> [AnyHashable : Any]! { return ["version": "4.4.7"] } @objc static func requiresMainQueueSetup() -> Bool { return true } @objc func configureWith(_ appKey: String, forceApplyGDPR: Bool, forceATT: Bool) { self.notice = ACNotice(withAppKey: appKey, forceApplyGDPR: forceApplyGDPR, forceATT: forceATT) } @objc func present(_ force: Bool) { OperationQueue.main.addOperation { guard let controller = UIApplication.shared.delegate?.window??.rootViewController else { os_log("AppConsent: Failed to attach CMP to window rootViewController.", log: OSLog.sfbxlog, type: .error) return } self.notice?.presentNotice(force: force, viewController: controller) } } @objc func checkForUpdate(_ resolver: RCTPromiseResolveBlock?, rejecter: RCTPromiseRejectBlock?) { self.notice?.checkForUpdate({ success in resolver?(success) }, failure: { error in rejecter?("checkForUpdateFailure", "Error returned", error) }) } @objc func isGDPRCountry(_ resolver: RCTPromiseResolveBlock?, rejecter: RCTPromiseRejectBlock?) { guard let value = self.notice?.isGDPRCountry() else { rejecter?("isGDPRCountryFailure", "Unknown value", nil) return } resolver?(value) } @objc func consentAlreadyGiven(_ resolver: RCTPromiseResolveBlock?, rejecter: RCTPromiseRejectBlock?) { guard let value = self.notice?.consentGiven() else { rejecter?("consentAlreadyGivenFailure", "Unknown value", nil) return } resolver?(value) } @objc func consentGiven(_ resolver: RCTPromiseResolveBlock?, rejecter: RCTPromiseRejectBlock?) { self.notice?.consentGiven(success: { resolver?(true) }, failure: { error in rejecter?("consentGivenFailure", "Unknown value", nil) }) } @objc func clearConsent() { self.notice?.clearConsent() } @objc func extraConsentableAllowed(_ extraId: String, resolver: RCTPromiseResolveBlock?, rejecter: RCTPromiseRejectBlock?) { guard let value = self.notice?.extraConsentableAllowed(extraId: extraId) else { rejecter?("extraConsentableAllowedFailure", "Unknown value", nil) return } resolver?(value) } @objc func extraVendorAllowed(_ extraId: String, resolver: RCTPromiseResolveBlock?, rejecter: RCTPromiseRejectBlock?) { guard let value = self.notice?.extraVendorAllowed(extraId: extraId) else { rejecter?("extraVendorAllowedFailure", "Unknown value", nil) return } resolver?(value) } @objc func extraFloatingPurposeAllowed(_ extraId: String, resolver: RCTPromiseResolveBlock?, rejecter: RCTPromiseRejectBlock?) { guard let value = self.notice?.floatingPurposeAllowed(extraId: extraId) else { rejecter?("extraFloatingPurposeAllowedFailure", "Unknown value", nil) return } resolver?(value) } @objc func setConsentableConsent(_ values: [String: NSInteger], resolver: RCTPromiseResolveBlock?, rejecter: RCTPromiseRejectBlock?) { self.notice?.setConsentableConsents(values: values, success: { resolver?(true) }, failure: { error in rejecter?("setConsentableConsentFailure", "Error returned", error) }) } @objc func setExtraConsentableConsent(_ values: [String: NSInteger], resolver: RCTPromiseResolveBlock?, rejecter: RCTPromiseRejectBlock?) { self.notice?.setExtraConsentableConsents(values: values, success: { resolver?(true) }, failure: { error in rejecter?("setExtraConsentableConsentFailure", "Error returned", error) }) } @objc func getExternalIds(_ resolver: RCTPromiseResolveBlock?, rejecter: RCTPromiseRejectBlock?) { guard let value: Dictionary = self.notice?.getExternalIds() else { os_log("AppConsent: ERROR getExternalIds.", log: OSLog.sfbxlog, type: .error) rejecter?("getExternalIdsFailure", "Unknown value", nil) return } os_log("AppConsent: getExternalIds. %{public}s", log: OSLog.sfbxlog, type: .info, value.debugDescription) resolver?(value.debugDescription) } @objc func setExternalIds(_ ids: [String: String], resolver: RCTPromiseResolveBlock?, rejecter: RCTPromiseRejectBlock?) { guard let value = self.notice?.setExternalIds(externalIds: ids) else { os_log("AppConsent: ERROR setExternalIds.", log: OSLog.sfbxlog, type: .error) rejecter?("setExternalIdsFailure", "Unknown value", nil) return } resolver?(true) } @objc func saveExternalIds(_ resolver: RCTPromiseResolveBlock?, rejecter: RCTPromiseRejectBlock?) { self.notice?.saveExternalIds(success: { state, configuration in resolver?(true) }, failure: { error in os_log("AppConsent: ERROR saveExternalIds: %{public}s", log: OSLog.sfbxlog, type: .error, error.localizedDescription) rejecter?("saveExternalIdsFailure", error.localizedDescription, error) }) } // *********************************************** // MARK: - WARNING - Deprecated // *********************************************** @objc func consentableAllowedByObjectId(_ objectId: String, resolver: RCTPromiseResolveBlock?, rejecter: RCTPromiseRejectBlock?) { guard let id: UInt32 = UInt32(objectId) else { rejecter?("consentableAllowedByIABIdFailure", "bad objectId value, not an int", nil) return } guard let value = self.notice?.consentableAllowed(objectId: id) else { rejecter?("consentableAllowedByObjectIdFailure", "Unknown value", nil) return } resolver?(value) } @objc func consentableAllowedByIABId(_ iabId: String, type: NSInteger, resolver: RCTPromiseResolveBlock?, rejecter: RCTPromiseRejectBlock?) { guard let id: UInt32 = UInt32(iabId) else { rejecter?("consentableAllowedByIABIdFailure", "bad iabId value, not an int", nil) return } guard let consentableType = ACConsentableType(rawValue: type) else { rejecter?("consentableAllowedByIABIdFailure", "Unknown consentable type", nil) return } guard let value = self.notice?.consentableAllowed(iabId: id, type: consentableType) else { rejecter?("consentableAllowedByIABIdFailure", "Unknown iabId", nil) return } resolver?(value) } @objc func vendorAllowedByIABId(_ iabId: String, resolver: RCTPromiseResolveBlock?, rejecter: RCTPromiseRejectBlock?) { guard let id: UInt32 = UInt32(iabId) else { rejecter?("consentableAllowedByIABIdFailure", "bad iabId value, not an int", nil) return } guard let value = self.notice?.vendorAllowed(iabId: id) else { rejecter?("vendorAllowedByIABIdFailure", "Unknown value", nil) return } resolver?(value) } @objc func stackAllowedByIABId(_ iabId: String, resolver: RCTPromiseResolveBlock?, rejecter: RCTPromiseRejectBlock?) { guard let id: UInt32 = UInt32(iabId) else { rejecter?("consentableAllowedByIABIdFailure", "bad iabId value, not an int", nil) return } guard let value = self.notice?.stackAllowed(iabId: id) else { rejecter?("stackAllowedByIABIdFailure", "Unknown value", nil) return } resolver?(value) } @objc func getAppKey(_ resolver: RCTPromiseResolveBlock?, rejecter: RCTPromiseRejectBlock?) { guard let value = self.notice?.appKey else { rejecter?("getAppKeyFailure", "Unknown value", nil) return } resolver?(value) } @objc func getForceApplyGDPR(_ resolver: RCTPromiseResolveBlock?, rejecter: RCTPromiseRejectBlock?) { guard let value = self.notice?.forceApplyGDPR else { rejecter?("getForceApplyGDPRFailure", "Unknown value", nil) return } resolver?(value) } // *********************************************** // MARK: - WARNING - Only iOS // *********************************************** @objc func getForceATT(_ resolver: RCTPromiseResolveBlock?, rejecter: RCTPromiseRejectBlock?) { guard let value = self.notice?.forceATT else { rejecter?("getForceATTFailure", "Unknown value", nil) return } resolver?(value) } @objc func appTrackingIsAvailable(_ resolver: RCTPromiseResolveBlock?, rejecter: RCTPromiseRejectBlock?) { guard let value = self.notice?.appTrackingIsAvailable() else { rejecter?("appTrackingIsAvailableFailure", "Unknown value", nil) return } resolver?(value) } @objc func appTrackingAuthorizationGiven(_ resolver: RCTPromiseResolveBlock?, rejecter: RCTPromiseRejectBlock?) { guard let value = self.notice?.appTrackingAuthorizationGiven() else { rejecter?("appTrackingAuthorizationGivenFailure", "Unknown value", nil) return } resolver?(value.rawValue) } @objc func appTrackingAuthorizationStatus(_ resolver: RCTPromiseResolveBlock?, rejecter: RCTPromiseRejectBlock?) { guard let value = self.notice?.appTrackingAuthorizationStatus() else { rejecter?("appTrackingAuthorizationStatusFailure", "Unknown value", nil) return } resolver?(value.rawValue) } }