Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion android/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -158,5 +158,5 @@ dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"

implementation("com.google.code.gson:gson:2.13.1")
implementation "io.didomi.sdk:android:2.46.0"
implementation "io.didomi.sdk:android:2.47.0"
}
22 changes: 22 additions & 0 deletions android/src/main/java/io/didomi/reactnative/DidomiModule.kt
Original file line number Diff line number Diff line change
Expand Up @@ -245,6 +245,16 @@ class DidomiModule(reactContext: ReactApplicationContext) : DidomiModuleSpec(rea
* Error while using an external SDK integration
*/
override fun integrationError(event: IntegrationErrorEvent) = prepareIntegrationErrorEvent(event)

/**
* A widget was displayed
*/
override fun showWidget(event: ShowWidgetEvent) = prepareShowWidgetEvent(event)

/**
* A widget was hidden
*/
override fun hideWidget(event: HideWidgetEvent) = prepareEvent(EventTypes.HIDE_WIDGET.event, null)
}

private val vendorStatusListeners: MutableSet<String> = mutableSetOf()
Expand Down Expand Up @@ -1250,6 +1260,18 @@ class DidomiModule(reactContext: ReactApplicationContext) : DidomiModuleSpec(rea
.emit(eventName, params)
}

private fun prepareShowWidgetEvent(event: ShowWidgetEvent) {
val eventName = EventTypes.SHOW_WIDGET.event
Log.d("prepareEvent", "Sending $eventName")
val params = WritableNativeMap().apply {
putString("widgetId", event.widgetId)
putString("layerName", event.layerName)
}
reactContext
.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter::class.java)
.emit(eventName, params)
}

// Required to transform from array to variadic.
private fun readableArrayToStringArray(readableArray: ReadableArray) = readableArray.toSet().toTypedArray()

Expand Down
6 changes: 5 additions & 1 deletion android/src/main/java/io/didomi/reactnative/EventTypes.kt
Original file line number Diff line number Diff line change
Expand Up @@ -68,5 +68,9 @@ enum class EventTypes(val event: String) {
VENDOR_STATUS_CHANGE_PREFIX("on_vendor_status_change_"),

// Integrations
INTEGRATION_ERROR_EVENT("on_integration_error")
INTEGRATION_ERROR_EVENT("on_integration_error"),

// Widgets
SHOW_WIDGET("on_show_widget"),
HIDE_WIDGET("on_hide_widget")
}
19 changes: 18 additions & 1 deletion ios/RNDidomi.swift
Original file line number Diff line number Diff line change
Expand Up @@ -763,7 +763,10 @@ extension RNDidomi {
"on_language_updated",
"on_language_update_failed",
// Integrations
"on_integration_error"
"on_integration_error",
// Widgets
"on_show_widget",
"on_hide_widget"
])
vendorStatusListeners.forEach {
eventsSet.insert("on_vendor_status_change_\($0)")
Expand Down Expand Up @@ -953,6 +956,20 @@ extension RNDidomi {
self?.dispatchEvent(withName: "on_integration_error", body: result)
}

// The iOS SDK names the property `widgetID` while Android names it `widgetId`.
// The event key must stay `widgetId` so both platforms match the JS type.
didomiEventListener.onShowWidget = { [weak self] event in
let result: [String: Any] = [
"widgetId": event.widgetID as Any,
"layerName": event.layerName as Any
]
self?.dispatchEvent(withName: "on_show_widget", body: result)
}

didomiEventListener.onHideWidget = { [weak self] event in
self?.dispatchEvent(withName: "on_hide_widget", body: "")
}

Didomi.shared.addEventListener(listener: didomiEventListener)
}

Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@didomi/react-native",
"version": "2.31.0",
"version": "2.32.0",
"description": "Didomi React Native SDK",
"main": "lib/commonjs/index",
"module": "lib/module/index",
Expand Down
2 changes: 1 addition & 1 deletion react-native-didomi.podspec
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ Pod::Spec.new do |s|

s.source_files = "ios/**/*.{h,m,mm,swift}"

s.dependency "Didomi-XCFramework", "2.46.0"
s.dependency "Didomi-XCFramework", "2.47.0"

install_modules_dependencies(s)
end
2 changes: 2 additions & 0 deletions sample/src/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,8 @@ function App() {
registerListener(DidomiEventType.PREFERENCES_CLICK_VIEW_VENDORS);
registerListener(DidomiEventType.LANGUAGE_UPDATED);
registerListener(DidomiEventType.LANGUAGE_UPDATE_FAILED);
registerListener(DidomiEventType.SHOW_WIDGET);
registerListener(DidomiEventType.HIDE_WIDGET);

Didomi.onReady().then(() => {
console.log('ready');
Expand Down
2 changes: 1 addition & 1 deletion src/Constants.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// User agent name
export const DIDOMI_USER_AGENT_NAME = "Didomi React-Native SDK"
// User agent version
export const DIDOMI_VERSION = "2.31.0"
export const DIDOMI_VERSION = "2.32.0"
21 changes: 21 additions & 0 deletions src/DidomiTypes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,9 @@ export enum DidomiEventType {
LANGUAGE_UPDATE_FAILED = "on_language_update_failed",
// Integrations
INTEGRATION_ERROR = "on_integration_error",
// Widgets
SHOW_WIDGET = "on_show_widget",
HIDE_WIDGET = "on_hide_widget",
}

export interface Vendor {
Expand Down Expand Up @@ -190,6 +193,24 @@ export interface IntegrationErrorEvent {
reason: string;
}

/**
* A widget was displayed.
* Emitted with the {@link DidomiEventType#SHOW_WIDGET} event type.
* @interface
*/
export interface ShowWidgetEvent {
/**
* Identifier of the widget that was displayed, as resolved by the Rules Engine.
* @property
*/
widgetId?: string;
/**
* Name of the layer at which the widget was displayed.
* @property
*/
layerName?: string;
}

export interface UserAuth {
id: string;
}
Expand Down
36 changes: 36 additions & 0 deletions src/__tests__/DidomiListener.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,3 +31,39 @@ describe('test remove listener', () => {
expect(DidomiListener.listeners.get(DidomiEventType.ERROR).length).toBe(0);
});
});

describe('test widget listeners', () => {
it('add and remove show widget listener', () => {
const callback = () => {};
DidomiListener.addEventListener(DidomiEventType.SHOW_WIDGET, callback);
expect(
DidomiListener.listeners.get(DidomiEventType.SHOW_WIDGET).length
).toBe(1);
DidomiListener.removeEventListener(DidomiEventType.SHOW_WIDGET, callback);
expect(
DidomiListener.listeners.get(DidomiEventType.SHOW_WIDGET).length
).toBe(0);
});

it('add and remove hide widget listener', () => {
const callback = () => {};
DidomiListener.addEventListener(DidomiEventType.HIDE_WIDGET, callback);
expect(
DidomiListener.listeners.get(DidomiEventType.HIDE_WIDGET).length
).toBe(1);
DidomiListener.removeEventListener(DidomiEventType.HIDE_WIDGET, callback);
expect(
DidomiListener.listeners.get(DidomiEventType.HIDE_WIDGET).length
).toBe(0);
});

it('registers the widget events with the native event emitter', () => {
DidomiListener.eventEmitter.addListener = jest.fn();
DidomiListener.init();
const registered = (
DidomiListener.eventEmitter.addListener as jest.Mock
).mock.calls.map((call) => call[0]);
expect(registered).toContain('on_show_widget');
expect(registered).toContain('on_hide_widget');
});
});
3 changes: 2 additions & 1 deletion src/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -13,5 +13,6 @@ export {
VendorStatus,
UserAuthWithEncryptionParams,
UserAuthWithHashParams,
DidomiInitializeParameters
DidomiInitializeParameters,
ShowWidgetEvent
} from './DidomiTypes';
2 changes: 2 additions & 0 deletions test/src/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,8 @@ function App() {
registerListener(DidomiEventType.LANGUAGE_UPDATED);
registerListener(DidomiEventType.LANGUAGE_UPDATE_FAILED);
registerListener(DidomiEventType.INTEGRATION_ERROR);
registerListener(DidomiEventType.SHOW_WIDGET);
registerListener(DidomiEventType.HIDE_WIDGET);
}, [registerListener]);

React.useEffect(() => {
Expand Down