1 min read
Sort Selection
Last Updated - Platform 19.0.0 - SDK 14.0.0Builders are the main setup and customisation point of a feature. However, containers can be used to customise standard dependencies of a feature for all instances of that feature.
The SortSelectionBuilder
is constrained to a SortSelectionState
where the default type is PoqSortSelectionState
.
It uses delegateMiddleware
to apply the SortOrder
selection to the Product List or previous feature.
The ProductListState
has a sort
sub-state that can be easily passed to the SortSelectionBuilder
.
Customise the sort feature
To customise the sort feature you will need to override the product list navigation middleware.
Create a new Swift file for the custom navigation middleware with the following code.
import PoqFoundationimport PoqProductList
extension Middleware where State : ProductListState { static func customNavigation() -> Middleware { Middleware { (store, action) in store.continue(action) guard let action = action as? NavigationAction else { return } guard let destination = action.destination as? ProductListNavigationDestination else { return } switch action { case .sortSelection: guard let sort = store.state?.sort else { return } let viewController = SortSelectionBuilder() .withDelegateMiddleware(using: store.dispatch) .build(with: sort) // Apply popover presentation. viewController.modalPresentationStyle = .popover viewController.popoverPresentationController?.sourceView = action.sourceView // Modally present the sort feature. NavigationHelper.shared.present(viewController) default: // Otherwise execute the default middleware. Middleware.productListNavigation() .execute(store: store, action: action) } } }}
You must provide delegate middleware to the SortSelectionBuilder
within your code.
Open your AppModule
and modify the ProductListBuilder
variable that you set up earlier.
import PoqFoundationimport PoqProductList
class AppModule: PoqModule { var productListBuilder: ProductListBuilder { ProductListBuilder() .withNavigationMiddleware(.customNavigation()) }}
You have customised the sort feature.
Container customisation
Containers can be used to customise services, mappers, views and more by modifying your AppModule
to inject custom implementations into Container.shared
.
A good location for this code is at the beginning of the setUpProductList
function, or in setUpDependencies
for global dependencies. See the full list of dependencies, used by this feature, below.
Builder customisation
Example of basic usage.
let viewController = SortSelectionBuilder() .withDelegateMiddleware(using: store.dispatch) .build(with: state.sort)
Example of usage with custom view controller subclass.
let viewController: CustomSortSelectionViewController = SortSelectionBuilder() .withDelegateMiddleware(using: store.dispatch) .build(with: state.sort)
Example of usage with customisation.
let viewController = SortSelectionBuilder<CustomSortSelectionState>() .withDelegateMiddleware(using: { (action) in guard case SortSelectionAction.apply(let sortOrder) = action else { return store.dispatch(action) } print(sortOrder) store.dispatch(SortSelectionAction.apply(sortOrder)) }) .withRouterMiddleware(.customNavigation()) .withView(CustomView()) .withViewDataMapper(CustomViewDataMapper()) .build(with: SortSelectionState(available: [.featured, .priceHighToLow, .priceLowToHigh, .rating], selected: .featured))