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 @@ -149,7 +149,7 @@ def kotlin_version = getExtOrDefault('kotlinVersion')
dependencies {
//noinspection GradleDynamicVersion
implementation 'com.facebook.react:react-native:+' // From node_modules
implementation 'com.smallcase.gateway:sdk:6.0.5'
implementation 'com.smallcase.gateway:sdk-dhruv-propagate-dm-events-17a02a6:6.0.5-3186-release'
implementation 'com.smallcase.loans:sdk:5.1.1'
implementation "androidx.core:core-ktx:1.3.1"
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
Expand Down
13 changes: 9 additions & 4 deletions smart_investing_react_native/app/screens/SmtScreen.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import React from 'react';
import {Button, TextInput, View} from 'react-native';
import {launchSmallPlug} from '../apis/Functions';
import {SCGatewayEventManager} from 'react-native-smallcase-gateway';

const SmtScreen = () => {
const [targetEndpoint, onChangeTargetEndpoint] = React.useState<
Expand Down Expand Up @@ -70,6 +71,12 @@ const SmtScreen = () => {
backIconOpacity: bo,
};

const smallplugSub = SCGatewayEventManager.subscribeToSmallplugEvents(
event => {
console.log('[SmallPlug Event]:', event);
},
);

try {
const result = await launchSmallPlug(
targetEndpoint,
Expand All @@ -79,16 +86,14 @@ const SmtScreen = () => {
console.log('✅ Smallplug Success:', result);
if (result?.data?.userInfo) {
console.log(' User Info:', result.data.userInfo);
// You can use the userInfo object here, for example, show an alert
// alert(`Success! User phone: ${result.data.userInfo.phoneNumber}`);
}
} catch (error: any) {
console.error(' Smallplug Error:', error);
if (error?.data?.userInfo) {
console.log(' User Info from error:', error.data.userInfo);
// You can use the userInfo object here
// alert(`Failure! User phone: ${error.data.userInfo.phoneNumber}`);
}
} finally {
smallplugSub?.remove();
}
}}
title={'SmallPlug'}
Expand Down
38 changes: 38 additions & 0 deletions src/SCGatewayEventEmitter.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
SUPER_PROPERTIES_UPDATED: 'scgateway_super_properties_updated',
USER_RESET: 'scgateway_user_reset',
USER_IDENTIFY: 'scgateway_user_identify',
SMALLPLUG_ANALYTICS_EVENT: 'smallplug_analytics_event',
};

const SCGatewayNotificationEvent = 'scg_notification';
Expand Down Expand Up @@ -104,6 +105,43 @@
return subscription;
}

/**
* Subscribe to SmallPlug / DM analytics events streamed during a launchSmallplug session.
* Events have shape: { eventName: string, data: object, timestamp: number }
* @param {(event: {eventName: string, data: any, timestamp: number}) => void} callback
* @returns {GatewayEventSubscription}
*/
subscribeToSmallplugEvents(callback) {
if (!this.isInitialized) {
console.warn('[SCGatewayEvents] Event emitter not initialized');
return null;
}

if (typeof callback !== 'function') {
console.warn('[SCGatewayEvents] Invalid callback provided for SmallPlug subscription');

Check failure on line 121 in src/SCGatewayEventEmitter.js

View workflow job for this annotation

GitHub Actions / ESLint & Prettier

Replace `'[SCGatewayEvents]·Invalid·callback·provided·for·SmallPlug·subscription'` with `⏎········'[SCGatewayEvents]·Invalid·callback·provided·for·SmallPlug·subscription'⏎······`
return null;
}

const subscription = this.eventEmitter.addListener(
SCGatewayNotificationEvent,
(jsonString) => {
if (!jsonString) return;
let parsed;
try {
parsed = JSON.parse(jsonString);
} catch (e) {
return;
}
if (parsed.type !== 'smallplug_analytics_event') return;
const { eventName, data } = parsed.data ?? {};
callback({ eventName, data, timestamp: parsed.timestamp ?? Date.now() });

Check failure on line 137 in src/SCGatewayEventEmitter.js

View workflow job for this annotation

GitHub Actions / ESLint & Prettier

Replace `·eventName,·data,·timestamp:·parsed.timestamp·??·Date.now()` with `⏎··········eventName,⏎··········data,⏎··········timestamp:·parsed.timestamp·??·Date.now(),⏎·······`
}
);

this.subscriptions.push(subscription);
return subscription;
}

/**
* Unsubscribe from Gateway Events
* @param {GatewayEventSubscription} subscription - Subscription returned from subscribeToGatewayEvents
Expand Down
8 changes: 8 additions & 0 deletions types/index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,12 @@ export interface LoansEvent {
timestamp: number;
}

export interface SmallplugAnalyticsEvent {
eventName: string;
data: Record<string, any>;
timestamp: number;
}

export interface GatewayEventSubscription {
remove(): void;
}
Expand All @@ -22,6 +28,7 @@ export interface LoansEventSubscription {

interface SCGatewayEventManagerInterface {
subscribeToGatewayEvents(callback: ((event: GatewayEvent) => void)): GatewayEventSubscription | null;
subscribeToSmallplugEvents(callback: ((event: SmallplugAnalyticsEvent) => void)): GatewayEventSubscription | null;
unsubscribeFromGatewayEvents(subscription: GatewayEventSubscription): void;
}

Expand Down Expand Up @@ -87,6 +94,7 @@ declare const _default: {
SCLoansEventManager: SCLoansEventManagerInterface;
subscribeToGatewayEvents: (callback: (event: GatewayEvent) => void) => GatewayEventSubscription | null;
unsubscribeFromGatewayEvents: (subscription: GatewayEventSubscription) => void;
subscribeToSmallplugEvents: (callback: (event: SmallplugAnalyticsEvent) => void) => GatewayEventSubscription | null;
subscribeToLoansEvent: (callback: (event: LoansEvent) => void) => LoansEventSubscription | null;
unsubscribeFromLoansEvent: (subscription: LoansEventSubscription) => void;
};
Expand Down
Loading