From d301f5984d135130bd31990e1ada85590c0ff039 Mon Sep 17 00:00:00 2001 From: Mauricio Maciel Date: Tue, 18 Oct 2022 18:53:01 -0300 Subject: [PATCH 1/2] ActivityListView - still missing some configuration --- .../ActivityDetails/ActivityListView.swift | 64 +++++++++++++++++++ .../FinanceApp/Screens/Home/HomeView.swift | 45 ++++++------- 2 files changed, 87 insertions(+), 22 deletions(-) create mode 100644 solutions/devsprint-caio-santos-7/FinanceApp/Screens/ActivityDetails/ActivityListView.swift diff --git a/solutions/devsprint-caio-santos-7/FinanceApp/Screens/ActivityDetails/ActivityListView.swift b/solutions/devsprint-caio-santos-7/FinanceApp/Screens/ActivityDetails/ActivityListView.swift new file mode 100644 index 0000000..ad742d8 --- /dev/null +++ b/solutions/devsprint-caio-santos-7/FinanceApp/Screens/ActivityDetails/ActivityListView.swift @@ -0,0 +1,64 @@ +// +// ActivityListView.swift +// FinanceApp +// +// Created by Mauricio on 18/10/22. +// + +import UIKit + +class ActivityListView: UIView { + + private var activities: [Activity] = [] + + private lazy var tableView: UITableView = { + let tableView = UITableView(frame: .zero) + tableView.translatesAutoresizingMaskIntoConstraints = false + tableView.register(ActivityCellView.self, forCellReuseIdentifier: ActivityCellView.reuseIdentifier) + tableView.register(UITableViewCell.self, forCellReuseIdentifier: UITableViewCell.reuseIdentifier) + + return tableView + }() + + override init(frame: CGRect) { + super.init(frame: frame) + self.configViews() + self.buildHierarchy() + self.setupConstraints() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + func updateTableView(with configuration: HomeViewConfiguration) { + activities = configuration.homeData.activity + tableView.reloadData() + } + + public func configTableViewProtocol(delegate: UITableViewDelegate, dataSource: UITableViewDataSource){ + self.tableView.delegate = delegate + self.tableView.dataSource = dataSource + } + +} + +extension ActivityListView: ViewCodable { + func configViews (){ + backgroundColor = .white + } + + func buildHierarchy(){ + addSubview(tableView) + } + + func setupConstraints(){ + NSLayoutConstraint.activate([ + tableView.topAnchor.constraint(equalTo: self.topAnchor), + tableView.leadingAnchor.constraint(equalTo: self.leadingAnchor), + tableView.trailingAnchor.constraint(equalTo: self.trailingAnchor), + tableView.bottomAnchor.constraint(equalTo: self.bottomAnchor) + ]) + } + +} diff --git a/solutions/devsprint-caio-santos-7/FinanceApp/Screens/Home/HomeView.swift b/solutions/devsprint-caio-santos-7/FinanceApp/Screens/Home/HomeView.swift index b0b11d3..a7744b2 100644 --- a/solutions/devsprint-caio-santos-7/FinanceApp/Screens/Home/HomeView.swift +++ b/solutions/devsprint-caio-santos-7/FinanceApp/Screens/Home/HomeView.swift @@ -7,30 +7,29 @@ import UIKit -struct HomeViewConfiguration { - let homeData: HomeData -} + struct HomeViewConfiguration { + let homeData: HomeData + } -final class HomeView: UIView { private var activities: [Activity] = [] +final class HomeView: UIView{ + private lazy var accountSummaryView: AccountSummaryView = { let element = AccountSummaryView() element.translatesAutoresizingMaskIntoConstraints = false return element }() - private lazy var tableView: UITableView = { - let tableView = UITableView(frame: .zero) - tableView.translatesAutoresizingMaskIntoConstraints = false - tableView.register(ActivityCellView.self, forCellReuseIdentifier: ActivityCellView.reuseIdentifier) - tableView.register(UITableViewCell.self, forCellReuseIdentifier: UITableViewCell.reuseIdentifier) - tableView.dataSource = self - return tableView + private lazy var activityListView: ActivityListView = { + let element = ActivityListView() + element.translatesAutoresizingMaskIntoConstraints = false + return element }() - + init() { super.init(frame: .zero) + self.activityListView.configTableViewProtocol(delegate: self, dataSource: self) self.setupViews() } @@ -39,12 +38,12 @@ final class HomeView: UIView { } func updateView(with configuration: HomeViewConfiguration) { - activities = configuration.homeData.activity accountSummaryView.updateValues(balance: configuration.homeData.balance, savings: configuration.homeData.savings, spending: configuration.homeData.spending) - tableView.reloadData() + activityListView.updateTableView(with: configuration) } + } private extension HomeView { @@ -57,7 +56,7 @@ private extension HomeView { func configureSubviews() { addSubview(accountSummaryView) - addSubview(tableView) + addSubview(activityListView) } func configureSubviewsConstraints() { @@ -66,15 +65,15 @@ private extension HomeView { accountSummaryView.leadingAnchor.constraint(equalTo: safeAreaLayoutGuide.leadingAnchor, constant: 16), accountSummaryView.trailingAnchor.constraint(equalTo: safeAreaLayoutGuide.trailingAnchor, constant: -16), - tableView.topAnchor.constraint(equalTo: accountSummaryView.bottomAnchor, constant: 16), - tableView.leadingAnchor.constraint(equalTo: safeAreaLayoutGuide.leadingAnchor), - tableView.trailingAnchor.constraint(equalTo: safeAreaLayoutGuide.trailingAnchor), - tableView.bottomAnchor.constraint(equalTo: safeAreaLayoutGuide.bottomAnchor) + activityListView.topAnchor.constraint(equalTo: accountSummaryView.bottomAnchor, constant: 16), + activityListView.leadingAnchor.constraint(equalTo: safeAreaLayoutGuide.leadingAnchor), + activityListView.trailingAnchor.constraint(equalTo: safeAreaLayoutGuide.trailingAnchor), + activityListView.bottomAnchor.constraint(equalTo: safeAreaLayoutGuide.bottomAnchor) ]) } } -extension HomeView: UITableViewDataSource { +extension HomeView: UITableViewDelegate, UITableViewDataSource { public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return activities.count } @@ -84,10 +83,12 @@ extension HomeView: UITableViewDataSource { indexPath.row < activities.count else { return .init() } - - cell.updateValues(activity: activities[indexPath.row]) return cell } + + func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + print("Função para disparar ação de toque na atividade") + } } From 09624d0c90266b31cbc0691ede2ebb4af2ed9eb1 Mon Sep 17 00:00:00 2001 From: Caio Santos Date: Tue, 18 Oct 2022 19:56:26 -0300 Subject: [PATCH 2/2] Ajustes PR --- .../ActivityDetails/ActivityListView.swift | 14 ++--- .../FinanceApp/Screens/Home/HomeView.swift | 13 ++-- .../ActivityListViewTests.swift | 56 ++++++++++++++++++ .../testRenderView.1.png | Bin 0 -> 52082 bytes 4 files changed, 68 insertions(+), 15 deletions(-) create mode 100644 solutions/devsprint-caio-santos-7/FinanceAppTests/Screens/ActivityDetails/ActivityListViewTests.swift create mode 100644 solutions/devsprint-caio-santos-7/FinanceAppTests/Screens/ActivityDetails/__Snapshots__/ActivityListViewTests/testRenderView.1.png diff --git a/solutions/devsprint-caio-santos-7/FinanceApp/Screens/ActivityDetails/ActivityListView.swift b/solutions/devsprint-caio-santos-7/FinanceApp/Screens/ActivityDetails/ActivityListView.swift index ad742d8..0911d54 100644 --- a/solutions/devsprint-caio-santos-7/FinanceApp/Screens/ActivityDetails/ActivityListView.swift +++ b/solutions/devsprint-caio-santos-7/FinanceApp/Screens/ActivityDetails/ActivityListView.swift @@ -8,15 +8,11 @@ import UIKit class ActivityListView: UIView { - - private var activities: [Activity] = [] - private lazy var tableView: UITableView = { let tableView = UITableView(frame: .zero) tableView.translatesAutoresizingMaskIntoConstraints = false tableView.register(ActivityCellView.self, forCellReuseIdentifier: ActivityCellView.reuseIdentifier) - tableView.register(UITableViewCell.self, forCellReuseIdentifier: UITableViewCell.reuseIdentifier) - + tableView.separatorStyle = .none return tableView }() @@ -31,16 +27,15 @@ class ActivityListView: UIView { fatalError("init(coder:) has not been implemented") } - func updateTableView(with configuration: HomeViewConfiguration) { - activities = configuration.homeData.activity + func reloadData() { tableView.reloadData() } - public func configTableViewProtocol(delegate: UITableViewDelegate, dataSource: UITableViewDataSource){ + public func configTableViewProtocol(delegate: UITableViewDelegate, + dataSource: UITableViewDataSource) { self.tableView.delegate = delegate self.tableView.dataSource = dataSource } - } extension ActivityListView: ViewCodable { @@ -60,5 +55,4 @@ extension ActivityListView: ViewCodable { tableView.bottomAnchor.constraint(equalTo: self.bottomAnchor) ]) } - } diff --git a/solutions/devsprint-caio-santos-7/FinanceApp/Screens/Home/HomeView.swift b/solutions/devsprint-caio-santos-7/FinanceApp/Screens/Home/HomeView.swift index 5a7c3e1..22cbaf0 100644 --- a/solutions/devsprint-caio-santos-7/FinanceApp/Screens/Home/HomeView.swift +++ b/solutions/devsprint-caio-santos-7/FinanceApp/Screens/Home/HomeView.swift @@ -42,12 +42,12 @@ final class HomeView: UIView { } func updateView(with configuration: HomeViewConfiguration) { + activities = configuration.homeData.activity accountSummaryView.updateValues(balance: configuration.homeData.balance, savings: configuration.homeData.savings, spending: configuration.homeData.spending) - activityListView.updateTableView(with: configuration) + activityListView.reloadData() } - } private extension HomeView { @@ -79,8 +79,8 @@ private extension HomeView { extension HomeView: UITableViewDataSource, UITableViewDelegate { -public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - return activities.count + public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + activities.count } public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { @@ -95,5 +95,8 @@ public func tableView(_ tableView: UITableView, numberOfRowsInSection section: I func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { delegate?.didSelectActivity() } + + func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? { + "Activity" + } } - diff --git a/solutions/devsprint-caio-santos-7/FinanceAppTests/Screens/ActivityDetails/ActivityListViewTests.swift b/solutions/devsprint-caio-santos-7/FinanceAppTests/Screens/ActivityDetails/ActivityListViewTests.swift new file mode 100644 index 0000000..c7c7fc1 --- /dev/null +++ b/solutions/devsprint-caio-santos-7/FinanceAppTests/Screens/ActivityDetails/ActivityListViewTests.swift @@ -0,0 +1,56 @@ +// +// ActivityListViewTests.swift +// FinanceAppTests +// +// Created by Caio Santos on 18/10/22. +// + +import UIKit +import SnapshotTesting +import XCTest + +@testable import FinanceApp + +final class ActivityListViewTests: XCTestCase { + + private var sut: ActivityListView? + private var activities: [Activity] = [ + .init(name: "Test", price: 99, time: "Test"), + .init(name: "Test", price: 99, time: "Test"), + .init(name: "Test", price: 99, time: "Test"), + .init(name: "Test", price: 99, time: "Test"), + ] + + override func setUp() { +// SnapshotTesting.isRecording = true + sut = ActivityListView() + } + + func testRenderView() throws { + let unwrappedSut = try XCTUnwrap(sut) + unwrappedSut.configTableViewProtocol(delegate: self, dataSource: self) + assertSnapshot(matching: unwrappedSut, as: .image(size: .init(width: UIScreen.main.bounds.width, + height: 527))) + } +} + +extension ActivityListViewTests: UITableViewDataSource, UITableViewDelegate { + + public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return activities.count + } + + public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + guard let cell: ActivityCellView = .createCell(for: tableView, at: indexPath), + indexPath.row < activities.count else { + return .init() + } + cell.updateValues(activity: activities[indexPath.row]) + return cell + } + + func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? { + "Activity" + } +} + diff --git a/solutions/devsprint-caio-santos-7/FinanceAppTests/Screens/ActivityDetails/__Snapshots__/ActivityListViewTests/testRenderView.1.png b/solutions/devsprint-caio-santos-7/FinanceAppTests/Screens/ActivityDetails/__Snapshots__/ActivityListViewTests/testRenderView.1.png new file mode 100644 index 0000000000000000000000000000000000000000..609fe51cb9778ec724e536839d021c3b66c2a10a GIT binary patch literal 52082 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 PH_|3ap|6Xic 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 literal 0 HcmV?d00001