Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 44 additions & 0 deletions iOSBooks/iOSBooks.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,11 @@
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 */; };
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 */

Expand Down Expand Up @@ -79,6 +84,11 @@
74ADE9C42319730F006D2644 /* BooksCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BooksCell.swift; sourceTree = "<group>"; };
74ADE9C6231973B5006D2644 /* BooksListViewController+CollectionView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "BooksListViewController+CollectionView.swift"; sourceTree = "<group>"; };
74ADE9C8231981F5006D2644 /* BooksListViewController+View.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "BooksListViewController+View.swift"; sourceTree = "<group>"; };
74ADE9CF23199C1F006D2644 /* BookDetail.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = BookDetail.storyboard; sourceTree = "<group>"; };
74ADE9D123199D97006D2644 /* BookDetailViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BookDetailViewController.swift; sourceTree = "<group>"; };
74B9185123199E8F00ADDEA4 /* BookDetailViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BookDetailViewModel.swift; sourceTree = "<group>"; };
74B9185323199F4500ADDEA4 /* BookDetailViewController+View.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "BookDetailViewController+View.swift"; sourceTree = "<group>"; };
74B918552319AE0300ADDEA4 /* BookDetailViewController+Safari.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "BookDetailViewController+Safari.swift"; sourceTree = "<group>"; };
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 = "<group>"; };
/* End PBXFileReference section */

Expand Down Expand Up @@ -127,6 +137,7 @@
children = (
74ADE9B5231969F0006D2644 /* Coordinators */,
7447D3762316F6C700E01BD3 /* BooksList */,
74ADE9D323199E0F006D2644 /* BookDetail */,
7447D3712316F16E00E01BD3 /* Data */,
0E3964D72314BB470093738B /* AppDelegate.swift */,
0E3964DE2314BB4A0093738B /* Assets.xcassets */,
Expand Down Expand Up @@ -259,6 +270,34 @@
path = Subviews;
sourceTree = "<group>";
};
74ADE9D323199E0F006D2644 /* BookDetail */ = {
isa = PBXGroup;
children = (
74B9184F23199E6D00ADDEA4 /* View */,
74B9185023199E7700ADDEA4 /* ViewModel */,
);
path = BookDetail;
sourceTree = "<group>";
};
74B9184F23199E6D00ADDEA4 /* View */ = {
isa = PBXGroup;
children = (
74ADE9CF23199C1F006D2644 /* BookDetail.storyboard */,
74ADE9D123199D97006D2644 /* BookDetailViewController.swift */,
74B9185323199F4500ADDEA4 /* BookDetailViewController+View.swift */,
74B918552319AE0300ADDEA4 /* BookDetailViewController+Safari.swift */,
);
path = View;
sourceTree = "<group>";
};
74B9185023199E7700ADDEA4 /* ViewModel */ = {
isa = PBXGroup;
children = (
74B9185123199E8F00ADDEA4 /* BookDetailViewModel.swift */,
);
path = ViewModel;
sourceTree = "<group>";
};
E4186846F20EA500EF61D605 /* Pods */ = {
isa = PBXGroup;
children = (
Expand Down Expand Up @@ -357,6 +396,7 @@
files = (
0E3964E22314BB4A0093738B /* LaunchScreen.storyboard in Resources */,
7447D37E2316F72A00E01BD3 /* BooksList.storyboard in Resources */,
74ADE9D023199C1F006D2644 /* BookDetail.storyboard in Resources */,
0E3964DF2314BB4A0093738B /* Assets.xcassets in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
Expand Down Expand Up @@ -460,19 +500,23 @@
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 */,
7447D36E2316F13A00E01BD3 /* ImageLinks.swift in Sources */,
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 */,
74B918562319AE0300ADDEA4 /* BookDetailViewController+Safari.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 */,
Expand Down
Original file line number Diff line number Diff line change
@@ -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"
}
}
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
83 changes: 83 additions & 0 deletions iOSBooks/iOSBooks/BookDetail/View/BookDetail.storyboard
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="14490.70" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
<device id="retina6_1" orientation="portrait">
<adaptation id="fullscreen"/>
</device>
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14490.49"/>
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<scenes>
<!--Book Detail View Controller-->
<scene sceneID="fw4-DL-XOb">
<objects>
<viewController storyboardIdentifier="BookDetailViewController" useStoryboardIdentifierAsRestorationIdentifier="YES" id="6rU-Uw-H3q" customClass="BookDetailViewController" customModule="iOSBooks" customModuleProvider="target" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" id="c9M-V1-kX2">
<rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="TpO-b0-I35">
<rect key="frame" x="12" y="56" width="300" height="300"/>
<constraints>
<constraint firstAttribute="width" constant="300" id="RkD-TA-uR1"/>
<constraint firstAttribute="height" constant="300" id="ze3-T2-UB5"/>
</constraints>
</imageView>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" spacing="12" translatesAutoresizingMaskIntoConstraints="NO" id="DsL-0l-xi7">
<rect key="frame" x="12" y="368" width="390" height="528"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="768-XD-nlZ">
<rect key="frame" x="0.0" y="0.0" width="390" height="23.5"/>
<fontDescription key="fontDescription" name="AvenirNext-Bold" family="Avenir Next" pointSize="17"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="mU9-Pt-17a">
<rect key="frame" x="0.0" y="35.5" width="390" height="23.5"/>
<fontDescription key="fontDescription" name="AvenirNext-DemiBold" family="Avenir Next" pointSize="17"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="baa-VJ-mqK">
<rect key="frame" x="0.0" y="71" width="390" height="23.5"/>
<fontDescription key="fontDescription" name="AvenirNext-Italic" family="Avenir Next" pointSize="17"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
<textView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" editable="NO" textAlignment="natural" selectable="NO" translatesAutoresizingMaskIntoConstraints="NO" id="AgA-qA-aED">
<rect key="frame" x="0.0" y="106.5" width="390" height="421.5"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<string key="text">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.</string>
<fontDescription key="fontDescription" name="AvenirNext-Regular" family="Avenir Next" pointSize="17"/>
<textInputTraits key="textInputTraits" autocapitalizationType="sentences"/>
</textView>
</subviews>
</stackView>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstItem="DsL-0l-xi7" firstAttribute="leading" secondItem="SrW-hW-4OI" secondAttribute="leading" constant="12" id="A9U-Mz-1My"/>
<constraint firstItem="DsL-0l-xi7" firstAttribute="top" secondItem="TpO-b0-I35" secondAttribute="bottom" constant="12" id="NTd-sh-A5j"/>
<constraint firstItem="TpO-b0-I35" firstAttribute="leading" secondItem="SrW-hW-4OI" secondAttribute="leading" constant="12" id="Psc-l9-6GA"/>
<constraint firstAttribute="bottom" secondItem="DsL-0l-xi7" secondAttribute="bottom" id="chY-Lh-qBo"/>
<constraint firstItem="SrW-hW-4OI" firstAttribute="trailing" secondItem="DsL-0l-xi7" secondAttribute="trailing" constant="12" id="doA-ib-ugT"/>
<constraint firstItem="TpO-b0-I35" firstAttribute="top" secondItem="SrW-hW-4OI" secondAttribute="top" constant="12" id="y6M-gB-GD3"/>
</constraints>
<viewLayoutGuide key="safeArea" id="SrW-hW-4OI"/>
</view>
<connections>
<outlet property="bookAuthorsLabel" destination="mU9-Pt-17a" id="3vw-bk-jyF"/>
<outlet property="bookImageView" destination="TpO-b0-I35" id="XbF-1j-3nc"/>
<outlet property="bookTitleLabel" destination="768-XD-nlZ" id="z92-Hg-c8F"/>
<outlet property="buyLinkLabel" destination="baa-VJ-mqK" id="2ro-Qf-yqx"/>
<outlet property="descriptionTextView" destination="AgA-qA-aED" id="zGM-Go-3v2"/>
</connections>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="7Zi-CG-FdX" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="-7" y="-1"/>
</scene>
</scenes>
<color key="tintColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
</document>
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
//
// BookDetailViewController+Safari.swift
// iOSBooks
//
// Created by Guilherme Antunes Ferreira on 30/08/19.
// Copyright © 2019 Guilherme Antunes. All rights reserved.
//

import UIKit

extension BookDetailViewController {
@objc func openBuyLink() {
guard let buyLink = viewModel?.getBookBuyLinkURL() else { return }
UIApplication.shared.open(buyLink, options: [:], completionHandler: nil)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
//
// 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 configureTap() {
let tap = UITapGestureRecognizer(target: self, action: #selector(openBuyLink))
buyLinkLabel?.addGestureRecognizer(tap)
}

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))
}

}
39 changes: 39 additions & 0 deletions iOSBooks/iOSBooks/BookDetail/View/BookDetailViewController.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
//
// 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()
configureTap()
}

override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
descriptionTextView?.scrollRangeToVisible(NSRange(location:0, length:0))
}

@objc func dismissScreen() {
viewModel?.presentPreviousStep()
}
}
Loading