diff --git a/android/src/main/java/io/didomi/reactnative/DidomiModule.kt b/android/src/main/java/io/didomi/reactnative/DidomiModule.kt index c5f3581c..8e8a1790 100644 --- a/android/src/main/java/io/didomi/reactnative/DidomiModule.kt +++ b/android/src/main/java/io/didomi/reactnative/DidomiModule.kt @@ -606,6 +606,24 @@ class DidomiModule(reactContext: ReactApplicationContext) : DidomiModuleSpec(rea } } + @ReactMethod + override fun getUserCountryCode(promise: Promise) { + try { + promise.resolve(Didomi.getInstance().userCountryCode) + } catch (e: DidomiNotReadyException) { + promise.reject(e) + } + } + + @ReactMethod + override fun getUserRegionCode(promise: Promise) { + try { + promise.resolve(Didomi.getInstance().userRegionCode) + } catch (e: DidomiNotReadyException) { + promise.reject(e) + } + } + @ReactMethod override fun hideNotice(promise: Promise) { try { diff --git a/ios/Didomi.m b/ios/Didomi.m index 3c3a3af7..a6233ce9 100644 --- a/ios/Didomi.m +++ b/ios/Didomi.m @@ -68,6 +68,12 @@ @interface RCT_EXTERN_MODULE(Didomi, RCTEventEmitter) RCT_EXTERN_METHOD(getApplicableRegulation:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) +RCT_EXTERN_METHOD(getUserCountryCode:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject) + +RCT_EXTERN_METHOD(getUserRegionCode:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject) + RCT_EXTERN_METHOD(setCurrentUserStatus:(NSString *)currentUserStatusAsString resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) diff --git a/ios/RNDidomi.swift b/ios/RNDidomi.swift index 98c69aeb..e39544e1 100644 --- a/ios/RNDidomi.swift +++ b/ios/RNDidomi.swift @@ -169,7 +169,17 @@ class RNDidomi: RCTEventEmitter { func getApplicableRegulation(resolve:RCTPromiseResolveBlock, reject:RCTPromiseRejectBlock) { resolve(Didomi.shared.applicableRegulation.description) } - + + @objc(getUserCountryCode:reject:) + func getUserCountryCode(resolve:RCTPromiseResolveBlock, reject:RCTPromiseRejectBlock) { + resolve(Didomi.shared.userCountryCode) + } + + @objc(getUserRegionCode:reject:) + func getUserRegionCode(resolve:RCTPromiseResolveBlock, reject:RCTPromiseRejectBlock) { + resolve(Didomi.shared.userRegionCode) + } + @objc(setCurrentUserStatus:resolve:reject:) func setCurrentUserStatus(currentUserStatusAsString: String, resolve:RCTPromiseResolveBlock, reject:RCTPromiseRejectBlock) { guard let jsonData = currentUserStatusAsString.data(using: .utf8) else { diff --git a/src/Didomi.ts b/src/Didomi.ts index 26acfd57..9b81e589 100644 --- a/src/Didomi.ts +++ b/src/Didomi.ts @@ -354,6 +354,18 @@ export const Didomi = { */ getCurrentUserStatus: (): Promise => RNDidomi.getCurrentUserStatus(), + /** + * Get the country code determined for the user (for example "FR" or "US"). + * @returns the user country code, or null when unknown. + */ + getUserCountryCode: (): Promise => RNDidomi.getUserCountryCode(), + + /** + * Get the region code determined for the user (for example "CA"). + * @returns the user region code, or null when unknown. + */ + getUserRegionCode: (): Promise => RNDidomi.getUserRegionCode(), + /** * Get the user consent status. * @returns: status that represents user consent. diff --git a/src/__tests__/Didomi.test.ts b/src/__tests__/Didomi.test.ts new file mode 100644 index 00000000..1a39c1d8 --- /dev/null +++ b/src/__tests__/Didomi.test.ts @@ -0,0 +1,36 @@ +jest.mock('../specs/NativeDidomi', () => ({ + __esModule: true, + default: { + getUserCountryCode: jest.fn(), + getUserRegionCode: jest.fn(), + }, +})); + +import { Didomi } from '../Didomi'; +import NativeDidomi from '../specs/NativeDidomi'; + +const RNDidomi = NativeDidomi as any; + +describe('getUserCountryCode', () => { + it('resolves the value returned by the native module', async () => { + RNDidomi.getUserCountryCode.mockResolvedValue('FR'); + await expect(Didomi.getUserCountryCode()).resolves.toBe('FR'); + }); + + it('resolves null when unknown', async () => { + RNDidomi.getUserCountryCode.mockResolvedValue(null); + await expect(Didomi.getUserCountryCode()).resolves.toBeNull(); + }); +}); + +describe('getUserRegionCode', () => { + it('resolves the value returned by the native module', async () => { + RNDidomi.getUserRegionCode.mockResolvedValue('CA'); + await expect(Didomi.getUserRegionCode()).resolves.toBe('CA'); + }); + + it('resolves null when unknown', async () => { + RNDidomi.getUserRegionCode.mockResolvedValue(null); + await expect(Didomi.getUserRegionCode()).resolves.toBeNull(); + }); +}); diff --git a/src/specs/NativeDidomi.ts b/src/specs/NativeDidomi.ts index 95c021a9..1454c18d 100644 --- a/src/specs/NativeDidomi.ts +++ b/src/specs/NativeDidomi.ts @@ -76,6 +76,8 @@ export interface Spec extends TurboModule { setUserDisagreeToAll(): Promise; getApplicableRegulation(): Promise; + getUserCountryCode(): Promise; + getUserRegionCode(): Promise; getPurpose(purposeId: string): Promise; getRequiredPurposes(): Promise; getRequiredPurposeIds(): Promise>;