Skip to content

Release 4.6.0

Latest

Choose a tag to compare

@DanielOS7-TM DanielOS7-TM released this 23 Sep 11:41
· 4 commits to main since this release

4.6.0 (2026-09-23)

Features

What's Changed

  • chore: downgrade Android Retail SDK to 3.8.19
  • feat: add support for multiple custom modules
  • refactor: RN authState auto updates now listens for the full range of available TMAuthenticationDelegate.onStateChanged() and AccountsAnalyticsObserver > getLoginStateLiveData() events

BREAKING CHANGES ⚠️

customModules now takes an array

Multiple modules can now be configured and render in the order given. enabled has been removed (presence in the array enables the module), and button1/button2/button3 are replaced by a buttons array of 1–3 buttons.

Before:

customModules={{
  enabled: true,
  headerView: { color: '#026cdf' },
  button1: { title: 'Shop merch', callback: (data) => console.log('Shop merch pressed') },
  button2: { title: 'Get directions', callback: (data) => console.log('Get directions pressed') }
}}

After:

customModules={[
  {
    headerView: { color: '#026cdf' },
    buttons: [
      { title: 'Shop merch', callback: (data) => console.log('Shop merch pressed') },
      { title: 'Get directions', callback: (data) => console.log('Get directions pressed') }
    ]
  }
]}

Custom module analytics consolidated into one event

ticketsSdkCustomModuleButton1, ticketsSdkCustomModuleButton2 and ticketsSdkCustomModuleButton3 are replaced by ticketsSdkCustomModuleButtonPressed, which carries moduleIndex, buttonIndex and buttonTitle so you can identify the button pressed. The matching IgniteAnalyticName enum members change accordingly. Button callbacks still fire automatically, so this only affects code reading these events directly.

iOS buttonCallback reports the button index

For custom modules, ticketsSdkDidPressModuleActionButton.buttonCallback is now the button index ("0", "1", "2") rather than the title. Use buttonTitle for the label.

Authentication Analytics Refactor

Removed manual event emission from Android's logout() and logoutAll() methods, relying entirely on the native SDKs' built-in analytics observers.

The native observers handle all auth analytics automatically:

  • iOS: TMAuthenticationDelegate.onStateChanged() fired events
  • Android: AccountsAnalyticsObserver observing getLoginStateLiveData() fired events

It has been observed on the current version of the SDK's that AccountsAnalyticsObserver for Android Modern Accounts logins does not emit accountsSdkLoggedIn accountsSdkLoggedOut or accountsSdkLogoutCompleted and AccountsAnalyticsObserver Android Sport XR does not omit accountsSdkLoginAccountCompleted and accountsSdkLoggedOut.

This has resulted in our auto authState update conditions for integrators who have autoUpdate set to true (our default) being updated to:

const handleIgniteAnalyticsEvent = async (
...
    // The user can logout via the Tickets SDK Modal UI, so the below event
    // tells RN to check the SDK auth state when the user dismisses the modal
    const ticketsSdkModalDismissed = result.ticketsSdkModalDidDismiss;
    const userLoggedInViaTicketsSdk = result.ticketsSdkDidViewEvents;
    const checkoutEnded = result.purchaseSdkDidEndCheckoutFor;
    const iosAuthStateChanged =
      (result.accountsSdkLoggedIn || result.accountsSdkLoggedOut) &&
      Platform.OS === 'ios';
    // Sport XR fires accountsSdkLoggedIn whereas Modern Accounts fires accountsSdkLoginAccountCompleted
    const androidSdkAuthStateChanged =
      (result.accountsSdkLoginAccountCompleted ||
        result.accountsSdkLoggedIn ||
        result.accountsSdkLogoutStarted) &&
      Platform.OS === 'android';

    // The condition below is a helper to handle SDK-initiated auth state changes.
    // When RN triggers auth, isLoggingIn is set to true so isLoggingIn being false will be an SDK-initiated change.
    if (
      (checkoutEnded ||
        userLoggedInViaTicketsSdk ||
        ticketsSdkModalDismissed ||
        ((iosAuthStateChanged || androidSdkAuthStateChanged) &&
          !isLoggingIn)) &&
      autoUpdate
    ) {
      try {
        if (result.accountsSdkLogoutStarted && Platform.OS === 'android') {
          // Promise timeout approach allows outer try/catch to handle errors without needing try/catch inside setTimeout
          await new Promise<void>((resolve) => setTimeout(resolve, 1200));
          await setAuthenticationState();
        } else {
          await setAuthenticationState();
        }
      } catch (e) {
        enableLogs &&
          console.log(
            `Accounts SDK auth state update error: ${(e as Error).message}`
          );
      }
    }
...

If any of the missing analytics are needed in your personal project, they can be patched into the Android login/logout methods. We have removed the manual emissions to prevent any double-emission of events in future SDK versions. We will update our auto authState conditions as we upgrade to newer SDK versions.

iOS:
TM-Ignite = 1.21.1

TicketmasterFoundation: 1.6.8 (build 574)
TicketmasterAuthentication: 3.17.14 (build 106)
TicketmasterDiscoveryAPI: 4.1.2 (build 19)
TicketmasterPrePurchase: 4.1.2 (build 19)
TicketmasterPurchase: 4.1.2 (build 19)
TicketmasterSwiftProtobuf: 1.29.2
TicketmasterSecureEntry: 1.13.0 (build 9885)
TicketmasterTickets: 3.18.1 (build 9885) (updated)

Android:

 implementation 'com.ticketmaster.tickets:tickets:3.18.1'
 implementation 'com.ticketmaster.tickets:secure-entry:1.8.0'
 implementation 'com.ticketmaster.retail:purchase:3.8.20'
 implementation 'com.ticketmaster.retail:prepurchase:3.8.20'
 implementation 'com.ticketmaster.retail:discoveryapi:3.8.20'
 implementation 'com.ticketmaster.retail:foundation:3.8.20'

Full Changelog: v4.5.0...v4.6.0