@@ -10,34 +10,93 @@ import UIKit
1010import GenericCollectionViewKit
1111import ICTMDBViewKit
1212import SnapKit
13-
14-
15- final class HomeViewController : UIViewController {
16- var presenter : ( any ViewToPresenterHomeProtocol ) ?
13+ //MARK: HomeViewController
14+ final class HomeViewController : UIViewController {
1715
16+ var presenter : ( any ViewToPresenterHomeProtocol ) ?
17+ private var collectionView : UICollectionView !
18+ private let acitvityIndicator = UIActivityIndicatorView . baseActivityIndicator ( )
19+ private var dataSource : GenericCollectionDataSource < HomePresenter > ?
20+ private var delegateSource : GenericCollectionDelegate < HomePresenter > ?
21+ private var layout : GenericCollectionLayoutProvider < HomePresenter > ?
22+ private var errorMessageLabeal = UILabel ( )
1823 override func viewDidLoad( ) {
1924 super. viewDidLoad ( )
25+
26+ presenter? . viewDidLoad ( )
27+ setupCollectionView ( )
28+ collectionPrepareView ( )
29+ setupUI ( )
2030 }
21- }
22-
23-
24-
25- extension HomeViewController : PresenterToViewHomeProtocol {
26- func relaodCollectionView( ) {
31+
32+ private func setupCollectionView( ) {
33+ guard let presenter = presenter as? HomePresenter else { return }
34+ layout = GenericCollectionLayoutProvider < HomePresenter > ( source: presenter)
35+ collectionView = UICollectionView ( frame: view. bounds, collectionViewLayout: layout!. createLayout ( ) )
36+ collectionView. autoresizingMask = [ . flexibleWidth, . flexibleHeight]
37+ collectionView. register ( PopularCell . self, forCellWithReuseIdentifier: PopularCell . identifier)
38+ collectionView. register ( AiringTodayCell . self, forCellWithReuseIdentifier: AiringTodayCell . identifier)
39+
40+ collectionView. register ( CHeaderView . self,
41+ forSupplementaryViewOfKind: UICollectionView . elementKindSectionHeader,
42+ withReuseIdentifier: String ( describing: CHeaderView . self) )
2743
44+
2845 }
2946
30- func sendError( errorState: ( isHidden: Bool , message: String ) ) {
47+ private func collectionPrepareView( ) {
48+ guard let presenter = presenter as? HomePresenter else { return }
49+ dataSource = GenericCollectionDataSource ( source: presenter) { identifier, cell, item in
50+ guard let item = item as? CellItemType else { return }
51+
52+ switch item {
53+ case . popular( let item) :
54+ if let c = cell as? PopularCell { c. configure ( ) }
55+ case . airing( let value) :
56+ if let c = cell as? AiringTodayCell { c. configure ( ) }
57+ case . none:
58+ break
59+ }
60+ }
61+ delegateSource = GenericCollectionDelegate < HomePresenter > ( source: presenter)
62+ collectionView. dataSource = dataSource
63+ collectionView. delegate = delegateSource
64+ view. addSubview ( collectionView)
3165
3266 }
3367
68+ private func setupUI( ) {
69+
70+ view. addSubview ( errorMessageLabeal)
71+ errorMessageLabeal. snp. makeConstraints { make in
72+ make. center. equalToSuperview ( )
73+ }
74+ }
75+ }
76+
77+ extension HomeViewController : @MainActor PresenterToViewHomeProtocol {
3478 func startLoading( ) {
35-
79+ acitvityIndicator . startAnimating ( )
3680 }
3781
3882 func finishLoading( ) {
39-
83+ acitvityIndicator . stopAnimating ( )
4084 }
4185
86+ func relaodCollectionView( ) {
87+ collectionView. reloadData ( )
88+ }
4289
90+ func sendError( errorState: ( isHidden: Bool , message: String ) ) {
91+ collectionView. isHidden = errorState. isHidden
92+ errorMessageLabeal. text = errorState. message
93+ errorMessageLabeal. isHidden = !errorState. isHidden
94+
95+ }
4396}
97+
98+ #Preview {
99+ let module = ICTMDBHomeModule ( )
100+ module. createHomeModule ( )
101+ }
102+
0 commit comments