From efa7525c5ed3c613a2b8886520f3aaba9aa80fd5 Mon Sep 17 00:00:00 2001 From: joe goodall <65718433+joe-goodall-ticketmaster@users.noreply.github.com> Date: Fri, 11 Oct 2024 15:13:03 +0100 Subject: [PATCH] feat: support multi accesstokens android (#46) * feat: change native android to support multi access token * feat: add types to RN token methods * docs: update readme * chore: update tickets sdk [android] --------- Co-authored-by: Daniel --- README.md | 12 +++++++++ android/build.gradle | 2 +- .../ticketmasterignite/AccountsSDKModule.kt | 26 +++++++++---------- src/IgniteProvider.tsx | 19 +++++++++++--- 4 files changed, 41 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index c64b0c2..149a4ed 100644 --- a/README.md +++ b/README.md @@ -199,6 +199,18 @@ try { {isLoggedIn && You are logged in} ``` +`getToken` and `refreshToken` return different data types per platform. iOS returns a `string` and Android returns an object. See Android object type below: + +```typescript +type AuthSource = { + hostAccessToken?: string; + archticsAccessToken?: string; + mfxAccessToken?: string; + sportXRAccessToken?: string; +}; +``` + + The `login()` method from the `useIgnite` hook accepts an object with properties `onLogin` and `skipUpdate`: - `onLogin` - a callback that fires after successful authentication diff --git a/android/build.gradle b/android/build.gradle index 85f7046..494ffe5 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -98,7 +98,7 @@ dependencies { implementation 'com.google.code.gson:gson:2.10.1' implementation 'com.ticketmaster.accounts:authentication:3.9.0_jdk15to18_bouncycastle-SNAPSHOT' - implementation 'com.ticketmaster.tickets:tickets:3.8.0' + implementation 'com.ticketmaster.tickets:tickets:3.8.3' implementation 'com.ticketmaster.tickets:secure-entry:1.2.10' implementation 'com.ticketmaster.retail:purchase:3.2.0' implementation 'com.ticketmaster.retail:prepurchase:3.2.0' diff --git a/android/src/main/java/com/ticketmasterignite/AccountsSDKModule.kt b/android/src/main/java/com/ticketmasterignite/AccountsSDKModule.kt index 141f95c..5a8fb33 100644 --- a/android/src/main/java/com/ticketmasterignite/AccountsSDKModule.kt +++ b/android/src/main/java/com/ticketmasterignite/AccountsSDKModule.kt @@ -240,21 +240,21 @@ class AccountsSDKModule(reactContext: ReactApplicationContext) : val tokenRefreshedParams: WritableMap = Arguments.createMap().apply { putString("accountsSdkTokenRefreshed", "accountsSdkTokenRefreshed") } + val combinedTokens: WritableMap = Arguments.createMap() if (!resHostAccessToken.isNullOrEmpty()) { - GlobalEventEmitter.sendEvent("igniteAnalytics", tokenRefreshedParams) - promise.resolve(resHostAccessToken) - } else if (!resArchticsAccessToken.isNullOrEmpty()) { - GlobalEventEmitter.sendEvent("igniteAnalytics", tokenRefreshedParams) - promise.resolve(resArchticsAccessToken) - } else if (!resMfxAccessToken.isNullOrEmpty()) { - GlobalEventEmitter.sendEvent("igniteAnalytics", tokenRefreshedParams) - promise.resolve(resMfxAccessToken) - } else if (!resSportXRAccessToken.isNullOrEmpty()) { - GlobalEventEmitter.sendEvent("igniteAnalytics", tokenRefreshedParams) - promise.resolve(resSportXRAccessToken) - }else { - promise.resolve(null) + combinedTokens.putString("hostAccessToken", resHostAccessToken) + } + if (!resArchticsAccessToken.isNullOrEmpty()) { + combinedTokens.putString("archticsAccessToken", resArchticsAccessToken) + } + if (!resMfxAccessToken.isNullOrEmpty()) { + combinedTokens.putString("mfxAccessToken", resMfxAccessToken) + } + if (!resSportXRAccessToken.isNullOrEmpty()) { + combinedTokens.putString("sportXRAccessToken", resSportXRAccessToken) } + GlobalEventEmitter.sendEvent("igniteAnalytics", tokenRefreshedParams) + promise.resolve(combinedTokens) } catch (e: Exception) { promise.reject("Accounts SDK refreshToken Error: ", e) } diff --git a/src/IgniteProvider.tsx b/src/IgniteProvider.tsx index 7a872dc..ea29180 100644 --- a/src/IgniteProvider.tsx +++ b/src/IgniteProvider.tsx @@ -34,15 +34,22 @@ type IgniteContextType = { login: (LoginParams?: LoginParams) => Promise; logout: (LogoutParams?: LogoutParams) => Promise; getIsLoggedIn: () => Promise; - getToken: () => Promise; + getToken: () => Promise; getMemberInfo: () => Promise | null>; - refreshToken: () => Promise; + refreshToken: () => Promise; authState: AuthStateParams; isLoggingIn: boolean; }; type Region = 'US' | 'UK'; +type AuthSource = { + hostAccessToken?: string; + archticsAccessToken?: string; + mfxAccessToken?: string; + sportXRAccessToken?: string; +}; + export const IgniteContext = createContext({ login: async () => {}, logout: async () => {}, @@ -225,7 +232,9 @@ export const IgniteProvider: React.FC = ({ // eslint-disable-next-line react-hooks/exhaustive-deps }, []); - const getToken = useCallback(async (): Promise => { + const getToken = useCallback(async (): Promise< + string | AuthSource | null + > => { let accessToken; try { if (Platform.OS === 'ios') { @@ -268,7 +277,9 @@ export const IgniteProvider: React.FC = ({ // eslint-disable-next-line react-hooks/exhaustive-deps }, []); - const refreshToken = useCallback(async (): Promise => { + const refreshToken = useCallback(async (): Promise< + string | AuthSource | null + > => { try { const result = await AccountsSDK.refreshToken(); console.log('Accounts SDK refresh token:', result);