Skip to content

Commit

Permalink
Merge pull request #173 from pietrocaselani/search_viewstate_no_story…
Browse files Browse the repository at this point in the history
…board

Search module to ViewState and no storyboard
  • Loading branch information
pietrocaselani authored Jan 5, 2019
2 parents e6ad0e5 + 0f7b7af commit f4a3a9f
Show file tree
Hide file tree
Showing 39 changed files with 599 additions and 1,185 deletions.
94 changes: 28 additions & 66 deletions CouchTracker.xcodeproj/project.pbxproj

Large diffs are not rendered by default.

11 changes: 11 additions & 0 deletions CouchTrackerApp/Extensions/UICollectionViewLayout.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
extension UICollectionViewLayout {
static var ctDefault: UICollectionViewLayout {
let layout = UICollectionViewFlowLayout()
layout.scrollDirection = .vertical
layout.itemSize = CGSize(width: 100, height: 180)
layout.sectionInset = UIEdgeInsets(top: 0, left: 5, bottom: 0, right: 5)
layout.minimumInteritemSpacing = 5
layout.minimumLineSpacing = 5
return layout
}
}
72 changes: 0 additions & 72 deletions CouchTrackerApp/Search/Search.storyboard

This file was deleted.

36 changes: 0 additions & 36 deletions CouchTrackerApp/Search/SearchBarView.swift

This file was deleted.

22 changes: 0 additions & 22 deletions CouchTrackerApp/Search/SearchBarView.xib

This file was deleted.

45 changes: 45 additions & 0 deletions CouchTrackerApp/Search/SearchCollectionViewDataSource.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
import CouchTrackerCore

final class SearchCollectionViewDataSource: NSObject, SearchDataSource {
private let interactor: PosterCellInteractor

var entities = [SearchResultEntity]()

init(interactor: PosterCellInteractor) {
self.interactor = interactor
}

func collectionView(_: UICollectionView, numberOfItemsInSection _: Int) -> Int {
return entities.count
}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let identifier = PosterAndTitleCell.identifier

let cell = collectionView.dequeueReusableCell(withReuseIdentifier: identifier, for: indexPath)

guard let posterCell = cell as? PosterAndTitleCell else {
Swift.fatalError("cell should be an instance of PosterAndTitleCell")
}

let entity = entities[indexPath.row]
let viewModel = mapEntityToViewModel(entity)

let presenter = PosterCellDefaultPresenter(view: posterCell, interactor: interactor, viewModel: viewModel)

posterCell.presenter = presenter

return posterCell
}
}

private func mapEntityToViewModel(_ entity: SearchResultEntity) -> PosterViewModel {
switch entity.type {
case let .movie(movie):
let type = movie.ids.tmdb.map { PosterViewModelType.movie(tmdbMovieId: $0) }
return PosterViewModel(title: movie.title ?? "", type: type)
case let .show(show):
let type = show.ids.tmdb.map { PosterViewModelType.show(tmdbShowId: $0) }
return PosterViewModel(title: show.title ?? "", type: type)
}
}
26 changes: 14 additions & 12 deletions CouchTrackerApp/Search/SearchModule.swift
Original file line number Diff line number Diff line change
@@ -1,18 +1,17 @@
import CouchTrackerCore
import TraktSwift

final class SearchModule {
private init() {}
protocol SearchDataSource: UICollectionViewDataSource {
var entities: [SearchResultEntity] { get set }
}

enum SearchModule {
static func setupModule(searchTypes: [SearchType]) -> BaseView {
guard let viewController = R.storyboard.search.searchViewController() else {
Swift.fatalError("Could not instantiate view controller from storyboard")
}

let environment = Environment.instance
let tmdb = environment.tmdb
let tvdb = environment.tvdb
let schedulers = environment.schedulers
let trakt = environment.trakt

let configurationRepository = ConfigurationCachedRepository(tmdbProvider: tmdb)

Expand All @@ -21,15 +20,18 @@ final class SearchModule {
cofigurationRepository: configurationRepository,
schedulers: schedulers)

viewController.imageRepository = imageRepository
let posterCellInteractor = PosterCellService(imageRepository: imageRepository)

let dataSource = SearchCollectionViewDataSource(interactor: posterCellInteractor)

let interactor = SearchService(traktProvider: trakt)
let router = SearchiOSRouter()

let searchBaseView = SearchViewModule.setupModule(searchTypes: searchTypes, resultOutput: viewController)
let presenter = SearchDefaultPresenter(interactor: interactor, types: searchTypes, router: router)

guard let searchView = searchBaseView as? SearchView else {
Swift.fatalError("searchBaseView should be an instance of SearchView")
}
let viewController = SearchViewController(presenter: presenter, dataSource: dataSource)

viewController.searchView = searchView
router.viewController = viewController

return viewController
}
Expand Down
61 changes: 61 additions & 0 deletions CouchTrackerApp/Search/SearchView.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
import Cartography

public final class SearchView: View {
public let collectionView: UICollectionView
public let emptyView = DefaultEmptyView()

public let searchBar: UISearchBar = {
let searchBar = UISearchBar(frame: CGRect.zero)
searchBar.isUserInteractionEnabled = true
searchBar.barTintColor = Colors.NavigationBar.barTintColor
return searchBar
}()

private lazy var stackView: UIStackView = {
let subviews = [searchBar, collectionView]
let stackView = UIStackView(arrangedSubviews: subviews)

stackView.axis = .vertical
stackView.alignment = .fill
stackView.distribution = .equalSpacing

return stackView
}()

init(collectionViewLayout: UICollectionViewLayout = UICollectionViewLayout.ctDefault) {
collectionView = UICollectionView(frame: CGRect.zero, collectionViewLayout: collectionViewLayout)
super.init()
}

public required init?(coder _: NSCoder) {
fatalError("init(coder:) has not been implemented")
}

public required convenience init() {
self.init(collectionViewLayout: UICollectionViewLayout.ctDefault)
}

public override func initialize() {
addSubview(stackView)
addSubview(emptyView)
}

public override func installConstraints() {
constrain(stackView, emptyView, searchBar) { stack, empty, search in
/*
CT-TODO Fix this + 43
Without this constant, the search bar appears behind the top bar
*/
search.top == search.superview!.top + 43
search.width == search.superview!.width

stack.size == stack.superview!.size
stack.top == stack.superview!.top
stack.bottom == stack.superview!.bottom
stack.left == stack.superview!.left
stack.right == stack.superview!.right

empty.center == empty.superview!.center
}
}
}
Loading

0 comments on commit f4a3a9f

Please sign in to comment.