Skip to content

Commit cd04b47

Browse files
feat: add showWidget and hideWidget events (#186)
Update native SDKs to 2.47.0 (iOS and Android) and expose the new widget events, mirroring didomi/flutter#157. - Add SHOW_WIDGET / HIDE_WIDGET to DidomiEventType, with a ShowWidgetEvent payload type (widgetId, layerName). - Bridge the events on both platforms. The iOS SDK names the property `widgetID` while Android names it `widgetId`; the event key is normalized to `widgetId` so the JS type matches on both platforms. - Register the events in the sample and test apps, and cover the new event types in DidomiListener tests.
1 parent 052574c commit cd04b47

12 files changed

Lines changed: 112 additions & 7 deletions

File tree

android/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,5 +158,5 @@ dependencies {
158158
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
159159

160160
implementation("com.google.code.gson:gson:2.13.1")
161-
implementation "io.didomi.sdk:android:2.46.0"
161+
implementation "io.didomi.sdk:android:2.47.0"
162162
}

android/src/main/java/io/didomi/reactnative/DidomiModule.kt

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,16 @@ class DidomiModule(reactContext: ReactApplicationContext) : DidomiModuleSpec(rea
245245
* Error while using an external SDK integration
246246
*/
247247
override fun integrationError(event: IntegrationErrorEvent) = prepareIntegrationErrorEvent(event)
248+
249+
/**
250+
* A widget was displayed
251+
*/
252+
override fun showWidget(event: ShowWidgetEvent) = prepareShowWidgetEvent(event)
253+
254+
/**
255+
* A widget was hidden
256+
*/
257+
override fun hideWidget(event: HideWidgetEvent) = prepareEvent(EventTypes.HIDE_WIDGET.event, null)
248258
}
249259

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

1263+
private fun prepareShowWidgetEvent(event: ShowWidgetEvent) {
1264+
val eventName = EventTypes.SHOW_WIDGET.event
1265+
Log.d("prepareEvent", "Sending $eventName")
1266+
val params = WritableNativeMap().apply {
1267+
putString("widgetId", event.widgetId)
1268+
putString("layerName", event.layerName)
1269+
}
1270+
reactContext
1271+
.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter::class.java)
1272+
.emit(eventName, params)
1273+
}
1274+
12531275
// Required to transform from array to variadic.
12541276
private fun readableArrayToStringArray(readableArray: ReadableArray) = readableArray.toSet().toTypedArray()
12551277

android/src/main/java/io/didomi/reactnative/EventTypes.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,5 +68,9 @@ enum class EventTypes(val event: String) {
6868
VENDOR_STATUS_CHANGE_PREFIX("on_vendor_status_change_"),
6969

7070
// Integrations
71-
INTEGRATION_ERROR_EVENT("on_integration_error")
71+
INTEGRATION_ERROR_EVENT("on_integration_error"),
72+
73+
// Widgets
74+
SHOW_WIDGET("on_show_widget"),
75+
HIDE_WIDGET("on_hide_widget")
7276
}

ios/RNDidomi.swift

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -763,7 +763,10 @@ extension RNDidomi {
763763
"on_language_updated",
764764
"on_language_update_failed",
765765
// Integrations
766-
"on_integration_error"
766+
"on_integration_error",
767+
// Widgets
768+
"on_show_widget",
769+
"on_hide_widget"
767770
])
768771
vendorStatusListeners.forEach {
769772
eventsSet.insert("on_vendor_status_change_\($0)")
@@ -953,6 +956,20 @@ extension RNDidomi {
953956
self?.dispatchEvent(withName: "on_integration_error", body: result)
954957
}
955958

959+
// The iOS SDK names the property `widgetID` while Android names it `widgetId`.
960+
// The event key must stay `widgetId` so both platforms match the JS type.
961+
didomiEventListener.onShowWidget = { [weak self] event in
962+
let result: [String: Any] = [
963+
"widgetId": event.widgetID as Any,
964+
"layerName": event.layerName as Any
965+
]
966+
self?.dispatchEvent(withName: "on_show_widget", body: result)
967+
}
968+
969+
didomiEventListener.onHideWidget = { [weak self] event in
970+
self?.dispatchEvent(withName: "on_hide_widget", body: "")
971+
}
972+
956973
Didomi.shared.addEventListener(listener: didomiEventListener)
957974
}
958975

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@didomi/react-native",
3-
"version": "2.31.0",
3+
"version": "2.32.0",
44
"description": "Didomi React Native SDK",
55
"main": "lib/commonjs/index",
66
"module": "lib/module/index",

react-native-didomi.podspec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ Pod::Spec.new do |s|
1515

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

18-
s.dependency "Didomi-XCFramework", "2.46.0"
18+
s.dependency "Didomi-XCFramework", "2.47.0"
1919

2020
install_modules_dependencies(s)
2121
end

sample/src/App.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,8 @@ function App() {
6565
registerListener(DidomiEventType.PREFERENCES_CLICK_VIEW_VENDORS);
6666
registerListener(DidomiEventType.LANGUAGE_UPDATED);
6767
registerListener(DidomiEventType.LANGUAGE_UPDATE_FAILED);
68+
registerListener(DidomiEventType.SHOW_WIDGET);
69+
registerListener(DidomiEventType.HIDE_WIDGET);
6870

6971
Didomi.onReady().then(() => {
7072
console.log('ready');

src/Constants.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
// User agent name
22
export const DIDOMI_USER_AGENT_NAME = "Didomi React-Native SDK"
33
// User agent version
4-
export const DIDOMI_VERSION = "2.31.0"
4+
export const DIDOMI_VERSION = "2.32.0"

src/DidomiTypes.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,9 @@ export enum DidomiEventType {
7777
LANGUAGE_UPDATE_FAILED = "on_language_update_failed",
7878
// Integrations
7979
INTEGRATION_ERROR = "on_integration_error",
80+
// Widgets
81+
SHOW_WIDGET = "on_show_widget",
82+
HIDE_WIDGET = "on_hide_widget",
8083
}
8184

8285
export interface Vendor {
@@ -190,6 +193,24 @@ export interface IntegrationErrorEvent {
190193
reason: string;
191194
}
192195

196+
/**
197+
* A widget was displayed.
198+
* Emitted with the {@link DidomiEventType#SHOW_WIDGET} event type.
199+
* @interface
200+
*/
201+
export interface ShowWidgetEvent {
202+
/**
203+
* Identifier of the widget that was displayed, as resolved by the Rules Engine.
204+
* @property
205+
*/
206+
widgetId?: string;
207+
/**
208+
* Name of the layer at which the widget was displayed.
209+
* @property
210+
*/
211+
layerName?: string;
212+
}
213+
193214
export interface UserAuth {
194215
id: string;
195216
}

src/__tests__/DidomiListener.test.ts

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,3 +31,39 @@ describe('test remove listener', () => {
3131
expect(DidomiListener.listeners.get(DidomiEventType.ERROR).length).toBe(0);
3232
});
3333
});
34+
35+
describe('test widget listeners', () => {
36+
it('add and remove show widget listener', () => {
37+
const callback = () => {};
38+
DidomiListener.addEventListener(DidomiEventType.SHOW_WIDGET, callback);
39+
expect(
40+
DidomiListener.listeners.get(DidomiEventType.SHOW_WIDGET).length
41+
).toBe(1);
42+
DidomiListener.removeEventListener(DidomiEventType.SHOW_WIDGET, callback);
43+
expect(
44+
DidomiListener.listeners.get(DidomiEventType.SHOW_WIDGET).length
45+
).toBe(0);
46+
});
47+
48+
it('add and remove hide widget listener', () => {
49+
const callback = () => {};
50+
DidomiListener.addEventListener(DidomiEventType.HIDE_WIDGET, callback);
51+
expect(
52+
DidomiListener.listeners.get(DidomiEventType.HIDE_WIDGET).length
53+
).toBe(1);
54+
DidomiListener.removeEventListener(DidomiEventType.HIDE_WIDGET, callback);
55+
expect(
56+
DidomiListener.listeners.get(DidomiEventType.HIDE_WIDGET).length
57+
).toBe(0);
58+
});
59+
60+
it('registers the widget events with the native event emitter', () => {
61+
DidomiListener.eventEmitter.addListener = jest.fn();
62+
DidomiListener.init();
63+
const registered = (
64+
DidomiListener.eventEmitter.addListener as jest.Mock
65+
).mock.calls.map((call) => call[0]);
66+
expect(registered).toContain('on_show_widget');
67+
expect(registered).toContain('on_hide_widget');
68+
});
69+
});

0 commit comments

Comments
 (0)