From 15124dfbb911269974672fc649f515417383d004 Mon Sep 17 00:00:00 2001 From: Guilherme Antunes Date: Fri, 30 Aug 2019 16:17:27 -0300 Subject: [PATCH 1/2] feat(book detail): adding book detail screen --- iOSBooks/iOSBooks.xcodeproj/project.pbxproj | 40 +++++++++ .../back_arrow.imageset/Contents.json | 23 +++++ .../back_arrow.imageset/back_arrow.png | Bin 0 -> 254 bytes .../back_arrow.imageset/back_arrow@2x.png | Bin 0 -> 315 bytes .../back_arrow.imageset/back_arrow@3x.png | Bin 0 -> 446 bytes .../BookDetail/View/BookDetail.storyboard | 83 ++++++++++++++++++ .../View/BookDetailViewController+View.swift | 32 +++++++ .../View/BookDetailViewController.swift | 38 ++++++++ .../ViewModel/BookDetailViewModel.swift | 66 ++++++++++++++ .../BooksList/View/BooksList.storyboard | 1 + ...oksListViewController+CollectionView.swift | 4 + .../View/BooksListViewController+View.swift | 6 +- .../View/BooksListViewController.swift | 5 ++ .../BooksList/View/Subviews/BooksCell.swift | 2 +- .../ViewModel/BooksListViewModel.swift | 16 +++- .../AppCoordinator/AppCoordinator.swift | 36 +++++++- .../AppCoordinatorDependencyInjector.swift | 18 ++++ .../UIViewController+QuickInstance.swift | 8 +- 18 files changed, 370 insertions(+), 8 deletions(-) create mode 100644 iOSBooks/iOSBooks/Assets.xcassets/back_arrow.imageset/Contents.json create mode 100644 iOSBooks/iOSBooks/Assets.xcassets/back_arrow.imageset/back_arrow.png create mode 100644 iOSBooks/iOSBooks/Assets.xcassets/back_arrow.imageset/back_arrow@2x.png create mode 100644 iOSBooks/iOSBooks/Assets.xcassets/back_arrow.imageset/back_arrow@3x.png create mode 100644 iOSBooks/iOSBooks/BookDetail/View/BookDetail.storyboard create mode 100644 iOSBooks/iOSBooks/BookDetail/View/BookDetailViewController+View.swift create mode 100644 iOSBooks/iOSBooks/BookDetail/View/BookDetailViewController.swift create mode 100644 iOSBooks/iOSBooks/BookDetail/ViewModel/BookDetailViewModel.swift diff --git a/iOSBooks/iOSBooks.xcodeproj/project.pbxproj b/iOSBooks/iOSBooks.xcodeproj/project.pbxproj index ed6db10..7c3f9ec 100644 --- a/iOSBooks/iOSBooks.xcodeproj/project.pbxproj +++ b/iOSBooks/iOSBooks.xcodeproj/project.pbxproj @@ -32,6 +32,10 @@ 74ADE9C52319730F006D2644 /* BooksCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74ADE9C42319730F006D2644 /* BooksCell.swift */; }; 74ADE9C7231973B5006D2644 /* BooksListViewController+CollectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74ADE9C6231973B5006D2644 /* BooksListViewController+CollectionView.swift */; }; 74ADE9C9231981F5006D2644 /* BooksListViewController+View.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74ADE9C8231981F5006D2644 /* BooksListViewController+View.swift */; }; + 74ADE9D023199C1F006D2644 /* BookDetail.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 74ADE9CF23199C1F006D2644 /* BookDetail.storyboard */; }; + 74ADE9D223199D97006D2644 /* BookDetailViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74ADE9D123199D97006D2644 /* BookDetailViewController.swift */; }; + 74B9185223199E8F00ADDEA4 /* BookDetailViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74B9185123199E8F00ADDEA4 /* BookDetailViewModel.swift */; }; + 74B9185423199F4500ADDEA4 /* BookDetailViewController+View.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74B9185323199F4500ADDEA4 /* BookDetailViewController+View.swift */; }; 768F74E39672B1F50C632913 /* Pods_iOSBooks.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2D2FDB2EC5907498F6A3C173 /* Pods_iOSBooks.framework */; }; /* End PBXBuildFile section */ @@ -79,6 +83,10 @@ 74ADE9C42319730F006D2644 /* BooksCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BooksCell.swift; sourceTree = ""; }; 74ADE9C6231973B5006D2644 /* BooksListViewController+CollectionView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "BooksListViewController+CollectionView.swift"; sourceTree = ""; }; 74ADE9C8231981F5006D2644 /* BooksListViewController+View.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "BooksListViewController+View.swift"; sourceTree = ""; }; + 74ADE9CF23199C1F006D2644 /* BookDetail.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = BookDetail.storyboard; sourceTree = ""; }; + 74ADE9D123199D97006D2644 /* BookDetailViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BookDetailViewController.swift; sourceTree = ""; }; + 74B9185123199E8F00ADDEA4 /* BookDetailViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BookDetailViewModel.swift; sourceTree = ""; }; + 74B9185323199F4500ADDEA4 /* BookDetailViewController+View.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "BookDetailViewController+View.swift"; sourceTree = ""; }; E6741F045EBC12BB315EE1CB /* Pods-iOSBooks.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-iOSBooks.debug.xcconfig"; path = "Target Support Files/Pods-iOSBooks/Pods-iOSBooks.debug.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ @@ -127,6 +135,7 @@ children = ( 74ADE9B5231969F0006D2644 /* Coordinators */, 7447D3762316F6C700E01BD3 /* BooksList */, + 74ADE9D323199E0F006D2644 /* BookDetail */, 7447D3712316F16E00E01BD3 /* Data */, 0E3964D72314BB470093738B /* AppDelegate.swift */, 0E3964DE2314BB4A0093738B /* Assets.xcassets */, @@ -259,6 +268,33 @@ path = Subviews; sourceTree = ""; }; + 74ADE9D323199E0F006D2644 /* BookDetail */ = { + isa = PBXGroup; + children = ( + 74B9184F23199E6D00ADDEA4 /* View */, + 74B9185023199E7700ADDEA4 /* ViewModel */, + ); + path = BookDetail; + sourceTree = ""; + }; + 74B9184F23199E6D00ADDEA4 /* View */ = { + isa = PBXGroup; + children = ( + 74ADE9CF23199C1F006D2644 /* BookDetail.storyboard */, + 74ADE9D123199D97006D2644 /* BookDetailViewController.swift */, + 74B9185323199F4500ADDEA4 /* BookDetailViewController+View.swift */, + ); + path = View; + sourceTree = ""; + }; + 74B9185023199E7700ADDEA4 /* ViewModel */ = { + isa = PBXGroup; + children = ( + 74B9185123199E8F00ADDEA4 /* BookDetailViewModel.swift */, + ); + path = ViewModel; + sourceTree = ""; + }; E4186846F20EA500EF61D605 /* Pods */ = { isa = PBXGroup; children = ( @@ -357,6 +393,7 @@ files = ( 0E3964E22314BB4A0093738B /* LaunchScreen.storyboard in Resources */, 7447D37E2316F72A00E01BD3 /* BooksList.storyboard in Resources */, + 74ADE9D023199C1F006D2644 /* BookDetail.storyboard in Resources */, 0E3964DF2314BB4A0093738B /* Assets.xcassets in Resources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -460,6 +497,7 @@ 74ADE9C223196E99006D2644 /* Identifiable.swift in Sources */, 7447D36C2316F12800E01BD3 /* Item.swift in Sources */, 7447D3682316E57500E01BD3 /* Book.swift in Sources */, + 74B9185423199F4500ADDEA4 /* BookDetailViewController+View.swift in Sources */, 74ADE9BE23196CE3006D2644 /* AppCoordinatorDependencyInjector.swift in Sources */, 7447D3702316F14D00E01BD3 /* SalesInfo.swift in Sources */, 7447D37A2316F71200E01BD3 /* BooksListViewModel.swift in Sources */, @@ -467,12 +505,14 @@ 7447D37C2316F71D00E01BD3 /* BooksListViewController.swift in Sources */, 74ADE9C7231973B5006D2644 /* BooksListViewController+CollectionView.swift in Sources */, 74ADE9C52319730F006D2644 /* BooksCell.swift in Sources */, + 74ADE9D223199D97006D2644 /* BookDetailViewController.swift in Sources */, 74ADE9B823196A7A006D2644 /* AppCoordinator.swift in Sources */, 0E3964D82314BB470093738B /* AppDelegate.swift in Sources */, 74ADE9C023196E44006D2644 /* UIViewController+QuickInstance.swift in Sources */, 7447D3602316CB1200E01BD3 /* Reachability.swift in Sources */, 7447D35E2316C91700E01BD3 /* APIClient.swift in Sources */, 7447D3642316E02500E01BD3 /* Endpoint.swift in Sources */, + 74B9185223199E8F00ADDEA4 /* BookDetailViewModel.swift in Sources */, 7447D36A2316F11800E01BD3 /* BooksList.swift in Sources */, 7447D3662316E3C100E01BD3 /* BooksClient.swift in Sources */, 7447D3622316DECA00E01BD3 /* BooksAPI.swift in Sources */, diff --git a/iOSBooks/iOSBooks/Assets.xcassets/back_arrow.imageset/Contents.json b/iOSBooks/iOSBooks/Assets.xcassets/back_arrow.imageset/Contents.json new file mode 100644 index 0000000..b7b948c --- /dev/null +++ b/iOSBooks/iOSBooks/Assets.xcassets/back_arrow.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "back_arrow.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "back_arrow@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "back_arrow@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/iOSBooks/iOSBooks/Assets.xcassets/back_arrow.imageset/back_arrow.png b/iOSBooks/iOSBooks/Assets.xcassets/back_arrow.imageset/back_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..6575439e6b760480456067b332cca7581a454214 GIT binary patch literal 254 zcmeAS@N?(olHy`uVBq!ia0vp@KrF_=1|+3_iKzf7&H|6fVg?3oVGw3ym^DWND9BhG zw$eVM3 z&22*$Z%+b?&jGfag1F|Ee;2ZYKTewNJ*!4Ti`Cd=iJ^$qCdOTtCfX%7@GN!@KFI0d zdH&3bF0QQj3lRw%j4zijC~Z8%G`HYL&7HGRm)A@0zq|HR)ltI*H}6X^ebq16=U6Ow wwoyy0WPXh1)24}wPwzD0%saEc!uA$lds)NX$sq}+fX-v^boFyt=akR{0Q^{4IRF3v literal 0 HcmV?d00001 diff --git a/iOSBooks/iOSBooks/Assets.xcassets/back_arrow.imageset/back_arrow@2x.png b/iOSBooks/iOSBooks/Assets.xcassets/back_arrow.imageset/back_arrow@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..11c6c4c90696ccaf70dd9b85a1a26fab449acff5 GIT binary patch literal 315 zcmeAS@N?(olHy`uVBq!ia0vp^l0dA*!3HGV*gqryDb50q$YKTtF;x&|^bAt@02E{_ z4sv&5Sa(k5C6L3C?&#~tz_78O`%fY(kbl9`#WAFU@$J<_-a`fgZ4dP|X0&+CU@kCH zd5}=d#5bX##cM^&qX!mF&Q6C;UEE#T_{DeMoAcM6$Fu)Qa=G%+E$%^Vg>}R+_FW}E zyf3|EZcdNuR7+&6{;$v+@?z6W1H87)$o; zXZLkF5$(AA=)x9H1@>GfjRQ({8K*QiXt5vMWXW-DZ{s0e%S}@*>R!4v0q8ddPgg&e IbxsLQ05;!r#{d8T literal 0 HcmV?d00001 diff --git a/iOSBooks/iOSBooks/Assets.xcassets/back_arrow.imageset/back_arrow@3x.png b/iOSBooks/iOSBooks/Assets.xcassets/back_arrow.imageset/back_arrow@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..1ce9897c80682995e0e2c5c49b8be60fe8f49ce4 GIT binary patch literal 446 zcmV;v0YUzWP)&=J_6-GC9A4S)&S4HyMBC>xXw9%mFJKtjzqyo(k2FGZ31#XmJt zbg_X->#%Snd%GpO^8K~zx_2y{q3-Rv@Mi}sSqAX$9 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/iOSBooks/iOSBooks/BookDetail/View/BookDetailViewController+View.swift b/iOSBooks/iOSBooks/BookDetail/View/BookDetailViewController+View.swift new file mode 100644 index 0000000..8f76f56 --- /dev/null +++ b/iOSBooks/iOSBooks/BookDetail/View/BookDetailViewController+View.swift @@ -0,0 +1,32 @@ +// +// BookDetailViewController+View.swift +// iOSBooks +// +// Created by Guilherme Antunes Ferreira on 30/08/19. +// Copyright © 2019 Guilherme Antunes. All rights reserved. +// + +import Kingfisher +import UIKit + +protocol BookDetailViewControllerPresentable: class { + +} + +extension BookDetailViewController: BookDetailViewControllerPresentable { + + func setupView() { + title = viewModel?.getScreenTitle() + bookImageView?.kf.setImage(with: viewModel?.getBookImageLink()) + bookTitleLabel?.text = viewModel?.getBookTitle() + bookAuthorsLabel?.text = viewModel?.getBookAuthors() + buyLinkLabel?.text = viewModel?.getBookBuyLink() + descriptionTextView?.text = viewModel?.getBookDescription() + } + + func setupNavigation() { + navigationController?.navigationBar.prefersLargeTitles = false + setBackButton(#selector(dismissScreen)) + } + +} diff --git a/iOSBooks/iOSBooks/BookDetail/View/BookDetailViewController.swift b/iOSBooks/iOSBooks/BookDetail/View/BookDetailViewController.swift new file mode 100644 index 0000000..ac2e68a --- /dev/null +++ b/iOSBooks/iOSBooks/BookDetail/View/BookDetailViewController.swift @@ -0,0 +1,38 @@ +// +// BookDetailViewController.swift +// iOSBooks +// +// Created by Guilherme Antunes Ferreira on 30/08/19. +// Copyright © 2019 Guilherme Antunes. All rights reserved. +// + +import UIKit + +class BookDetailViewController: UIViewController { + + // MARK: - Outlets + @IBOutlet weak var bookImageView: UIImageView? + @IBOutlet weak var bookTitleLabel: UILabel? + @IBOutlet weak var bookAuthorsLabel: UILabel? + @IBOutlet weak var buyLinkLabel: UILabel? + @IBOutlet weak var descriptionTextView: UITextView? + + // MARK: - Properties + var viewModel: BookDetailViewModelProtocol? + + // MARK: - View Life Cycle + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + setupView() + setupNavigation() + } + + override func viewDidAppear(_ animated: Bool) { + super.viewDidAppear(animated) + descriptionTextView?.scrollRangeToVisible(NSRange(location:0, length:0)) + } + + @objc func dismissScreen() { + viewModel?.presentPreviousStep() + } +} diff --git a/iOSBooks/iOSBooks/BookDetail/ViewModel/BookDetailViewModel.swift b/iOSBooks/iOSBooks/BookDetail/ViewModel/BookDetailViewModel.swift new file mode 100644 index 0000000..d7260bb --- /dev/null +++ b/iOSBooks/iOSBooks/BookDetail/ViewModel/BookDetailViewModel.swift @@ -0,0 +1,66 @@ +// +// BookDetailViewModel.swift +// iOSBooks +// +// Created by Guilherme Antunes Ferreira on 30/08/19. +// Copyright © 2019 Guilherme Antunes. All rights reserved. +// + +import Foundation + +protocol BookDetailViewModelProtocol { + func getBookTitle() -> String + func getBookAuthors() -> String + func getBookBuyLink() -> String + func getBookDescription() -> String + func getBookImageLink() -> URL? + func presentPreviousStep() + func getScreenTitle() -> String? +} + +class BookDetailViewModel: BookDetailViewModelProtocol { + + // MARK: - Properties + var selectedBook: Item? + weak var view: BookDetailViewControllerPresentable? + var coordinator: AppCoordinatorProtocol? + + // MARK: - ViewModel Protocol Methods + func getBookTitle() -> String { + guard let bookTitle = selectedBook?.book?.title else { return "Título indisponível" } + var title = "Título: " + title.append(bookTitle) + return title + } + + func getBookAuthors() -> String { + guard let bookAuthor = selectedBook?.book?.authors?.first else { return "Autores não disponíveis" } + var author = "Autor: " + author.append(bookAuthor) + return author + } + + func getBookBuyLink() -> String { + return selectedBook?.salesInfo?.buyLink ?? "Link de compra não disponível" + } + + func getBookDescription() -> String { + return selectedBook?.book?.description ?? "Sem descrição disponível" + } + + func getBookImageLink() -> URL? { + if let bookURLString = selectedBook?.book?.imageLinks?.thumbnail { + return URL(string: bookURLString) + } + + return nil + } + + func getScreenTitle() -> String? { + return selectedBook?.book?.title + } + + func presentPreviousStep() { + coordinator?.presentPreviousStep() + } +} diff --git a/iOSBooks/iOSBooks/BooksList/View/BooksList.storyboard b/iOSBooks/iOSBooks/BooksList/View/BooksList.storyboard index 511c79e..14bcfd6 100644 --- a/iOSBooks/iOSBooks/BooksList/View/BooksList.storyboard +++ b/iOSBooks/iOSBooks/BooksList/View/BooksList.storyboard @@ -70,4 +70,5 @@ + diff --git a/iOSBooks/iOSBooks/BooksList/View/BooksListViewController+CollectionView.swift b/iOSBooks/iOSBooks/BooksList/View/BooksListViewController+CollectionView.swift index 7ac7c72..e5fd44c 100644 --- a/iOSBooks/iOSBooks/BooksList/View/BooksListViewController+CollectionView.swift +++ b/iOSBooks/iOSBooks/BooksList/View/BooksListViewController+CollectionView.swift @@ -20,4 +20,8 @@ extension BooksListViewController: UICollectionViewDataSource, UICollectionViewD func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { return viewModel?.cellForItem(inCollectionView: collectionView, atIndexPath: indexPath) ?? UICollectionViewCell() } + + func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { + viewModel?.selectBook(atIndexPath: indexPath) + } } diff --git a/iOSBooks/iOSBooks/BooksList/View/BooksListViewController+View.swift b/iOSBooks/iOSBooks/BooksList/View/BooksListViewController+View.swift index e2ccd98..75e57a0 100644 --- a/iOSBooks/iOSBooks/BooksList/View/BooksListViewController+View.swift +++ b/iOSBooks/iOSBooks/BooksList/View/BooksListViewController+View.swift @@ -8,7 +8,7 @@ import UIKit -protocol BooksListViewControllerPresentable { +protocol BooksListViewControllerPresentable: class { func reloadView() func presentError(message: String) } @@ -27,4 +27,8 @@ extension BooksListViewController: BooksListViewControllerPresentable { booksCollectionView?.dataSource = self booksCollectionView?.delegate = self } + + func setupNavigationBar() { + navigationController?.navigationBar.prefersLargeTitles = true + } } diff --git a/iOSBooks/iOSBooks/BooksList/View/BooksListViewController.swift b/iOSBooks/iOSBooks/BooksList/View/BooksListViewController.swift index 7661e23..e3a99da 100644 --- a/iOSBooks/iOSBooks/BooksList/View/BooksListViewController.swift +++ b/iOSBooks/iOSBooks/BooksList/View/BooksListViewController.swift @@ -19,4 +19,9 @@ class BooksListViewController: UIViewController { setupCollectionView() viewModel?.loadBooks() } + + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + setupNavigationBar() + } } diff --git a/iOSBooks/iOSBooks/BooksList/View/Subviews/BooksCell.swift b/iOSBooks/iOSBooks/BooksList/View/Subviews/BooksCell.swift index da5e82c..515a938 100644 --- a/iOSBooks/iOSBooks/BooksList/View/Subviews/BooksCell.swift +++ b/iOSBooks/iOSBooks/BooksList/View/Subviews/BooksCell.swift @@ -13,7 +13,7 @@ class BooksCell: UICollectionViewCell { @IBOutlet weak var bookImageView: UIImageView? func setup(withBook book: Book?) { - if let book = book, let bookURLString = book.imageLinks?.thumbnail, let url = URL(string: bookURLString) { + if let book = book, let bookURLString = book.imageLinks?.smallThumbnail, let url = URL(string: bookURLString) { bookImageView?.kf.setImage(with: url) } } diff --git a/iOSBooks/iOSBooks/BooksList/ViewModel/BooksListViewModel.swift b/iOSBooks/iOSBooks/BooksList/ViewModel/BooksListViewModel.swift index d913009..81dfa05 100644 --- a/iOSBooks/iOSBooks/BooksList/ViewModel/BooksListViewModel.swift +++ b/iOSBooks/iOSBooks/BooksList/ViewModel/BooksListViewModel.swift @@ -10,6 +10,8 @@ import UIKit protocol BooksListViewModelProtocol { func loadBooks() + func selectBook(atIndexPath indexPath: IndexPath) + func presentPreviousStep() func numberOfSections() -> Int func numberOfItemsInSection() -> Int func cellForItem(inCollectionView collectionView: UICollectionView, atIndexPath indexPath: IndexPath) -> UICollectionViewCell @@ -20,7 +22,9 @@ class BooksListViewModel: BooksListViewModelProtocol { var items: [Item] = [] var service = BooksClient() var startingIndex = 0 - var view: BooksListViewControllerPresentable? + weak var view: BooksListViewControllerPresentable? + var selectedBook: Item? + var coordinator: AppCoordinatorProtocol? func numberOfSections() -> Int { return 1 @@ -54,4 +58,14 @@ class BooksListViewModel: BooksListViewModelProtocol { } } + + func selectBook(atIndexPath indexPath: IndexPath) { + selectedBook = nil + selectedBook = items[indexPath.item] + coordinator?.presentNextStep() + } + + func presentPreviousStep() { + coordinator?.presentPreviousStep() + } } diff --git a/iOSBooks/iOSBooks/Coordinators/AppCoordinator/AppCoordinator.swift b/iOSBooks/iOSBooks/Coordinators/AppCoordinator/AppCoordinator.swift index f0129ef..eb21a1e 100644 --- a/iOSBooks/iOSBooks/Coordinators/AppCoordinator/AppCoordinator.swift +++ b/iOSBooks/iOSBooks/Coordinators/AppCoordinator/AppCoordinator.swift @@ -8,10 +8,21 @@ import UIKit -class AppCoordinator { +protocol AppCoordinatorProtocol: class { + func presentNextStep() + func presentPreviousStep() +} + +enum RoutingState { + case list + case detail +} + +class AppCoordinator: AppCoordinatorProtocol { lazy var injector = AppCoordinatorDependencyInjector() var window: UIWindow + var state: RoutingState = .list init(window: UIWindow) { self.window = window @@ -25,5 +36,28 @@ class AppCoordinator { func setupNavigationController() { injector.navigationController.viewControllers.append(injector.booksListViewController) + injector.booksListViewModel.coordinator = self + } + + func presentNextStep() { + switch state { + case .list: + injector.injectNewBook() + injector.bookDetailViewModel.coordinator = self + state = .detail + injector.navigationController.pushViewController(injector.bookDetailViewController, animated: true) + case.detail: + print("Nenhuma tela para frente neste fluxo") + } + } + + func presentPreviousStep() { + switch state { + case .list: + print("Nenhuma tela para trás neste fluxo") + case.detail: + state = .list + injector.navigationController.popViewController(animated: true) + } } } diff --git a/iOSBooks/iOSBooks/Coordinators/AppCoordinator/AppCoordinatorDependencyInjector.swift b/iOSBooks/iOSBooks/Coordinators/AppCoordinator/AppCoordinatorDependencyInjector.swift index 4ed7ff9..cd5e575 100644 --- a/iOSBooks/iOSBooks/Coordinators/AppCoordinator/AppCoordinatorDependencyInjector.swift +++ b/iOSBooks/iOSBooks/Coordinators/AppCoordinator/AppCoordinatorDependencyInjector.swift @@ -13,6 +13,7 @@ class AppCoordinatorDependencyInjector { let navigation = UINavigationController() navigation.navigationBar.prefersLargeTitles = true navigation.navigationBar.barStyle = .black + navigation.navigationBar.tintColor = .white return navigation }() @@ -26,4 +27,21 @@ class AppCoordinatorDependencyInjector { lazy var booksListViewModel: BooksListViewModel = { return BooksListViewModel() }() + + lazy var bookDetailViewController: BookDetailViewController = { + let controller: BookDetailViewController = BookDetailViewController.instantiate() + bookDetailViewModel.view = controller + controller.viewModel = bookDetailViewModel + return controller + }() + + lazy var bookDetailViewModel: BookDetailViewModel = { + let viewModel = BookDetailViewModel() + viewModel.selectedBook = booksListViewModel.selectedBook + return viewModel + }() + + func injectNewBook() { + bookDetailViewModel.selectedBook = booksListViewModel.selectedBook + } } diff --git a/iOSBooks/iOSBooks/UIViewController+QuickInstance.swift b/iOSBooks/iOSBooks/UIViewController+QuickInstance.swift index 3ccb0ed..dd6e636 100644 --- a/iOSBooks/iOSBooks/UIViewController+QuickInstance.swift +++ b/iOSBooks/iOSBooks/UIViewController+QuickInstance.swift @@ -27,10 +27,10 @@ extension UIViewController { extension UIViewController { func setBackButton(_ backFunction: Selector) { -// navigationItem.hidesBackButton = true -// let newBackButton = UIBarButtonItem(image: UIImage(named: "back_arrow"), style: .plain, target: self, action: backFunction) -// newBackButton.title = "Voltar" -// navigationItem.leftBarButtonItem = newBackButton + navigationItem.hidesBackButton = true + let newBackButton = UIBarButtonItem(image: UIImage(named: "back_arrow"), style: .plain, target: self, action: backFunction) + newBackButton.title = "Voltar" + navigationItem.leftBarButtonItem = newBackButton } } From a52f8dc66d916cd46ab904716e463284a93dba60 Mon Sep 17 00:00:00 2001 From: Guilherme Antunes Date: Fri, 30 Aug 2019 16:33:54 -0300 Subject: [PATCH 2/2] feat(open link): adding open buy link feature --- iOSBooks/iOSBooks.xcodeproj/project.pbxproj | 4 ++++ .../BookDetail/View/BookDetail.storyboard | 4 ++-- .../View/BookDetailViewController+Safari.swift | 16 ++++++++++++++++ .../View/BookDetailViewController+View.swift | 5 +++++ .../View/BookDetailViewController.swift | 1 + .../ViewModel/BookDetailViewModel.swift | 9 +++++++++ 6 files changed, 37 insertions(+), 2 deletions(-) create mode 100644 iOSBooks/iOSBooks/BookDetail/View/BookDetailViewController+Safari.swift diff --git a/iOSBooks/iOSBooks.xcodeproj/project.pbxproj b/iOSBooks/iOSBooks.xcodeproj/project.pbxproj index 7c3f9ec..7161d36 100644 --- a/iOSBooks/iOSBooks.xcodeproj/project.pbxproj +++ b/iOSBooks/iOSBooks.xcodeproj/project.pbxproj @@ -36,6 +36,7 @@ 74ADE9D223199D97006D2644 /* BookDetailViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74ADE9D123199D97006D2644 /* BookDetailViewController.swift */; }; 74B9185223199E8F00ADDEA4 /* BookDetailViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74B9185123199E8F00ADDEA4 /* BookDetailViewModel.swift */; }; 74B9185423199F4500ADDEA4 /* BookDetailViewController+View.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74B9185323199F4500ADDEA4 /* BookDetailViewController+View.swift */; }; + 74B918562319AE0300ADDEA4 /* BookDetailViewController+Safari.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74B918552319AE0300ADDEA4 /* BookDetailViewController+Safari.swift */; }; 768F74E39672B1F50C632913 /* Pods_iOSBooks.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2D2FDB2EC5907498F6A3C173 /* Pods_iOSBooks.framework */; }; /* End PBXBuildFile section */ @@ -87,6 +88,7 @@ 74ADE9D123199D97006D2644 /* BookDetailViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BookDetailViewController.swift; sourceTree = ""; }; 74B9185123199E8F00ADDEA4 /* BookDetailViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BookDetailViewModel.swift; sourceTree = ""; }; 74B9185323199F4500ADDEA4 /* BookDetailViewController+View.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "BookDetailViewController+View.swift"; sourceTree = ""; }; + 74B918552319AE0300ADDEA4 /* BookDetailViewController+Safari.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "BookDetailViewController+Safari.swift"; sourceTree = ""; }; E6741F045EBC12BB315EE1CB /* Pods-iOSBooks.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-iOSBooks.debug.xcconfig"; path = "Target Support Files/Pods-iOSBooks/Pods-iOSBooks.debug.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ @@ -283,6 +285,7 @@ 74ADE9CF23199C1F006D2644 /* BookDetail.storyboard */, 74ADE9D123199D97006D2644 /* BookDetailViewController.swift */, 74B9185323199F4500ADDEA4 /* BookDetailViewController+View.swift */, + 74B918552319AE0300ADDEA4 /* BookDetailViewController+Safari.swift */, ); path = View; sourceTree = ""; @@ -507,6 +510,7 @@ 74ADE9C52319730F006D2644 /* BooksCell.swift in Sources */, 74ADE9D223199D97006D2644 /* BookDetailViewController.swift in Sources */, 74ADE9B823196A7A006D2644 /* AppCoordinator.swift in Sources */, + 74B918562319AE0300ADDEA4 /* BookDetailViewController+Safari.swift in Sources */, 0E3964D82314BB470093738B /* AppDelegate.swift in Sources */, 74ADE9C023196E44006D2644 /* UIViewController+QuickInstance.swift in Sources */, 7447D3602316CB1200E01BD3 /* Reachability.swift in Sources */, diff --git a/iOSBooks/iOSBooks/BookDetail/View/BookDetail.storyboard b/iOSBooks/iOSBooks/BookDetail/View/BookDetail.storyboard index fadaade..c032e64 100644 --- a/iOSBooks/iOSBooks/BookDetail/View/BookDetail.storyboard +++ b/iOSBooks/iOSBooks/BookDetail/View/BookDetail.storyboard @@ -39,7 +39,7 @@ -