|
| 1 | +// |
| 2 | +// MoviesSceneDIContainer.swift |
| 3 | +// ExampleMVVM |
| 4 | +// |
| 5 | +// Created by Oleh Kudinov on 03.03.19. |
| 6 | +// |
| 7 | + |
| 8 | +import Foundation |
| 9 | +import UIKit |
| 10 | +// SwiftUI |
| 11 | +//import SwiftUI |
| 12 | + |
| 13 | +final class MoviesSceneDIContainer { |
| 14 | + |
| 15 | + struct Dependencies { |
| 16 | + let apiDataTransferService: DataTransfer |
| 17 | + let imageDataTransferService: DataTransfer |
| 18 | + } |
| 19 | + |
| 20 | + private let dependencies: Dependencies |
| 21 | + |
| 22 | + // MARK: - Persistent Storage |
| 23 | + lazy var moviesQueriesStorage: MoviesQueriesStorage = CoreDataStorage(maxStorageLimit: 10) |
| 24 | + |
| 25 | + init(dependencies: Dependencies) { |
| 26 | + self.dependencies = dependencies |
| 27 | + } |
| 28 | + |
| 29 | + // MARK: - Use Cases |
| 30 | + func makeSearchMoviesUseCase() -> SearchMoviesUseCase { |
| 31 | + return DefaultSearchMoviesUseCase(moviesRepository: makeMoviesRepository(), |
| 32 | + moviesQueriesRepository: makeMoviesQueriesRepository()) |
| 33 | + } |
| 34 | + |
| 35 | + func makeFetchMoviesRecentQueriesUseCase() -> FetchMoviesRecentQueriesUseCase { |
| 36 | + return DefaultFetchMoviesRecentQueriesUseCase(moviesQueriesRepository: makeMoviesQueriesRepository()) |
| 37 | + } |
| 38 | + |
| 39 | + // MARK: - Data Sources |
| 40 | + func makeMoviesRepository() -> MoviesRepository { |
| 41 | + return DefaultMoviesRepository(dataTransferService: dependencies.apiDataTransferService) |
| 42 | + } |
| 43 | + func makeMoviesQueriesRepository() -> MoviesQueriesRepository { |
| 44 | + return DefaultMoviesQueriesRepository(dataTransferService: dependencies.apiDataTransferService, |
| 45 | + moviesQueriesPersistentStorage: moviesQueriesStorage) |
| 46 | + } |
| 47 | + func makePosterImagesRepository() -> PosterImagesRepository { |
| 48 | + return DefaultPosterImagesRepository(dataTransferService: dependencies.imageDataTransferService, |
| 49 | + imageNotFoundData: UIImage(named: "image_not_found")?.pngData()) |
| 50 | + } |
| 51 | + |
| 52 | + // MARK: - Movies List |
| 53 | + func makeMoviesListViewController() -> UIViewController { |
| 54 | + return MoviesListViewController.create(with: makeMoviesListViewModel(), moviesListViewControllersFactory: self) |
| 55 | + } |
| 56 | + |
| 57 | + func makeMoviesListViewModel() -> MoviesListViewModel { |
| 58 | + return MoviesListViewModel(searchMoviesUseCase: makeSearchMoviesUseCase(), |
| 59 | + posterImagesRepository: makePosterImagesRepository()) |
| 60 | + } |
| 61 | + |
| 62 | + // MARK: - Movie Details |
| 63 | + func makeMoviesDetailsViewController(title: String, |
| 64 | + overview: String, |
| 65 | + posterPlaceholderImage: Data?, |
| 66 | + posterPath: String?) -> UIViewController { |
| 67 | + return MovieDetailsViewController.create(with: makeMoviesDetailsViewModel(title: title, |
| 68 | + overview: overview, |
| 69 | + posterPlaceholderImage: posterPlaceholderImage, |
| 70 | + posterPath: posterPath)) |
| 71 | + } |
| 72 | + |
| 73 | + func makeMoviesDetailsViewModel(title: String, |
| 74 | + overview: String, |
| 75 | + posterPlaceholderImage: Data?, |
| 76 | + posterPath: String?) -> MovieDetailsViewModel { |
| 77 | + return MovieDetailsViewModel(title: title, |
| 78 | + overview: overview, |
| 79 | + posterPlaceholderImage: posterPlaceholderImage, |
| 80 | + posterPath: posterPath, |
| 81 | + posterImagesRepository: makePosterImagesRepository()) |
| 82 | + } |
| 83 | + |
| 84 | + // MARK: - Movies Queries Suggestions List |
| 85 | + func makeMoviesQueriesSuggestionsListViewController(delegate: MoviesQueryListViewModelDelegate) -> UIViewController { |
| 86 | +// if #available(iOS 13.0, *) { // SwiftUI |
| 87 | +// return UIHostingController(rootView: MoviesQueryListView(viewModel: makeMoviesQueryListViewModelWrapper(delegate: delegate))) |
| 88 | +// } else { // UIKit |
| 89 | + return MoviesQueriesTableViewController.create(with: makeMoviesQueryListViewModel(delegate: delegate)) |
| 90 | +// } |
| 91 | + } |
| 92 | + |
| 93 | + func makeMoviesQueryListViewModel(delegate: MoviesQueryListViewModelDelegate) -> MoviesQueryListViewModel { |
| 94 | + return MoviesQueryListViewModel(numberOfQueriesToShow: 10, |
| 95 | + fetchMoviesRecentQueriesUseCase: makeFetchMoviesRecentQueriesUseCase(), |
| 96 | + delegate: delegate) |
| 97 | + } |
| 98 | +// SwiftUI |
| 99 | +// @available(iOS 13.0, *) |
| 100 | +// func makeMoviesQueryListViewModelWrapper(delegate: MoviesQueryListViewModelDelegate) -> MoviesQueryListViewModelWrapper { |
| 101 | +// return MoviesQueryListViewModelWrapper(numberOfQueriesToShow: 10, |
| 102 | +// fetchMoviesRecentQueriesUseCase: makeFetchMoviesRecentQueriesUseCase(), |
| 103 | +// delegate: delegate) |
| 104 | +// } |
| 105 | +} |
| 106 | + |
| 107 | +extension MoviesSceneDIContainer: MoviesListViewControllersFactory {} |
0 commit comments