From d3f0765441dbed721eb6b5d0a25838efde312d1c Mon Sep 17 00:00:00 2001 From: Jaissica Date: Tue, 12 May 2026 17:58:51 -0400 Subject: [PATCH] refactor: migrate nativeSdkHelpers module to TS --- src/nativeSdkHelpers.interfaces.ts | 2 +- ...ativeSdkHelpers.js => nativeSdkHelpers.ts} | 111 ++++++++++-------- 2 files changed, 61 insertions(+), 52 deletions(-) rename src/{nativeSdkHelpers.js => nativeSdkHelpers.ts} (54%) diff --git a/src/nativeSdkHelpers.interfaces.ts b/src/nativeSdkHelpers.interfaces.ts index ae7ba09bc..d26996176 100644 --- a/src/nativeSdkHelpers.interfaces.ts +++ b/src/nativeSdkHelpers.interfaces.ts @@ -9,5 +9,5 @@ export interface INativeSdkHelpers { sendToNative: (path: string, value?: string) => void; sendViaBridgeV1: (path: string, value: string) => void; sendViaIframeToIOS: (path: string, value: string) => void; - sendViaBridgeV2: (path: string, value: string, requiredWebviewBridgeName: boolean) => void; + sendViaBridgeV2: (path: string, value: string, requiredWebviewBridgeName: string) => void; } diff --git a/src/nativeSdkHelpers.js b/src/nativeSdkHelpers.ts similarity index 54% rename from src/nativeSdkHelpers.js rename to src/nativeSdkHelpers.ts index b8464dd7b..5f9aa90f8 100644 --- a/src/nativeSdkHelpers.js +++ b/src/nativeSdkHelpers.ts @@ -1,13 +1,19 @@ import Constants from './constants'; +import { IMParticleWebSDKInstance } from './mp-instance'; +import { INativeSdkHelpers } from './nativeSdkHelpers.interfaces'; +import { Dictionary } from './utils'; -var Messages = Constants.Messages; +const Messages = Constants.Messages; -var androidBridgeNameBase = 'mParticleAndroid'; -var iosBridgeNameBase = 'mParticle'; +const androidBridgeNameBase = 'mParticleAndroid'; +const iosBridgeNameBase = 'mParticle'; -export default function NativeSdkHelpers(mpInstance) { - var self = this; - this.initializeSessionAttributes = function(apiKey) { +export default function NativeSdkHelpers( + this: INativeSdkHelpers, + mpInstance: IMParticleWebSDKInstance +): void { + const self = this; + this.initializeSessionAttributes = function(apiKey: string): void { const { SetSessionAttribute } = Constants.NativeSdkPaths; const env = JSON.stringify({ key: '$src_env', @@ -25,28 +31,27 @@ export default function NativeSdkHelpers(mpInstance) { } }; - this.isBridgeV2Available = function(bridgeName) { + this.isBridgeV2Available = function(bridgeName: string): boolean { if (!bridgeName) { return false; } - var androidBridgeName = + const androidBridgeName = androidBridgeNameBase + '_' + bridgeName + '_v2'; - var iosBridgeName = iosBridgeNameBase + '_' + bridgeName + '_v2'; + const iosBridgeName = iosBridgeNameBase + '_' + bridgeName + '_v2'; // iOS v2 bridge if ( - window.webkit && - window.webkit.messageHandlers && - window.webkit.messageHandlers.hasOwnProperty(iosBridgeName) + (window as Dictionary).webkit && + (window as Dictionary).webkit.messageHandlers && + (window as Dictionary).webkit.messageHandlers.hasOwnProperty(iosBridgeName) ) { return true; } // other iOS v2 bridge - // TODO: what to do about people setting things on mParticle itself? if ( window.mParticle && - window.mParticle.uiwebviewBridgeName && - window.mParticle.uiwebviewBridgeName === iosBridgeName + (window.mParticle as Dictionary).uiwebviewBridgeName && + (window.mParticle as Dictionary).uiwebviewBridgeName === iosBridgeName ) { return true; } @@ -58,23 +63,23 @@ export default function NativeSdkHelpers(mpInstance) { }; this.isWebviewEnabled = function( - requiredWebviewBridgeName, - minWebviewBridgeVersion - ) { - mpInstance._Store.bridgeV2Available = self.isBridgeV2Available( + requiredWebviewBridgeName: string, + minWebviewBridgeVersion: number + ): boolean { + (mpInstance._Store as Dictionary).bridgeV2Available = self.isBridgeV2Available( requiredWebviewBridgeName ); - mpInstance._Store.bridgeV1Available = self.isBridgeV1Available(); + (mpInstance._Store as Dictionary).bridgeV1Available = self.isBridgeV1Available(); if (minWebviewBridgeVersion === 2) { - return mpInstance._Store.bridgeV2Available; + return (mpInstance._Store as Dictionary).bridgeV2Available; } // iOS BridgeV1 can be available via mParticle.isIOS, but return false if uiwebviewBridgeName doesn't match requiredWebviewBridgeName if (window.mParticle) { if ( - window.mParticle.uiwebviewBridgeName && - window.mParticle.uiwebviewBridgeName !== + (window.mParticle as Dictionary).uiwebviewBridgeName && + (window.mParticle as Dictionary).uiwebviewBridgeName !== iosBridgeNameBase + '_' + requiredWebviewBridgeName + '_v2' ) { return false; @@ -84,18 +89,18 @@ export default function NativeSdkHelpers(mpInstance) { if (minWebviewBridgeVersion < 2) { // ios return ( - mpInstance._Store.bridgeV2Available || - mpInstance._Store.bridgeV1Available + (mpInstance._Store as Dictionary).bridgeV2Available || + (mpInstance._Store as Dictionary).bridgeV1Available ); } return false; }; - this.isBridgeV1Available = function() { + this.isBridgeV1Available = function(): boolean { if ( mpInstance._Store.SDKConfig.useNativeSdk || - window.mParticleAndroid || + (window as Dictionary).mParticleAndroid || mpInstance._Store.SDKConfig.isIOS ) { return true; @@ -104,9 +109,9 @@ export default function NativeSdkHelpers(mpInstance) { return false; }; - this.sendToNative = function(path, value) { + this.sendToNative = function(path: string, value?: string): void { if ( - mpInstance._Store.bridgeV2Available && + (mpInstance._Store as Dictionary).bridgeV2Available && mpInstance._Store.SDKConfig.minWebviewBridgeVersion === 2 ) { self.sendViaBridgeV2( @@ -117,7 +122,7 @@ export default function NativeSdkHelpers(mpInstance) { return; } if ( - mpInstance._Store.bridgeV2Available && + (mpInstance._Store as Dictionary).bridgeV2Available && mpInstance._Store.SDKConfig.minWebviewBridgeVersion < 2 ) { self.sendViaBridgeV2( @@ -128,7 +133,7 @@ export default function NativeSdkHelpers(mpInstance) { return; } if ( - mpInstance._Store.bridgeV1Available && + (mpInstance._Store as Dictionary).bridgeV1Available && mpInstance._Store.SDKConfig.minWebviewBridgeVersion < 2 ) { self.sendViaBridgeV1(path, value); @@ -136,15 +141,15 @@ export default function NativeSdkHelpers(mpInstance) { } }; - this.sendViaBridgeV1 = function(path, value) { + this.sendViaBridgeV1 = function(path: string, value: string): void { if ( - window.mParticleAndroid && - window.mParticleAndroid.hasOwnProperty(path) + (window as Dictionary).mParticleAndroid && + (window as Dictionary).mParticleAndroid.hasOwnProperty(path) ) { mpInstance.Logger.verbose( Messages.InformationMessages.SendAndroid + path ); - window.mParticleAndroid[path](value); + (window as Dictionary).mParticleAndroid[path](value); } else if (mpInstance._Store.SDKConfig.isIOS) { mpInstance.Logger.verbose( Messages.InformationMessages.SendIOS + path @@ -153,8 +158,8 @@ export default function NativeSdkHelpers(mpInstance) { } }; - this.sendViaIframeToIOS = function(path, value) { - var iframe = document.createElement('IFRAME'); + this.sendViaIframeToIOS = function(path: string, value: string): void { + const iframe = document.createElement('IFRAME'); iframe.setAttribute( 'src', 'mp-sdk://' + path + '/' + encodeURIComponent(value) @@ -163,30 +168,34 @@ export default function NativeSdkHelpers(mpInstance) { iframe.parentNode.removeChild(iframe); }; - this.sendViaBridgeV2 = function(path, value, requiredWebviewBridgeName) { + this.sendViaBridgeV2 = function( + path: string, + value: string, + requiredWebviewBridgeName: string + ): void { if (!requiredWebviewBridgeName) { return; } - var androidBridgeName = - androidBridgeNameBase + '_' + requiredWebviewBridgeName + '_v2', - androidBridge = window[androidBridgeName], - iosBridgeName = - iosBridgeNameBase + '_' + requiredWebviewBridgeName + '_v2', - iOSBridgeMessageHandler, - iOSBridgeNonMessageHandler; + const androidBridgeName = + androidBridgeNameBase + '_' + requiredWebviewBridgeName + '_v2'; + const androidBridge = (window as Dictionary)[androidBridgeName]; + const iosBridgeName = + iosBridgeNameBase + '_' + requiredWebviewBridgeName + '_v2'; + let iOSBridgeMessageHandler: Dictionary; + let iOSBridgeNonMessageHandler: Dictionary; if ( - window.webkit && - window.webkit.messageHandlers && - window.webkit.messageHandlers[iosBridgeName] + (window as Dictionary).webkit && + (window as Dictionary).webkit.messageHandlers && + (window as Dictionary).webkit.messageHandlers[iosBridgeName] ) { iOSBridgeMessageHandler = - window.webkit.messageHandlers[iosBridgeName]; + (window as Dictionary).webkit.messageHandlers[iosBridgeName]; } - if (mpInstance.uiwebviewBridgeName === iosBridgeName) { - iOSBridgeNonMessageHandler = mpInstance[iosBridgeName]; + if ((mpInstance as Dictionary).uiwebviewBridgeName === iosBridgeName) { + iOSBridgeNonMessageHandler = (mpInstance as Dictionary)[iosBridgeName]; } if (androidBridge && androidBridge.hasOwnProperty(path)) {