algolia / instantsearch-ios

⚡️ A library of widgets and helpers to build instant-search applications on iOS.
https://www.algolia.com/doc/guides/building-search-ui/what-is-instantsearch/ios/
Apache License 2.0
591 stars 55 forks source link

Not able to pass dynamic attribute to FacetList Connector ? #296

Open winstoncex7 opened 1 year ago

winstoncex7 commented 1 year ago

import SwiftUI import InstantSearch

class ALGController {

//MARK: - PLP Search & Results
let searcher: HitsSearcher
let searchBoxInteractor: SearchBoxInteractor
let searchBoxController: SearchBoxObservableController
let hitsInteractor: HitsInteractor<Hit<Box>>
let hitsController: HitsObservableController<Hit<Box>>

//MARK: - Sort By View
let sortByConnector: SortByConnector
let selectableSegmentObservableController: SelectableSegmentObservableController

//MARK: - Results Count View
let statsController: StatsTextObservableController
let statsConnector: StatsConnector

//MARK: - Common Filter Storage State
let filterState: FilterState

//MARK: - Clear/Reset All Filters
let clearFiltersConnector: FilterClearConnector
let clearFilterController: FilterClearObservableController

//MARK: - Current Applied Filters
let currentFiltersListConnector: CurrentFiltersConnector
let currentFiltersController: CurrentFiltersObservableController

//MARK: - Filter Detail View
let AllFilterConnector : FacetListConnector
let AllFilterController : FacetListObservableController
let AllFilterPresenter : FacetListPresenter

//MARK: - Filter Detail View
let FilterDetailConnector : FacetListConnector
let FilterDetailController : FacetListObservableController
let FilterDetailPresenter : FacetListPresenter

//MARK: - LOADER
let loadingController: LoadingObservableController
let loadingConnector: LoadingConnector

init() {

self.searcher = HitsSearcher(client: .Cred, indexName: .Index)
self.filterState = .init()
self.searchBoxInteractor = .init()
self.searchBoxController = .init()
self.hitsInteractor = .init()
self.hitsController = .init()
self.statsController = .init()
self.statsConnector = .init(searcher: searcher)
self.currentFiltersController = .init()
self.clearFilterController = .init()
self.loadingConnector = .init(searcher: searcher)

currentFiltersListConnector = .init(filterState: filterState)
clearFiltersConnector = .init(filterState: filterState)

self.sortByConnector = .init(searcher: searcher,
                               indicesNames: [.Relevance,
                                              .NameAsc,
                                              .NameDesc,
                                              .PriceAsc,
                                              .PriceDesc,
                                              .Popularity,
                                              .Rating],
                               selected: 0)

  selectableSegmentObservableController = SelectableSegmentObservableController()

  AllFilterPresenter = FacetListPresenter(sortBy: [.alphabetical(order: .ascending)])

  AllFilterController = FacetListObservableController()

  AllFilterConnector =  .init(searcher: searcher,
                               filterState: filterState,
                               attribute: "*",
                               operator: .or,
                               controller: AllFilterController,presenter: AllFilterPresenter)

  FilterDetailPresenter = FacetListPresenter(sortBy: [.alphabetical(order: .ascending)])

  FilterDetailController = FacetListObservableController()

  FilterDetailConnector =  .init(searcher: searcher,
                               filterState: filterState,
                               attribute: "",  // Pass a dynamic attribute here selected by the user. for example Color
                               operator: .or,
                               controller: FilterDetailController,presenter: FilterDetailPresenter)

   loadingController = LoadingObservableController()
   loadingConnector.connectController(loadingController)

  setupConnections()

}

func setupConnections() {

searchBoxInteractor.connectSearcher(searcher)
searchBoxInteractor.connectController(searchBoxController)
hitsInteractor.connectSearcher(searcher)
hitsInteractor.connectController(hitsController)
sortByConnector.connectController(selectableSegmentObservableController,
                                                   presenter: self.title(for:))
statsConnector.interactor.connectController(statsController) { stats -> String? in
    guard let stats = stats else {
      return nil
    }
    return "\(stats.totalHitsCount) results"
  }

  AllFilterConnector.connectController(AllFilterController)
  AllFilterConnector.connect()

  FilterDetailConnector.connect()

  currentFiltersListConnector.connectController(currentFiltersController)
  currentFiltersListConnector.connect()

  clearFiltersConnector.connectController(clearFilterController)
  clearFiltersConnector.connect()

  searcher.connectFilterState(filterState)

  searcher.search()

}

func title(for indexName: IndexName) -> String {
  switch indexName {
  case .Relevance:
    return "Relevance".localized
  case .NameAsc:
    return "Product Name - A to Z".localized
  case .NameDesc:
    return "Product Name - Z to A".localized
  case .PriceAsc:
    return "Price - Low To High".localized
  case .PriceDesc:
    return "Price - High To Low".localized
  case .Popularity:
    return "Most Popular".localized
  case .Rating:
    return "Top Rated".localized
  default:
    return indexName.rawValue
  }
}

}