Logo

Navigation

Birbonus uses a destination-based navigation model. Each main destination can contain an optional sub-destination for more granular routing.

Creating the Coordinator

Create a UINavigationController, initialize EcoCoordinator, and start the required destination.

let navigationController = UINavigationController()

let coordinator = EcoCoordinator(
    router: navigationController,
    configurator: configurator
)

coordinator.start(with: .benefits(.mainPage))

Main Destinations

public enum Destination {
    case birbonusCabinet(BirbonusCabinetDestination?)
    case benefits(BenefitsDestination?)
    case bravoClub(BravoClubDestination?)
    case subscription(SubscriptionDestination?)
}

Birbonus Cabinet Destinations

public enum BirbonusCabinetDestination {
    case mainPage(source: Source = .fromMain)
    case chooseCategories(
        shouldOpenDirect: Bool = false,
        source: Source = .fromOther
    )
    case transactionDetail(
        transactionId: String,
        source: Source = .fromOther
    )
    case transactionHistory(source: Source = .fromOther)
    case scrollTo(id: String, source: Source = .fromOther)

    public enum Source {
        case fromMain
        case fromBenefits
        case fromLink
        case fromOther
    }
}

Usage

// Open the Birbonus Cabinet main page
coordinator.start(with: .birbonusCabinet(.mainPage()))

// Open a transaction detail
coordinator.start(
    with: .birbonusCabinet(
        .transactionDetail(transactionId: "12345")
    )
)

// Open transaction history
coordinator.start(with: .birbonusCabinet(.transactionHistory()))

// Open category selection directly
coordinator.start(
    with: .birbonusCabinet(
        .chooseCategories(shouldOpenDirect: true)
    )
)

// Scroll to a specific item
coordinator.start(
    with: .birbonusCabinet(
        .scrollTo(id: "item123")
    )
)

Benefits Destinations

public enum BenefitsDestination {
    case mainPage
    case partners(categoryID: String?)
    case partner(partnerID: String, categoryID: String?)
    case game(gameID: String)
}

Usage

// Open the Benefits main page
coordinator.start(with: .benefits(.mainPage))

// Open all partners
coordinator.start(with: .benefits(.partners(categoryID: nil)))

// Open partners in a specific category
coordinator.start(
    with: .benefits(
        .partners(categoryID: "category123")
    )
)

// Open a specific partner
coordinator.start(
    with: .benefits(
        .partner(
            partnerID: "partner456",
            categoryID: nil
        )
    )
)

// Open a game
coordinator.start(
    with: .benefits(
        .game(gameID: "game789")
    )
)

BravoClub Destinations

public enum BravoClubDestination {
    case mainPage
}

Usage

coordinator.start(with: .bravoClub(.mainPage))

Subscription Destinations

public enum SubscriptionDestination {
    case main
}

Usage

coordinator.start(with: .subscription(.main))

Getting a View Controller

Use getInitialViewController(with:) when the host application needs the destination's initial view controller without immediately starting the SDK navigation flow.

let viewController = coordinator.getInitialViewController(
    with: .benefits(.mainPage)
)

navigationController.pushViewController(
    viewController,
    animated: true
)