Skip to content

Commit 49761fb

Browse files
feat: view all transactions (#72)
1 parent 906307a commit 49761fb

File tree

6 files changed

+154
-2
lines changed

6 files changed

+154
-2
lines changed

GoMoney.xcodeproj/project.pbxproj

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
080ADD26290F8CAF005DCF86 /* EditViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 080ADD25290F8CAF005DCF86 /* EditViewController.swift */; };
1313
080ADD2B290FA4F3005DCF86 /* DetailViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 080ADD2A290FA4F3005DCF86 /* DetailViewModel.swift */; };
1414
080ADD30290FB068005DCF86 /* DetailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 080ADD2F290FB068005DCF86 /* DetailView.swift */; };
15+
0816CEED292BE5BB00C17626 /* ViewAllViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0816CEEC292BE5BB00C17626 /* ViewAllViewController.swift */; };
16+
0816CEEF292BE66300C17626 /* ViewAllViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0816CEEE292BE66300C17626 /* ViewAllViewModel.swift */; };
1517
081CB3112906F5310007D426 /* LineChartXAxisFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 081CB3102906F5310007D426 /* LineChartXAxisFormatter.swift */; };
1618
081CB31429077BF20007D426 /* DayAxisValueFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 081CB31329077BF20007D426 /* DayAxisValueFormatter.swift */; };
1719
081CB3162907829C0007D426 /* Expense+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 081CB3152907829C0007D426 /* Expense+Extension.swift */; };
@@ -179,6 +181,8 @@
179181
080ADD25290F8CAF005DCF86 /* EditViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditViewController.swift; sourceTree = "<group>"; };
180182
080ADD2A290FA4F3005DCF86 /* DetailViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DetailViewModel.swift; sourceTree = "<group>"; };
181183
080ADD2F290FB068005DCF86 /* DetailView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DetailView.swift; sourceTree = "<group>"; };
184+
0816CEEC292BE5BB00C17626 /* ViewAllViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewAllViewController.swift; sourceTree = "<group>"; };
185+
0816CEEE292BE66300C17626 /* ViewAllViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewAllViewModel.swift; sourceTree = "<group>"; };
182186
081CB3102906F5310007D426 /* LineChartXAxisFormatter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LineChartXAxisFormatter.swift; sourceTree = "<group>"; };
183187
081CB31329077BF20007D426 /* DayAxisValueFormatter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DayAxisValueFormatter.swift; sourceTree = "<group>"; };
184188
081CB3152907829C0007D426 /* Expense+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Expense+Extension.swift"; sourceTree = "<group>"; };
@@ -381,6 +385,15 @@
381385
path = Detail;
382386
sourceTree = "<group>";
383387
};
388+
0816CEEB292BE5B000C17626 /* ViewAll */ = {
389+
isa = PBXGroup;
390+
children = (
391+
0816CEEC292BE5BB00C17626 /* ViewAllViewController.swift */,
392+
0816CEEE292BE66300C17626 /* ViewAllViewModel.swift */,
393+
);
394+
path = ViewAll;
395+
sourceTree = "<group>";
396+
};
384397
081CB30F2906F5290007D426 /* Chart */ = {
385398
isa = PBXGroup;
386399
children = (
@@ -674,6 +687,7 @@
674687
08C872B828F658A300DC859D /* Scences */ = {
675688
isa = PBXGroup;
676689
children = (
690+
0816CEEB292BE5B000C17626 /* ViewAll */,
677691
0878DB9D29248C54004E3FFD /* Tags */,
678692
08F0689A2921F6E7005C58EC /* Calculator */,
679693
08C54525291F9D1600CAD0DF /* Exchange */,
@@ -1206,6 +1220,7 @@
12061220
08C1F25D28FE93E900590512 /* DateFormatter+Extension.swift in Sources */,
12071221
08EEA00C291CC359003B35B8 /* UserDefaults+AppGroup.swift in Sources */,
12081222
0888241B2923250F00660A9E /* UserManager.swift in Sources */,
1223+
0816CEED292BE5BB00C17626 /* ViewAllViewController.swift in Sources */,
12091224
08C1F26A28FFBAD500590512 /* UIImage+Extension.swift in Sources */,
12101225
081E1253291B8392007BD5FB /* EmptyTransactionView.swift in Sources */,
12111226
089CC73C29190C080070A108 /* ExportViewModel.swift in Sources */,
@@ -1217,6 +1232,7 @@
12171232
080ADD2B290FA4F3005DCF86 /* DetailViewModel.swift in Sources */,
12181233
088D692029015FBC003D0660 /* DatePickerInputView.swift in Sources */,
12191234
08F0688C2921DBEE005C58EC /* ExchangeViewmodel.swift in Sources */,
1235+
0816CEEF292BE66300C17626 /* ViewAllViewModel.swift in Sources */,
12201236
08E4EAAD291DFD91006D5C58 /* SyncInterval.swift in Sources */,
12211237
08F068AD29221C79005C58EC /* AsyncImageView.swift in Sources */,
12221238
08F068AC29221C79005C58EC /* ImageLoader.swift in Sources */,

GoMoney/Scences/Home/HomeViewController.swift

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,15 @@ class HomeViewController: GMMainViewController {
1717

1818
private lazy var recentExpenseLabel = GMLabel(text: Content.recentExpense, style: .regularBold)
1919

20+
private lazy var viewAllLabel = GMButton(
21+
text: Content.viewAll,
22+
font: K.Font.nova,
23+
tapAction: { [weak self] in
24+
let vc = ViewAllViewController()
25+
self?.navigationController?.pushViewController(vc, animated: true)
26+
}
27+
)
28+
2029
private lazy var tableView: UITableView = {
2130
let tableView = UITableView()
2231
tableView.translatesAutoresizingMaskIntoConstraints = false
@@ -104,7 +113,14 @@ class HomeViewController: GMMainViewController {
104113
override func setupLayout() {
105114
super.setupLayout()
106115

107-
view.addSubviews(backImage, chartView, recentExpenseLabel, tableView, floatingButton)
116+
view.addSubviews(
117+
backImage,
118+
chartView,
119+
recentExpenseLabel,
120+
tableView,
121+
floatingButton,
122+
viewAllLabel
123+
)
108124

109125
let chartSize = view.bounds.size.width - 2 * Constant.padding
110126

@@ -129,6 +145,11 @@ class HomeViewController: GMMainViewController {
129145
paddingTop: 16
130146
)
131147

148+
viewAllLabel.anchor(
149+
top: recentExpenseLabel.topAnchor,
150+
right: chartView.rightAnchor
151+
)
152+
132153
tableView.anchor(
133154
top: recentExpenseLabel.topAnchor,
134155
left: chartView.leftAnchor,
@@ -325,6 +346,7 @@ extension HomeViewController {
325346
private enum Content {
326347
static let myExpense = "My Transactions"
327348
static let recentExpense = "Recent Transactions"
349+
static let viewAll = "View All"
328350
}
329351

330352
private enum Constant {

GoMoney/Scences/Stat/StatViewController.swift

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,13 +188,15 @@ extension StatViewController: UITableViewDataSource {
188188
cell.tagExpenses = viewModel.tagExpenses ?? []
189189
return cell
190190
}
191-
default:
191+
case 2:
192192
if let cell = tableView.dequeueReusableCell(withIdentifier: RecentExpenseCell.identifier, for: indexPath) as? RecentExpenseCell {
193193
if let expense = viewModel.topExpenses?[indexPath.row] {
194194
cell.expense = expense
195195
return cell
196196
}
197197
}
198+
default:
199+
break
198200
}
199201
return UITableViewCell()
200202
}
@@ -220,6 +222,14 @@ extension StatViewController: UITableViewDataSource {
220222
extension StatViewController: UITableViewDelegate {
221223
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
222224
tableView.deselectRow(at: indexPath, animated: true)
225+
226+
if indexPath.section == 2 {
227+
if let transaction = viewModel.topExpenses?[indexPath.row] {
228+
let vc = DetailViewController()
229+
vc.transaction = transaction
230+
navigationController?.pushViewController(vc, animated: true)
231+
}
232+
}
223233
}
224234
}
225235

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
import UIKit
2+
3+
class ViewAllViewController: GMMainViewController {
4+
let viewModel = ViewAllViewModel()
5+
6+
private lazy var tableView: UITableView = {
7+
let tableView = UITableView()
8+
tableView.translatesAutoresizingMaskIntoConstraints = false
9+
tableView.register(RecentExpenseCell.self, forCellReuseIdentifier: RecentExpenseCell.identifier)
10+
tableView.backgroundColor = K.Color.background
11+
tableView.dataSource = self
12+
tableView.delegate = self
13+
tableView.rowHeight = .rowHeight
14+
tableView.showsVerticalScrollIndicator = false
15+
tableView.separatorStyle = .none
16+
return tableView
17+
}()
18+
19+
// MARK: - LifeCircle
20+
21+
override func viewDidLoad() {
22+
super.viewDidLoad()
23+
setupViewModel()
24+
}
25+
26+
override func getTitle() -> String? {
27+
return "All Transactions"
28+
}
29+
30+
override func setupLayout() {
31+
super.setupLayout()
32+
view.addSubview(tableView)
33+
34+
tableView.anchor(
35+
top: view.safeAreaLayoutGuide.topAnchor,
36+
left: view.leftAnchor,
37+
bottom: view.safeAreaLayoutGuide.bottomAnchor,
38+
right: view.rightAnchor,
39+
paddingTop: .padding,
40+
paddingLeft: .padding,
41+
paddingRight: .padding
42+
)
43+
}
44+
45+
// MARK: - Methods
46+
47+
private func setupViewModel() {
48+
GMLoadingView.shared.startLoadingAnimation(with: "Loading ...")
49+
viewModel.getAllTransaction { [weak self] in
50+
GMLoadingView.shared.endLoadingAnimation()
51+
self?.tableView.reloadData()
52+
}
53+
}
54+
}
55+
56+
// MARK: - Table Delegate
57+
58+
extension ViewAllViewController: UITableViewDataSource, UITableViewDelegate {
59+
func tableView(_: UITableView, numberOfRowsInSection _: Int) -> Int {
60+
return viewModel.transactions.count
61+
}
62+
63+
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
64+
if let cell = tableView.dequeueReusableCell(withIdentifier: RecentExpenseCell.identifier) as? RecentExpenseCell {
65+
let expense = viewModel.transactions[indexPath.row]
66+
cell.selectionStyle = .none
67+
cell.expense = expense
68+
return cell
69+
}
70+
71+
return UITableViewCell()
72+
}
73+
74+
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
75+
tableView.deselectRow(at: indexPath, animated: true)
76+
let transaction = viewModel.transactions[indexPath.row]
77+
let vc = DetailViewController()
78+
vc.transaction = transaction
79+
navigationController?.pushViewController(vc, animated: true)
80+
}
81+
}
82+
83+
private extension CGFloat {
84+
static let rowHeight: CGFloat = 65
85+
static let padding: CGFloat = 16
86+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import RealmSwift
2+
3+
class ViewAllViewModel {
4+
let realm = try! Realm()
5+
6+
var transactions = [Expense]()
7+
8+
func getAllTransaction(completion: @escaping () -> Void) {
9+
DataService.shared.getAllTransactions { transactions in
10+
self.transactions = transactions
11+
completion()
12+
}
13+
}
14+
}

GoMoney/Service/DataService.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,10 @@ class DataService {
5858
itemsToken?.invalidate()
5959
}
6060

61+
func getAllTransactions(completion: @escaping ([Expense]) -> Void) {
62+
getExpenses(type: nil, filerBy: .all, completion: completion)
63+
}
64+
6165
func getExpenses(type: ExpenseType? = .expense, filerBy: ExpenseFilter = .month, sortBy: ExpenseSort = .occuredOn, ascending: Bool = false, completion: @escaping ([Expense]) -> Void) {
6266
let endDate = Date()
6367
let startDate: Date?

0 commit comments

Comments
 (0)