Skip to content

Commit

Permalink
Add transactions view
Browse files Browse the repository at this point in the history
  • Loading branch information
cp-nirali-s committed Jun 20, 2024
1 parent 2e05e79 commit 4749e71
Show file tree
Hide file tree
Showing 32 changed files with 1,412 additions and 424 deletions.
4 changes: 4 additions & 0 deletions BaseStyle/BaseStyle.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
A40018A9B957803B8105BEA5 /* Pods_BaseStyle.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 174198EE4AF2FC82DADEB060 /* Pods_BaseStyle.framework */; };
D82174BE2BBAD86D00DB42C3 /* ProfileImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D82174BD2BBAD86D00DB42C3 /* ProfileImageView.swift */; };
D8302D9C2B9EE1D2005ACA13 /* PrimaryFloatingButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8302D9B2B9EE1D2005ACA13 /* PrimaryFloatingButton.swift */; };
D86632962C2410BB009D3EF5 /* OtpTextInputView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D86632952C2410BB009D3EF5 /* OtpTextInputView.swift */; };
D887213F2B99992A009DC5BE /* LoaderViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D887213E2B99992A009DC5BE /* LoaderViewModel.swift */; };
D89C933F2BC3C0F800FACD16 /* ForwardIcon.swift in Sources */ = {isa = PBXBuildFile; fileRef = D89C933E2BC3C0F800FACD16 /* ForwardIcon.swift */; };
D89C93462BC42DE500FACD16 /* MailComposeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D89C93452BC42DE500FACD16 /* MailComposeView.swift */; };
Expand Down Expand Up @@ -72,6 +73,7 @@
CC9EC1F1C0A5A0821118E6CA /* Pods-BaseStyleTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-BaseStyleTests.debug.xcconfig"; path = "Target Support Files/Pods-BaseStyleTests/Pods-BaseStyleTests.debug.xcconfig"; sourceTree = "<group>"; };
D82174BD2BBAD86D00DB42C3 /* ProfileImageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileImageView.swift; sourceTree = "<group>"; };
D8302D9B2B9EE1D2005ACA13 /* PrimaryFloatingButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrimaryFloatingButton.swift; sourceTree = "<group>"; };
D86632952C2410BB009D3EF5 /* OtpTextInputView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OtpTextInputView.swift; sourceTree = "<group>"; };
D887213E2B99992A009DC5BE /* LoaderViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = LoaderViewModel.swift; path = BaseStyle/Views/LoaderViewModel.swift; sourceTree = SOURCE_ROOT; };
D89C933E2BC3C0F800FACD16 /* ForwardIcon.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ForwardIcon.swift; sourceTree = "<group>"; };
D89C93452BC42DE500FACD16 /* MailComposeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MailComposeView.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -297,6 +299,7 @@
D8D42AAF2B872E44009B345D /* LoaderView.swift */,
D8D14A4F2BA090F000F45FF2 /* ShareSheetView.swift */,
D89C93452BC42DE500FACD16 /* MailComposeView.swift */,
D86632952C2410BB009D3EF5 /* OtpTextInputView.swift */,
D89DBE3B2B88AA1500E5F1BD /* CustomTextField.swift */,
D82174BD2BBAD86D00DB42C3 /* ProfileImageView.swift */,
D8E244C02B986CD800C6C82A /* ImagePickerView.swift */,
Expand Down Expand Up @@ -513,6 +516,7 @@
D8D42AAC2B872A7C009B345D /* ToastView.swift in Sources */,
D8D42A952B85F8A2009B345D /* Bundle+Extension.swift in Sources */,
D89C93462BC42DE500FACD16 /* MailComposeView.swift in Sources */,
D86632962C2410BB009D3EF5 /* OtpTextInputView.swift in Sources */,
D8E244C12B986CD800C6C82A /* ImagePickerView.swift in Sources */,
D89DBE312B8884E300E5F1BD /* SectionHeaderView.swift in Sources */,
D8D42A862B85D08F009B345D /* Font+Extension.swift in Sources */,
Expand Down
61 changes: 61 additions & 0 deletions BaseStyle/BaseStyle/CustomUI/OtpTextInputView.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
//
// OtpTextInputView.swift
// BaseStyle
//
// Created by Amisha Italiya on 20/06/24.
//

import SwiftUI

public struct OtpTextInputView: View {

private let OTP_TOTAL_CHARACTERS = 6

@Binding var text: String

var isFocused: FocusState<Bool>.Binding
var keyboardType: UIKeyboardType

var onOtpVerify: (() -> Void)?

public init(text: Binding<String>, isFocused: FocusState<Bool>.Binding,
keyboardType: UIKeyboardType = .numberPad, onOtpVerify: ( () -> Void)? = nil) {
self._text = text
self.isFocused = isFocused
self.keyboardType = keyboardType
self.onOtpVerify = onOtpVerify
}

public var body: some View {
VStack(alignment: .center, spacing: 10) {
TextField("", text: $text)
.kerning(16)
.tint(primaryColor)
.font(.subTitle1(34))
.foregroundColor(primaryText)
.multilineTextAlignment(.center)
.keyboardType(keyboardType)
.textContentType(.oneTimeCode)
.disableAutocorrection(true)
.focused(isFocused)
.onChange(of: text) { newValue in
if newValue.count == OTP_TOTAL_CHARACTERS {
onOtpVerify?()
UIApplication.shared.endEditing()
}
}

Divider()
.background(outlineColor)
.padding(.horizontal, 60)
}
.onAppear {
if text.isEmpty {
isFocused.wrappedValue = true
} else {
isFocused.wrappedValue = false
UIApplication.shared.endEditing()
}
}
}
}
5 changes: 4 additions & 1 deletion Data/Data/Model/Transaction.swift
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,15 @@ public struct Transactions: Codable {

public var payerId: String
public var receiverId: String
public var addedBy: String
public let groupId: String
public var amount: Double
public var date: Timestamp

public init(payerId: String, receiverId: String, groupId: String, amount: Double, date: Timestamp) {
public init(payerId: String, receiverId: String, addedBy: String, groupId: String, amount: Double, date: Timestamp) {
self.payerId = payerId
self.receiverId = receiverId
self.addedBy = addedBy
self.groupId = groupId
self.amount = amount
self.date = date
Expand All @@ -29,6 +31,7 @@ public struct Transactions: Codable {
case id
case payerId = "payer_id"
case receiverId = "receiver_id"
case addedBy = "added_by"
case groupId = "group_id"
case amount
case date
Expand Down
8 changes: 8 additions & 0 deletions Data/Data/Repository/TransactionRepository.swift
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,14 @@ public class TransactionRepository: ObservableObject {
store.fetchTransactionsBy(groupId: groupId)
}

public func fetchTransactionBy(transactionId: String) -> AnyPublisher<Transactions, ServiceError> {
store.fetchTransactionsBy(transactionId: transactionId)
}

public func deleteTransaction(transactionId: String) -> AnyPublisher<Void, ServiceError> {
store.deleteTransaction(transactionId: transactionId)
}

public func deleteTransactionsOf(groupId: String) -> AnyPublisher<Void, ServiceError> {
store.deleteTransactionsOf(groupId: groupId)
}
Expand Down
8 changes: 7 additions & 1 deletion Data/Data/Router/AppRoute.swift
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,9 @@ public enum AppRoute: Hashable {
case GroupSettleUpView(groupId: String)
case GroupWhoIsPayingView(groupId: String)
case GroupWhoGettingPaidView(groupId: String, selectedMemberId: String)
case GroupPaymentView(groupId: String, payerId: String, receiverId: String, amount: Double)
case GroupPaymentView(transactionId: String?, groupId: String, payerId: String, receiverId: String, amount: Double)
case TransactionListView(groupId: String)
case TransactionDetailView(transactionId: String, groupId: String)

// MARK: - Expense Button
case AddExpenseView(expenseId: String?, groupId: String?)
Expand Down Expand Up @@ -88,6 +90,10 @@ public enum AppRoute: Hashable {
"groupWhoGettingPaidView"
case .GroupPaymentView:
"groupPaymentView"
case .TransactionListView:
"transactionListView"
case .TransactionDetailView:
"transactionDetailView"

case .AddExpenseView:
"addExpenseView"
Expand Down
50 changes: 50 additions & 0 deletions Data/Data/Store/TransactionStore.swift
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,56 @@ public class TransactionStore: ObservableObject {
.eraseToAnyPublisher()
}

func fetchTransactionsBy(transactionId: String) -> AnyPublisher<Transactions, ServiceError> {
Future { [weak self] promise in
guard let self else {
promise(.failure(.unexpectedError))
return
}

self.database.collection(COLLECTION_NAME).document(transactionId).getDocument { snapshot, error in
if let error {
LogE("TransactionStore :: \(#function) error: \(error.localizedDescription)")
promise(.failure(.databaseError(error: error.localizedDescription)))
return
}

guard let snapshot else {
LogE("TransactionStore :: \(#function) The document is not available.")
promise(.failure(.dataNotFound))
return
}

do {
let transaction = try snapshot.data(as: Transactions.self)
promise(.success(transaction))
} catch {
LogE("TransactionStore :: \(#function) Decode error: \(error.localizedDescription)")
promise(.failure(.decodingError))
}
}
}.eraseToAnyPublisher()
}

func deleteTransaction(transactionId: String) -> AnyPublisher<Void, ServiceError> {
Future { [weak self] promise in
guard let self else {
promise(.failure(.unexpectedError))
return
}

self.database.collection(self.COLLECTION_NAME).document(transactionId).delete { error in
if let error {
LogE("TransactionStore :: \(#function): Deleting collection failed with error: \(error.localizedDescription).")
promise(.failure(.databaseError(error: error.localizedDescription)))
} else {
LogD("TransactionStore :: \(#function): transaction deleted successfully.")
promise(.success(()))
}
}
}.eraseToAnyPublisher()
}

func deleteTransactionsOf(groupId: String) -> AnyPublisher<Void, ServiceError> {
Future { [weak self] promise in
guard let self else {
Expand Down
50 changes: 49 additions & 1 deletion Splito.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,13 @@
0BF8F99614F85846D78DE106 /* Pods_Splito_SplitoUITests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C2B9BBF3F71277A6AA5329CB /* Pods_Splito_SplitoUITests.framework */; };
213BA0602C0F465000116130 /* GroupSettleUpRouteView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 213BA05F2C0F465000116130 /* GroupSettleUpRouteView.swift */; };
213BA0662C11B70F00116130 /* HomeRouteViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 213BA0652C11B70F00116130 /* HomeRouteViewModel.swift */; };
2156A8B02C24069800CFAB64 /* GroupTransactionsRouteView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2156A8AF2C24069800CFAB64 /* GroupTransactionsRouteView.swift */; };
2177692B2C203160009B3B37 /* GroupTransactionDetailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2177692A2C203160009B3B37 /* GroupTransactionDetailView.swift */; };
2177692D2C20316B009B3B37 /* GroupTransactionDetailViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2177692C2C20316B009B3B37 /* GroupTransactionDetailViewModel.swift */; };
217BEC122C00AD78000CBBB4 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 217BEC112C00AD78000CBBB4 /* GoogleService-Info.plist */; };
21B1C09A2C1C59F10098B4FD /* GroupTransactionListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21B1C0992C1C59F10098B4FD /* GroupTransactionListView.swift */; };
21B1C09C2C1C5A050098B4FD /* GroupTransactionListViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21B1C09B2C1C5A040098B4FD /* GroupTransactionListViewModel.swift */; };
21B1C09E2C1C5AA30098B4FD /* GroupExpenseListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21B1C09D2C1C5AA30098B4FD /* GroupExpenseListView.swift */; };
741540F86E36400CE27B1FAD /* Pods_SplitoTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 701193A10871F36C3EDB356C /* Pods_SplitoTests.framework */; };
D815DFD72BEA26C200C0F862 /* Secrets.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = D815DFD62BEA26C200C0F862 /* Secrets.xcconfig */; };
D826C0E22BDBD65600AAA449 /* GroupBalancesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D826C0E12BDBD65600AAA449 /* GroupBalancesView.swift */; };
Expand Down Expand Up @@ -133,8 +139,14 @@
038CCD15E82A4E16A4AD213C /* Pods-Splito-SplitoUITests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Splito-SplitoUITests.release.xcconfig"; path = "Target Support Files/Pods-Splito-SplitoUITests/Pods-Splito-SplitoUITests.release.xcconfig"; sourceTree = "<group>"; };
213BA05F2C0F465000116130 /* GroupSettleUpRouteView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GroupSettleUpRouteView.swift; sourceTree = "<group>"; };
213BA0652C11B70F00116130 /* HomeRouteViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeRouteViewModel.swift; sourceTree = "<group>"; };
2156A8AF2C24069800CFAB64 /* GroupTransactionsRouteView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GroupTransactionsRouteView.swift; sourceTree = "<group>"; };
2177692A2C203160009B3B37 /* GroupTransactionDetailView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GroupTransactionDetailView.swift; sourceTree = "<group>"; };
2177692C2C20316B009B3B37 /* GroupTransactionDetailViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GroupTransactionDetailViewModel.swift; sourceTree = "<group>"; };
217BEC0F2C00AB9E000CBBB4 /* Secrets.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Secrets.xcconfig; sourceTree = "<group>"; };
217BEC112C00AD78000CBBB4 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = "<group>"; };
21B1C0992C1C59F10098B4FD /* GroupTransactionListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GroupTransactionListView.swift; sourceTree = "<group>"; };
21B1C09B2C1C5A040098B4FD /* GroupTransactionListViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GroupTransactionListViewModel.swift; sourceTree = "<group>"; };
21B1C09D2C1C5AA30098B4FD /* GroupExpenseListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GroupExpenseListView.swift; sourceTree = "<group>"; };
43FFDB1561C565EE6E3DC86A /* Pods_Splito.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Splito.framework; sourceTree = BUILT_PRODUCTS_DIR; };
44312D517F674E980CBAE838 /* Pods-Splito.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Splito.debug.xcconfig"; path = "Target Support Files/Pods-Splito/Pods-Splito.debug.xcconfig"; sourceTree = "<group>"; };
701193A10871F36C3EDB356C /* Pods_SplitoTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_SplitoTests.framework; sourceTree = BUILT_PRODUCTS_DIR; };
Expand Down Expand Up @@ -264,6 +276,34 @@
/* End PBXFrameworksBuildPhase section */

/* Begin PBXGroup section */
2156A8AE2C24064400CFAB64 /* Transactions */ = {
isa = PBXGroup;
children = (
2156A8AF2C24069800CFAB64 /* GroupTransactionsRouteView.swift */,
21B1C0992C1C59F10098B4FD /* GroupTransactionListView.swift */,
21B1C09B2C1C5A040098B4FD /* GroupTransactionListViewModel.swift */,
2177692E2C206678009B3B37 /* Transaction Detail */,
);
path = Transactions;
sourceTree = "<group>";
};
2177692E2C206678009B3B37 /* Transaction Detail */ = {
isa = PBXGroup;
children = (
2177692A2C203160009B3B37 /* GroupTransactionDetailView.swift */,
2177692C2C20316B009B3B37 /* GroupTransactionDetailViewModel.swift */,
);
path = "Transaction Detail";
sourceTree = "<group>";
};
21B1C0972C1C59630098B4FD /* More Options */ = {
isa = PBXGroup;
children = (
D8A7CA732BA486290014EC67 /* Group Setting */,
);
path = "More Options";
sourceTree = "<group>";
};
7530D0A01F0D8D2C363B2A6E /* Frameworks */ = {
isa = PBXGroup;
children = (
Expand Down Expand Up @@ -304,6 +344,7 @@
isa = PBXGroup;
children = (
D83344562C0DD03B00CD9F05 /* Settle up */,
2156A8AE2C24064400CFAB64 /* Transactions */,
D83344552C0DD02F00CD9F05 /* Balances */,
D833445F2C0EF1D300CD9F05 /* Totals */,
);
Expand Down Expand Up @@ -560,8 +601,9 @@
children = (
D8A7CA6D2BA483F60014EC67 /* GroupHomeView.swift */,
D8E244BE2B98592C00C6C82A /* GroupHomeViewModel.swift */,
21B1C09D2C1C5AA30098B4FD /* GroupExpenseListView.swift */,
21B1C0972C1C59630098B4FD /* More Options */,
D826C0E02BDBD63A00AAA449 /* Group Options */,
D8A7CA732BA486290014EC67 /* Group Setting */,
);
path = Group;
sourceTree = "<group>";
Expand Down Expand Up @@ -937,9 +979,11 @@
D83344612C0EF1F100CD9F05 /* GroupTotalsView.swift in Sources */,
D88721472B9B2C97009DC5BE /* GroupListViewModel.swift in Sources */,
D8D14A622BA2DCE700F45FF2 /* UserProfileViewModel.swift in Sources */,
2177692B2C203160009B3B37 /* GroupTransactionDetailView.swift in Sources */,
D8A7CA6E2BA483F60014EC67 /* GroupHomeView.swift in Sources */,
D85E86ED2BB41B87002EDF76 /* ChooseGroupView.swift in Sources */,
D8302DA22B9F284D005ACA13 /* InviteMemberViewModel.swift in Sources */,
2177692D2C20316B009B3B37 /* GroupTransactionDetailViewModel.swift in Sources */,
D83344732C0F2D9500CD9F05 /* GroupPaymentView.swift in Sources */,
D83344582C0DD06F00CD9F05 /* GroupSettleUpView.swift in Sources */,
D8E244BF2B98592C00C6C82A /* GroupHomeViewModel.swift in Sources */,
Expand All @@ -964,6 +1008,7 @@
213BA0662C11B70F00116130 /* HomeRouteViewModel.swift in Sources */,
D8302DA02B9F282F005ACA13 /* InviteMemberView.swift in Sources */,
D89684452B722D3400D5F721 /* SplitoApp.swift in Sources */,
21B1C09C2C1C5A050098B4FD /* GroupTransactionListViewModel.swift in Sources */,
213BA0602C0F465000116130 /* GroupSettleUpRouteView.swift in Sources */,
D8AC26F72B84B12800CEAAD3 /* LoginView.swift in Sources */,
D8CD952E2BD65F4500407B47 /* ExpenseSplitOptionsViewModel.swift in Sources */,
Expand All @@ -972,11 +1017,13 @@
D8A7CA722BA486250014EC67 /* GroupSettingViewModel.swift in Sources */,
D833445A2C0DD08400CD9F05 /* GroupSettleUpViewModel.swift in Sources */,
D85E86EB2BB3FD59002EDF76 /* ChoosePayerViewModel.swift in Sources */,
21B1C09A2C1C59F10098B4FD /* GroupTransactionListView.swift in Sources */,
D89DBE5B2B8DE97000E5F1BD /* GroupRouteView.swift in Sources */,
D8AC27152B84B73000CEAAD3 /* PageControl.swift in Sources */,
D8E244BB2B9843A100C6C82A /* CreateGroupView.swift in Sources */,
D89DBE382B88A6A800E5F1BD /* VerifyOtpView.swift in Sources */,
D89DBE422B8CA72700E5F1BD /* HomeRouteView.swift in Sources */,
21B1C09E2C1C5AA30098B4FD /* GroupExpenseListView.swift in Sources */,
D89DBE252B875C3000E5F1BD /* PhoneLoginViewModel.swift in Sources */,
D8D14A602BA2DCDB00F45FF2 /* UserProfileView.swift in Sources */,
D88721452B9B2C78009DC5BE /* GroupListView.swift in Sources */,
Expand All @@ -986,6 +1033,7 @@
D85E86E92BB3FD49002EDF76 /* ChoosePayerView.swift in Sources */,
D833446E2C0F2D4C00CD9F05 /* GroupWhoGettingPaidViewModel.swift in Sources */,
D856C7342BCFD2260008A341 /* ExpenseDetailsViewModel.swift in Sources */,
2156A8B02C24069800CFAB64 /* GroupTransactionsRouteView.swift in Sources */,
D8AC26F62B84B12800CEAAD3 /* LoginViewModel.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
Expand Down
Loading

0 comments on commit 4749e71

Please sign in to comment.