Prebuilt Modules

Prev Next

The Tickets SDK includes five prebuilt modules you can add to your event detail screen. Each module renders a standard UI component without requiring you to build it from scratch. This guide shows you how to add them, handle their callbacks and customize their appearance.


Available modules

Share Attendance

Renders a social sharing banner ("I Got In") that displays a branded preview card event details, and a "YOU GOT TICKETS!" headline. Includes a "Share You're Going" button that opens a share screen where the user can share a branded image card to social media.  

Requires: Host or Microflex events. This module does not render for Archtics, TM1, or other event source types.    


More Ticket Actions

Renders a "More Ticket Actions" button that opens the NAM Manage Tickets webpage. This module may surface options such as Donate depending on the event configuration.

Requires: Archtics Season Tickets. This module does not render for Host or Single Game tickets.



Venue Directions

Renders a non-interactive map with a "Get Directions" button. Tapping the button opens Apple Maps (iOS) or Google Maps (Android) with the venue as the destination.

Requires: A venue street address in the Ticketmaster database.



Seat Upgrades

Renders a generic seat image with an "Upgrade Options" button that opens the NAM Upgrade Tickets webpage.

Requires: Archtics Season Tickets.



Venue Concessions

Renders a generic food image with "Order" and optional "Wallet" buttons. Tapping either button fires a callback into your app — the SDK does not provide a built-in concessions UI. You are responsible for presenting your own concessions experience.


Invoice

Renders a "View Invoice" button that opens the NAM Invoice webpage.

Requires: Archtics Season Tickets.


Add prebuilt modules

Step 1: Set the module delegate

Assign TMTicketsModuleDelegate to the object that will supply and respond to modules.

TMTickets.shared.moduleDelegate = myClass

Assign a TicketsModuleDelegate to the singleton before presenting the Tickets UI.

TicketsSDKSingleton.moduleDelegate = object : TicketsModuleDelegate {
    // implement required methods
}

Your delegate class must conform to TMTicketsModuleDelegate and implement two methods: addCustomModules and handleModuleActionButton.

Step 2: Supply modules for an event

Return the modules you want to display inside addCustomModules. The SDK calls this method once per event load.

extension MyClass: TMTicketsModuleDelegate {
    func addCustomModules(event: TMPurchasedEvent, completion: @escaping ([TMTicketsModule]?) -> Void) {
        completion(prebuiltModules(for: event))
    }
    private func prebuiltModules(for event: TMPurchasedEvent) -> [TMTicketsModule] {
        var modules: [TMTicketsModule] = []
        if let module = TMTicketsPrebuiltModule.accountManagerMoreTicketActions(event: event) {
            modules.append(module)
        }
        if let module = TMTicketsPrebuiltModule.accountManagerInvoiceAction(event: event) {
            modules.append(module)
        }
        if let module = TMTicketsPrebuiltModule.venueDirectionsViaAppleMaps(event: event) {
            modules.append(module)
        }
        if let module = TMTicketsPrebuiltModule.accountManagerSeatUpgrades(event: event) {
            modules.append(module)
        }
        if let module = TMTicketsPrebuiltModule.venueConcessions(event: event, showWalletButton: true) {
            modules.append(module)
        }
        return modules
    }
}

Each factory method returns nil when the module's requirements are not met (for example, accountManagerMoreTicketActions returns nil for non-Archtics events). The module simply won't appear.

Return your modules from getCustomModulesLiveData. The SDK observes this LiveData and renders the list on update.

override fun getCustomModulesLiveData(order: Order): LiveData<List<TicketsSDKModule>> {
    val modules = ArrayList<TicketsSDKModule>()
    modules.add(MoreTicketActionsModule(order.eventId))
    modules.add(
        DirectionsModule(activity, latitude = order.latitude, longitude = order.longitude).build()
    )
    val eventSource = order.tickets.firstOrNull()?.source
    if (eventSource != null) {
        modules.add(
            SeatUpgradesModule(
                activity,
                NAMWebPageSettings(activity, eventSource),
                order.eventId
            )
        )
    }
    val venueNextModule = VenueNextModule.Builder(order.venueId).build()
    modules.add(venueNextModule.createVenueNextView(context) { click ->
        // Handle VenueNext tap events here
    })
    modules.add(InvoiceModule())
    return MutableLiveData(modules)
}

Step 3: Handle callbacks

Venue Concessions fires callbacks instead of opening a webpage. Implement handleModuleActionButton to respond.

extension MyClass: TMTicketsModuleDelegate {
    func handleModuleActionButton(
        event: TMPurchasedEvent,
        module: TMTicketsModule,
        button: TMTicketsModule.ActionButton,
        completion: @escaping (TMTicketsModule.WebpageSettings?) -> Void
    ) {
        guard module.identifier == TMTicketsPrebuiltModule.ModuleName.venueConcessions.rawValue else {
            return
        }
        switch button.callbackValue {
        case TMTicketsPrebuiltModule.ButtonCallbackName.order.rawValue:
            completion(nil)
            // Present your concessions Order UI
        case TMTicketsPrebuiltModule.ButtonCallbackName.wallet.rawValue:
            completion(nil)
            // Present your concessions Wallet UI
        default:
            break
        }
    }
}

Call completion(nil) to dismiss any SDK-managed loading state before you present your own UI. Pass a WebpageSettings value instead if you want the SDK to open a webpage.

Implement userDidPressActionButton on your delegate to respond to module button taps.

override fun userDidPressActionButton(
    buttonTitle: String?,
    callbackValue: String?,
    eventOrders: EventOrders?
) {
    // Inspect callbackValue to determine which button was tapped
    // and present the appropriate UI
}


Customize module headers

You can override the default header image and label text for Seat Upgrades and Venue Concessions.

Default prebuilt module header
Custom override header

Pass a HeaderOverride when constructing a prebuilt module. You can set label text, text alignment and a custom background image.

// Custom Seat Upgrades header
let seatUpgradesHeader = TMTicketsPrebuiltModule.HeaderOverride(
    topLabelText: "Get Great Seats!",
    topLabelTextAlignment: .left,
    gradientAlpha: 1.0,
    backgroundImage: .daytonaSeats
)
if let module = TMTicketsPrebuiltModule.accountManagerSeatUpgrades(
    event: event,
    headerOverride: seatUpgradesHeader
) {
    modules.append(module)
}
// Custom Venue Concessions header
let concessionsHeader = TMTicketsPrebuiltModule.HeaderOverride(
    bottomLabelText: "Bring the Lobby to you!",
    gradientAlpha: 1.0,
    backgroundImage: .lobby
)
if let module = TMTicketsPrebuiltModule.venueConcessions(
    event: event,
    headerOverride: concessionsHeader,
    showWalletButton: true
) {
    modules.append(module)
}

Call setHeader on any module that supports it before adding it to your list. Three overloads are available:

// Pass a pre-built View
module.setHeader(view: View)
// Inflate from a layout resource
module.setHeader(@LayoutRes xml: Int)
// Pass an ImageView directly
module.setHeader(imageView: ImageView)


Module analytics

For analytics events fired when users interact with modules, see Analytics documentation.