From 97532fcc3f42000fb9aaaf3a9de57ea57b21101c Mon Sep 17 00:00:00 2001 From: Hessam Mahdiabadi <67460597+iamHEssam@users.noreply.github.com> Date: Sat, 4 Nov 2023 22:00:17 +0330 Subject: [PATCH 01/34] Add .gitignore file - added the .gitignore file, The file copied from 'https://cocoacasts.com/a-gitignore-for-swift-projects' url. --- .gitignore | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..fae5995 --- /dev/null +++ b/.gitignore @@ -0,0 +1,31 @@ +.DS_Store +*.swp +*~.nib +DerivedData/ +build/ +*.pbxuser +*.mode1v3 +*.mode2v3 +*.perspectivev3 +!default.pbxuser +!default.mode1v3 +!default.mode2v3 +!default.perspectivev3 +xcuserdata +!xcshareddata +!xcschemes +*.moved-aside +/Pods +/Carthage + +.swiftpm +/node_modules +/tmp + +.env +.env.* + +**/fastlane/report.xml +**/fastlane/Preview.html +**/fastlane/screenshots +**/fastlane/test_output \ No newline at end of file From a095d265f44b8832aca968c088d2347c5bb365fa Mon Sep 17 00:00:00 2001 From: Hessam Mahdiabadi <67460597+iamHEssam@users.noreply.github.com> Date: Sat, 4 Nov 2023 22:09:47 +0330 Subject: [PATCH 02/34] Adjust Minimum Deployment Target to iOS 14.0 --- TransferList.xcodeproj/project.pbxproj | 2 ++ 1 file changed, 2 insertions(+) diff --git a/TransferList.xcodeproj/project.pbxproj b/TransferList.xcodeproj/project.pbxproj index 05bc24e..e02ab27 100644 --- a/TransferList.xcodeproj/project.pbxproj +++ b/TransferList.xcodeproj/project.pbxproj @@ -294,6 +294,7 @@ INFOPLIST_KEY_UIMainStoryboardFile = Main; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -321,6 +322,7 @@ INFOPLIST_KEY_UIMainStoryboardFile = Main; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", From 5287d1094e71faeddc4e2764973e061227c3e8a5 Mon Sep 17 00:00:00 2001 From: Hessam Mahdiabadi <67460597+iamHEssam@users.noreply.github.com> Date: Sat, 4 Nov 2023 22:37:30 +0330 Subject: [PATCH 03/34] Add Entities: Person, Card, CardTransferCount, and PersonBankAccount - Added the `Person` entity to store personal information including name and avatar. - Added the `Card` entity to hold card number data. - Added the `CardTransferCount` entity for tracking transfer counts. - Added the `PersonBankAccount` entity to combine and manage these entities. --- Domain/.gitignore | 9 ++++++ Domain/Package.swift | 28 +++++++++++++++++++ Domain/README.md | 3 ++ Domain/Sources/Domain/Entities/Card.swift | 14 ++++++++++ .../Domain/Entities/CardTransferCount.swift | 14 ++++++++++ Domain/Sources/Domain/Entities/Person.swift | 15 ++++++++++ .../Domain/Entities/PersonBankAccount.swift | 20 +++++++++++++ TransferList.xcodeproj/project.pbxproj | 2 ++ .../xcschemes/xcschememanagement.plist | 2 +- 9 files changed, 106 insertions(+), 1 deletion(-) create mode 100644 Domain/.gitignore create mode 100644 Domain/Package.swift create mode 100644 Domain/README.md create mode 100644 Domain/Sources/Domain/Entities/Card.swift create mode 100644 Domain/Sources/Domain/Entities/CardTransferCount.swift create mode 100644 Domain/Sources/Domain/Entities/Person.swift create mode 100644 Domain/Sources/Domain/Entities/PersonBankAccount.swift diff --git a/Domain/.gitignore b/Domain/.gitignore new file mode 100644 index 0000000..3b29812 --- /dev/null +++ b/Domain/.gitignore @@ -0,0 +1,9 @@ +.DS_Store +/.build +/Packages +/*.xcodeproj +xcuserdata/ +DerivedData/ +.swiftpm/config/registries.json +.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata +.netrc diff --git a/Domain/Package.swift b/Domain/Package.swift new file mode 100644 index 0000000..f1e1726 --- /dev/null +++ b/Domain/Package.swift @@ -0,0 +1,28 @@ +// swift-tools-version: 5.8 +// The swift-tools-version declares the minimum version of Swift required to build this package. + +import PackageDescription + +let package = Package( + name: "Domain", + products: [ + // Products define the executables and libraries a package produces, and make them visible to other packages. + .library( + name: "Domain", + targets: ["Domain"]), + ], + dependencies: [ + // Dependencies declare other packages that this package depends on. + // .package(url: /* package url */, from: "1.0.0"), + ], + targets: [ + // Targets are the basic building blocks of a package. A target can define a module or a test suite. + // Targets can depend on other targets in this package, and on products in packages this package depends on. + .target( + name: "Domain", + dependencies: []), + .testTarget( + name: "DomainTests", + dependencies: ["Domain"]), + ] +) diff --git a/Domain/README.md b/Domain/README.md new file mode 100644 index 0000000..eb40e6c --- /dev/null +++ b/Domain/README.md @@ -0,0 +1,3 @@ +# Domain + +A description of this package. diff --git a/Domain/Sources/Domain/Entities/Card.swift b/Domain/Sources/Domain/Entities/Card.swift new file mode 100644 index 0000000..e8e6ba0 --- /dev/null +++ b/Domain/Sources/Domain/Entities/Card.swift @@ -0,0 +1,14 @@ +// +// Card.swift +// +// +// Created by Hessam Mahdiabadi on 11/4/23. +// + +import Foundation + +public struct Card { + + public var cardNumber: String? + public var cardType: String? +} diff --git a/Domain/Sources/Domain/Entities/CardTransferCount.swift b/Domain/Sources/Domain/Entities/CardTransferCount.swift new file mode 100644 index 0000000..3fee572 --- /dev/null +++ b/Domain/Sources/Domain/Entities/CardTransferCount.swift @@ -0,0 +1,14 @@ +// +// CardTransferCount.swift +// +// +// Created by Hessam Mahdiabadi on 11/4/23. +// + +import Foundation + +public struct CardTransferCount { + + public var numberOfTransfers: Int? + public var totalTransfer: Int? +} diff --git a/Domain/Sources/Domain/Entities/Person.swift b/Domain/Sources/Domain/Entities/Person.swift new file mode 100644 index 0000000..6beadef --- /dev/null +++ b/Domain/Sources/Domain/Entities/Person.swift @@ -0,0 +1,15 @@ +// +// Person.swift +// +// +// Created by Hessam Mahdiabadi on 11/4/23. +// + +import Foundation + +public struct Person { + + public var name: String? + public var emial: String? + public var avatar: String? +} diff --git a/Domain/Sources/Domain/Entities/PersonBankAccount.swift b/Domain/Sources/Domain/Entities/PersonBankAccount.swift new file mode 100644 index 0000000..0c8bed9 --- /dev/null +++ b/Domain/Sources/Domain/Entities/PersonBankAccount.swift @@ -0,0 +1,20 @@ +// +// PersonBankAccount.swift +// +// +// Created by Hessam Mahdiabadi on 11/4/23. +// + +import Foundation + +public struct PersonBankAccount: Identifiable { + + public var id: String { + card?.cardNumber ?? UUID().uuidString + } + public var person: Person? + public var card: Card? + public var cardTransferCount: CardTransferCount? + public var note: String? + public var lastDateTransfer: Date? +} diff --git a/TransferList.xcodeproj/project.pbxproj b/TransferList.xcodeproj/project.pbxproj index e02ab27..843dbf2 100644 --- a/TransferList.xcodeproj/project.pbxproj +++ b/TransferList.xcodeproj/project.pbxproj @@ -24,6 +24,7 @@ DEBE4ACB2AF6C3B200A58501 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; DEBE4ACE2AF6C3B200A58501 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; DEBE4AD02AF6C3B200A58501 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + DEBE4AD62AF6C8F600A58501 /* Domain */ = {isa = PBXFileReference; lastKnownFileType = wrapper; path = Domain; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -40,6 +41,7 @@ DEBE4AB62AF6C3B000A58501 = { isa = PBXGroup; children = ( + DEBE4AD62AF6C8F600A58501 /* Domain */, DEBE4AC12AF6C3B000A58501 /* TransferList */, DEBE4AC02AF6C3B000A58501 /* Products */, ); diff --git a/TransferList.xcodeproj/xcuserdata/hessam.xcuserdatad/xcschemes/xcschememanagement.plist b/TransferList.xcodeproj/xcuserdata/hessam.xcuserdatad/xcschemes/xcschememanagement.plist index 7a6bac3..097b2a4 100644 --- a/TransferList.xcodeproj/xcuserdata/hessam.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/TransferList.xcodeproj/xcuserdata/hessam.xcuserdatad/xcschemes/xcschememanagement.plist @@ -7,7 +7,7 @@ TransferList.xcscheme_^#shared#^_ orderHint - 0 + 1 From 7c735fc609db28ff4f79e97b745cd2871334d4f5 Mon Sep 17 00:00:00 2001 From: Hessam Mahdiabadi <67460597+iamHEssam@users.noreply.github.com> Date: Sun, 5 Nov 2023 01:03:03 +0330 Subject: [PATCH 04/34] Add Repository, UseCase, and AnyPublisher Extension - Added the `PersonBankAccountError` enum for error handling. - Added the `PersonBankAccountRepository` for communication between the Domain and Data layers. - Added the `PersonBankAccountUseCase` for interactions with the Presentation Layer. - Added an extension to `AnyPublisher` for integrating async/await with the Combine framework. --- Domain/Package.swift | 1 + Domain/Sources/Domain/Entities/Card.swift | 5 + .../Domain/Entities/CardTransferCount.swift | 5 + Domain/Sources/Domain/Entities/Person.swift | 6 + .../Domain/Entities/PersonBankAccount.swift | 19 ++ .../Domain/Error/PersonBankAccountError.swift | 32 ++ .../Domain/Extension/AnyPublisher+async.swift | 54 ++++ .../PersonBankAccountRepository.swift | 17 + .../UseCases/PersonBankAccountUseCase.swift | 19 ++ .../PersonBankAccountUseCaseImpl.swift | 110 +++++++ .../DomainTests/UseCasesTests/MockError.swift | 13 + .../UseCasesTests/MockRepository.swift | 81 +++++ .../PersonBankAccountUseCaseTests.swift | 291 ++++++++++++++++++ .../xcschemes/xcschememanagement.plist | 2 +- 14 files changed, 654 insertions(+), 1 deletion(-) create mode 100644 Domain/Sources/Domain/Error/PersonBankAccountError.swift create mode 100644 Domain/Sources/Domain/Extension/AnyPublisher+async.swift create mode 100644 Domain/Sources/Domain/Repositories/PersonBankAccountRepository.swift create mode 100644 Domain/Sources/Domain/UseCases/PersonBankAccountUseCase.swift create mode 100644 Domain/Sources/Domain/UseCases/PersonBankAccountUseCaseImpl.swift create mode 100644 Domain/Tests/DomainTests/UseCasesTests/MockError.swift create mode 100644 Domain/Tests/DomainTests/UseCasesTests/MockRepository.swift create mode 100644 Domain/Tests/DomainTests/UseCasesTests/PersonBankAccountUseCaseTests.swift diff --git a/Domain/Package.swift b/Domain/Package.swift index f1e1726..ce3a19f 100644 --- a/Domain/Package.swift +++ b/Domain/Package.swift @@ -5,6 +5,7 @@ import PackageDescription let package = Package( name: "Domain", + platforms: [.iOS(.v15)], products: [ // Products define the executables and libraries a package produces, and make them visible to other packages. .library( diff --git a/Domain/Sources/Domain/Entities/Card.swift b/Domain/Sources/Domain/Entities/Card.swift index e8e6ba0..03fa565 100644 --- a/Domain/Sources/Domain/Entities/Card.swift +++ b/Domain/Sources/Domain/Entities/Card.swift @@ -11,4 +11,9 @@ public struct Card { public var cardNumber: String? public var cardType: String? + + public init(cardNumber: String?, cardType: String?) { + self.cardNumber = cardNumber + self.cardType = cardType + } } diff --git a/Domain/Sources/Domain/Entities/CardTransferCount.swift b/Domain/Sources/Domain/Entities/CardTransferCount.swift index 3fee572..9e24070 100644 --- a/Domain/Sources/Domain/Entities/CardTransferCount.swift +++ b/Domain/Sources/Domain/Entities/CardTransferCount.swift @@ -11,4 +11,9 @@ public struct CardTransferCount { public var numberOfTransfers: Int? public var totalTransfer: Int? + + public init(numberOfTransfers: Int?, totalTransfer: Int?) { + self.numberOfTransfers = numberOfTransfers + self.totalTransfer = totalTransfer + } } diff --git a/Domain/Sources/Domain/Entities/Person.swift b/Domain/Sources/Domain/Entities/Person.swift index 6beadef..0d27034 100644 --- a/Domain/Sources/Domain/Entities/Person.swift +++ b/Domain/Sources/Domain/Entities/Person.swift @@ -12,4 +12,10 @@ public struct Person { public var name: String? public var emial: String? public var avatar: String? + + public init(name: String?, emial: String?, avatar: String?) { + self.name = name + self.emial = emial + self.avatar = avatar + } } diff --git a/Domain/Sources/Domain/Entities/PersonBankAccount.swift b/Domain/Sources/Domain/Entities/PersonBankAccount.swift index 0c8bed9..017dafc 100644 --- a/Domain/Sources/Domain/Entities/PersonBankAccount.swift +++ b/Domain/Sources/Domain/Entities/PersonBankAccount.swift @@ -17,4 +17,23 @@ public struct PersonBankAccount: Identifiable { public var cardTransferCount: CardTransferCount? public var note: String? public var lastDateTransfer: Date? + public private(set) var isFavorite: Bool = false + var indexAtList: Int = 0 + + public init(person: Person?, card: Card?, cardTransferCount: CardTransferCount?, + note: String?, lastDateTransfer: Date?) { + self.person = person + self.card = card + self.cardTransferCount = cardTransferCount + self.note = note + self.lastDateTransfer = lastDateTransfer + } + + public mutating func update(favoriteStatus isFavorite: Bool) { + self.isFavorite = isFavorite + } + + mutating func update(indexAtList index: Int) { + self.indexAtList = index + } } diff --git a/Domain/Sources/Domain/Error/PersonBankAccountError.swift b/Domain/Sources/Domain/Error/PersonBankAccountError.swift new file mode 100644 index 0000000..e38ad5f --- /dev/null +++ b/Domain/Sources/Domain/Error/PersonBankAccountError.swift @@ -0,0 +1,32 @@ +// +// PersonBankAccountError.swift +// +// +// Created by Hessam Mahdiabadi on 11/4/23. +// + +import Foundation + +public enum PersonBankAccountError: Error { + + case cannotSavePersonAccountToFavorites + case cannotRemovePersonAccountFromFavorites + case cannotFetchPersonAccounts + case cannotFetchFavoritePersonAccounts + + var errorDescription: String? { + switch self { + case .cannotSavePersonAccountToFavorites: + return "Failed to save person accounts to favorites" + + case .cannotRemovePersonAccountFromFavorites: + return "Failed to remove person account from favorites" + + case .cannotFetchPersonAccounts: + return "Failed to fetch person accounts" + + case .cannotFetchFavoritePersonAccounts: + return "Failed to fetch favorite person accounts" + } + } +} diff --git a/Domain/Sources/Domain/Extension/AnyPublisher+async.swift b/Domain/Sources/Domain/Extension/AnyPublisher+async.swift new file mode 100644 index 0000000..5abc22f --- /dev/null +++ b/Domain/Sources/Domain/Extension/AnyPublisher+async.swift @@ -0,0 +1,54 @@ +// +// AnyPublisher+async.swift +// +// +// Created by Hessam Mahdiabadi on 11/4/23. +// + +import Combine + +extension AnyPublisher { + struct Subscriber { + fileprivate let send: (Output) -> Void + fileprivate let complete: (Subscribers.Completion) -> Void + + func send(_ value: Output) { + self.send(value) + } + func send(completion: Subscribers.Completion) { + self.complete(completion) + } + } + + init(_ closure: (Subscriber) -> AnyCancellable) { + let subject = PassthroughSubject() + + let subscriber = Subscriber( + send: subject.send, + complete: subject.send(completion:) + ) + let cancel = closure(subscriber) + + self = subject + .handleEvents(receiveCancel: cancel.cancel) + .eraseToAnyPublisher() + } +} + +extension AnyPublisher { + init(taskPriority: TaskPriority? = nil, asyncFunc: @escaping () async throws -> Output) { + self.init { subscriber in + let task = Task(priority: taskPriority) { + do { + subscriber.send(try await asyncFunc()) + subscriber.send(completion: .finished) + } catch { + subscriber.send(completion: .failure(error as! Failure)) + } + } + return AnyCancellable { + task.cancel() + } + } + } +} diff --git a/Domain/Sources/Domain/Repositories/PersonBankAccountRepository.swift b/Domain/Sources/Domain/Repositories/PersonBankAccountRepository.swift new file mode 100644 index 0000000..44b9f89 --- /dev/null +++ b/Domain/Sources/Domain/Repositories/PersonBankAccountRepository.swift @@ -0,0 +1,17 @@ +// +// PersonBankAccountRepository.swift.swift +// +// +// Created by Hessam Mahdiabadi on 11/4/23. +// + +import Foundation + +public protocol PersonBankAccountRepository { + + func fetchPersonAccounts(withOffest offset: Int) async throws -> [PersonBankAccount] + func fetchFavoritePersonAccounts() async throws -> [PersonBankAccount] + func savePersonAccountToFavorites(_ personBankAccount: PersonBankAccount) async throws -> PersonBankAccount + func removePersonAccountFromFavorites(_ personBankAccount: PersonBankAccount) async throws -> PersonBankAccount + func updatefavoriteStatusForPersonAccount(_ personBankAccount: PersonBankAccount) async -> PersonBankAccount +} diff --git a/Domain/Sources/Domain/UseCases/PersonBankAccountUseCase.swift b/Domain/Sources/Domain/UseCases/PersonBankAccountUseCase.swift new file mode 100644 index 0000000..6582a0b --- /dev/null +++ b/Domain/Sources/Domain/UseCases/PersonBankAccountUseCase.swift @@ -0,0 +1,19 @@ +// +// PersonBankAccountUseCase.swift +// +// +// Created by Hessam Mahdiabadi on 11/4/23. +// + +import Foundation +import Combine + +public protocol PersonBankAccountUseCase { + + func fetchPersonAccounts(withOffest offset: Int) -> AnyPublisher<[PersonBankAccount], PersonBankAccountError> + func fetchFavoritePersonAccounts() -> AnyPublisher<[PersonBankAccount], PersonBankAccountError> + func savePersonAccountToFavorites(_ personBankAccount: PersonBankAccount) + -> AnyPublisher + func removePersonAccountFromFavorites(_ personBankAccount: PersonBankAccount) + -> AnyPublisher +} diff --git a/Domain/Sources/Domain/UseCases/PersonBankAccountUseCaseImpl.swift b/Domain/Sources/Domain/UseCases/PersonBankAccountUseCaseImpl.swift new file mode 100644 index 0000000..7cbf183 --- /dev/null +++ b/Domain/Sources/Domain/UseCases/PersonBankAccountUseCaseImpl.swift @@ -0,0 +1,110 @@ +// +// PersonBankAccountUseCaseImpl.swift +// +// +// Created by Hessam Mahdiabadi on 11/4/23. +// + +import Foundation +import Combine + +public class PersonBankAccountUseCaseImpl: PersonBankAccountUseCase { + + private var repository: PersonBankAccountRepository + + public init(repository: PersonBankAccountRepository) { + self.repository = repository + } + + public func fetchPersonAccounts(withOffest offset: Int) + -> AnyPublisher<[PersonBankAccount], PersonBankAccountError> { + return AnyPublisher { [weak self] in + guard let self else { throw PersonBankAccountError.cannotFetchPersonAccounts } + + do { + let accounts = try await self.repository.fetchPersonAccounts(withOffest: offset) + let newAccount = await self.updateFavoriteStatus(forPersonBankAccounts: accounts) + return newAccount + } catch { + throw PersonBankAccountError.cannotFetchPersonAccounts + } + } + } + + public func fetchFavoritePersonAccounts() + -> AnyPublisher<[PersonBankAccount], PersonBankAccountError> { + return AnyPublisher { [weak self] in + guard let self else { throw PersonBankAccountError.cannotFetchFavoritePersonAccounts } + + do { + return try await self.repository.fetchFavoritePersonAccounts() + } catch { + throw PersonBankAccountError.cannotFetchFavoritePersonAccounts + } + } + } + + public func savePersonAccountToFavorites(_ personBankAccount: PersonBankAccount) + -> AnyPublisher { + return AnyPublisher { [weak self] in + guard let self else { throw PersonBankAccountError.cannotSavePersonAccountToFavorites } + + do { + return try await self.repository.savePersonAccountToFavorites(personBankAccount) + } catch { + throw PersonBankAccountError.cannotSavePersonAccountToFavorites + } + } + } + + public func removePersonAccountFromFavorites(_ personBankAccount: PersonBankAccount) + -> AnyPublisher { + return AnyPublisher { [weak self] in + guard let self else { throw PersonBankAccountError.cannotRemovePersonAccountFromFavorites } + + do { + return try await self.repository.removePersonAccountFromFavorites(personBankAccount) + } catch { + throw PersonBankAccountError.cannotRemovePersonAccountFromFavorites + } + } + } + + private func updateFavoriteStatus(forPersonBankAccounts accounts: [PersonBankAccount]) async + -> [PersonBankAccount] { + return await withTaskGroup(of: PersonBankAccount.self, + returning: [PersonBankAccount].self) { [weak self] taskGroup in + guard let self else { return accounts } + + var updatedFavoriteStatusAccounts = accounts + + let totalSize = accounts.count + let batchSize = totalSize < 4 ? totalSize : 4 + + func createUpdateFavoriteStatusTask(atIndex index: Int) { + taskGroup.addTask { + var updatedAccount = await self.repository + .updatefavoriteStatusForPersonAccount(accounts[index]) + updatedAccount.update(indexAtList: index) + return updatedAccount + } + } + + for index in 0 ..< batchSize { + createUpdateFavoriteStatusTask(atIndex: index) + } + + var index = batchSize + + for await account in taskGroup { + updatedFavoriteStatusAccounts[account.indexAtList].update(favoriteStatus: account.isFavorite) + + if index < totalSize { + createUpdateFavoriteStatusTask(atIndex: index) + index += 1 + } + } + return updatedFavoriteStatusAccounts + } + } +} diff --git a/Domain/Tests/DomainTests/UseCasesTests/MockError.swift b/Domain/Tests/DomainTests/UseCasesTests/MockError.swift new file mode 100644 index 0000000..f49a95a --- /dev/null +++ b/Domain/Tests/DomainTests/UseCasesTests/MockError.swift @@ -0,0 +1,13 @@ +// +// MockError.swift +// +// +// Created by Hessam Mahdiabadi on 11/5/23. +// + +import Foundation + +enum MockError: Error { + + case mockCase +} diff --git a/Domain/Tests/DomainTests/UseCasesTests/MockRepository.swift b/Domain/Tests/DomainTests/UseCasesTests/MockRepository.swift new file mode 100644 index 0000000..f073348 --- /dev/null +++ b/Domain/Tests/DomainTests/UseCasesTests/MockRepository.swift @@ -0,0 +1,81 @@ +// +// MockRepository.swift +// +// +// Created by Hessam Mahdiabadi on 11/5/23. +// + +import Foundation +@testable import Domain + +class MockPersonBankAccountRepository: PersonBankAccountRepository { + + func createMockPersonAccount() -> PersonBankAccount { + let person = Person(name: "hessam", emial: "h.mahdi", avatar: nil) + let card = Card(cardNumber: "123", cardType: "master") + let cardCount = CardTransferCount(numberOfTransfers: 12, totalTransfer: 12) + let note = "note" + return .init(person: person, card: card, cardTransferCount: cardCount, + note: note, lastDateTransfer: nil) + } + + func fetchPersonAccounts(withOffest offset: Int) async throws -> [Domain.PersonBankAccount] { + throw MockError.mockCase + } + + func fetchFavoritePersonAccounts() async throws -> [Domain.PersonBankAccount] { + throw MockError.mockCase + } + + func savePersonAccountToFavorites(_ personBankAccount: PersonBankAccount) async throws -> PersonBankAccount { + throw MockError.mockCase + } + + func removePersonAccountFromFavorites(_ personBankAccount: PersonBankAccount) async throws -> PersonBankAccount { + throw MockError.mockCase + } + + func updatefavoriteStatusForPersonAccount(_ personBankAccount: Domain.PersonBankAccount) async -> Domain.PersonBankAccount { + return personBankAccount + } +} + +class MockSuccessEmptyFetchAccountRepository: MockPersonBankAccountRepository { + override func fetchPersonAccounts(withOffest offset: Int) async throws -> [PersonBankAccount] { + return [] + } +} + +class MockSuccessFetchAccountRepository: MockPersonBankAccountRepository { + + override func fetchPersonAccounts(withOffest offset: Int) async throws -> [PersonBankAccount] { + return [createMockPersonAccount()] + } + + override func fetchFavoritePersonAccounts() async throws -> [PersonBankAccount] { + var person = createMockPersonAccount() + person.update(favoriteStatus: true) + return [person] + } +} + +class MockSuccessSaveOrRemoveAccountToFavoritesRepository: MockPersonBankAccountRepository { + + var person: PersonBankAccount! + + override func savePersonAccountToFavorites(_ personBankAccount: PersonBankAccount) async throws -> PersonBankAccount { + person = personBankAccount + person.update(favoriteStatus: true) + return person + } + + override func removePersonAccountFromFavorites(_ personBankAccount: PersonBankAccount) async throws -> PersonBankAccount { + person = personBankAccount + person.update(favoriteStatus: false) + return person + } + + override func fetchFavoritePersonAccounts() async throws -> [PersonBankAccount] { + return [person] + } +} diff --git a/Domain/Tests/DomainTests/UseCasesTests/PersonBankAccountUseCaseTests.swift b/Domain/Tests/DomainTests/UseCasesTests/PersonBankAccountUseCaseTests.swift new file mode 100644 index 0000000..44f79fb --- /dev/null +++ b/Domain/Tests/DomainTests/UseCasesTests/PersonBankAccountUseCaseTests.swift @@ -0,0 +1,291 @@ +// +// PersonBankAccountUseCaseTests.swift +// +// +// Created by Hessam Mahdiabadi on 11/5/23. +// + +import XCTest +import Combine +@testable import Domain + +final class PersonBankAccountUseCaseTests: XCTestCase { + + var cancellables: Set! + var useCase: PersonBankAccountUseCase! + + override func setUp() { + cancellables = [] + } + + override func tearDown() { + useCase = nil + cancellables.removeAll() + } + + + func testSuccessFetchPersonAccounts() { + // given + let repository = MockSuccessFetchAccountRepository() + useCase = PersonBankAccountUseCaseImpl(repository: repository) + + let expectation = XCTestExpectation(description: "fetch accounts") + + var accounts: [PersonBankAccount]? + + // when + useCase.fetchPersonAccounts(withOffest: 1) + .receive(on: DispatchQueue.main) + .sink(receiveCompletion: { _ in + }, receiveValue: { values in + accounts = values + expectation.fulfill() + }) + .store(in: &cancellables) + + wait(for: [expectation], timeout: 2.0) + + // then + XCTAssertNotNil(accounts) + XCTAssertEqual(accounts?.count, 1) + } + + func testSuccessEmptyFetchPersonAccounts() { + // given + let repository = MockSuccessEmptyFetchAccountRepository() + useCase = PersonBankAccountUseCaseImpl(repository: repository) + + let expectation = XCTestExpectation(description: "fetch accounts") + + var accounts: [PersonBankAccount]? + + // when + useCase.fetchPersonAccounts(withOffest: 1) + .receive(on: DispatchQueue.main) + .sink(receiveCompletion: { _ in + }, receiveValue: { values in + accounts = values + expectation.fulfill() + }) + .store(in: &cancellables) + + wait(for: [expectation], timeout: 2.0) + + // then + XCTAssertNotNil(accounts) + XCTAssertTrue(accounts?.isEmpty ?? false) + } + + func testFailFetchPersonAccounts() { + + // given + let repository = MockPersonBankAccountRepository() + useCase = PersonBankAccountUseCaseImpl(repository: repository) + + let expectation = XCTestExpectation(description: "fetch accounts") + + var error: PersonBankAccountError? + + // when + useCase.fetchPersonAccounts(withOffest: 1) + .sink { completion in + switch completion { + case .failure(let perEror): error = perEror + case .finished: break + } + expectation.fulfill() + } receiveValue: { _ in } + .store(in: &cancellables) + + wait(for: [expectation], timeout: 2.0) + + // then + XCTAssertNotNil(error) + XCTAssertEqual(error, .cannotFetchPersonAccounts) + } + + func testSuccessFetchFavoritePersonAccounts() { + // given + let repository = MockSuccessFetchAccountRepository() + useCase = PersonBankAccountUseCaseImpl(repository: repository) + + let expectation = XCTestExpectation(description: "fetch accounts") + + var accounts: [PersonBankAccount]? + + // when + useCase.fetchFavoritePersonAccounts() + .receive(on: DispatchQueue.main) + .sink(receiveCompletion: { _ in + }, receiveValue: { values in + accounts = values + expectation.fulfill() + }) + .store(in: &cancellables) + + wait(for: [expectation], timeout: 2.0) + + // then + XCTAssertNotNil(accounts) + XCTAssertEqual(accounts?.count, 1) + XCTAssertEqual(accounts?.first?.isFavorite, true) + } + + func testFailFetchFavoritePersonAccounts() { + + // given + let repository = MockPersonBankAccountRepository() + useCase = PersonBankAccountUseCaseImpl(repository: repository) + + let expectation = XCTestExpectation(description: "fetch accounts") + + var error: PersonBankAccountError? + + // when + useCase.fetchFavoritePersonAccounts() + .sink { completion in + switch completion { + case .failure(let perEror): error = perEror + case .finished: break + } + expectation.fulfill() + } receiveValue: { _ in } + .store(in: &cancellables) + + wait(for: [expectation], timeout: 2.0) + + // then + XCTAssertNotNil(error) + XCTAssertEqual(error, .cannotFetchFavoritePersonAccounts) + } + + func testSuccessSavePersonAccount() { + // given + let repository = MockSuccessSaveOrRemoveAccountToFavoritesRepository() + useCase = PersonBankAccountUseCaseImpl(repository: repository) + + let expectation = XCTestExpectation(description: "save account") + + let mockAccount = repository.createMockPersonAccount() + var accounts: [PersonBankAccount]? + + // when + useCase.savePersonAccountToFavorites(mockAccount) + .sink { _ in } receiveValue: { _ in }.store(in: &cancellables) + + + useCase.fetchFavoritePersonAccounts() + .receive(on: DispatchQueue.main) + .sink(receiveCompletion: { _ in + }, receiveValue: { values in + accounts = values + expectation.fulfill() + }) + .store(in: &cancellables) + + wait(for: [expectation], timeout: 2.0) + + // then + XCTAssertEqual(accounts?.count, 1) + XCTAssertEqual(accounts?.first?.person?.name, mockAccount.person?.name) + XCTAssertEqual(accounts?.first?.isFavorite, true) + } + + func testSuccessRemovePersonAccount() { + // given + let repository = MockSuccessSaveOrRemoveAccountToFavoritesRepository() + useCase = PersonBankAccountUseCaseImpl(repository: repository) + + let expectation = XCTestExpectation(description: "remove account") + + let mockAccount = repository.createMockPersonAccount() + var accounts: [PersonBankAccount]? + + func runFetchFavorite() { + useCase.fetchFavoritePersonAccounts() + .receive(on: DispatchQueue.main) + .sink(receiveCompletion: { _ in + }, receiveValue: { values in + accounts = values + expectation.fulfill() + }) + .store(in: &cancellables) + } + + func runRemove() { + useCase.removePersonAccountFromFavorites(mockAccount) + .sink { _ in + runFetchFavorite() + } receiveValue: { _ in }.store(in: &cancellables) + } + + // when + useCase.savePersonAccountToFavorites(mockAccount) + .sink { _ in + runRemove() + } receiveValue: { _ in }.store(in: &cancellables) + + wait(for: [expectation], timeout: 2.0) + + // then + XCTAssertEqual(accounts?.count, 1) + XCTAssertEqual(accounts?.first?.person?.name, mockAccount.person?.name) + XCTAssertEqual(accounts?.first?.isFavorite, false) + } + + func testFailSavePersonAccount() { + // given + let repository = MockSuccessFetchAccountRepository() + useCase = PersonBankAccountUseCaseImpl(repository: repository) + + let expectation = XCTestExpectation(description: "save account") + + let mockAccount = repository.createMockPersonAccount() + var error: PersonBankAccountError? + + // when + useCase.savePersonAccountToFavorites(mockAccount) + .sink { completion in + switch completion { + case .failure(let perEror): error = perEror + case .finished: break + } + expectation.fulfill() + } receiveValue: { _ in } + .store(in: &cancellables) + + wait(for: [expectation], timeout: 2.0) + + // then + XCTAssertNotNil(error) + XCTAssertEqual(error, .cannotSavePersonAccountToFavorites) + } + + func testFailRemovePersonAccount() { + // given + let repository = MockSuccessFetchAccountRepository() + useCase = PersonBankAccountUseCaseImpl(repository: repository) + + let expectation = XCTestExpectation(description: "remove account") + + let mockAccount = repository.createMockPersonAccount() + var error: PersonBankAccountError? + + // when + useCase.removePersonAccountFromFavorites(mockAccount) + .sink { completion in + switch completion { + case .failure(let perEror): error = perEror + case .finished: break + } + expectation.fulfill() + } receiveValue: { _ in } + .store(in: &cancellables) + + wait(for: [expectation], timeout: 2.0) + + // then + XCTAssertNotNil(error) + XCTAssertEqual(error, .cannotRemovePersonAccountFromFavorites) + } +} diff --git a/TransferList.xcodeproj/xcuserdata/hessam.xcuserdatad/xcschemes/xcschememanagement.plist b/TransferList.xcodeproj/xcuserdata/hessam.xcuserdatad/xcschemes/xcschememanagement.plist index 097b2a4..7a6bac3 100644 --- a/TransferList.xcodeproj/xcuserdata/hessam.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/TransferList.xcodeproj/xcuserdata/hessam.xcuserdatad/xcschemes/xcschememanagement.plist @@ -7,7 +7,7 @@ TransferList.xcscheme_^#shared#^_ orderHint - 1 + 0 From f3ecb9757d6aec7072be48f9e6e40586357bec9e Mon Sep 17 00:00:00 2001 From: Hessam Mahdiabadi <67460597+iamHEssam@users.noreply.github.com> Date: Sun, 5 Nov 2023 01:32:58 +0330 Subject: [PATCH 05/34] Refine AnyPublisher Extension to Constrain Error Type, Add GitHub Workflow for Domain Layer, Including Linting and Testing - Enhanced the AnyPublisher extension to include a constraint on the error type, ensuring it aligns with the PersonBankAccountError type and avoiding forced casting within the extension. - Added a GitHub workflow for the Domain package to run linting and tests on every pull request. - Added support for macOS 10.15 and iOS 14 within this package. --- .github/workflows/Domain.yml | 27 +++++++++++++++++++ Domain/Package.swift | 2 +- .../Domain/Error/PersonBankAccountError.swift | 3 +++ .../Domain/Extension/AnyPublisher+async.swift | 7 ++--- .../xcschemes/xcschememanagement.plist | 2 +- 5 files changed, 36 insertions(+), 5 deletions(-) create mode 100644 .github/workflows/Domain.yml diff --git a/.github/workflows/Domain.yml b/.github/workflows/Domain.yml new file mode 100644 index 0000000..a0ffcab --- /dev/null +++ b/.github/workflows/Domain.yml @@ -0,0 +1,27 @@ +name: Domain Layer + +on: + pull_request: + branches: + - '*' + - '*/*' + +jobs: + build: + runs-on: macos-13 + + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Set up SwiftLint + run: brew install swiftlint + + - name: Lint code + run: swiftlint + + - name: run unit test + run: | + cd Domain/Sources/ + swift build + swift test \ No newline at end of file diff --git a/Domain/Package.swift b/Domain/Package.swift index ce3a19f..5191856 100644 --- a/Domain/Package.swift +++ b/Domain/Package.swift @@ -5,7 +5,7 @@ import PackageDescription let package = Package( name: "Domain", - platforms: [.iOS(.v15)], + platforms: [.iOS(.v14), .macOS(.v10_15)], products: [ // Products define the executables and libraries a package produces, and make them visible to other packages. .library( diff --git a/Domain/Sources/Domain/Error/PersonBankAccountError.swift b/Domain/Sources/Domain/Error/PersonBankAccountError.swift index e38ad5f..a69adb7 100644 --- a/Domain/Sources/Domain/Error/PersonBankAccountError.swift +++ b/Domain/Sources/Domain/Error/PersonBankAccountError.swift @@ -13,6 +13,7 @@ public enum PersonBankAccountError: Error { case cannotRemovePersonAccountFromFavorites case cannotFetchPersonAccounts case cannotFetchFavoritePersonAccounts + case unexpectedError var errorDescription: String? { switch self { @@ -27,6 +28,8 @@ public enum PersonBankAccountError: Error { case .cannotFetchFavoritePersonAccounts: return "Failed to fetch favorite person accounts" + + case .unexpectedError: return "Unexpected error" } } } diff --git a/Domain/Sources/Domain/Extension/AnyPublisher+async.swift b/Domain/Sources/Domain/Extension/AnyPublisher+async.swift index 5abc22f..a1fc26e 100644 --- a/Domain/Sources/Domain/Extension/AnyPublisher+async.swift +++ b/Domain/Sources/Domain/Extension/AnyPublisher+async.swift @@ -7,7 +7,7 @@ import Combine -extension AnyPublisher { +extension AnyPublisher where Failure == PersonBankAccountError { struct Subscriber { fileprivate let send: (Output) -> Void fileprivate let complete: (Subscribers.Completion) -> Void @@ -35,7 +35,7 @@ extension AnyPublisher { } } -extension AnyPublisher { +extension AnyPublisher where Failure == PersonBankAccountError { init(taskPriority: TaskPriority? = nil, asyncFunc: @escaping () async throws -> Output) { self.init { subscriber in let task = Task(priority: taskPriority) { @@ -43,7 +43,8 @@ extension AnyPublisher { subscriber.send(try await asyncFunc()) subscriber.send(completion: .finished) } catch { - subscriber.send(completion: .failure(error as! Failure)) + let personError = error as? PersonBankAccountError ?? .unexpectedError + subscriber.send(completion: .failure(personError)) } } return AnyCancellable { diff --git a/TransferList.xcodeproj/xcuserdata/hessam.xcuserdatad/xcschemes/xcschememanagement.plist b/TransferList.xcodeproj/xcuserdata/hessam.xcuserdatad/xcschemes/xcschememanagement.plist index 7a6bac3..097b2a4 100644 --- a/TransferList.xcodeproj/xcuserdata/hessam.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/TransferList.xcodeproj/xcuserdata/hessam.xcuserdatad/xcschemes/xcschememanagement.plist @@ -7,7 +7,7 @@ TransferList.xcscheme_^#shared#^_ orderHint - 0 + 1 From adacf5fb0b39424c911edfe8c4bf382488d33b91 Mon Sep 17 00:00:00 2001 From: Hessam Mahdiabadi <67460597+iamHEssam@users.noreply.github.com> Date: Sun, 5 Nov 2023 02:54:30 +0330 Subject: [PATCH 06/34] Add API Components: Protocol, Router, DTO Model, and Alamofire Library - Added an API protocol to facilitate network access used by repositories. - Added the API Router for creating endpoints. - Added DTO models for converting JSON data from the server. - Added the Alamofire third-party library for simplified API calls. --- Data/.gitignore | 9 ++ Data/Package.swift | 31 +++++ Data/README.md | 3 + Data/Sources/Data/Network/Api.swift | 13 ++ Data/Sources/Data/Network/ApiImpl.swift | 66 +++++++++ Data/Sources/Data/Network/ApiRouter.swift | 64 +++++++++ Data/Sources/Data/Network/CardDTO.swift | 14 ++ .../Data/Network/CardTransferCountDTO.swift | 14 ++ Data/Sources/Data/Network/NetworkError.swift | 21 +++ .../Data/Network/PersonBankAccountDTO.swift | 17 +++ Data/Sources/Data/Network/PersonDTO.swift | 15 ++ .../NetworkTests/ApiRouterTests.swift | 46 +++++++ .../DataTests/NetworkTests/ApiTests.swift | 129 ++++++++++++++++++ .../NetworkTests/Mock/ApiMockResponse.swift | 24 ++++ .../Mock/BadResponseMockURLProtocol.swift | 72 ++++++++++ .../Mock/OfflineServerMockURLProtocol.swift | 54 ++++++++ .../Mock/ResponseMockURLProtocol.swift | 103 ++++++++++++++ Domain/Sources/Domain/Entities/Person.swift | 6 +- TransferList.xcodeproj/project.pbxproj | 2 + .../xcshareddata/swiftpm/Package.resolved | 14 ++ .../xcschemes/xcschememanagement.plist | 2 +- 21 files changed, 715 insertions(+), 4 deletions(-) create mode 100644 Data/.gitignore create mode 100644 Data/Package.swift create mode 100644 Data/README.md create mode 100644 Data/Sources/Data/Network/Api.swift create mode 100644 Data/Sources/Data/Network/ApiImpl.swift create mode 100644 Data/Sources/Data/Network/ApiRouter.swift create mode 100644 Data/Sources/Data/Network/CardDTO.swift create mode 100644 Data/Sources/Data/Network/CardTransferCountDTO.swift create mode 100644 Data/Sources/Data/Network/NetworkError.swift create mode 100644 Data/Sources/Data/Network/PersonBankAccountDTO.swift create mode 100644 Data/Sources/Data/Network/PersonDTO.swift create mode 100644 Data/Tests/DataTests/NetworkTests/ApiRouterTests.swift create mode 100644 Data/Tests/DataTests/NetworkTests/ApiTests.swift create mode 100644 Data/Tests/DataTests/NetworkTests/Mock/ApiMockResponse.swift create mode 100644 Data/Tests/DataTests/NetworkTests/Mock/BadResponseMockURLProtocol.swift create mode 100644 Data/Tests/DataTests/NetworkTests/Mock/OfflineServerMockURLProtocol.swift create mode 100644 Data/Tests/DataTests/NetworkTests/Mock/ResponseMockURLProtocol.swift create mode 100644 TransferList.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved diff --git a/Data/.gitignore b/Data/.gitignore new file mode 100644 index 0000000..3b29812 --- /dev/null +++ b/Data/.gitignore @@ -0,0 +1,9 @@ +.DS_Store +/.build +/Packages +/*.xcodeproj +xcuserdata/ +DerivedData/ +.swiftpm/config/registries.json +.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata +.netrc diff --git a/Data/Package.swift b/Data/Package.swift new file mode 100644 index 0000000..bcdb3c0 --- /dev/null +++ b/Data/Package.swift @@ -0,0 +1,31 @@ +// swift-tools-version: 5.8 +// The swift-tools-version declares the minimum version of Swift required to build this package. + +import PackageDescription + +let package = Package( + name: "Data", + platforms: [.iOS(.v14), .macOS(.v10_15)], + products: [ + // Products define the executables and libraries a package produces, and make them visible to other packages. + .library( + name: "Data", + targets: ["Data"]), + ], + dependencies: [ + // Dependencies declare other packages that this package depends on. + // .package(url: /* package url */, from: "1.0.0"), + .package(path: "../Domain"), + .package(url: "https://github.com/Alamofire/Alamofire.git", .upToNextMajor(from: "5.8.1")) + ], + targets: [ + // Targets are the basic building blocks of a package. A target can define a module or a test suite. + // Targets can depend on other targets in this package, and on products in packages this package depends on. + .target( + name: "Data", + dependencies: ["Alamofire"]), + .testTarget( + name: "DataTests", + dependencies: ["Data"]), + ] +) diff --git a/Data/README.md b/Data/README.md new file mode 100644 index 0000000..9f2dd4d --- /dev/null +++ b/Data/README.md @@ -0,0 +1,3 @@ +# Data + +A description of this package. diff --git a/Data/Sources/Data/Network/Api.swift b/Data/Sources/Data/Network/Api.swift new file mode 100644 index 0000000..b3cd02b --- /dev/null +++ b/Data/Sources/Data/Network/Api.swift @@ -0,0 +1,13 @@ +// +// Api.swift +// +// +// Created by Hessam Mahdiabadi on 11/5/23. +// + +import Foundation + +protocol Api { + + func callApi(route: ApiRouter, decodeType type: T.Type) async throws -> T +} diff --git a/Data/Sources/Data/Network/ApiImpl.swift b/Data/Sources/Data/Network/ApiImpl.swift new file mode 100644 index 0000000..144d971 --- /dev/null +++ b/Data/Sources/Data/Network/ApiImpl.swift @@ -0,0 +1,66 @@ +// +// ApiImpl.swift +// +// +// Created by Hessam Mahdiabadi on 11/5/23. +// + +import Foundation +import Alamofire + +final public class ApiImpl: Api { + + private var sessionManager: Session + private var decoder: JSONDecoder! + +#if DEBUG + public init(configuration: URLSessionConfiguration) { + sessionManager = Session(configuration: configuration) + setupDecoder() + } +#endif + + public init() { + sessionManager = Session() + setupDecoder() + } + + private func setupDecoder() { + let dateFormatter = DateFormatter() + dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss'Z'" + + decoder = JSONDecoder() + decoder.dateDecodingStrategy = .formatted(dateFormatter) + } + + public func callApi(route: ApiRouter, decodeType type: T.Type) async throws -> T { + return try await withCheckedThrowingContinuation { [weak self] continuation in + guard let self else { + continuation.resume(throwing: NetworkError.cannotConnectToServer) + return + } + + sessionManager.request(route) + .validate(statusCode: 200 ..< 300) + .responseData { [weak self] responseData in + guard let self else { + continuation.resume(throwing: NetworkError.cannotParseJson) + return + } + + switch responseData.result { + case .success(let data): + do { + let retVal = try decoder.decode(type, from: data) + continuation.resume(returning: retVal) + } catch { + continuation.resume(throwing: NetworkError.cannotParseJson) + } + + case .failure: + continuation.resume(throwing: NetworkError.cannotConnectToServer) + } + } + } + } +} diff --git a/Data/Sources/Data/Network/ApiRouter.swift b/Data/Sources/Data/Network/ApiRouter.swift new file mode 100644 index 0000000..2dc0aa8 --- /dev/null +++ b/Data/Sources/Data/Network/ApiRouter.swift @@ -0,0 +1,64 @@ +// +// ApiRouter.swift +// +// +// Created by Hessam Mahdiabadi on 11/5/23. +// + +import Foundation +import Alamofire + +public enum ApiRouter: URLRequestConvertible { + + public typealias Params = [String: Any] + + case transferList(offset: Int) + + public func asURLRequest() throws -> URLRequest { + + let httpMethod = getHttpMethod() + let url = createURL() + var urlRequest = URLRequest(url: url) + urlRequest.httpMethod = httpMethod.rawValue + urlRequest.timeoutInterval = 20.0 + urlRequest.cachePolicy = .reloadIgnoringLocalCacheData + + let encoding: ParameterEncoding = { + switch httpMethod { + default: + return URLEncoding.queryString + } + }() + + return try encoding.encode(urlRequest, with: self.getParams()) + } +} + +public extension ApiRouter { + + func getHttpMethod() -> HTTPMethod { + switch self { + case .transferList: + return .get + } + } + + func getParams() -> Params? { + return nil + } + + var urlPath: String { + switch self { + case .transferList(let offset): + return "/transfer-list/\(offset)" + } + } + + func createURL() -> URL { + var component = URLComponents() + component.scheme = "https" + component.host = "191da1ac-768c-4c6a-80ad-b533beafec25.mock.pstmn.io" + component.path = urlPath + return component.url! + } +} diff --git a/Data/Sources/Data/Network/CardDTO.swift b/Data/Sources/Data/Network/CardDTO.swift new file mode 100644 index 0000000..9805228 --- /dev/null +++ b/Data/Sources/Data/Network/CardDTO.swift @@ -0,0 +1,14 @@ +// +// CardDTO.swift +// +// +// Created by Hessam Mahdiabadi on 11/5/23. +// + +import Foundation + +struct CardDTO: Decodable { + + var card_number: String? + var card_type: String? +} diff --git a/Data/Sources/Data/Network/CardTransferCountDTO.swift b/Data/Sources/Data/Network/CardTransferCountDTO.swift new file mode 100644 index 0000000..d7b26f0 --- /dev/null +++ b/Data/Sources/Data/Network/CardTransferCountDTO.swift @@ -0,0 +1,14 @@ +// +// CardTransferCountDTO.swift +// +// +// Created by Hessam Mahdiabadi on 11/5/23. +// + +import Foundation + +struct CardTransferCountDTO: Decodable { + + var number_of_transfers: Int? + var total_transfer: Int? +} diff --git a/Data/Sources/Data/Network/NetworkError.swift b/Data/Sources/Data/Network/NetworkError.swift new file mode 100644 index 0000000..a0b4fde --- /dev/null +++ b/Data/Sources/Data/Network/NetworkError.swift @@ -0,0 +1,21 @@ +// +// File.swift +// +// +// Created by Hessam Mahdiabadi on 11/5/23. +// + +import Foundation + +enum NetworkError: Error, LocalizedError { + + case cannotConnectToServer + case cannotParseJson + + var errorDescription: String? { + switch self { + case .cannotConnectToServer: return "You seem to be offline!" + case .cannotParseJson: return "Unexpected error" + } + } +} diff --git a/Data/Sources/Data/Network/PersonBankAccountDTO.swift b/Data/Sources/Data/Network/PersonBankAccountDTO.swift new file mode 100644 index 0000000..3b2a675 --- /dev/null +++ b/Data/Sources/Data/Network/PersonBankAccountDTO.swift @@ -0,0 +1,17 @@ +// +// PersonBankAccountDTO.swift +// +// +// Created by Hessam Mahdiabadi on 11/5/23. +// + +import Foundation + +public struct PersonBankAccountDTO: Decodable { + + var person: PersonDTO? + var card: CardDTO? + var more_info: CardTransferCountDTO? + var note: String? + var last_transfer: Date? +} diff --git a/Data/Sources/Data/Network/PersonDTO.swift b/Data/Sources/Data/Network/PersonDTO.swift new file mode 100644 index 0000000..b4fdb30 --- /dev/null +++ b/Data/Sources/Data/Network/PersonDTO.swift @@ -0,0 +1,15 @@ +// +// PersonDTO.swift +// +// +// Created by Hessam Mahdiabadi on 11/5/23. +// + +import Foundation + +struct PersonDTO: Decodable { + + var full_name: String? + var email: String? + var avatar: String? +} diff --git a/Data/Tests/DataTests/NetworkTests/ApiRouterTests.swift b/Data/Tests/DataTests/NetworkTests/ApiRouterTests.swift new file mode 100644 index 0000000..66db7f2 --- /dev/null +++ b/Data/Tests/DataTests/NetworkTests/ApiRouterTests.swift @@ -0,0 +1,46 @@ +// +// ApiRouterTests.swift +// +// +// Created by Hessam Mahdiabadi on 11/5/23. +// + +import XCTest +@testable import Data + +final class ApiRouterTests: XCTestCase { + + func testGetHttpMethod() { + // given + let route = ApiRouter.transferList(offset: 1) + + // when + let httpMethod = route.getHttpMethod() + + // then + XCTAssertEqual(httpMethod, .get) + XCTAssertNotEqual(httpMethod, .post) + } + + func testPath() { + // given + let route = ApiRouter.transferList(offset: 1) + + // when + let path = route.urlPath + + // then + XCTAssertEqual(path, "/transfer-list/1") + } + + func testCreateURL() { + // given + let route = ApiRouter.transferList(offset: 1) + + // when + let url = route.createURL() + + // then + XCTAssertEqual(url.absoluteString, "https://191da1ac-768c-4c6a-80ad-b533beafec25.mock.pstmn.io/transfer-list/1") + } +} diff --git a/Data/Tests/DataTests/NetworkTests/ApiTests.swift b/Data/Tests/DataTests/NetworkTests/ApiTests.swift new file mode 100644 index 0000000..0553216 --- /dev/null +++ b/Data/Tests/DataTests/NetworkTests/ApiTests.swift @@ -0,0 +1,129 @@ +// +// File.swift +// +// +// Created by Hessam Mahdiabadi on 11/5/23. +// + +import XCTest +@testable import Data + +final class ApiTests: XCTestCase { + + private var api: Api! + + override func tearDown() { + api = nil + } + + func testRealMediaListApiCall() async { + + // given + api = ApiImpl() + do { + + // when + let accounts = try await api.callApi(route: .transferList(offset: 1), + decodeType: [PersonBankAccountDTO].self) + + // then + XCTAssertEqual(accounts.count, 10) + XCTAssertEqual(accounts.first?.person?.full_name, "Jemimah Sprott") + XCTAssertEqual(accounts.first?.person?.email, nil) + XCTAssertEqual(accounts.first?.card?.card_number, "5602217292772382") + + } catch { + // then + XCTAssertNil(error as? NetworkError) + } + } + + func testSuccessMockResponse() async { + + // given + let configuration = URLSessionConfiguration.default + configuration.protocolClasses = [ResponseMockURLProtocol.self] + let api = ApiImpl(configuration: configuration) + + do { + // when + let accounts = try await api.callApi(route: .transferList(offset: 10), + decodeType: [PersonBankAccountDTO].self) + + // then + XCTAssertEqual(accounts.count, 2) + XCTAssertEqual(accounts.first?.person?.full_name, "Jemimah Sprott") + XCTAssertEqual(accounts.first?.person?.email, nil) + XCTAssertEqual(accounts.first?.card?.card_number, "5602217292772382") + + } catch { + + // then + XCTAssertNil(error) + } + } + + func testSuccessEmptyMockResponse() async { + + // given + let configuration = URLSessionConfiguration.default + configuration.protocolClasses = [ResponseMockURLProtocol.self] + let api = ApiImpl(configuration: configuration) + + do { + // when + let accounts = try await api.callApi(route: .transferList(offset: 11), + decodeType: [PersonBankAccountDTO].self) + + // then + XCTAssertTrue(accounts.isEmpty) + + } catch { + + // then + XCTAssertNil(error) + } + } + + func testOfflineApiCall() async { + // given + let configuration = URLSessionConfiguration.default + configuration.protocolClasses = [OfflineServerMockURLProtocol.self] + let api = ApiImpl(configuration: configuration) + + do { + // when + let _ = try await api.callApi(route: .transferList(offset: 10), + decodeType: [PersonBankAccountDTO].self) + + } catch { + + // then + let networkError = error as? NetworkError + XCTAssertNotNil(networkError) + XCTAssertEqual(networkError, .cannotConnectToServer) + } + } + + func testBadResponseApiCall() async { + + // given + let configuration = URLSessionConfiguration.default + configuration.protocolClasses = [BadResponseMockURLProtocol.self] + let api = ApiImpl(configuration: configuration) + + do { + + // when + let _ = try await api.callApi(route: .transferList(offset: 10), + decodeType: [PersonBankAccountDTO].self) + + } catch { + + // then + let networkError = error as? NetworkError + XCTAssertNotNil(networkError) + XCTAssertEqual(networkError, .cannotParseJson) + } + } +} diff --git a/Data/Tests/DataTests/NetworkTests/Mock/ApiMockResponse.swift b/Data/Tests/DataTests/NetworkTests/Mock/ApiMockResponse.swift new file mode 100644 index 0000000..66c6872 --- /dev/null +++ b/Data/Tests/DataTests/NetworkTests/Mock/ApiMockResponse.swift @@ -0,0 +1,24 @@ +// +// ApiMockResponse.swift +// +// +// Created by Hessam Mahdiabadi on 11/5/23. +// + +import Foundation + +struct ApiMockResponse: Hashable, Equatable { + + var url: URL + var data: Data? + var httpResponse: HTTPURLResponse? + var error: Error? + + func hash(into hasher: inout Hasher) { + hasher.combine(url) + } + + static func == (lhs: ApiMockResponse, rhs: ApiMockResponse) -> Bool { + lhs.hashValue == rhs.hashValue + } +} diff --git a/Data/Tests/DataTests/NetworkTests/Mock/BadResponseMockURLProtocol.swift b/Data/Tests/DataTests/NetworkTests/Mock/BadResponseMockURLProtocol.swift new file mode 100644 index 0000000..953d91f --- /dev/null +++ b/Data/Tests/DataTests/NetworkTests/Mock/BadResponseMockURLProtocol.swift @@ -0,0 +1,72 @@ +// +// BadResponseMockURLProtocol.swift +// +// +// Created by Hessam Mahdiabadi on 11/5/23. +// + +import Foundation + +class BadResponseMockURLProtocol: URLProtocol { + + private static var mockResponses = createMockResponse() + + override class func canInit(with request: URLRequest) -> Bool { + return true + } + + override class func canonicalRequest(for request: URLRequest) -> URLRequest { + return request + } + + override func startLoading() { + if let url = request.url { + if let apiResponse = BadResponseMockURLProtocol.mockResponses[url] { + if let response = apiResponse.httpResponse { + client?.urlProtocol(self, didReceive: response, cacheStoragePolicy: .notAllowed) + } + if let data = apiResponse.data { + client?.urlProtocol(self, didLoad: data) + } + if let error = apiResponse.error { + client?.urlProtocol(self, didFailWithError: error) + } + } + client?.urlProtocolDidFinishLoading(self) + } + } + + override func stopLoading() {} + + private static func createMockResponse() -> [URL: ApiMockResponse] { + + let strUrl = "https://191da1ac-768c-4c6a-80ad-b533beafec25.mock.pstmn.io/transfer-list/10" + let url = URL(string: strUrl)! + let data = #""" +{ + "person": { + "full_name": "Jemimah Sprott", + "email": null, + "avatar": "https://www.dropbox.com/s/64y9lcnca22p1jx/avatar1.png?dl=1" + }, + "card": { + "card_number": "5602217292772382", + "card_type": "bankcard" + }, + "last_transfer": "2022-08-31T15:24:16Z", + "note": null, + "more_info": { + "number_of_transfers": 74, + "total_transfer": 83111687 + } + } +"""#.data(using: .utf8) + let httpResponse = HTTPURLResponse(url: url, statusCode: 200, + httpVersion: nil, headerFields: nil) + let response = ApiMockResponse(url: url, data: data, + httpResponse: httpResponse, + error: nil) + + return [url: response] + } +} diff --git a/Data/Tests/DataTests/NetworkTests/Mock/OfflineServerMockURLProtocol.swift b/Data/Tests/DataTests/NetworkTests/Mock/OfflineServerMockURLProtocol.swift new file mode 100644 index 0000000..3c52cdb --- /dev/null +++ b/Data/Tests/DataTests/NetworkTests/Mock/OfflineServerMockURLProtocol.swift @@ -0,0 +1,54 @@ +// +// OfflineServerMockURLProtocol.swift +// +// +// Created by Hessam Mahdiabadi on 11/5/23. +// + +import Foundation + +class OfflineServerMockURLProtocol: URLProtocol { + + private static var mockResponses = createMockResponse() + + override class func canInit(with request: URLRequest) -> Bool { + return true + } + + override class func canonicalRequest(for request: URLRequest) -> URLRequest { + return request + } + + override func startLoading() { + if let url = request.url { + if let apiResponse = OfflineServerMockURLProtocol.mockResponses[url] { + if let response = apiResponse.httpResponse { + client?.urlProtocol(self, didReceive: response, cacheStoragePolicy: .notAllowed) + } + if let data = apiResponse.data { + client?.urlProtocol(self, didLoad: data) + } + if let error = apiResponse.error { + client?.urlProtocol(self, didFailWithError: error) + } + } + client?.urlProtocolDidFinishLoading(self) + } + } + + override func stopLoading() {} + + private static func createMockResponse() -> [URL: ApiMockResponse] { + + let strUrl = "https://191da1ac-768c-4c6a-80ad-b533beafec25.mock.pstmn.io/transfer-list/10" + let url = URL(string: strUrl)! + let data = "offline server".data(using: .utf8) + let httpResponse = HTTPURLResponse(url: url, statusCode: -1, + httpVersion: nil, headerFields: nil) + let response = ApiMockResponse(url: url, data: data, + httpResponse: httpResponse, + error: URLError(URLError.Code.cannotConnectToHost)) + + return [url: response] + } +} diff --git a/Data/Tests/DataTests/NetworkTests/Mock/ResponseMockURLProtocol.swift b/Data/Tests/DataTests/NetworkTests/Mock/ResponseMockURLProtocol.swift new file mode 100644 index 0000000..fedb270 --- /dev/null +++ b/Data/Tests/DataTests/NetworkTests/Mock/ResponseMockURLProtocol.swift @@ -0,0 +1,103 @@ +// +// ResponseMockURLProtocol.swift +// +// +// Created by Hessam Mahdiabadi on 11/5/23. +// + +import Foundation + +class ResponseMockURLProtocol: URLProtocol { + + private static var mockResponses = createMockResponse() + + override class func canInit(with request: URLRequest) -> Bool { + return true + } + + override class func canonicalRequest(for request: URLRequest) -> URLRequest { + return request + } + + override func startLoading() { + if let url = request.url { + if let apiResponse = ResponseMockURLProtocol.mockResponses[url] { + if let response = apiResponse.httpResponse { + client?.urlProtocol(self, didReceive: response, cacheStoragePolicy: .notAllowed) + } + if let data = apiResponse.data { + client?.urlProtocol(self, didLoad: data) + } + if let error = apiResponse.error { + client?.urlProtocol(self, didFailWithError: error) + } + } + client?.urlProtocolDidFinishLoading(self) + } + } + + override func stopLoading() {} + + private static func createMockResponse() -> [URL: ApiMockResponse] { + + let strUrl = "https://191da1ac-768c-4c6a-80ad-b533beafec25.mock.pstmn.io/transfer-list/10" + let url = URL(string: strUrl)! + let data = #""" +[ + { + "person": { + "full_name": "Jemimah Sprott", + "email": null, + "avatar": "https://www.dropbox.com/s/64y9lcnca22p1jx/avatar1.png?dl=1" + }, + "card": { + "card_number": "5602217292772382", + "card_type": "bankcard" + }, + "last_transfer": "2022-08-31T15:24:16Z", + "note": null, + "more_info": { + "number_of_transfers": 74, + "total_transfer": 83111687 + } + }, + { + "person": { + "full_name": "Bondy Lathleiff", + "email": "blathleiff1@mozilla.com", + "avatar": "https://www.dropbox.com/s/64y9lcnca22p1jx/avatar1.png?dl=1" + }, + "card": { + "card_number": "5602250166453938", + "card_type": "bankcard" + }, + "last_transfer": "2023-02-06T10:51:10Z", + "note": null, + "more_info": { + "number_of_transfers": 81, + "total_transfer": 37807212 + } + } +] +"""#.data(using: .utf8) + let httpResponse = HTTPURLResponse(url: url, statusCode: 200, + httpVersion: nil, headerFields: nil) + let response = ApiMockResponse(url: url, data: data, + httpResponse: httpResponse, + error: nil) + + let strUrl2 = "https://191da1ac-768c-4c6a-80ad-b533beafec25.mock.pstmn.io/transfer-list/11" + let url2 = URL(string: strUrl2)! + let data2 = #""" +[ +] +"""#.data(using: .utf8) + let httpResponse2 = HTTPURLResponse(url: url, statusCode: 200, + httpVersion: nil, headerFields: nil) + let response2 = ApiMockResponse(url: url2, data: data2, + httpResponse: httpResponse2, + error: nil) + + return [url: response, url2: response2] + } +} diff --git a/Domain/Sources/Domain/Entities/Person.swift b/Domain/Sources/Domain/Entities/Person.swift index 0d27034..1906b2f 100644 --- a/Domain/Sources/Domain/Entities/Person.swift +++ b/Domain/Sources/Domain/Entities/Person.swift @@ -10,12 +10,12 @@ import Foundation public struct Person { public var name: String? - public var emial: String? + public var email: String? public var avatar: String? - public init(name: String?, emial: String?, avatar: String?) { + public init(name: String?, email: String?, avatar: String?) { self.name = name - self.emial = emial + self.email = email self.avatar = avatar } } diff --git a/TransferList.xcodeproj/project.pbxproj b/TransferList.xcodeproj/project.pbxproj index 843dbf2..e8ba71b 100644 --- a/TransferList.xcodeproj/project.pbxproj +++ b/TransferList.xcodeproj/project.pbxproj @@ -16,6 +16,7 @@ /* End PBXBuildFile section */ /* Begin PBXFileReference section */ + DE3EF77C2AF6F9B40071E5E4 /* Data */ = {isa = PBXFileReference; lastKnownFileType = wrapper; path = Data; sourceTree = ""; }; DEBE4ABF2AF6C3B000A58501 /* TransferList.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = TransferList.app; sourceTree = BUILT_PRODUCTS_DIR; }; DEBE4AC22AF6C3B000A58501 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; DEBE4AC42AF6C3B000A58501 /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; }; @@ -41,6 +42,7 @@ DEBE4AB62AF6C3B000A58501 = { isa = PBXGroup; children = ( + DE3EF77C2AF6F9B40071E5E4 /* Data */, DEBE4AD62AF6C8F600A58501 /* Domain */, DEBE4AC12AF6C3B000A58501 /* TransferList */, DEBE4AC02AF6C3B000A58501 /* Products */, diff --git a/TransferList.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/TransferList.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved new file mode 100644 index 0000000..bc7ce25 --- /dev/null +++ b/TransferList.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -0,0 +1,14 @@ +{ + "pins" : [ + { + "identity" : "alamofire", + "kind" : "remoteSourceControl", + "location" : "https://github.com/Alamofire/Alamofire.git", + "state" : { + "revision" : "3dc6a42c7727c49bf26508e29b0a0b35f9c7e1ad", + "version" : "5.8.1" + } + } + ], + "version" : 2 +} diff --git a/TransferList.xcodeproj/xcuserdata/hessam.xcuserdatad/xcschemes/xcschememanagement.plist b/TransferList.xcodeproj/xcuserdata/hessam.xcuserdatad/xcschemes/xcschememanagement.plist index 097b2a4..5eb9d26 100644 --- a/TransferList.xcodeproj/xcuserdata/hessam.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/TransferList.xcodeproj/xcuserdata/hessam.xcuserdatad/xcschemes/xcschememanagement.plist @@ -7,7 +7,7 @@ TransferList.xcscheme_^#shared#^_ orderHint - 1 + 3 From 2366efb635c37b5839e048e84d40db4ce4a19fe5 Mon Sep 17 00:00:00 2001 From: Hessam Mahdiabadi <67460597+iamHEssam@users.noreply.github.com> Date: Sun, 5 Nov 2023 03:45:45 +0330 Subject: [PATCH 07/34] Add Mapper, Rename Folder, and Implement Repository - Added a Mapper component for converting DTOs to entities and vice versa. - Renamed the Network folder to Http for improved clarity. - Created the `PersonBankAccountRepositoryImpl` and implemented account fetching functionality. --- Data/Package.swift | 2 +- Data/Sources/Data/Common/Mapper.swift | 29 ++++++++++ Data/Sources/Data/{Network => Http}/Api.swift | 2 +- .../Data/{Network => Http}/ApiImpl.swift | 0 .../Data/{Network => Http}/ApiRouter.swift | 0 .../DataResponse}/CardDTO.swift | 0 .../DataResponse}/CardTransferCountDTO.swift | 0 .../DataResponse}/PersonBankAccountDTO.swift | 2 +- .../DataResponse}/PersonDTO.swift | 0 .../Sources/Data/Http/Mapper/CardMapper.swift | 25 +++++++++ .../Http/Mapper/CardTransferCountMapper.swift | 27 +++++++++ .../Http/Mapper/PersonBankAccountMapper.swift | 42 ++++++++++++++ .../Data/Http/Mapper/PersonMapper.swift | 27 +++++++++ .../Data/{Network => Http}/NetworkError.swift | 0 .../PersonBankAccountRepositoryImpl.swift | 44 +++++++++++++++ .../ApiRouterTests.swift | 0 .../ApiTests.swift | 0 .../Mock/ApiMockResponse.swift | 0 .../Mock/BadResponseMockURLProtocol.swift | 0 .../Mock/OfflineServerMockURLProtocol.swift | 0 .../Mock/ResponseMockURLProtocol.swift | 0 .../RepositoriesTests/Mock/MockApi.swift | 35 ++++++++++++ .../PersonBankAccountRepositoryTests.swift | 56 +++++++++++++++++++ .../UseCasesTests/MockRepository.swift | 2 +- 24 files changed, 289 insertions(+), 4 deletions(-) create mode 100644 Data/Sources/Data/Common/Mapper.swift rename Data/Sources/Data/{Network => Http}/Api.swift (89%) rename Data/Sources/Data/{Network => Http}/ApiImpl.swift (100%) rename Data/Sources/Data/{Network => Http}/ApiRouter.swift (100%) rename Data/Sources/Data/{Network => Http/DataResponse}/CardDTO.swift (100%) rename Data/Sources/Data/{Network => Http/DataResponse}/CardTransferCountDTO.swift (100%) rename Data/Sources/Data/{Network => Http/DataResponse}/PersonBankAccountDTO.swift (84%) rename Data/Sources/Data/{Network => Http/DataResponse}/PersonDTO.swift (100%) create mode 100644 Data/Sources/Data/Http/Mapper/CardMapper.swift create mode 100644 Data/Sources/Data/Http/Mapper/CardTransferCountMapper.swift create mode 100644 Data/Sources/Data/Http/Mapper/PersonBankAccountMapper.swift create mode 100644 Data/Sources/Data/Http/Mapper/PersonMapper.swift rename Data/Sources/Data/{Network => Http}/NetworkError.swift (100%) create mode 100644 Data/Sources/Data/Repositories/PersonBankAccountRepositoryImpl.swift rename Data/Tests/DataTests/{NetworkTests => HttpTests}/ApiRouterTests.swift (100%) rename Data/Tests/DataTests/{NetworkTests => HttpTests}/ApiTests.swift (100%) rename Data/Tests/DataTests/{NetworkTests => HttpTests}/Mock/ApiMockResponse.swift (100%) rename Data/Tests/DataTests/{NetworkTests => HttpTests}/Mock/BadResponseMockURLProtocol.swift (100%) rename Data/Tests/DataTests/{NetworkTests => HttpTests}/Mock/OfflineServerMockURLProtocol.swift (100%) rename Data/Tests/DataTests/{NetworkTests => HttpTests}/Mock/ResponseMockURLProtocol.swift (100%) create mode 100644 Data/Tests/DataTests/RepositoriesTests/Mock/MockApi.swift create mode 100644 Data/Tests/DataTests/RepositoriesTests/PersonBankAccountRepositoryTests.swift diff --git a/Data/Package.swift b/Data/Package.swift index bcdb3c0..02a4cae 100644 --- a/Data/Package.swift +++ b/Data/Package.swift @@ -23,7 +23,7 @@ let package = Package( // Targets can depend on other targets in this package, and on products in packages this package depends on. .target( name: "Data", - dependencies: ["Alamofire"]), + dependencies: ["Alamofire", "Domain"]), .testTarget( name: "DataTests", dependencies: ["Data"]), diff --git a/Data/Sources/Data/Common/Mapper.swift b/Data/Sources/Data/Common/Mapper.swift new file mode 100644 index 0000000..6ebf7f0 --- /dev/null +++ b/Data/Sources/Data/Common/Mapper.swift @@ -0,0 +1,29 @@ +// +// Mapper.swift +// +// +// Created by Hessam Mahdiabadi on 11/5/23. +// + +import Foundation + +public protocol Mapper { + + associatedtype Entity + associatedtype Dto + + func mapEntityToDto(input: Entity) -> Dto + func mapDtoToEntity(input: Dto) -> Entity +} + +public extension Mapper { + + func mapEntitiesToDtos(input: [Entity]) -> [Dto] { + return input.map { mapEntityToDto(input: $0) } + } + + func mapDtosToEntities(input: [Dto]) -> [Entity] { + return input.map { mapDtoToEntity(input: $0) } + } +} + diff --git a/Data/Sources/Data/Network/Api.swift b/Data/Sources/Data/Http/Api.swift similarity index 89% rename from Data/Sources/Data/Network/Api.swift rename to Data/Sources/Data/Http/Api.swift index b3cd02b..270aca8 100644 --- a/Data/Sources/Data/Network/Api.swift +++ b/Data/Sources/Data/Http/Api.swift @@ -7,7 +7,7 @@ import Foundation -protocol Api { +public protocol Api { func callApi(route: ApiRouter, decodeType type: T.Type) async throws -> T } diff --git a/Data/Sources/Data/Network/ApiImpl.swift b/Data/Sources/Data/Http/ApiImpl.swift similarity index 100% rename from Data/Sources/Data/Network/ApiImpl.swift rename to Data/Sources/Data/Http/ApiImpl.swift diff --git a/Data/Sources/Data/Network/ApiRouter.swift b/Data/Sources/Data/Http/ApiRouter.swift similarity index 100% rename from Data/Sources/Data/Network/ApiRouter.swift rename to Data/Sources/Data/Http/ApiRouter.swift diff --git a/Data/Sources/Data/Network/CardDTO.swift b/Data/Sources/Data/Http/DataResponse/CardDTO.swift similarity index 100% rename from Data/Sources/Data/Network/CardDTO.swift rename to Data/Sources/Data/Http/DataResponse/CardDTO.swift diff --git a/Data/Sources/Data/Network/CardTransferCountDTO.swift b/Data/Sources/Data/Http/DataResponse/CardTransferCountDTO.swift similarity index 100% rename from Data/Sources/Data/Network/CardTransferCountDTO.swift rename to Data/Sources/Data/Http/DataResponse/CardTransferCountDTO.swift diff --git a/Data/Sources/Data/Network/PersonBankAccountDTO.swift b/Data/Sources/Data/Http/DataResponse/PersonBankAccountDTO.swift similarity index 84% rename from Data/Sources/Data/Network/PersonBankAccountDTO.swift rename to Data/Sources/Data/Http/DataResponse/PersonBankAccountDTO.swift index 3b2a675..d2f4f90 100644 --- a/Data/Sources/Data/Network/PersonBankAccountDTO.swift +++ b/Data/Sources/Data/Http/DataResponse/PersonBankAccountDTO.swift @@ -7,7 +7,7 @@ import Foundation -public struct PersonBankAccountDTO: Decodable { +struct PersonBankAccountDTO: Decodable { var person: PersonDTO? var card: CardDTO? diff --git a/Data/Sources/Data/Network/PersonDTO.swift b/Data/Sources/Data/Http/DataResponse/PersonDTO.swift similarity index 100% rename from Data/Sources/Data/Network/PersonDTO.swift rename to Data/Sources/Data/Http/DataResponse/PersonDTO.swift diff --git a/Data/Sources/Data/Http/Mapper/CardMapper.swift b/Data/Sources/Data/Http/Mapper/CardMapper.swift new file mode 100644 index 0000000..371895c --- /dev/null +++ b/Data/Sources/Data/Http/Mapper/CardMapper.swift @@ -0,0 +1,25 @@ +// +// CardMapper.swift +// +// +// Created by Hessam Mahdiabadi on 11/5/23. +// + +import Foundation +import Domain + +struct CardMapper: Mapper { + + typealias Entity = Card? + typealias Dto = CardDTO? + + func mapDtoToEntity(input: CardDTO?) -> Card? { + guard let input else { return nil } + return .init(cardNumber: input.card_number, cardType: input.card_type) + } + + func mapEntityToDto(input: Card?) -> CardDTO? { + guard let input else { return nil } + return .init(card_number: input.cardNumber, card_type: input.cardType) + } +} diff --git a/Data/Sources/Data/Http/Mapper/CardTransferCountMapper.swift b/Data/Sources/Data/Http/Mapper/CardTransferCountMapper.swift new file mode 100644 index 0000000..3cf421d --- /dev/null +++ b/Data/Sources/Data/Http/Mapper/CardTransferCountMapper.swift @@ -0,0 +1,27 @@ +// +// CardTransferCountMapper.swift +// +// +// Created by Hessam Mahdiabadi on 11/5/23. +// + +import Foundation +import Domain + +struct CardTransferCountMapper: Mapper { + + typealias Entity = CardTransferCount? + typealias Dto = CardTransferCountDTO? + + func mapDtoToEntity(input: CardTransferCountDTO?) -> CardTransferCount? { + guard let input else { return nil } + return .init(numberOfTransfers: input.number_of_transfers, + totalTransfer: input.total_transfer) + } + + func mapEntityToDto(input: CardTransferCount?) -> CardTransferCountDTO? { + guard let input else { return nil } + return .init(number_of_transfers: input.numberOfTransfers, + total_transfer: input.totalTransfer) + } +} diff --git a/Data/Sources/Data/Http/Mapper/PersonBankAccountMapper.swift b/Data/Sources/Data/Http/Mapper/PersonBankAccountMapper.swift new file mode 100644 index 0000000..0d15b59 --- /dev/null +++ b/Data/Sources/Data/Http/Mapper/PersonBankAccountMapper.swift @@ -0,0 +1,42 @@ +// +// PersonBankAccountMapper.swift +// +// +// Created by Hessam Mahdiabadi on 11/5/23. +// + +import Foundation +import Domain + +struct PersonBankAccountMapper: Mapper { + + typealias Entity = PersonBankAccount + typealias Dto = PersonBankAccountDTO + + private let personMapper: PersonMapper + private let cardMapper: CardMapper + private let cardTransferCountMapper: CardTransferCountMapper + + init(personMapper: PersonMapper, cardMapper: CardMapper, + cardTransferCountMapper: CardTransferCountMapper) { + self.personMapper = personMapper + self.cardMapper = cardMapper + self.cardTransferCountMapper = cardTransferCountMapper + } + + func mapDtoToEntity(input: PersonBankAccountDTO) -> PersonBankAccount { + let person = personMapper.mapDtoToEntity(input: input.person) + let card = cardMapper.mapDtoToEntity(input: input.card) + let transferCount = cardTransferCountMapper.mapDtoToEntity(input: input.more_info) + return .init(person: person, card: card, cardTransferCount: transferCount, note: input.note, + lastDateTransfer: input.last_transfer) + } + + func mapEntityToDto(input: PersonBankAccount) -> PersonBankAccountDTO { + let person = personMapper.mapEntityToDto(input: input.person) + let card = cardMapper.mapEntityToDto(input: input.card) + let transferCount = cardTransferCountMapper.mapEntityToDto(input: input.cardTransferCount) + return .init(person: person, card: card, more_info: transferCount, note: input.note, + last_transfer: input.lastDateTransfer) + } +} diff --git a/Data/Sources/Data/Http/Mapper/PersonMapper.swift b/Data/Sources/Data/Http/Mapper/PersonMapper.swift new file mode 100644 index 0000000..7b26946 --- /dev/null +++ b/Data/Sources/Data/Http/Mapper/PersonMapper.swift @@ -0,0 +1,27 @@ +// +// PersonMapper.swift +// +// +// Created by Hessam Mahdiabadi on 11/5/23. +// + +import Foundation +import Domain + +struct PersonMapper: Mapper { + + typealias Entity = Person? + typealias Dto = PersonDTO? + + func mapDtoToEntity(input: PersonDTO?) -> Person? { + guard let input else { return nil } + return .init(name: input.full_name, email: input.email, + avatar: input.avatar) + } + + func mapEntityToDto(input: Person?) -> PersonDTO? { + guard let input else { return nil } + return .init(full_name: input.name, email: input.email, + avatar: input.avatar) + } +} diff --git a/Data/Sources/Data/Network/NetworkError.swift b/Data/Sources/Data/Http/NetworkError.swift similarity index 100% rename from Data/Sources/Data/Network/NetworkError.swift rename to Data/Sources/Data/Http/NetworkError.swift diff --git a/Data/Sources/Data/Repositories/PersonBankAccountRepositoryImpl.swift b/Data/Sources/Data/Repositories/PersonBankAccountRepositoryImpl.swift new file mode 100644 index 0000000..ecbbedd --- /dev/null +++ b/Data/Sources/Data/Repositories/PersonBankAccountRepositoryImpl.swift @@ -0,0 +1,44 @@ +// +// PersonBankAccountRepositoryImpl.swift +// +// +// Created by Hessam Mahdiabadi on 11/5/23. +// + +import Foundation +import Domain + +public class PersonBankAccountRepositoryImpl: PersonBankAccountRepository { + + private var api: Api + private let mapper: PersonBankAccountMapper + + public init(api: Api) { + self.api = api + mapper = .init(personMapper: .init(), + cardMapper: .init(), + cardTransferCountMapper: .init()) + } + + public func fetchPersonAccounts(withOffest offset: Int) async throws -> [Domain.PersonBankAccount] { + let accounts = try await api.callApi(route: .transferList(offset: offset), + decodeType: [PersonBankAccountDTO].self) + return mapper.mapDtosToEntities(input: accounts) + } + + public func fetchFavoritePersonAccounts() async throws -> [Domain.PersonBankAccount] { + fatalError() + } + + public func savePersonAccountToFavorites(_ personBankAccount: Domain.PersonBankAccount) async throws -> Domain.PersonBankAccount { + fatalError() + } + + public func removePersonAccountFromFavorites(_ personBankAccount: Domain.PersonBankAccount) async throws -> Domain.PersonBankAccount { + fatalError() + } + + public func updatefavoriteStatusForPersonAccount(_ personBankAccount: Domain.PersonBankAccount) async -> Domain.PersonBankAccount { + fatalError() + } +} diff --git a/Data/Tests/DataTests/NetworkTests/ApiRouterTests.swift b/Data/Tests/DataTests/HttpTests/ApiRouterTests.swift similarity index 100% rename from Data/Tests/DataTests/NetworkTests/ApiRouterTests.swift rename to Data/Tests/DataTests/HttpTests/ApiRouterTests.swift diff --git a/Data/Tests/DataTests/NetworkTests/ApiTests.swift b/Data/Tests/DataTests/HttpTests/ApiTests.swift similarity index 100% rename from Data/Tests/DataTests/NetworkTests/ApiTests.swift rename to Data/Tests/DataTests/HttpTests/ApiTests.swift diff --git a/Data/Tests/DataTests/NetworkTests/Mock/ApiMockResponse.swift b/Data/Tests/DataTests/HttpTests/Mock/ApiMockResponse.swift similarity index 100% rename from Data/Tests/DataTests/NetworkTests/Mock/ApiMockResponse.swift rename to Data/Tests/DataTests/HttpTests/Mock/ApiMockResponse.swift diff --git a/Data/Tests/DataTests/NetworkTests/Mock/BadResponseMockURLProtocol.swift b/Data/Tests/DataTests/HttpTests/Mock/BadResponseMockURLProtocol.swift similarity index 100% rename from Data/Tests/DataTests/NetworkTests/Mock/BadResponseMockURLProtocol.swift rename to Data/Tests/DataTests/HttpTests/Mock/BadResponseMockURLProtocol.swift diff --git a/Data/Tests/DataTests/NetworkTests/Mock/OfflineServerMockURLProtocol.swift b/Data/Tests/DataTests/HttpTests/Mock/OfflineServerMockURLProtocol.swift similarity index 100% rename from Data/Tests/DataTests/NetworkTests/Mock/OfflineServerMockURLProtocol.swift rename to Data/Tests/DataTests/HttpTests/Mock/OfflineServerMockURLProtocol.swift diff --git a/Data/Tests/DataTests/NetworkTests/Mock/ResponseMockURLProtocol.swift b/Data/Tests/DataTests/HttpTests/Mock/ResponseMockURLProtocol.swift similarity index 100% rename from Data/Tests/DataTests/NetworkTests/Mock/ResponseMockURLProtocol.swift rename to Data/Tests/DataTests/HttpTests/Mock/ResponseMockURLProtocol.swift diff --git a/Data/Tests/DataTests/RepositoriesTests/Mock/MockApi.swift b/Data/Tests/DataTests/RepositoriesTests/Mock/MockApi.swift new file mode 100644 index 0000000..d10ef81 --- /dev/null +++ b/Data/Tests/DataTests/RepositoriesTests/Mock/MockApi.swift @@ -0,0 +1,35 @@ +// +// File.swift +// +// +// Created by Hessam Mahdiabadi on 11/5/23. +// + +import Foundation +@testable import Data + +final class MockApi: Api { + + func callApi(route: ApiRouter, decodeType type: T.Type) async throws -> T where T : Decodable { + let person = PersonDTO(full_name: "hessam", email: "h.mahdi", avatar: nil) + let card = CardDTO(card_number: "123", card_type: "master") + let cardCount = CardTransferCountDTO(number_of_transfers: 12, total_transfer: 12) + let note = "note" + let account = PersonBankAccountDTO(person: person, card: card, + more_info: cardCount, note: note, + last_transfer: nil) + + guard let retVal = [account] as? T else { + throw NetworkError.cannotParseJson + } + + return retVal + } +} + +final class MockFailConnectToServerApi: Api { + + func callApi(route: ApiRouter, decodeType type: T.Type) async throws -> T where T : Decodable { + throw NetworkError.cannotConnectToServer + } +} diff --git a/Data/Tests/DataTests/RepositoriesTests/PersonBankAccountRepositoryTests.swift b/Data/Tests/DataTests/RepositoriesTests/PersonBankAccountRepositoryTests.swift new file mode 100644 index 0000000..9cf0cbc --- /dev/null +++ b/Data/Tests/DataTests/RepositoriesTests/PersonBankAccountRepositoryTests.swift @@ -0,0 +1,56 @@ +// +// PersonBankAccountRepositoryTests.swift +// +// +// Created by Hessam Mahdiabadi on 11/5/23. +// + +import XCTest +import Domain +@testable import Data + +final class PersonBankAccountRepositoryTests: XCTestCase { + + var repository: PersonBankAccountRepository! + + override func tearDown() { + repository = nil + } + + func testSuccessFetchMediaList() async { + + // given + repository = PersonBankAccountRepositoryImpl(api: MockApi()) + + do { + // when + let accounts = try await repository.fetchPersonAccounts(withOffest: 10) + + // then + XCTAssertEqual(accounts.count, 1) + XCTAssertEqual(accounts.first?.person?.name, "hessam") + XCTAssertEqual(accounts.first?.person?.email, "h.mahdi") + XCTAssertEqual(accounts.first?.card?.cardNumber, "123") + + } catch { + // then + XCTAssertNil(error) + } + } + + func testFailFetchMediaList() async { + + // given + repository = PersonBankAccountRepositoryImpl(api: MockFailConnectToServerApi()) + + do { + // when + let _ = try await repository.fetchPersonAccounts(withOffest: 10) + + } catch { + + // then + XCTAssertNotNil(error) + } + } +} diff --git a/Domain/Tests/DomainTests/UseCasesTests/MockRepository.swift b/Domain/Tests/DomainTests/UseCasesTests/MockRepository.swift index f073348..77c6cc5 100644 --- a/Domain/Tests/DomainTests/UseCasesTests/MockRepository.swift +++ b/Domain/Tests/DomainTests/UseCasesTests/MockRepository.swift @@ -11,7 +11,7 @@ import Foundation class MockPersonBankAccountRepository: PersonBankAccountRepository { func createMockPersonAccount() -> PersonBankAccount { - let person = Person(name: "hessam", emial: "h.mahdi", avatar: nil) + let person = Person(name: "hessam", email: "h.mahdi", avatar: nil) let card = Card(cardNumber: "123", cardType: "master") let cardCount = CardTransferCount(numberOfTransfers: 12, totalTransfer: 12) let note = "note" From b12c3fcf93d528440b688490bbf834877ff8cec2 Mon Sep 17 00:00:00 2001 From: Hessam Mahdiabadi <67460597+iamHEssam@users.noreply.github.com> Date: Sun, 5 Nov 2023 12:03:40 +0330 Subject: [PATCH 08/34] Add Database Protocol and Error Handling - Added a Database protocol for repository usage. - Added a Database Error for improved error handling. --- Data/Sources/Data/Local/Database.swift | 40 +++++++++++++++++++ Data/Sources/Data/Local/DatabaseError.swift | 23 +++++++++++ Data/Sources/Data/Local/DatabaseImpl.swift | 43 +++++++++++++++++++++ 3 files changed, 106 insertions(+) create mode 100644 Data/Sources/Data/Local/Database.swift create mode 100644 Data/Sources/Data/Local/DatabaseError.swift create mode 100644 Data/Sources/Data/Local/DatabaseImpl.swift diff --git a/Data/Sources/Data/Local/Database.swift b/Data/Sources/Data/Local/Database.swift new file mode 100644 index 0000000..8ed3762 --- /dev/null +++ b/Data/Sources/Data/Local/Database.swift @@ -0,0 +1,40 @@ +// +// Database.swift +// +// +// Created by Hessam Mahdiabadi on 11/5/23. +// + +import Foundation +import CoreData + +public protocol Database { + + var persistentContainer: NSPersistentContainer! { get } + var viewContext: NSManagedObjectContext { get } + var backgroundContext: NSManagedObjectContext { get } + func saveContext() throws + func saveBackgroundContext() throws +} + +public extension Database { + + func saveContext() throws { + guard viewContext.hasChanges else { return } + do { + try viewContext.save() + } catch { + throw DatabaseError.unexpectedError + } + } + + func saveBackgroundContext() throws { + guard backgroundContext.hasChanges else { return } + do { + try backgroundContext.save() + try saveContext() + } catch { + throw DatabaseError.unexpectedError + } + } +} diff --git a/Data/Sources/Data/Local/DatabaseError.swift b/Data/Sources/Data/Local/DatabaseError.swift new file mode 100644 index 0000000..0fac364 --- /dev/null +++ b/Data/Sources/Data/Local/DatabaseError.swift @@ -0,0 +1,23 @@ +// +// DatabaseError.swift +// +// +// Created by Hessam Mahdiabadi on 11/5/23. +// + +import Foundation + +enum DatabaseError: Error { + + case unexpectedError + case cannotSavePersonAccountToFavorites + case cannotRemovePersonAccountFromFavorites + + var errorDescription: String? { + switch self { + case .unexpectedError: return "You seem to be offline!" + case .cannotSavePersonAccountToFavorites: return "Failed to save person accounts to favorites" + case .cannotRemovePersonAccountFromFavorites: return "Failed to remove person account from favorites" + } + } +} diff --git a/Data/Sources/Data/Local/DatabaseImpl.swift b/Data/Sources/Data/Local/DatabaseImpl.swift new file mode 100644 index 0000000..6ef2a20 --- /dev/null +++ b/Data/Sources/Data/Local/DatabaseImpl.swift @@ -0,0 +1,43 @@ +// +// DatabaseImpl.swift +// +// +// Created by Hessam Mahdiabadi on 11/5/23. +// + +import Foundation +import CoreData + +public class DatabaseImpl: Database { + + private let modelName = "db" + public private(set) var persistentContainer: NSPersistentContainer! + + public required init() { + setupPersistentContainer() + } + + lazy public var viewContext: NSManagedObjectContext = { + let context = persistentContainer.viewContext + return context + }() + + lazy public var backgroundContext: NSManagedObjectContext = { + let context = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType) + context.parent = viewContext + context.automaticallyMergesChangesFromParent = true + context.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy + return context + }() + + private func setupPersistentContainer() { + let container = NSPersistentContainer(name: modelName) + container.loadPersistentStores(completionHandler: { _, error in + if let error = error as NSError? { + fatalError("Unresolved error \(error), \(error.userInfo)") + } + }) + + persistentContainer = container + } +} From 7fc9d28fbfec56858cc3322c7aa6a8a1d8b8d921 Mon Sep 17 00:00:00 2001 From: Hessam Mahdiabadi <67460597+iamHEssam@users.noreply.github.com> Date: Sun, 5 Nov 2023 15:25:57 +0330 Subject: [PATCH 09/34] Add Core Data Transformer, Convert DTOs to Classes, and Implement Persistent Container - Added a Core Data transformer for saving custom objects. - Converted `CardDTO`, `PersonDTO`, and `CardTransferCountDTO` to classes. - Added the Persistent Container for Core Data usage in the Swift Package Manager. --- .../Data/Http/DataResponse/CardDTO.swift | 27 +++++- .../DataResponse/CardTransferCountDTO.swift | 27 +++++- .../Data/Http/DataResponse/PersonDTO.swift | 32 ++++++- Data/Sources/Data/Local/Database.swift | 3 +- Data/Sources/Data/Local/DatabaseImpl.swift | 21 +++-- ...ersonBankAccountEntity+CoreDataClass.swift | 15 ++++ ...BankAccountEntity+CoreDataProperties.swift | 34 +++++++ .../Data/Local/PersistentContainer.swift | 11 +++ .../Transformer/CardDTOTransformer.swift | 24 +++++ .../CardTransferCountDTOTransformer.swift | 24 +++++ .../Transformer/PersonDTOTransformer.swift | 24 +++++ .../db.xcdatamodeld/db.xcdatamodel/contents | 11 +++ .../DataTests/LocalTests/DatabaseTests.swift | 90 +++++++++++++++++++ .../LocalTests/Mock/MockDatabase.swift | 44 +++++++++ .../xcschemes/xcschememanagement.plist | 2 +- .../db.xcdatamodeld/db.xcdatamodel/contents | 2 + 16 files changed, 378 insertions(+), 13 deletions(-) create mode 100644 Data/Sources/Data/Local/ManagedObject/PersonBankAccountEntity+CoreDataClass.swift create mode 100644 Data/Sources/Data/Local/ManagedObject/PersonBankAccountEntity+CoreDataProperties.swift create mode 100644 Data/Sources/Data/Local/PersistentContainer.swift create mode 100644 Data/Sources/Data/Local/Transformer/CardDTOTransformer.swift create mode 100644 Data/Sources/Data/Local/Transformer/CardTransferCountDTOTransformer.swift create mode 100644 Data/Sources/Data/Local/Transformer/PersonDTOTransformer.swift create mode 100644 Data/Sources/Data/Local/db.xcdatamodeld/db.xcdatamodel/contents create mode 100644 Data/Tests/DataTests/LocalTests/DatabaseTests.swift create mode 100644 Data/Tests/DataTests/LocalTests/Mock/MockDatabase.swift create mode 100644 TransferList/db.xcdatamodeld/db.xcdatamodel/contents diff --git a/Data/Sources/Data/Http/DataResponse/CardDTO.swift b/Data/Sources/Data/Http/DataResponse/CardDTO.swift index 9805228..7515bdb 100644 --- a/Data/Sources/Data/Http/DataResponse/CardDTO.swift +++ b/Data/Sources/Data/Http/DataResponse/CardDTO.swift @@ -7,8 +7,33 @@ import Foundation -struct CardDTO: Decodable { +class CardDTO: NSObject, NSSecureCoding, Decodable { + enum Key: String { + case cardNumber + case cardType + } + + static var supportsSecureCoding: Bool = true var card_number: String? var card_type: String? + + init(card_number: String? = nil, card_type: String? = nil) { + self.card_number = card_number + self.card_type = card_type + } + + func encode(with coder: NSCoder) { + coder.encode(card_number, forKey: Key.cardNumber.rawValue) + coder.encode(card_type, forKey: Key.cardType.rawValue) + } + + required convenience init?(coder: NSCoder) { + let card_number = coder.decodeObject(of: NSString.self, + forKey: Key.cardNumber.rawValue) as? String + let card_type = coder.decodeObject(of: NSString.self, + forKey: Key.cardType.rawValue) as? String + + self.init(card_number: card_number, card_type: card_type) + } } diff --git a/Data/Sources/Data/Http/DataResponse/CardTransferCountDTO.swift b/Data/Sources/Data/Http/DataResponse/CardTransferCountDTO.swift index d7b26f0..b19f0d4 100644 --- a/Data/Sources/Data/Http/DataResponse/CardTransferCountDTO.swift +++ b/Data/Sources/Data/Http/DataResponse/CardTransferCountDTO.swift @@ -7,8 +7,33 @@ import Foundation -struct CardTransferCountDTO: Decodable { +class CardTransferCountDTO: NSObject, NSSecureCoding, Decodable { + enum Key: String { + case numberOfTransfers + case totalTransfer + } + + static var supportsSecureCoding: Bool = true var number_of_transfers: Int? var total_transfer: Int? + + init(number_of_transfers: Int? = nil, total_transfer: Int? = nil) { + self.number_of_transfers = number_of_transfers + self.total_transfer = total_transfer + } + + func encode(with coder: NSCoder) { + coder.encode(number_of_transfers, forKey: Key.numberOfTransfers.rawValue) + coder.encode(total_transfer, forKey: Key.totalTransfer.rawValue) + } + + required convenience init?(coder: NSCoder) { + let number_of_transfers = coder.decodeObject(of: NSNumber.self, + forKey: Key.numberOfTransfers.rawValue)?.intValue + let total_transfer = coder.decodeObject(of: NSNumber.self, + forKey: Key.totalTransfer.rawValue)?.intValue + + self.init(number_of_transfers: number_of_transfers, total_transfer: total_transfer) + } } diff --git a/Data/Sources/Data/Http/DataResponse/PersonDTO.swift b/Data/Sources/Data/Http/DataResponse/PersonDTO.swift index b4fdb30..06d0be7 100644 --- a/Data/Sources/Data/Http/DataResponse/PersonDTO.swift +++ b/Data/Sources/Data/Http/DataResponse/PersonDTO.swift @@ -7,9 +7,39 @@ import Foundation -struct PersonDTO: Decodable { +class PersonDTO: NSObject, NSSecureCoding, Decodable { + enum Key: String { + case fullName + case email + case avatar + } + + static var supportsSecureCoding: Bool = true var full_name: String? var email: String? var avatar: String? + + init(full_name: String? = nil, email: String? = nil, avatar: String? = nil) { + self.full_name = full_name + self.email = email + self.avatar = avatar + } + + func encode(with coder: NSCoder) { + coder.encode(full_name, forKey: Key.fullName.rawValue) + coder.encode(email, forKey: Key.email.rawValue) + coder.encode(avatar, forKey: Key.avatar.rawValue) + } + + required convenience init?(coder: NSCoder) { + let full_name = coder.decodeObject(of: NSString.self, + forKey: Key.fullName.rawValue) as? String + let email = coder.decodeObject(of: NSString.self, + forKey: Key.email.rawValue) as? String + let avatar = coder.decodeObject(of: NSString.self, + forKey: Key.avatar.rawValue) as? String + + self.init(full_name: full_name, email: email, avatar: avatar) + } } diff --git a/Data/Sources/Data/Local/Database.swift b/Data/Sources/Data/Local/Database.swift index 8ed3762..3a1709b 100644 --- a/Data/Sources/Data/Local/Database.swift +++ b/Data/Sources/Data/Local/Database.swift @@ -10,8 +10,7 @@ import CoreData public protocol Database { - var persistentContainer: NSPersistentContainer! { get } - var viewContext: NSManagedObjectContext { get } + var viewContext: NSManagedObjectContext { set get } var backgroundContext: NSManagedObjectContext { get } func saveContext() throws func saveBackgroundContext() throws diff --git a/Data/Sources/Data/Local/DatabaseImpl.swift b/Data/Sources/Data/Local/DatabaseImpl.swift index 6ef2a20..3bad091 100644 --- a/Data/Sources/Data/Local/DatabaseImpl.swift +++ b/Data/Sources/Data/Local/DatabaseImpl.swift @@ -10,19 +10,23 @@ import CoreData public class DatabaseImpl: Database { - private let modelName = "db" - public private(set) var persistentContainer: NSPersistentContainer! + private(set) var modelName = "db" + private var persistentContainer: PersistentContainer! - public required init() { + public required init() { setupPersistentContainer() + + PersonDTOTransformer.register() + CardDTOTransformer.register() + CardTransferCountDTOTransformer.register() } - lazy public var viewContext: NSManagedObjectContext = { + public lazy var viewContext: NSManagedObjectContext = { let context = persistentContainer.viewContext return context }() - lazy public var backgroundContext: NSManagedObjectContext = { + public lazy var backgroundContext: NSManagedObjectContext = { let context = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType) context.parent = viewContext context.automaticallyMergesChangesFromParent = true @@ -31,13 +35,16 @@ public class DatabaseImpl: Database { }() private func setupPersistentContainer() { - let container = NSPersistentContainer(name: modelName) + guard let modelURL = Bundle.module.url(forResource: modelName, withExtension: "momd") else { return } + guard let model = NSManagedObjectModel(contentsOf: modelURL) else { return } + + let container = PersistentContainer(name: modelName, managedObjectModel: model) container.loadPersistentStores(completionHandler: { _, error in if let error = error as NSError? { fatalError("Unresolved error \(error), \(error.userInfo)") } }) - + persistentContainer = container } } diff --git a/Data/Sources/Data/Local/ManagedObject/PersonBankAccountEntity+CoreDataClass.swift b/Data/Sources/Data/Local/ManagedObject/PersonBankAccountEntity+CoreDataClass.swift new file mode 100644 index 0000000..3ceca85 --- /dev/null +++ b/Data/Sources/Data/Local/ManagedObject/PersonBankAccountEntity+CoreDataClass.swift @@ -0,0 +1,15 @@ +// +// PersonBankAccountEntity+CoreDataClass.swift +// TransferList +// +// Created by Hessam Mahdiabadi on 11/5/23. +// +// + +import Foundation +import CoreData + +@objc(PersonBankAccountEntity) +public class PersonBankAccountEntity: NSManagedObject { + +} diff --git a/Data/Sources/Data/Local/ManagedObject/PersonBankAccountEntity+CoreDataProperties.swift b/Data/Sources/Data/Local/ManagedObject/PersonBankAccountEntity+CoreDataProperties.swift new file mode 100644 index 0000000..eb6d5ea --- /dev/null +++ b/Data/Sources/Data/Local/ManagedObject/PersonBankAccountEntity+CoreDataProperties.swift @@ -0,0 +1,34 @@ +// +// PersonBankAccountEntity+CoreDataProperties.swift +// TransferList +// +// Created by Hessam Mahdiabadi on 11/5/23. +// +// + +import Foundation +import CoreData + +extension PersonBankAccountEntity { + + @nonobjc public class func fetchRequest() -> NSFetchRequest { + return NSFetchRequest(entityName: "PersonBankAccountEntity") + } + + @NSManaged public var note: String? + @NSManaged public var lastTransfer: Date? + @NSManaged public var dateSaved: Date? + @NSManaged var person: PersonDTO? + @NSManaged var card: CardDTO? + @NSManaged var more_info: CardTransferCountDTO? + +} + +extension PersonBankAccountEntity: Identifiable {} + +extension PersonBankAccountEntity { + + static var sortDescriptor: NSSortDescriptor { + NSSortDescriptor(key: #keyPath(PersonBankAccountEntity.dateSaved), ascending: false) + } +} diff --git a/Data/Sources/Data/Local/PersistentContainer.swift b/Data/Sources/Data/Local/PersistentContainer.swift new file mode 100644 index 0000000..5f78e1e --- /dev/null +++ b/Data/Sources/Data/Local/PersistentContainer.swift @@ -0,0 +1,11 @@ +// +// PersistentContainer.swift +// +// +// Created by Hessam Mahdiabadi on 11/5/23. +// + +import Foundation +import CoreData + +public class PersistentContainer: NSPersistentContainer {} diff --git a/Data/Sources/Data/Local/Transformer/CardDTOTransformer.swift b/Data/Sources/Data/Local/Transformer/CardDTOTransformer.swift new file mode 100644 index 0000000..0fd4095 --- /dev/null +++ b/Data/Sources/Data/Local/Transformer/CardDTOTransformer.swift @@ -0,0 +1,24 @@ +// +// CardDTOTransformer.swift +// +// +// Created by Hessam Mahdiabadi on 11/5/23. +// + +import Foundation + +@objc(CardDTOTransformer) +class CardDTOTransformer: NSSecureUnarchiveFromDataTransformer { + + override class var allowedTopLevelClasses: [AnyClass] { + return [CardDTO.self] + } + + static func register() { + let className = String(describing: CardDTOTransformer.self) + let name = NSValueTransformerName(className) + + let transformer = CardDTOTransformer() + ValueTransformer.setValueTransformer(transformer, forName: name) + } +} diff --git a/Data/Sources/Data/Local/Transformer/CardTransferCountDTOTransformer.swift b/Data/Sources/Data/Local/Transformer/CardTransferCountDTOTransformer.swift new file mode 100644 index 0000000..8fac661 --- /dev/null +++ b/Data/Sources/Data/Local/Transformer/CardTransferCountDTOTransformer.swift @@ -0,0 +1,24 @@ +// +// CardTransferCountDTOTransformer.swift +// +// +// Created by Hessam Mahdiabadi on 11/5/23. +// + +import Foundation + +@objc(CardTransferCountDTOTransformer) +class CardTransferCountDTOTransformer: NSSecureUnarchiveFromDataTransformer { + + override class var allowedTopLevelClasses: [AnyClass] { + return [CardTransferCountDTO.self] + } + + static func register() { + let className = String(describing: CardTransferCountDTOTransformer.self) + let name = NSValueTransformerName(className) + + let transformer = CardTransferCountDTOTransformer() + ValueTransformer.setValueTransformer(transformer, forName: name) + } +} diff --git a/Data/Sources/Data/Local/Transformer/PersonDTOTransformer.swift b/Data/Sources/Data/Local/Transformer/PersonDTOTransformer.swift new file mode 100644 index 0000000..07b920d --- /dev/null +++ b/Data/Sources/Data/Local/Transformer/PersonDTOTransformer.swift @@ -0,0 +1,24 @@ +// +// PersonDTOTransformer.swift +// +// +// Created by Hessam Mahdiabadi on 11/5/23. +// + +import Foundation + +@objc(PersonDTOTransformer) +class PersonDTOTransformer: NSSecureUnarchiveFromDataTransformer { + + override class var allowedTopLevelClasses: [AnyClass] { + return [PersonDTO.self] + } + + static func register() { + let className = String(describing: PersonDTOTransformer.self) + let name = NSValueTransformerName(className) + + let transformer = PersonDTOTransformer() + ValueTransformer.setValueTransformer(transformer, forName: name) + } +} diff --git a/Data/Sources/Data/Local/db.xcdatamodeld/db.xcdatamodel/contents b/Data/Sources/Data/Local/db.xcdatamodeld/db.xcdatamodel/contents new file mode 100644 index 0000000..be8f753 --- /dev/null +++ b/Data/Sources/Data/Local/db.xcdatamodeld/db.xcdatamodel/contents @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/Data/Tests/DataTests/LocalTests/DatabaseTests.swift b/Data/Tests/DataTests/LocalTests/DatabaseTests.swift new file mode 100644 index 0000000..cf6cb92 --- /dev/null +++ b/Data/Tests/DataTests/LocalTests/DatabaseTests.swift @@ -0,0 +1,90 @@ +// +// DatabaseTests.swift +// +// +// Created by Hessam Mahdiabadi on 11/5/23. +// + +import XCTest +@testable import Data +import CoreData + +final class DatabaseTests: XCTestCase { + + var database: Database! + + override func tearDown() { + database = nil + } + + private func createPersonAccountEntity(inContext: NSManagedObjectContext) { + let account = PersonBankAccountEntity(context: inContext) + let dateSaved = Date() + let note = "note" + account.dateSaved = dateSaved + account.note = note + account.lastTransfer = nil + account.person = PersonDTO(full_name: "hessam", email: "h.mahdi", avatar: nil) + account.card = .init(card_number: "123", card_type: "master") + account.more_info = .init(number_of_transfers: 1, total_transfer: nil) + } + + func testSavePersonAccount() { + database = MockDatabase() + + database.backgroundContext.performAndWait { + createPersonAccountEntity(inContext: database.backgroundContext) + + do { + try database.saveBackgroundContext() + + let fetchRequest: + NSFetchRequest = PersonBankAccountEntity.fetchRequest() + let sort = PersonBankAccountEntity.sortDescriptor + fetchRequest.sortDescriptors = [sort] + + let results = try database.backgroundContext.fetch(fetchRequest) + if results.isEmpty { + throw DatabaseError.unexpectedError + } else { + + XCTAssertEqual(results.count, 1) + XCTAssertEqual(results.first?.note, "note") + XCTAssertEqual(results.first?.person?.full_name, "hessam") + XCTAssertEqual(results.first?.card?.card_number, "123") + XCTAssertEqual(results.first?.more_info?.number_of_transfers, 1) + } + + } catch { + XCTAssertNil(error) + } + } + } + + func testRemovePersonAccount() { + database = MockDatabase() + + database.backgroundContext.performAndWait { + createPersonAccountEntity(inContext: database.backgroundContext) + + do { + try database.saveBackgroundContext() + + let fetchRequest: + NSFetchRequest = PersonBankAccountEntity.fetchRequest() + let sort = PersonBankAccountEntity.sortDescriptor + fetchRequest.sortDescriptors = [sort] + + let account = try database.backgroundContext.fetch(fetchRequest).first! + + database.backgroundContext.delete(account) + + let results = try database.backgroundContext.fetch(fetchRequest) + XCTAssertTrue(results.isEmpty) + + } catch { + XCTAssertNil(error) + } + } + } +} diff --git a/Data/Tests/DataTests/LocalTests/Mock/MockDatabase.swift b/Data/Tests/DataTests/LocalTests/Mock/MockDatabase.swift new file mode 100644 index 0000000..697715f --- /dev/null +++ b/Data/Tests/DataTests/LocalTests/Mock/MockDatabase.swift @@ -0,0 +1,44 @@ +// +// MockDatabase.swift +// +// +// Created by Hessam Mahdiabadi on 11/5/23. +// + +import Foundation +import CoreData +@testable import Data + +final class MockDatabase: DatabaseImpl { + + required init() { + super.init() + + viewContext = createInMemoryViewContext() + } + + private func createInMemoryViewContext() -> NSManagedObjectContext { + let context = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType) + context.persistentStoreCoordinator = self.persistentStoreCoordinator + return context + } + + private lazy var managedObjectModel: NSManagedObjectModel = { + let modelURL = Bundle.module.url(forResource: modelName, withExtension: "momd")! + return NSManagedObjectModel(contentsOf: modelURL)! + }() + + private lazy var persistentStoreCoordinator: NSPersistentStoreCoordinator = { + let coordinator = NSPersistentStoreCoordinator(managedObjectModel: managedObjectModel) + do { + try coordinator.addPersistentStore(ofType: NSInMemoryStoreType, + configurationName: nil, + at: nil, + options: nil) + } catch { + fatalError("Failed to initialize in-memory store type: \(error)") + } + return coordinator + }() +} + diff --git a/TransferList.xcodeproj/xcuserdata/hessam.xcuserdatad/xcschemes/xcschememanagement.plist b/TransferList.xcodeproj/xcuserdata/hessam.xcuserdatad/xcschemes/xcschememanagement.plist index 5eb9d26..7e70a09 100644 --- a/TransferList.xcodeproj/xcuserdata/hessam.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/TransferList.xcodeproj/xcuserdata/hessam.xcuserdatad/xcschemes/xcschememanagement.plist @@ -7,7 +7,7 @@ TransferList.xcscheme_^#shared#^_ orderHint - 3 + 2 diff --git a/TransferList/db.xcdatamodeld/db.xcdatamodel/contents b/TransferList/db.xcdatamodeld/db.xcdatamodel/contents new file mode 100644 index 0000000..9ce099f --- /dev/null +++ b/TransferList/db.xcdatamodeld/db.xcdatamodel/contents @@ -0,0 +1,2 @@ + + \ No newline at end of file From 4f4eb30ff1175066b5a1ce50a86a140aebee94a6 Mon Sep 17 00:00:00 2001 From: Hessam Mahdiabadi <67460597+iamHEssam@users.noreply.github.com> Date: Sun, 5 Nov 2023 19:39:53 +0330 Subject: [PATCH 10/34] Add One-to-One Relationships, Local Protocol, and New Database Entities - Added one-to-one relationships between accounts, persons, and cards to facilitate filtering. - Added a Local protocol for repository usage. - Added two new entities in the schema database. --- .../Data/Http/DataResponse/CardDTO.swift | 27 +-- .../DataResponse/PersonBankAccountDTO.swift | 1 + .../Data/Http/DataResponse/PersonDTO.swift | 32 +--- .../Data/Local/{ => Database}/Database.swift | 0 .../Data/Local/Database/DatabaseError.swift | 17 ++ .../Local/{ => Database}/DatabaseImpl.swift | 2 - .../CardEntity+CoreDataClass.swift | 15 ++ .../CardEntity+CoreDataProperties.swift | 22 +++ ...ersonBankAccountEntity+CoreDataClass.swift | 0 ...BankAccountEntity+CoreDataProperties.swift | 14 +- .../PersonEntity+CoreDataClass.swift | 15 ++ .../PersonEntity+CoreDataProperties.swift | 23 +++ .../Database/Mapper/CardEntityMapper.swift | 35 ++++ .../PersonBankAccountEntityMapper.swift | 47 ++++++ .../Database/Mapper/PersonEntityMapper.swift | 37 +++++ .../{ => Database}/PersistentContainer.swift | 0 .../CardTransferCountDTOTransformer.swift | 0 .../db.xcdatamodeld/db.xcdatamodel/contents | 23 +++ Data/Sources/Data/Local/Local.swift | 16 ++ .../{DatabaseError.swift => LocalError.swift} | 8 +- Data/Sources/Data/Local/LocalImpl.swift | 154 ++++++++++++++++++ .../Transformer/CardDTOTransformer.swift | 24 --- .../Transformer/PersonDTOTransformer.swift | 24 --- .../db.xcdatamodeld/db.xcdatamodel/contents | 11 -- .../{ => DatabaseTests}/DatabaseTests.swift | 18 +- .../DataTests/LocalTests/LocalTests.swift | 83 ++++++++++ .../xcschemes/xcschememanagement.plist | 2 +- 27 files changed, 515 insertions(+), 135 deletions(-) rename Data/Sources/Data/Local/{ => Database}/Database.swift (100%) create mode 100644 Data/Sources/Data/Local/Database/DatabaseError.swift rename Data/Sources/Data/Local/{ => Database}/DatabaseImpl.swift (95%) create mode 100644 Data/Sources/Data/Local/Database/ManagedObject/CardEntity+CoreDataClass.swift create mode 100644 Data/Sources/Data/Local/Database/ManagedObject/CardEntity+CoreDataProperties.swift rename Data/Sources/Data/Local/{ => Database}/ManagedObject/PersonBankAccountEntity+CoreDataClass.swift (100%) rename Data/Sources/Data/Local/{ => Database}/ManagedObject/PersonBankAccountEntity+CoreDataProperties.swift (71%) create mode 100644 Data/Sources/Data/Local/Database/ManagedObject/PersonEntity+CoreDataClass.swift create mode 100644 Data/Sources/Data/Local/Database/ManagedObject/PersonEntity+CoreDataProperties.swift create mode 100644 Data/Sources/Data/Local/Database/Mapper/CardEntityMapper.swift create mode 100644 Data/Sources/Data/Local/Database/Mapper/PersonBankAccountEntityMapper.swift create mode 100644 Data/Sources/Data/Local/Database/Mapper/PersonEntityMapper.swift rename Data/Sources/Data/Local/{ => Database}/PersistentContainer.swift (100%) rename Data/Sources/Data/Local/{ => Database}/Transformer/CardTransferCountDTOTransformer.swift (100%) create mode 100644 Data/Sources/Data/Local/Database/db.xcdatamodeld/db.xcdatamodel/contents create mode 100644 Data/Sources/Data/Local/Local.swift rename Data/Sources/Data/Local/{DatabaseError.swift => LocalError.swift} (75%) create mode 100644 Data/Sources/Data/Local/LocalImpl.swift delete mode 100644 Data/Sources/Data/Local/Transformer/CardDTOTransformer.swift delete mode 100644 Data/Sources/Data/Local/Transformer/PersonDTOTransformer.swift delete mode 100644 Data/Sources/Data/Local/db.xcdatamodeld/db.xcdatamodel/contents rename Data/Tests/DataTests/LocalTests/{ => DatabaseTests}/DatabaseTests.swift (84%) create mode 100644 Data/Tests/DataTests/LocalTests/LocalTests.swift diff --git a/Data/Sources/Data/Http/DataResponse/CardDTO.swift b/Data/Sources/Data/Http/DataResponse/CardDTO.swift index 7515bdb..9805228 100644 --- a/Data/Sources/Data/Http/DataResponse/CardDTO.swift +++ b/Data/Sources/Data/Http/DataResponse/CardDTO.swift @@ -7,33 +7,8 @@ import Foundation -class CardDTO: NSObject, NSSecureCoding, Decodable { +struct CardDTO: Decodable { - enum Key: String { - case cardNumber - case cardType - } - - static var supportsSecureCoding: Bool = true var card_number: String? var card_type: String? - - init(card_number: String? = nil, card_type: String? = nil) { - self.card_number = card_number - self.card_type = card_type - } - - func encode(with coder: NSCoder) { - coder.encode(card_number, forKey: Key.cardNumber.rawValue) - coder.encode(card_type, forKey: Key.cardType.rawValue) - } - - required convenience init?(coder: NSCoder) { - let card_number = coder.decodeObject(of: NSString.self, - forKey: Key.cardNumber.rawValue) as? String - let card_type = coder.decodeObject(of: NSString.self, - forKey: Key.cardType.rawValue) as? String - - self.init(card_number: card_number, card_type: card_type) - } } diff --git a/Data/Sources/Data/Http/DataResponse/PersonBankAccountDTO.swift b/Data/Sources/Data/Http/DataResponse/PersonBankAccountDTO.swift index d2f4f90..1c2fcce 100644 --- a/Data/Sources/Data/Http/DataResponse/PersonBankAccountDTO.swift +++ b/Data/Sources/Data/Http/DataResponse/PersonBankAccountDTO.swift @@ -14,4 +14,5 @@ struct PersonBankAccountDTO: Decodable { var more_info: CardTransferCountDTO? var note: String? var last_transfer: Date? + var isFavorite: Bool = false } diff --git a/Data/Sources/Data/Http/DataResponse/PersonDTO.swift b/Data/Sources/Data/Http/DataResponse/PersonDTO.swift index 06d0be7..b4fdb30 100644 --- a/Data/Sources/Data/Http/DataResponse/PersonDTO.swift +++ b/Data/Sources/Data/Http/DataResponse/PersonDTO.swift @@ -7,39 +7,9 @@ import Foundation -class PersonDTO: NSObject, NSSecureCoding, Decodable { +struct PersonDTO: Decodable { - enum Key: String { - case fullName - case email - case avatar - } - - static var supportsSecureCoding: Bool = true var full_name: String? var email: String? var avatar: String? - - init(full_name: String? = nil, email: String? = nil, avatar: String? = nil) { - self.full_name = full_name - self.email = email - self.avatar = avatar - } - - func encode(with coder: NSCoder) { - coder.encode(full_name, forKey: Key.fullName.rawValue) - coder.encode(email, forKey: Key.email.rawValue) - coder.encode(avatar, forKey: Key.avatar.rawValue) - } - - required convenience init?(coder: NSCoder) { - let full_name = coder.decodeObject(of: NSString.self, - forKey: Key.fullName.rawValue) as? String - let email = coder.decodeObject(of: NSString.self, - forKey: Key.email.rawValue) as? String - let avatar = coder.decodeObject(of: NSString.self, - forKey: Key.avatar.rawValue) as? String - - self.init(full_name: full_name, email: email, avatar: avatar) - } } diff --git a/Data/Sources/Data/Local/Database.swift b/Data/Sources/Data/Local/Database/Database.swift similarity index 100% rename from Data/Sources/Data/Local/Database.swift rename to Data/Sources/Data/Local/Database/Database.swift diff --git a/Data/Sources/Data/Local/Database/DatabaseError.swift b/Data/Sources/Data/Local/Database/DatabaseError.swift new file mode 100644 index 0000000..f9131de --- /dev/null +++ b/Data/Sources/Data/Local/Database/DatabaseError.swift @@ -0,0 +1,17 @@ +// +// DatabaseError.swift +// +// +// Created by Hessam Mahdiabadi on 11/5/23. +// + +import Foundation + +enum DatabaseError: Error { + + case unexpectedError + + var errorDescription: String? { + return "unexpected Error!" + } +} diff --git a/Data/Sources/Data/Local/DatabaseImpl.swift b/Data/Sources/Data/Local/Database/DatabaseImpl.swift similarity index 95% rename from Data/Sources/Data/Local/DatabaseImpl.swift rename to Data/Sources/Data/Local/Database/DatabaseImpl.swift index 3bad091..643172b 100644 --- a/Data/Sources/Data/Local/DatabaseImpl.swift +++ b/Data/Sources/Data/Local/Database/DatabaseImpl.swift @@ -16,8 +16,6 @@ public class DatabaseImpl: Database { public required init() { setupPersistentContainer() - PersonDTOTransformer.register() - CardDTOTransformer.register() CardTransferCountDTOTransformer.register() } diff --git a/Data/Sources/Data/Local/Database/ManagedObject/CardEntity+CoreDataClass.swift b/Data/Sources/Data/Local/Database/ManagedObject/CardEntity+CoreDataClass.swift new file mode 100644 index 0000000..6166ae6 --- /dev/null +++ b/Data/Sources/Data/Local/Database/ManagedObject/CardEntity+CoreDataClass.swift @@ -0,0 +1,15 @@ +// +// CardEntity+CoreDataClass.swift +// TransferList +// +// Created by Hessam Mahdiabadi on 11/5/23. +// +// + +import Foundation +import CoreData + +@objc(CardEntity) +public class CardEntity: NSManagedObject { + +} diff --git a/Data/Sources/Data/Local/Database/ManagedObject/CardEntity+CoreDataProperties.swift b/Data/Sources/Data/Local/Database/ManagedObject/CardEntity+CoreDataProperties.swift new file mode 100644 index 0000000..9ffa20a --- /dev/null +++ b/Data/Sources/Data/Local/Database/ManagedObject/CardEntity+CoreDataProperties.swift @@ -0,0 +1,22 @@ +// +// CardEntity+CoreDataProperties.swift +// TransferList +// +// Created by Hessam Mahdiabadi on 11/5/23. +// +// + +import Foundation +import CoreData + +extension CardEntity { + + @nonobjc public class func fetchRequest() -> NSFetchRequest { + return NSFetchRequest(entityName: "CardEntity") + } + + @NSManaged var cardNumber: String? + @NSManaged var cardType: String? + @NSManaged var account: PersonBankAccountEntity? + +} diff --git a/Data/Sources/Data/Local/ManagedObject/PersonBankAccountEntity+CoreDataClass.swift b/Data/Sources/Data/Local/Database/ManagedObject/PersonBankAccountEntity+CoreDataClass.swift similarity index 100% rename from Data/Sources/Data/Local/ManagedObject/PersonBankAccountEntity+CoreDataClass.swift rename to Data/Sources/Data/Local/Database/ManagedObject/PersonBankAccountEntity+CoreDataClass.swift diff --git a/Data/Sources/Data/Local/ManagedObject/PersonBankAccountEntity+CoreDataProperties.swift b/Data/Sources/Data/Local/Database/ManagedObject/PersonBankAccountEntity+CoreDataProperties.swift similarity index 71% rename from Data/Sources/Data/Local/ManagedObject/PersonBankAccountEntity+CoreDataProperties.swift rename to Data/Sources/Data/Local/Database/ManagedObject/PersonBankAccountEntity+CoreDataProperties.swift index eb6d5ea..7e41648 100644 --- a/Data/Sources/Data/Local/ManagedObject/PersonBankAccountEntity+CoreDataProperties.swift +++ b/Data/Sources/Data/Local/Database/ManagedObject/PersonBankAccountEntity+CoreDataProperties.swift @@ -15,17 +15,15 @@ extension PersonBankAccountEntity { return NSFetchRequest(entityName: "PersonBankAccountEntity") } - @NSManaged public var note: String? - @NSManaged public var lastTransfer: Date? - @NSManaged public var dateSaved: Date? - @NSManaged var person: PersonDTO? - @NSManaged var card: CardDTO? + @NSManaged var dateSaved: Date? + @NSManaged var lastTransfer: Date? @NSManaged var more_info: CardTransferCountDTO? - + @NSManaged var note: String? + @NSManaged var isFavorite: Bool + @NSManaged var card: CardEntity? + @NSManaged var person: PersonEntity? } -extension PersonBankAccountEntity: Identifiable {} - extension PersonBankAccountEntity { static var sortDescriptor: NSSortDescriptor { diff --git a/Data/Sources/Data/Local/Database/ManagedObject/PersonEntity+CoreDataClass.swift b/Data/Sources/Data/Local/Database/ManagedObject/PersonEntity+CoreDataClass.swift new file mode 100644 index 0000000..3385965 --- /dev/null +++ b/Data/Sources/Data/Local/Database/ManagedObject/PersonEntity+CoreDataClass.swift @@ -0,0 +1,15 @@ +// +// PersonEntity+CoreDataClass.swift +// TransferList +// +// Created by Hessam Mahdiabadi on 11/5/23. +// +// + +import Foundation +import CoreData + +@objc(PersonEntity) +public class PersonEntity: NSManagedObject { + +} diff --git a/Data/Sources/Data/Local/Database/ManagedObject/PersonEntity+CoreDataProperties.swift b/Data/Sources/Data/Local/Database/ManagedObject/PersonEntity+CoreDataProperties.swift new file mode 100644 index 0000000..1f62ed5 --- /dev/null +++ b/Data/Sources/Data/Local/Database/ManagedObject/PersonEntity+CoreDataProperties.swift @@ -0,0 +1,23 @@ +// +// PersonEntity+CoreDataProperties.swift +// TransferList +// +// Created by Hessam Mahdiabadi on 11/5/23. +// +// + +import Foundation +import CoreData + +extension PersonEntity { + + @nonobjc public class func fetchRequest() -> NSFetchRequest { + return NSFetchRequest(entityName: "PersonEntity") + } + + @NSManaged var avatar: String? + @NSManaged var email: String? + @NSManaged var name: String? + @NSManaged var account: PersonBankAccountEntity? + +} diff --git a/Data/Sources/Data/Local/Database/Mapper/CardEntityMapper.swift b/Data/Sources/Data/Local/Database/Mapper/CardEntityMapper.swift new file mode 100644 index 0000000..eb9baab --- /dev/null +++ b/Data/Sources/Data/Local/Database/Mapper/CardEntityMapper.swift @@ -0,0 +1,35 @@ +// +// CardEntityMapper.swift +// +// +// Created by Hessam Mahdiabadi on 11/5/23. +// + +import Foundation +import CoreData + +struct CardEntityMapper: Mapper { + + typealias Entity = CardEntity? + typealias Dto = CardDTO? + + private let context: NSManagedObjectContext + + init(context: NSManagedObjectContext) { + self.context = context + } + + func mapDtoToEntity(input: CardDTO?) -> CardEntity? { + guard let input else { return nil } + let entity = CardEntity(context: context) + entity.cardType = input.card_type + entity.cardNumber = input.card_number + + return entity + } + + func mapEntityToDto(input: CardEntity?) -> CardDTO? { + guard let input else { return nil } + return .init(card_number: input.cardNumber, card_type: input.cardType) + } +} diff --git a/Data/Sources/Data/Local/Database/Mapper/PersonBankAccountEntityMapper.swift b/Data/Sources/Data/Local/Database/Mapper/PersonBankAccountEntityMapper.swift new file mode 100644 index 0000000..8515fe3 --- /dev/null +++ b/Data/Sources/Data/Local/Database/Mapper/PersonBankAccountEntityMapper.swift @@ -0,0 +1,47 @@ +// +// PersonBankAccountEntityMapper.swift +// +// +// Created by Hessam Mahdiabadi on 11/5/23. +// + +import Foundation +import CoreData + +struct PersonBankAccountEntityMapper: Mapper { + + typealias Entity = PersonBankAccountEntity + typealias Dto = PersonBankAccountDTO + + private let context: NSManagedObjectContext + private let cardEntityMapper: CardEntityMapper + private let personEntityMapper: PersonEntityMapper + + init(context: NSManagedObjectContext, + cardEntityMapper: CardEntityMapper, + personEntityMapper: PersonEntityMapper) { + self.context = context + self.cardEntityMapper = cardEntityMapper + self.personEntityMapper = personEntityMapper + } + + func mapDtoToEntity(input: PersonBankAccountDTO) -> PersonBankAccountEntity { + let entity = PersonBankAccountEntity(context: context) + entity.person = personEntityMapper.mapDtoToEntity(input: input.person) + entity.more_info = input.more_info + entity.card = cardEntityMapper.mapDtoToEntity(input: input.card) + entity.note = input.note + entity.lastTransfer = input.last_transfer + entity.dateSaved = Date() + + return entity + } + + func mapEntityToDto(input: PersonBankAccountEntity) -> PersonBankAccountDTO { + let person = personEntityMapper.mapEntityToDto(input: input.person) + let card = cardEntityMapper.mapEntityToDto(input: input.card) + return .init(person: person, card: card, + more_info: input.more_info, note: input.note, + last_transfer: input.lastTransfer, isFavorite: input.isFavorite) + } +} diff --git a/Data/Sources/Data/Local/Database/Mapper/PersonEntityMapper.swift b/Data/Sources/Data/Local/Database/Mapper/PersonEntityMapper.swift new file mode 100644 index 0000000..57f6104 --- /dev/null +++ b/Data/Sources/Data/Local/Database/Mapper/PersonEntityMapper.swift @@ -0,0 +1,37 @@ +// +// PersonEntityMapper.swift +// +// +// Created by Hessam Mahdiabadi on 11/5/23. +// + +import Foundation +import CoreData + +struct PersonEntityMapper: Mapper { + + typealias Entity = PersonEntity? + typealias Dto = PersonDTO? + + private let context: NSManagedObjectContext + + init(context: NSManagedObjectContext) { + self.context = context + } + + func mapDtoToEntity(input: PersonDTO?) -> PersonEntity? { + guard let input else { return nil } + let entity = PersonEntity(context: context) + entity.name = input.full_name + entity.avatar = input.avatar + entity.email = input.email + + return entity + } + + func mapEntityToDto(input: PersonEntity?) -> PersonDTO? { + guard let input else { return nil } + return .init(full_name: input.name, email: input.email, + avatar: input.avatar) + } +} diff --git a/Data/Sources/Data/Local/PersistentContainer.swift b/Data/Sources/Data/Local/Database/PersistentContainer.swift similarity index 100% rename from Data/Sources/Data/Local/PersistentContainer.swift rename to Data/Sources/Data/Local/Database/PersistentContainer.swift diff --git a/Data/Sources/Data/Local/Transformer/CardTransferCountDTOTransformer.swift b/Data/Sources/Data/Local/Database/Transformer/CardTransferCountDTOTransformer.swift similarity index 100% rename from Data/Sources/Data/Local/Transformer/CardTransferCountDTOTransformer.swift rename to Data/Sources/Data/Local/Database/Transformer/CardTransferCountDTOTransformer.swift diff --git a/Data/Sources/Data/Local/Database/db.xcdatamodeld/db.xcdatamodel/contents b/Data/Sources/Data/Local/Database/db.xcdatamodeld/db.xcdatamodel/contents new file mode 100644 index 0000000..ac9abab --- /dev/null +++ b/Data/Sources/Data/Local/Database/db.xcdatamodeld/db.xcdatamodel/contents @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Data/Sources/Data/Local/Local.swift b/Data/Sources/Data/Local/Local.swift new file mode 100644 index 0000000..646c59a --- /dev/null +++ b/Data/Sources/Data/Local/Local.swift @@ -0,0 +1,16 @@ +// +// Local.swift +// +// +// Created by Hessam Mahdiabadi on 11/5/23. +// + +import Foundation +import Domain + +public protocol Local { + + func fetchFavoritePersonAccounts() async throws -> [PersonBankAccount] + func savePersonAccountToFavorites(_ personBankAccount: PersonBankAccount) async throws -> PersonBankAccount + func removePersonAccountFromFavorites(_ personBankAccount: PersonBankAccount) async throws -> PersonBankAccount +} diff --git a/Data/Sources/Data/Local/DatabaseError.swift b/Data/Sources/Data/Local/LocalError.swift similarity index 75% rename from Data/Sources/Data/Local/DatabaseError.swift rename to Data/Sources/Data/Local/LocalError.swift index 0fac364..7d4c882 100644 --- a/Data/Sources/Data/Local/DatabaseError.swift +++ b/Data/Sources/Data/Local/LocalError.swift @@ -1,5 +1,5 @@ // -// DatabaseError.swift +// LocalError.swift // // // Created by Hessam Mahdiabadi on 11/5/23. @@ -7,15 +7,15 @@ import Foundation -enum DatabaseError: Error { +enum LocalError: Error { - case unexpectedError + case cannotFetchFavorites case cannotSavePersonAccountToFavorites case cannotRemovePersonAccountFromFavorites var errorDescription: String? { switch self { - case .unexpectedError: return "You seem to be offline!" + case .cannotFetchFavorites: return "caanot fetch favorites accounts" case .cannotSavePersonAccountToFavorites: return "Failed to save person accounts to favorites" case .cannotRemovePersonAccountFromFavorites: return "Failed to remove person account from favorites" } diff --git a/Data/Sources/Data/Local/LocalImpl.swift b/Data/Sources/Data/Local/LocalImpl.swift new file mode 100644 index 0000000..87a8df3 --- /dev/null +++ b/Data/Sources/Data/Local/LocalImpl.swift @@ -0,0 +1,154 @@ +// +// LocalImpl.swift +// +// +// Created by Hessam Mahdiabadi on 11/5/23. +// + +import Foundation +import Domain +import CoreData + +public class LocalImpl: Local { + + private let database: Database + private let coreDataMapper: PersonBankAccountEntityMapper + private let mapper: PersonBankAccountMapper + + public init(database: Database) { + self.database = database + + let context = database.backgroundContext + let personMapper = PersonEntityMapper(context: context) + let cardMapper = CardEntityMapper(context: context) + coreDataMapper = .init(context: context, + cardEntityMapper: cardMapper, + personEntityMapper: personMapper) + + mapper = .init(personMapper: .init(), cardMapper: .init(), + cardTransferCountMapper: .init()) + } + + public func fetchFavoritePersonAccounts() async throws -> [Domain.PersonBankAccount] { + return try await withCheckedThrowingContinuation { [weak self] continuation in + guard let self else { + continuation.resume(throwing: LocalError.cannotFetchFavorites) + return + } + + self.database.backgroundContext.performAndWait { [weak self] in + guard let self else { + continuation.resume(throwing: LocalError.cannotFetchFavorites) + return + } + + do { + let fetchRequest: + NSFetchRequest = PersonBankAccountEntity.fetchRequest() + let sort = PersonBankAccountEntity.sortDescriptor + fetchRequest.sortDescriptors = [sort] + + let accountMangedObjects = try self.database.backgroundContext.fetch(fetchRequest) + let accountDtos = self.coreDataMapper.mapEntitiesToDtos(input: accountMangedObjects) + let accounts = self.mapper + .mapDtosToEntities(input: accountDtos) + .map { item in + var changeToFavoriteItem = item + changeToFavoriteItem.update(favoriteStatus: true) + return changeToFavoriteItem + } + + continuation.resume(returning: accounts) + + } catch { + continuation.resume(throwing: LocalError.cannotFetchFavorites) + } + } + } + } + + public func savePersonAccountToFavorites(_ personBankAccount: Domain.PersonBankAccount) async throws + -> Domain.PersonBankAccount { + return try await withCheckedThrowingContinuation { [weak self] continuation in + guard let self else { + continuation.resume(throwing: LocalError.cannotSavePersonAccountToFavorites) + return + } + + self.database.backgroundContext.performAndWait { [weak self] in + guard let self else { + continuation.resume(throwing: LocalError.cannotFetchFavorites) + return + } + + do { + let accountDto = self.mapper.mapEntityToDto(input: personBankAccount) + let _ = self.coreDataMapper.mapDtoToEntity(input: accountDto) + + try Task.checkCancellation() + try self.database.saveBackgroundContext() + + var newPersonBankAccount = personBankAccount + newPersonBankAccount.update(favoriteStatus: true) + continuation.resume(returning: newPersonBankAccount) + + } catch { + self.database.backgroundContext.rollback() + continuation.resume(throwing: LocalError.cannotSavePersonAccountToFavorites) + } + } + } + } + + public func removePersonAccountFromFavorites(_ personBankAccount: Domain.PersonBankAccount) async throws + -> Domain.PersonBankAccount { + return try await withCheckedThrowingContinuation { [weak self] continuation in + guard let self else { + continuation.resume(throwing: LocalError.cannotRemovePersonAccountFromFavorites) + return + } + + self.database.backgroundContext.performAndWait { [weak self] in + guard let self else { + continuation.resume(throwing: LocalError.cannotRemovePersonAccountFromFavorites) + return + } + + do { + let fetchRequest: + NSFetchRequest = PersonBankAccountEntity.fetchRequest() + let sort = PersonBankAccountEntity.sortDescriptor + fetchRequest.sortDescriptors = [sort] + fetchRequest.fetchLimit = 1 + + let namePredicate = NSPredicate(format: "person.name == %@", + personBankAccount.person?.name ?? "") + let cardNumberPredicate = NSPredicate(format: "card.cardNumber == %@", + personBankAccount.card?.cardNumber ?? "") + let predicate = NSCompoundPredicate(type: .and, + subpredicates: [namePredicate, cardNumberPredicate]) + fetchRequest.predicate = predicate + + try Task.checkCancellation() + let accounts = try self.database.backgroundContext.fetch(fetchRequest) + guard let entity = accounts.first else { + continuation.resume(throwing: LocalError.cannotRemovePersonAccountFromFavorites) + return + } + + try Task.checkCancellation() + self.database.backgroundContext.delete(entity) + try self.database.saveBackgroundContext() + + var newPersonBankAccount = personBankAccount + newPersonBankAccount.update(favoriteStatus: false) + continuation.resume(returning: newPersonBankAccount) + + } catch { + self.database.backgroundContext.rollback() + continuation.resume(throwing: LocalError.cannotRemovePersonAccountFromFavorites) + } + } + } + } +} diff --git a/Data/Sources/Data/Local/Transformer/CardDTOTransformer.swift b/Data/Sources/Data/Local/Transformer/CardDTOTransformer.swift deleted file mode 100644 index 0fd4095..0000000 --- a/Data/Sources/Data/Local/Transformer/CardDTOTransformer.swift +++ /dev/null @@ -1,24 +0,0 @@ -// -// CardDTOTransformer.swift -// -// -// Created by Hessam Mahdiabadi on 11/5/23. -// - -import Foundation - -@objc(CardDTOTransformer) -class CardDTOTransformer: NSSecureUnarchiveFromDataTransformer { - - override class var allowedTopLevelClasses: [AnyClass] { - return [CardDTO.self] - } - - static func register() { - let className = String(describing: CardDTOTransformer.self) - let name = NSValueTransformerName(className) - - let transformer = CardDTOTransformer() - ValueTransformer.setValueTransformer(transformer, forName: name) - } -} diff --git a/Data/Sources/Data/Local/Transformer/PersonDTOTransformer.swift b/Data/Sources/Data/Local/Transformer/PersonDTOTransformer.swift deleted file mode 100644 index 07b920d..0000000 --- a/Data/Sources/Data/Local/Transformer/PersonDTOTransformer.swift +++ /dev/null @@ -1,24 +0,0 @@ -// -// PersonDTOTransformer.swift -// -// -// Created by Hessam Mahdiabadi on 11/5/23. -// - -import Foundation - -@objc(PersonDTOTransformer) -class PersonDTOTransformer: NSSecureUnarchiveFromDataTransformer { - - override class var allowedTopLevelClasses: [AnyClass] { - return [PersonDTO.self] - } - - static func register() { - let className = String(describing: PersonDTOTransformer.self) - let name = NSValueTransformerName(className) - - let transformer = PersonDTOTransformer() - ValueTransformer.setValueTransformer(transformer, forName: name) - } -} diff --git a/Data/Sources/Data/Local/db.xcdatamodeld/db.xcdatamodel/contents b/Data/Sources/Data/Local/db.xcdatamodeld/db.xcdatamodel/contents deleted file mode 100644 index be8f753..0000000 --- a/Data/Sources/Data/Local/db.xcdatamodeld/db.xcdatamodel/contents +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/Data/Tests/DataTests/LocalTests/DatabaseTests.swift b/Data/Tests/DataTests/LocalTests/DatabaseTests/DatabaseTests.swift similarity index 84% rename from Data/Tests/DataTests/LocalTests/DatabaseTests.swift rename to Data/Tests/DataTests/LocalTests/DatabaseTests/DatabaseTests.swift index cf6cb92..aa5af8d 100644 --- a/Data/Tests/DataTests/LocalTests/DatabaseTests.swift +++ b/Data/Tests/DataTests/LocalTests/DatabaseTests/DatabaseTests.swift @@ -18,14 +18,24 @@ final class DatabaseTests: XCTestCase { } private func createPersonAccountEntity(inContext: NSManagedObjectContext) { + + let person = PersonEntity(context: inContext) + person.name = "hessam" + person.email = "h.mahdi" + person.avatar = nil + + let card = CardEntity(context: inContext) + card.cardNumber = "123" + card.cardType = "master" + let account = PersonBankAccountEntity(context: inContext) let dateSaved = Date() let note = "note" account.dateSaved = dateSaved account.note = note account.lastTransfer = nil - account.person = PersonDTO(full_name: "hessam", email: "h.mahdi", avatar: nil) - account.card = .init(card_number: "123", card_type: "master") + account.person = person + account.card = card account.more_info = .init(number_of_transfers: 1, total_transfer: nil) } @@ -50,8 +60,8 @@ final class DatabaseTests: XCTestCase { XCTAssertEqual(results.count, 1) XCTAssertEqual(results.first?.note, "note") - XCTAssertEqual(results.first?.person?.full_name, "hessam") - XCTAssertEqual(results.first?.card?.card_number, "123") + XCTAssertEqual(results.first?.person?.name, "hessam") + XCTAssertEqual(results.first?.card?.cardNumber, "123") XCTAssertEqual(results.first?.more_info?.number_of_transfers, 1) } diff --git a/Data/Tests/DataTests/LocalTests/LocalTests.swift b/Data/Tests/DataTests/LocalTests/LocalTests.swift new file mode 100644 index 0000000..8a9982d --- /dev/null +++ b/Data/Tests/DataTests/LocalTests/LocalTests.swift @@ -0,0 +1,83 @@ +// +// LocalTests.swift +// +// +// Created by Hessam Mahdiabadi on 11/5/23. +// + +import XCTest +import Domain +@testable import Data + +final class LocalTests: XCTestCase { + + private var local: Local! + + override func tearDown() { + local = nil + } + + private func createBankAccount() -> PersonBankAccount { + let person = Person(name: "hessam", email: "h.mahdi", avatar: nil) + let card = Card(cardNumber: "123", cardType: "master") + let cardCount = CardTransferCount(numberOfTransfers: 12, totalTransfer: 12) + let note = "note" + return .init(person: person, card: card, + cardTransferCount: cardCount, note: note, lastDateTransfer: nil) + } + + func testSuccessSaveAccountToFavorites() async { + + // given + local = LocalImpl(database: MockDatabase()) + + // when + do { + let account = try await local.savePersonAccountToFavorites(createBankAccount()) + + XCTAssertEqual(account.isFavorite, true) + XCTAssertEqual(account.person?.name, "hessam") + + } catch { + // then + XCTAssertNil(error) + } + } + + func testSuccessRemoveAccountToFavorites() async { + + // given + local = LocalImpl(database: MockDatabase()) + + // when + do { + let account = try await local.savePersonAccountToFavorites(createBankAccount()) + let removedAccount = try await local.removePersonAccountFromFavorites(account) + + XCTAssertEqual(removedAccount.isFavorite, false) + XCTAssertEqual(account.person?.name, "hessam") + + } catch { + // then + XCTAssertNil(error) + } + } + + func testSuccessFetchFavoriteAccounts() async { + + // given + local = LocalImpl(database: MockDatabase()) + + // when + do { + let _ = try await local.savePersonAccountToFavorites(createBankAccount()) + let accounts = try await local.fetchFavoritePersonAccounts() + + XCTAssertEqual(accounts.count, 1) + + } catch { + // then + XCTAssertNil(error) + } + } +} diff --git a/TransferList.xcodeproj/xcuserdata/hessam.xcuserdatad/xcschemes/xcschememanagement.plist b/TransferList.xcodeproj/xcuserdata/hessam.xcuserdatad/xcschemes/xcschememanagement.plist index 7e70a09..5eb9d26 100644 --- a/TransferList.xcodeproj/xcuserdata/hessam.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/TransferList.xcodeproj/xcuserdata/hessam.xcuserdatad/xcschemes/xcschememanagement.plist @@ -7,7 +7,7 @@ TransferList.xcscheme_^#shared#^_ orderHint - 2 + 3 From 557d8739a27bc8dcd74f5f3e3f70957c375b357c Mon Sep 17 00:00:00 2001 From: Hessam Mahdiabadi <67460597+iamHEssam@users.noreply.github.com> Date: Sun, 5 Nov 2023 20:21:31 +0330 Subject: [PATCH 11/34] Add Local Repository Integration in PersonBankAccountRepositoryImpl - Added local repository integration in the `PersonBankAccountRepositoryImpl` to store data in the database. --- .../DataResponse/PersonBankAccountDTO.swift | 28 +++++ .../PersonBankAccountRepositoryImpl.swift | 10 +- Data/Tests/DataTests/HttpTests/ApiTests.swift | 2 +- .../RepositoriesTests/Mock/MockLocal.swift | 66 +++++++++++ .../PersonBankAccountRepositoryTests.swift | 111 ++++++++++++++++-- 5 files changed, 202 insertions(+), 15 deletions(-) create mode 100644 Data/Tests/DataTests/RepositoriesTests/Mock/MockLocal.swift diff --git a/Data/Sources/Data/Http/DataResponse/PersonBankAccountDTO.swift b/Data/Sources/Data/Http/DataResponse/PersonBankAccountDTO.swift index 1c2fcce..fceaae1 100644 --- a/Data/Sources/Data/Http/DataResponse/PersonBankAccountDTO.swift +++ b/Data/Sources/Data/Http/DataResponse/PersonBankAccountDTO.swift @@ -15,4 +15,32 @@ struct PersonBankAccountDTO: Decodable { var note: String? var last_transfer: Date? var isFavorite: Bool = false + + init(person: PersonDTO?, card: CardDTO?, more_info: CardTransferCountDTO?, note: String?, + last_transfer: Date?, isFavorite: Bool = false) { + self.person = person + self.card = card + self.more_info = more_info + self.note = note + self.last_transfer = last_transfer + self.isFavorite = isFavorite + } + + enum CodingKeys: CodingKey { + case person + case card + case more_info + case note + case last_transfer + case isFavorite + } + + init(from decoder: Decoder) throws { + let container = try decoder.container(keyedBy: CodingKeys.self) + self.person = try container.decodeIfPresent(PersonDTO.self, forKey: .person) + self.card = try container.decodeIfPresent(CardDTO.self, forKey: .card) + self.more_info = try container.decodeIfPresent(CardTransferCountDTO.self, forKey: .more_info) + self.note = try container.decodeIfPresent(String.self, forKey: .note) + self.last_transfer = try container.decodeIfPresent(Date.self, forKey: .last_transfer) + } } diff --git a/Data/Sources/Data/Repositories/PersonBankAccountRepositoryImpl.swift b/Data/Sources/Data/Repositories/PersonBankAccountRepositoryImpl.swift index ecbbedd..460a23f 100644 --- a/Data/Sources/Data/Repositories/PersonBankAccountRepositoryImpl.swift +++ b/Data/Sources/Data/Repositories/PersonBankAccountRepositoryImpl.swift @@ -11,10 +11,12 @@ import Domain public class PersonBankAccountRepositoryImpl: PersonBankAccountRepository { private var api: Api + private var local: Local private let mapper: PersonBankAccountMapper - public init(api: Api) { + public init(api: Api, local: Local) { self.api = api + self.local = local mapper = .init(personMapper: .init(), cardMapper: .init(), cardTransferCountMapper: .init()) @@ -27,15 +29,15 @@ public class PersonBankAccountRepositoryImpl: PersonBankAccountRepository { } public func fetchFavoritePersonAccounts() async throws -> [Domain.PersonBankAccount] { - fatalError() + try await local.fetchFavoritePersonAccounts() } public func savePersonAccountToFavorites(_ personBankAccount: Domain.PersonBankAccount) async throws -> Domain.PersonBankAccount { - fatalError() + try await local.savePersonAccountToFavorites(personBankAccount) } public func removePersonAccountFromFavorites(_ personBankAccount: Domain.PersonBankAccount) async throws -> Domain.PersonBankAccount { - fatalError() + try await local.removePersonAccountFromFavorites(personBankAccount) } public func updatefavoriteStatusForPersonAccount(_ personBankAccount: Domain.PersonBankAccount) async -> Domain.PersonBankAccount { diff --git a/Data/Tests/DataTests/HttpTests/ApiTests.swift b/Data/Tests/DataTests/HttpTests/ApiTests.swift index 0553216..8adb6ad 100644 --- a/Data/Tests/DataTests/HttpTests/ApiTests.swift +++ b/Data/Tests/DataTests/HttpTests/ApiTests.swift @@ -16,7 +16,7 @@ final class ApiTests: XCTestCase { api = nil } - func testRealMediaListApiCall() async { + func testRealTransferListApiCall() async { // given api = ApiImpl() diff --git a/Data/Tests/DataTests/RepositoriesTests/Mock/MockLocal.swift b/Data/Tests/DataTests/RepositoriesTests/Mock/MockLocal.swift new file mode 100644 index 0000000..600e595 --- /dev/null +++ b/Data/Tests/DataTests/RepositoriesTests/Mock/MockLocal.swift @@ -0,0 +1,66 @@ +// +// MockLocal.swift +// +// +// Created by Hessam Mahdiabadi on 11/5/23. +// + +import Foundation +import Domain +@testable import Data + +class MockLocal: Local { + + func createAccount() -> PersonBankAccount { + let person = Person(name: "hessam", email: "h.mahdi", avatar: nil) + let card = Card(cardNumber: "123", cardType: "master") + let cardCount = CardTransferCount(numberOfTransfers: 12, totalTransfer: 12) + let note = "note" + + return .init(person: person, card: card, + cardTransferCount: cardCount, note: note, lastDateTransfer: nil) + } + + func fetchFavoritePersonAccounts() async throws -> [PersonBankAccount] { + return [ + createAccount() + ] + } + + func savePersonAccountToFavorites(_ personBankAccount: PersonBankAccount) async throws -> PersonBankAccount { + var newAccount = personBankAccount + newAccount.update(favoriteStatus: true) + return newAccount + } + + func removePersonAccountFromFavorites(_ personBankAccount: PersonBankAccount) async throws -> PersonBankAccount { + var newAccount = personBankAccount + newAccount.update(favoriteStatus: false) + return newAccount + } +} + +class MockSucceesRemoveLocal: MockLocal { + + override func fetchFavoritePersonAccounts() async throws -> [PersonBankAccount] { + [] + } +} + +class MockFailSaveOrRemoveLocal: MockSucceesRemoveLocal { + + override func savePersonAccountToFavorites(_ personBankAccount: PersonBankAccount) async throws -> PersonBankAccount { + throw LocalError.cannotSavePersonAccountToFavorites + } + + override func removePersonAccountFromFavorites(_ personBankAccount: PersonBankAccount) async throws -> PersonBankAccount { + throw LocalError.cannotRemovePersonAccountFromFavorites + } +} + +class MockFailFetchFavoriteAccountLocal: MockLocal { + + override func fetchFavoritePersonAccounts() async throws -> [PersonBankAccount] { + throw LocalError.cannotFetchFavorites + } +} diff --git a/Data/Tests/DataTests/RepositoriesTests/PersonBankAccountRepositoryTests.swift b/Data/Tests/DataTests/RepositoriesTests/PersonBankAccountRepositoryTests.swift index 9cf0cbc..a596e2e 100644 --- a/Data/Tests/DataTests/RepositoriesTests/PersonBankAccountRepositoryTests.swift +++ b/Data/Tests/DataTests/RepositoriesTests/PersonBankAccountRepositoryTests.swift @@ -10,17 +10,18 @@ import Domain @testable import Data final class PersonBankAccountRepositoryTests: XCTestCase { - + var repository: PersonBankAccountRepository! override func tearDown() { repository = nil } - func testSuccessFetchMediaList() async { + func testSuccessFetchTransferList() async { // given - repository = PersonBankAccountRepositoryImpl(api: MockApi()) + repository = PersonBankAccountRepositoryImpl(api: MockApi(), + local: MockLocal()) do { // when @@ -37,20 +38,110 @@ final class PersonBankAccountRepositoryTests: XCTestCase { XCTAssertNil(error) } } - - func testFailFetchMediaList() async { - + + func testFailFetchTransferList() async { + // given - repository = PersonBankAccountRepositoryImpl(api: MockFailConnectToServerApi()) - + repository = PersonBankAccountRepositoryImpl(api: MockFailConnectToServerApi() + , local: MockLocal()) + do { // when let _ = try await repository.fetchPersonAccounts(withOffest: 10) - + + } catch { + + // then + XCTAssertNotNil(error) + } + } + + func testSuccessSaveToFavorite() async { + // given + let local = MockLocal() + repository = PersonBankAccountRepositoryImpl(api: MockFailConnectToServerApi() + , local: local) + + do { + // when + let account = try await repository.savePersonAccountToFavorites(local.createAccount()) + XCTAssertEqual(account.isFavorite, true) + } catch { - // then XCTAssertNotNil(error) } } + + func testSuccessRemoveFromFavorite() async { + // given + let local = MockSucceesRemoveLocal() + repository = PersonBankAccountRepositoryImpl(api: MockFailConnectToServerApi() + , local: local) + + do { + // when + let account = try await repository.removePersonAccountFromFavorites(local.createAccount()) + XCTAssertEqual(account.isFavorite, false) + + let accounts = try await repository.fetchFavoritePersonAccounts() + XCTAssertTrue(accounts.isEmpty) + + } catch { + // then + XCTAssertNotNil(error) + } + } + + func testFailSaveFromFavorite() async { + // given + let local = MockFailSaveOrRemoveLocal() + repository = PersonBankAccountRepositoryImpl(api: MockFailConnectToServerApi() + , local: local) + + do { + // when + let _ = try await repository.savePersonAccountToFavorites(local.createAccount()) + + let accounts = try await repository.fetchFavoritePersonAccounts() + XCTAssertTrue(accounts.isEmpty) + + } catch { + // then + XCTAssertEqual(error as? LocalError, .cannotSavePersonAccountToFavorites) + } + } + + func testFailRemoveFromFavorite() async { + // given + let local = MockFailSaveOrRemoveLocal() + repository = PersonBankAccountRepositoryImpl(api: MockFailConnectToServerApi() + , local: local) + + do { + // when + let _ = try await repository.removePersonAccountFromFavorites(local.createAccount()) + + } catch { + // then + XCTAssertEqual(error as? LocalError, .cannotRemovePersonAccountFromFavorites) + } + } + + func testSuccessFetchFavoriteAccounts() async { + + // given + let local = MockFailFetchFavoriteAccountLocal() + repository = PersonBankAccountRepositoryImpl(api: MockApi(), + local: local) + + do { + // when + let _ = try await repository.fetchFavoritePersonAccounts() + + } catch { + // then + XCTAssertEqual(error as? LocalError, .cannotFetchFavorites) + } + } } From e374d015b61045e90aa14b0d1a457ac9336f55f1 Mon Sep 17 00:00:00 2001 From: Hessam Mahdiabadi <67460597+iamHEssam@users.noreply.github.com> Date: Sun, 5 Nov 2023 20:54:50 +0330 Subject: [PATCH 12/34] Fix Error Message Retrieval from Server on Invalid Page Number Request --- Data/Sources/Data/Http/ApiImpl.swift | 12 +++++- .../Http/DataResponse/ResponseError.swift | 34 +++++++++++++++++ Data/Sources/Data/Http/NetworkError.swift | 13 ++++++- Data/Tests/DataTests/HttpTests/ApiTests.swift | 38 +++++++++++++++++++ .../Mock/ResponseMockURLProtocol.swift | 15 +++++++- 5 files changed, 109 insertions(+), 3 deletions(-) create mode 100644 Data/Sources/Data/Http/DataResponse/ResponseError.swift diff --git a/Data/Sources/Data/Http/ApiImpl.swift b/Data/Sources/Data/Http/ApiImpl.swift index 144d971..e1d9d6b 100644 --- a/Data/Sources/Data/Http/ApiImpl.swift +++ b/Data/Sources/Data/Http/ApiImpl.swift @@ -58,7 +58,17 @@ final public class ApiImpl: Api { } case .failure: - continuation.resume(throwing: NetworkError.cannotConnectToServer) + guard let data = responseData.data else { + continuation.resume(throwing: NetworkError.cannotConnectToServer) + return + } + + guard let responseError = try? decoder.decode(ResponseError.self, from: data) else { + continuation.resume(throwing: NetworkError.cannotConnectToServer) + return + } + + continuation.resume(throwing: NetworkError.serverError(message: responseError)) } } } diff --git a/Data/Sources/Data/Http/DataResponse/ResponseError.swift b/Data/Sources/Data/Http/DataResponse/ResponseError.swift new file mode 100644 index 0000000..212d234 --- /dev/null +++ b/Data/Sources/Data/Http/DataResponse/ResponseError.swift @@ -0,0 +1,34 @@ +// +// ResponseError.swift +// +// +// Created by Hessam Mahdiabadi on 11/5/23. +// + +import Foundation + +struct ResponseError: Decodable, CustomStringConvertible, Equatable { + + var message: String? + + var description: String { + return message ?? "Unexpected error" + } + + static func == (lhs: ResponseError, rhs: ResponseError) -> Bool { + return lhs.message == rhs.message + } + + enum CodingKeys: CodingKey { + case error + } + + init(message: String?) { + self.message = message + } + + init(from decoder: Decoder) throws { + let container = try decoder.container(keyedBy: CodingKeys.self) + self.message = try container.decodeIfPresent(String.self, forKey: .error) + } +} diff --git a/Data/Sources/Data/Http/NetworkError.swift b/Data/Sources/Data/Http/NetworkError.swift index a0b4fde..1157dd3 100644 --- a/Data/Sources/Data/Http/NetworkError.swift +++ b/Data/Sources/Data/Http/NetworkError.swift @@ -7,15 +7,26 @@ import Foundation -enum NetworkError: Error, LocalizedError { +enum NetworkError: Error, LocalizedError, Equatable { case cannotConnectToServer case cannotParseJson + case serverError(message: ResponseError) var errorDescription: String? { switch self { case .cannotConnectToServer: return "You seem to be offline!" case .cannotParseJson: return "Unexpected error" + case .serverError(let error): return String(describing: error) + } + } + + static func == (lhs: NetworkError, rhs: NetworkError) -> Bool { + switch (lhs, rhs) { + case (.cannotConnectToServer, .cannotConnectToServer): return true + case (.cannotParseJson, .cannotParseJson): return true + case (.serverError(let lhsError), .serverError(let rhsError)): return lhsError == rhsError + default: return false } } } diff --git a/Data/Tests/DataTests/HttpTests/ApiTests.swift b/Data/Tests/DataTests/HttpTests/ApiTests.swift index 8adb6ad..e10eac0 100644 --- a/Data/Tests/DataTests/HttpTests/ApiTests.swift +++ b/Data/Tests/DataTests/HttpTests/ApiTests.swift @@ -37,6 +37,44 @@ final class ApiTests: XCTestCase { XCTAssertNil(error as? NetworkError) } } + + func testRealServerErrorTransferListApiCall() async { + + // given + api = ApiImpl() + do { + + // when + let _ = try await api.callApi(route: .transferList(offset: -1), + decodeType: [PersonBankAccountDTO].self) + + } catch { + // then + XCTAssertNotNil(error as? NetworkError) + let responseError = ResponseError(message: "page-number starts from 1") + XCTAssertEqual(error as? NetworkError, .serverError(message: responseError)) + } + } + + func testMockServerErrorTransferListApiCall() async { + + // given + let configuration = URLSessionConfiguration.default + configuration.protocolClasses = [ResponseMockURLProtocol.self] + let api = ApiImpl(configuration: configuration) + do { + + // when + let _ = try await api.callApi(route: .transferList(offset: -1), + decodeType: [PersonBankAccountDTO].self) + + } catch { + // then + XCTAssertNotNil(error as? NetworkError) + let responseError = ResponseError(message: "page-number starts from 1") + XCTAssertEqual(error as? NetworkError, .serverError(message: responseError)) + } + } func testSuccessMockResponse() async { diff --git a/Data/Tests/DataTests/HttpTests/Mock/ResponseMockURLProtocol.swift b/Data/Tests/DataTests/HttpTests/Mock/ResponseMockURLProtocol.swift index fedb270..b27f0dc 100644 --- a/Data/Tests/DataTests/HttpTests/Mock/ResponseMockURLProtocol.swift +++ b/Data/Tests/DataTests/HttpTests/Mock/ResponseMockURLProtocol.swift @@ -98,6 +98,19 @@ class ResponseMockURLProtocol: URLProtocol { httpResponse: httpResponse2, error: nil) - return [url: response, url2: response2] + let strUrl3 = "https://191da1ac-768c-4c6a-80ad-b533beafec25.mock.pstmn.io/transfer-list/-1" + let url3 = URL(string: strUrl3)! + let data3 = #""" +{ + "error": "page-number starts from 1" +} +"""#.data(using: .utf8) + let httpResponse3 = HTTPURLResponse(url: url, statusCode: 400, + httpVersion: nil, headerFields: nil) + let response3 = ApiMockResponse(url: url3, data: data3, + httpResponse: httpResponse3, + error: nil) + + return [url: response, url2: response2, url3: response3] } } From 852364d92a8a282c8e7d2dd9c3bdb037262ef219 Mon Sep 17 00:00:00 2001 From: Hessam Mahdiabadi <67460597+iamHEssam@users.noreply.github.com> Date: Sun, 5 Nov 2023 21:27:08 +0330 Subject: [PATCH 13/34] Resolve Name Violation: Variable Name Contains Only Alphanumeric Characters for DTOs Models --- .../Data/Http/DataResponse/CardDTO.swift | 20 +++++++++- .../DataResponse/CardTransferCountDTO.swift | 40 +++++++++++-------- .../DataResponse/PersonBankAccountDTO.swift | 29 +++++++------- .../Data/Http/DataResponse/PersonDTO.swift | 21 +++++++++- .../Sources/Data/Http/Mapper/CardMapper.swift | 4 +- .../Http/Mapper/CardTransferCountMapper.swift | 8 ++-- .../Http/Mapper/PersonBankAccountMapper.swift | 8 ++-- .../Data/Http/Mapper/PersonMapper.swift | 4 +- ...BankAccountEntity+CoreDataProperties.swift | 2 +- .../Database/Mapper/CardEntityMapper.swift | 6 +-- .../PersonBankAccountEntityMapper.swift | 8 ++-- .../Database/Mapper/PersonEntityMapper.swift | 4 +- .../db.xcdatamodeld/db.xcdatamodel/contents | 2 +- Data/Tests/DataTests/HttpTests/ApiTests.swift | 9 +++-- .../DatabaseTests/DatabaseTests.swift | 4 +- .../RepositoriesTests/Mock/MockApi.swift | 10 ++--- 16 files changed, 110 insertions(+), 69 deletions(-) diff --git a/Data/Sources/Data/Http/DataResponse/CardDTO.swift b/Data/Sources/Data/Http/DataResponse/CardDTO.swift index 9805228..fb91e9f 100644 --- a/Data/Sources/Data/Http/DataResponse/CardDTO.swift +++ b/Data/Sources/Data/Http/DataResponse/CardDTO.swift @@ -9,6 +9,22 @@ import Foundation struct CardDTO: Decodable { - var card_number: String? - var card_type: String? + var cardNumber: String? + var cardType: String? + + init(cardNumber: String? = nil, cardType: String? = nil) { + self.cardNumber = cardNumber + self.cardType = cardType + } + + enum CodingKeys: String, CodingKey { + case cardNumber = "card_number" + case cardType = "card_type" + } + + init(from decoder: Decoder) throws { + let container = try decoder.container(keyedBy: CodingKeys.self) + self.cardNumber = try container.decodeIfPresent(String.self, forKey: .cardNumber) + self.cardType = try container.decodeIfPresent(String.self, forKey: .cardType) + } } diff --git a/Data/Sources/Data/Http/DataResponse/CardTransferCountDTO.swift b/Data/Sources/Data/Http/DataResponse/CardTransferCountDTO.swift index b19f0d4..629f753 100644 --- a/Data/Sources/Data/Http/DataResponse/CardTransferCountDTO.swift +++ b/Data/Sources/Data/Http/DataResponse/CardTransferCountDTO.swift @@ -9,31 +9,37 @@ import Foundation class CardTransferCountDTO: NSObject, NSSecureCoding, Decodable { - enum Key: String { - case numberOfTransfers - case totalTransfer - } - static var supportsSecureCoding: Bool = true - var number_of_transfers: Int? - var total_transfer: Int? + var numberOfTransfers: Int? + var totalTransfer: Int? - init(number_of_transfers: Int? = nil, total_transfer: Int? = nil) { - self.number_of_transfers = number_of_transfers - self.total_transfer = total_transfer + init(numberOfTransfers: Int? = nil, totalTransfer: Int? = nil) { + self.numberOfTransfers = numberOfTransfers + self.totalTransfer = totalTransfer } func encode(with coder: NSCoder) { - coder.encode(number_of_transfers, forKey: Key.numberOfTransfers.rawValue) - coder.encode(total_transfer, forKey: Key.totalTransfer.rawValue) + coder.encode(numberOfTransfers, forKey: CodingKeys.numberOfTransfers.rawValue) + coder.encode(totalTransfer, forKey: CodingKeys.totalTransfer.rawValue) + } + + enum CodingKeys: String, CodingKey { + case numberOfTransfers = "number_of_transfers" + case totalTransfer = "total_transfer" + } + + required init(from decoder: Decoder) throws { + let container = try decoder.container(keyedBy: CodingKeys.self) + self.numberOfTransfers = try container.decodeIfPresent(Int.self, forKey: .numberOfTransfers) + self.totalTransfer = try container.decodeIfPresent(Int.self, forKey: .totalTransfer) } required convenience init?(coder: NSCoder) { - let number_of_transfers = coder.decodeObject(of: NSNumber.self, - forKey: Key.numberOfTransfers.rawValue)?.intValue - let total_transfer = coder.decodeObject(of: NSNumber.self, - forKey: Key.totalTransfer.rawValue)?.intValue + let numberOfTransfers = coder.decodeObject(of: NSNumber.self, + forKey: CodingKeys.numberOfTransfers.rawValue)?.intValue + let totalTransfer = coder.decodeObject(of: NSNumber.self, + forKey: CodingKeys.totalTransfer.rawValue)?.intValue - self.init(number_of_transfers: number_of_transfers, total_transfer: total_transfer) + self.init(numberOfTransfers: numberOfTransfers, totalTransfer: totalTransfer) } } diff --git a/Data/Sources/Data/Http/DataResponse/PersonBankAccountDTO.swift b/Data/Sources/Data/Http/DataResponse/PersonBankAccountDTO.swift index fceaae1..ca16c8c 100644 --- a/Data/Sources/Data/Http/DataResponse/PersonBankAccountDTO.swift +++ b/Data/Sources/Data/Http/DataResponse/PersonBankAccountDTO.swift @@ -11,36 +11,35 @@ struct PersonBankAccountDTO: Decodable { var person: PersonDTO? var card: CardDTO? - var more_info: CardTransferCountDTO? + var moreInfo: CardTransferCountDTO? var note: String? - var last_transfer: Date? + var lastTransfer: Date? var isFavorite: Bool = false - init(person: PersonDTO?, card: CardDTO?, more_info: CardTransferCountDTO?, note: String?, - last_transfer: Date?, isFavorite: Bool = false) { + init(person: PersonDTO?, card: CardDTO?, moreInfo: CardTransferCountDTO?, note: String?, + lastTransfer: Date?, isFavorite: Bool = false) { self.person = person self.card = card - self.more_info = more_info + self.moreInfo = moreInfo self.note = note - self.last_transfer = last_transfer + self.lastTransfer = lastTransfer self.isFavorite = isFavorite } - enum CodingKeys: CodingKey { - case person - case card - case more_info - case note - case last_transfer - case isFavorite + enum CodingKeys: String, CodingKey { + case person = "person" + case card = "card" + case moreInfo = "more_info" + case note = "note" + case lastTransfer = "lastTransfer" } init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) self.person = try container.decodeIfPresent(PersonDTO.self, forKey: .person) self.card = try container.decodeIfPresent(CardDTO.self, forKey: .card) - self.more_info = try container.decodeIfPresent(CardTransferCountDTO.self, forKey: .more_info) + self.moreInfo = try container.decodeIfPresent(CardTransferCountDTO.self, forKey: .moreInfo) self.note = try container.decodeIfPresent(String.self, forKey: .note) - self.last_transfer = try container.decodeIfPresent(Date.self, forKey: .last_transfer) + self.lastTransfer = try container.decodeIfPresent(Date.self, forKey: .lastTransfer) } } diff --git a/Data/Sources/Data/Http/DataResponse/PersonDTO.swift b/Data/Sources/Data/Http/DataResponse/PersonDTO.swift index b4fdb30..dc7410c 100644 --- a/Data/Sources/Data/Http/DataResponse/PersonDTO.swift +++ b/Data/Sources/Data/Http/DataResponse/PersonDTO.swift @@ -9,7 +9,26 @@ import Foundation struct PersonDTO: Decodable { - var full_name: String? + var fullName: String? var email: String? var avatar: String? + + init(fullName: String? = nil, email: String? = nil, avatar: String? = nil) { + self.fullName = fullName + self.email = email + self.avatar = avatar + } + + enum CodingKeys: String, CodingKey { + case fullName = "full_name" + case email = "email" + case avatar = "avatar" + } + + init(from decoder: Decoder) throws { + let container = try decoder.container(keyedBy: CodingKeys.self) + self.fullName = try container.decodeIfPresent(String.self, forKey: .fullName) + self.email = try container.decodeIfPresent(String.self, forKey: .email) + self.avatar = try container.decodeIfPresent(String.self, forKey: .avatar) + } } diff --git a/Data/Sources/Data/Http/Mapper/CardMapper.swift b/Data/Sources/Data/Http/Mapper/CardMapper.swift index 371895c..b9f0592 100644 --- a/Data/Sources/Data/Http/Mapper/CardMapper.swift +++ b/Data/Sources/Data/Http/Mapper/CardMapper.swift @@ -15,11 +15,11 @@ struct CardMapper: Mapper { func mapDtoToEntity(input: CardDTO?) -> Card? { guard let input else { return nil } - return .init(cardNumber: input.card_number, cardType: input.card_type) + return .init(cardNumber: input.cardNumber, cardType: input.cardType) } func mapEntityToDto(input: Card?) -> CardDTO? { guard let input else { return nil } - return .init(card_number: input.cardNumber, card_type: input.cardType) + return .init(cardNumber: input.cardNumber, cardType: input.cardType) } } diff --git a/Data/Sources/Data/Http/Mapper/CardTransferCountMapper.swift b/Data/Sources/Data/Http/Mapper/CardTransferCountMapper.swift index 3cf421d..7c1cfb3 100644 --- a/Data/Sources/Data/Http/Mapper/CardTransferCountMapper.swift +++ b/Data/Sources/Data/Http/Mapper/CardTransferCountMapper.swift @@ -15,13 +15,13 @@ struct CardTransferCountMapper: Mapper { func mapDtoToEntity(input: CardTransferCountDTO?) -> CardTransferCount? { guard let input else { return nil } - return .init(numberOfTransfers: input.number_of_transfers, - totalTransfer: input.total_transfer) + return .init(numberOfTransfers: input.numberOfTransfers, + totalTransfer: input.totalTransfer) } func mapEntityToDto(input: CardTransferCount?) -> CardTransferCountDTO? { guard let input else { return nil } - return .init(number_of_transfers: input.numberOfTransfers, - total_transfer: input.totalTransfer) + return .init(numberOfTransfers: input.numberOfTransfers, + totalTransfer: input.totalTransfer) } } diff --git a/Data/Sources/Data/Http/Mapper/PersonBankAccountMapper.swift b/Data/Sources/Data/Http/Mapper/PersonBankAccountMapper.swift index 0d15b59..860973f 100644 --- a/Data/Sources/Data/Http/Mapper/PersonBankAccountMapper.swift +++ b/Data/Sources/Data/Http/Mapper/PersonBankAccountMapper.swift @@ -27,16 +27,16 @@ struct PersonBankAccountMapper: Mapper { func mapDtoToEntity(input: PersonBankAccountDTO) -> PersonBankAccount { let person = personMapper.mapDtoToEntity(input: input.person) let card = cardMapper.mapDtoToEntity(input: input.card) - let transferCount = cardTransferCountMapper.mapDtoToEntity(input: input.more_info) + let transferCount = cardTransferCountMapper.mapDtoToEntity(input: input.moreInfo) return .init(person: person, card: card, cardTransferCount: transferCount, note: input.note, - lastDateTransfer: input.last_transfer) + lastDateTransfer: input.lastTransfer) } func mapEntityToDto(input: PersonBankAccount) -> PersonBankAccountDTO { let person = personMapper.mapEntityToDto(input: input.person) let card = cardMapper.mapEntityToDto(input: input.card) let transferCount = cardTransferCountMapper.mapEntityToDto(input: input.cardTransferCount) - return .init(person: person, card: card, more_info: transferCount, note: input.note, - last_transfer: input.lastDateTransfer) + return .init(person: person, card: card, moreInfo: transferCount, note: input.note, + lastTransfer: input.lastDateTransfer) } } diff --git a/Data/Sources/Data/Http/Mapper/PersonMapper.swift b/Data/Sources/Data/Http/Mapper/PersonMapper.swift index 7b26946..0e168cd 100644 --- a/Data/Sources/Data/Http/Mapper/PersonMapper.swift +++ b/Data/Sources/Data/Http/Mapper/PersonMapper.swift @@ -15,13 +15,13 @@ struct PersonMapper: Mapper { func mapDtoToEntity(input: PersonDTO?) -> Person? { guard let input else { return nil } - return .init(name: input.full_name, email: input.email, + return .init(name: input.fullName, email: input.email, avatar: input.avatar) } func mapEntityToDto(input: Person?) -> PersonDTO? { guard let input else { return nil } - return .init(full_name: input.name, email: input.email, + return .init(fullName: input.name, email: input.email, avatar: input.avatar) } } diff --git a/Data/Sources/Data/Local/Database/ManagedObject/PersonBankAccountEntity+CoreDataProperties.swift b/Data/Sources/Data/Local/Database/ManagedObject/PersonBankAccountEntity+CoreDataProperties.swift index 7e41648..8f5f802 100644 --- a/Data/Sources/Data/Local/Database/ManagedObject/PersonBankAccountEntity+CoreDataProperties.swift +++ b/Data/Sources/Data/Local/Database/ManagedObject/PersonBankAccountEntity+CoreDataProperties.swift @@ -17,7 +17,7 @@ extension PersonBankAccountEntity { @NSManaged var dateSaved: Date? @NSManaged var lastTransfer: Date? - @NSManaged var more_info: CardTransferCountDTO? + @NSManaged var moreInfo: CardTransferCountDTO? @NSManaged var note: String? @NSManaged var isFavorite: Bool @NSManaged var card: CardEntity? diff --git a/Data/Sources/Data/Local/Database/Mapper/CardEntityMapper.swift b/Data/Sources/Data/Local/Database/Mapper/CardEntityMapper.swift index eb9baab..00e5afe 100644 --- a/Data/Sources/Data/Local/Database/Mapper/CardEntityMapper.swift +++ b/Data/Sources/Data/Local/Database/Mapper/CardEntityMapper.swift @@ -22,14 +22,14 @@ struct CardEntityMapper: Mapper { func mapDtoToEntity(input: CardDTO?) -> CardEntity? { guard let input else { return nil } let entity = CardEntity(context: context) - entity.cardType = input.card_type - entity.cardNumber = input.card_number + entity.cardType = input.cardType + entity.cardNumber = input.cardNumber return entity } func mapEntityToDto(input: CardEntity?) -> CardDTO? { guard let input else { return nil } - return .init(card_number: input.cardNumber, card_type: input.cardType) + return .init(cardNumber: input.cardNumber, cardType: input.cardType) } } diff --git a/Data/Sources/Data/Local/Database/Mapper/PersonBankAccountEntityMapper.swift b/Data/Sources/Data/Local/Database/Mapper/PersonBankAccountEntityMapper.swift index 8515fe3..de57b09 100644 --- a/Data/Sources/Data/Local/Database/Mapper/PersonBankAccountEntityMapper.swift +++ b/Data/Sources/Data/Local/Database/Mapper/PersonBankAccountEntityMapper.swift @@ -28,10 +28,10 @@ struct PersonBankAccountEntityMapper: Mapper { func mapDtoToEntity(input: PersonBankAccountDTO) -> PersonBankAccountEntity { let entity = PersonBankAccountEntity(context: context) entity.person = personEntityMapper.mapDtoToEntity(input: input.person) - entity.more_info = input.more_info + entity.moreInfo = input.moreInfo entity.card = cardEntityMapper.mapDtoToEntity(input: input.card) entity.note = input.note - entity.lastTransfer = input.last_transfer + entity.lastTransfer = input.lastTransfer entity.dateSaved = Date() return entity @@ -41,7 +41,7 @@ struct PersonBankAccountEntityMapper: Mapper { let person = personEntityMapper.mapEntityToDto(input: input.person) let card = cardEntityMapper.mapEntityToDto(input: input.card) return .init(person: person, card: card, - more_info: input.more_info, note: input.note, - last_transfer: input.lastTransfer, isFavorite: input.isFavorite) + moreInfo: input.moreInfo, note: input.note, + lastTransfer: input.lastTransfer, isFavorite: input.isFavorite) } } diff --git a/Data/Sources/Data/Local/Database/Mapper/PersonEntityMapper.swift b/Data/Sources/Data/Local/Database/Mapper/PersonEntityMapper.swift index 57f6104..2649b87 100644 --- a/Data/Sources/Data/Local/Database/Mapper/PersonEntityMapper.swift +++ b/Data/Sources/Data/Local/Database/Mapper/PersonEntityMapper.swift @@ -22,7 +22,7 @@ struct PersonEntityMapper: Mapper { func mapDtoToEntity(input: PersonDTO?) -> PersonEntity? { guard let input else { return nil } let entity = PersonEntity(context: context) - entity.name = input.full_name + entity.name = input.fullName entity.avatar = input.avatar entity.email = input.email @@ -31,7 +31,7 @@ struct PersonEntityMapper: Mapper { func mapEntityToDto(input: PersonEntity?) -> PersonDTO? { guard let input else { return nil } - return .init(full_name: input.name, email: input.email, + return .init(fullName: input.name, email: input.email, avatar: input.avatar) } } diff --git a/Data/Sources/Data/Local/Database/db.xcdatamodeld/db.xcdatamodel/contents b/Data/Sources/Data/Local/Database/db.xcdatamodeld/db.xcdatamodel/contents index ac9abab..f276418 100644 --- a/Data/Sources/Data/Local/Database/db.xcdatamodeld/db.xcdatamodel/contents +++ b/Data/Sources/Data/Local/Database/db.xcdatamodeld/db.xcdatamodel/contents @@ -9,7 +9,7 @@ - + diff --git a/Data/Tests/DataTests/HttpTests/ApiTests.swift b/Data/Tests/DataTests/HttpTests/ApiTests.swift index e10eac0..0d29f29 100644 --- a/Data/Tests/DataTests/HttpTests/ApiTests.swift +++ b/Data/Tests/DataTests/HttpTests/ApiTests.swift @@ -28,9 +28,10 @@ final class ApiTests: XCTestCase { // then XCTAssertEqual(accounts.count, 10) - XCTAssertEqual(accounts.first?.person?.full_name, "Jemimah Sprott") + XCTAssertEqual(accounts.first?.person?.fullName, "Jemimah Sprott") XCTAssertEqual(accounts.first?.person?.email, nil) - XCTAssertEqual(accounts.first?.card?.card_number, "5602217292772382") + XCTAssertEqual(accounts.first?.card?.cardNumber, "5602217292772382") + XCTAssertEqual(accounts.first?.moreInfo?.numberOfTransfers, 74) } catch { // then @@ -90,9 +91,9 @@ final class ApiTests: XCTestCase { // then XCTAssertEqual(accounts.count, 2) - XCTAssertEqual(accounts.first?.person?.full_name, "Jemimah Sprott") + XCTAssertEqual(accounts.first?.person?.fullName, "Jemimah Sprott") XCTAssertEqual(accounts.first?.person?.email, nil) - XCTAssertEqual(accounts.first?.card?.card_number, "5602217292772382") + XCTAssertEqual(accounts.first?.card?.cardNumber, "5602217292772382") } catch { diff --git a/Data/Tests/DataTests/LocalTests/DatabaseTests/DatabaseTests.swift b/Data/Tests/DataTests/LocalTests/DatabaseTests/DatabaseTests.swift index aa5af8d..f78451a 100644 --- a/Data/Tests/DataTests/LocalTests/DatabaseTests/DatabaseTests.swift +++ b/Data/Tests/DataTests/LocalTests/DatabaseTests/DatabaseTests.swift @@ -36,7 +36,7 @@ final class DatabaseTests: XCTestCase { account.lastTransfer = nil account.person = person account.card = card - account.more_info = .init(number_of_transfers: 1, total_transfer: nil) + account.moreInfo = .init(numberOfTransfers: 1, totalTransfer: nil) } func testSavePersonAccount() { @@ -62,7 +62,7 @@ final class DatabaseTests: XCTestCase { XCTAssertEqual(results.first?.note, "note") XCTAssertEqual(results.first?.person?.name, "hessam") XCTAssertEqual(results.first?.card?.cardNumber, "123") - XCTAssertEqual(results.first?.more_info?.number_of_transfers, 1) + XCTAssertEqual(results.first?.moreInfo?.numberOfTransfers, 1) } } catch { diff --git a/Data/Tests/DataTests/RepositoriesTests/Mock/MockApi.swift b/Data/Tests/DataTests/RepositoriesTests/Mock/MockApi.swift index d10ef81..03149c7 100644 --- a/Data/Tests/DataTests/RepositoriesTests/Mock/MockApi.swift +++ b/Data/Tests/DataTests/RepositoriesTests/Mock/MockApi.swift @@ -11,13 +11,13 @@ import Foundation final class MockApi: Api { func callApi(route: ApiRouter, decodeType type: T.Type) async throws -> T where T : Decodable { - let person = PersonDTO(full_name: "hessam", email: "h.mahdi", avatar: nil) - let card = CardDTO(card_number: "123", card_type: "master") - let cardCount = CardTransferCountDTO(number_of_transfers: 12, total_transfer: 12) + let person = PersonDTO(fullName: "hessam", email: "h.mahdi", avatar: nil) + let card = CardDTO(cardNumber: "123", cardType: "master") + let cardCount = CardTransferCountDTO(numberOfTransfers: 12, totalTransfer: 12) let note = "note" let account = PersonBankAccountDTO(person: person, card: card, - more_info: cardCount, note: note, - last_transfer: nil) + moreInfo: cardCount, note: note, + lastTransfer: nil) guard let retVal = [account] as? T else { throw NetworkError.cannotParseJson From 16929860f48226e8f8b470080f1cc2ba6d8b4046 Mon Sep 17 00:00:00 2001 From: Hessam Mahdiabadi <67460597+iamHEssam@users.noreply.github.com> Date: Sun, 5 Nov 2023 21:50:59 +0330 Subject: [PATCH 14/34] Add Update of Favorite Status If Exist in Database --- Data/Sources/Data/Local/Local.swift | 1 + Data/Sources/Data/Local/LocalImpl.swift | 46 +++++++++++++++++++ .../PersonBankAccountRepositoryImpl.swift | 4 +- .../DataTests/LocalTests/LocalTests.swift | 41 ++++++++++++++++- .../RepositoriesTests/Mock/MockLocal.swift | 15 ++++++ .../PersonBankAccountRepositoryTests.swift | 40 ++++++++++++++++ .../PersonBankAccountRepository.swift | 2 +- .../PersonBankAccountUseCaseImpl.swift | 2 +- 8 files changed, 146 insertions(+), 5 deletions(-) diff --git a/Data/Sources/Data/Local/Local.swift b/Data/Sources/Data/Local/Local.swift index 646c59a..5ae0531 100644 --- a/Data/Sources/Data/Local/Local.swift +++ b/Data/Sources/Data/Local/Local.swift @@ -13,4 +13,5 @@ public protocol Local { func fetchFavoritePersonAccounts() async throws -> [PersonBankAccount] func savePersonAccountToFavorites(_ personBankAccount: PersonBankAccount) async throws -> PersonBankAccount func removePersonAccountFromFavorites(_ personBankAccount: PersonBankAccount) async throws -> PersonBankAccount + func updatefavoriteStatusBasedOnFavorites(_ personBankAccount: PersonBankAccount) async -> PersonBankAccount } diff --git a/Data/Sources/Data/Local/LocalImpl.swift b/Data/Sources/Data/Local/LocalImpl.swift index 87a8df3..8c3bdd7 100644 --- a/Data/Sources/Data/Local/LocalImpl.swift +++ b/Data/Sources/Data/Local/LocalImpl.swift @@ -151,4 +151,50 @@ public class LocalImpl: Local { } } } + + public func updatefavoriteStatusBasedOnFavorites(_ personBankAccount: PersonBankAccount) async -> PersonBankAccount { + return await withCheckedContinuation { [weak self] continuation in + guard let self else { + continuation.resume(returning: personBankAccount) + return + } + + self.database.backgroundContext.performAndWait { [weak self] in + guard let self else { + continuation.resume(returning: personBankAccount) + return + } + + do { + let fetchRequest: + NSFetchRequest = PersonBankAccountEntity.fetchRequest() + let sort = PersonBankAccountEntity.sortDescriptor + fetchRequest.sortDescriptors = [sort] + fetchRequest.fetchLimit = 1 + + let namePredicate = NSPredicate(format: "person.name == %@", + personBankAccount.person?.name ?? "") + let cardNumberPredicate = NSPredicate(format: "card.cardNumber == %@", + personBankAccount.card?.cardNumber ?? "") + let predicate = NSCompoundPredicate(type: .and, + subpredicates: [namePredicate, cardNumberPredicate]) + fetchRequest.predicate = predicate + + try Task.checkCancellation() + let accounts = try self.database.backgroundContext.fetch(fetchRequest) + guard let entity = accounts.first else { + continuation.resume(returning: personBankAccount) + return + } + + var newPersonBankAccount = personBankAccount + newPersonBankAccount.update(favoriteStatus: entity.isFavorite) + continuation.resume(returning: newPersonBankAccount) + + } catch { + continuation.resume(returning: personBankAccount) + } + } + } + } } diff --git a/Data/Sources/Data/Repositories/PersonBankAccountRepositoryImpl.swift b/Data/Sources/Data/Repositories/PersonBankAccountRepositoryImpl.swift index 460a23f..542cb43 100644 --- a/Data/Sources/Data/Repositories/PersonBankAccountRepositoryImpl.swift +++ b/Data/Sources/Data/Repositories/PersonBankAccountRepositoryImpl.swift @@ -40,7 +40,7 @@ public class PersonBankAccountRepositoryImpl: PersonBankAccountRepository { try await local.removePersonAccountFromFavorites(personBankAccount) } - public func updatefavoriteStatusForPersonAccount(_ personBankAccount: Domain.PersonBankAccount) async -> Domain.PersonBankAccount { - fatalError() + public func updatefavoriteStatusBasedOnFavorites(_ personBankAccount: PersonBankAccount) async -> PersonBankAccount { + await local.updatefavoriteStatusBasedOnFavorites(personBankAccount) } } diff --git a/Data/Tests/DataTests/LocalTests/LocalTests.swift b/Data/Tests/DataTests/LocalTests/LocalTests.swift index 8a9982d..a16a06d 100644 --- a/Data/Tests/DataTests/LocalTests/LocalTests.swift +++ b/Data/Tests/DataTests/LocalTests/LocalTests.swift @@ -70,7 +70,7 @@ final class LocalTests: XCTestCase { // when do { - let _ = try await local.savePersonAccountToFavorites(createBankAccount()) + let _ = try await local.savePersonAccountToFavorites(createBankAccount()) let accounts = try await local.fetchFavoritePersonAccounts() XCTAssertEqual(accounts.count, 1) @@ -80,4 +80,43 @@ final class LocalTests: XCTestCase { XCTAssertNil(error) } } + + func testSuccessUpdateFavoriteStatus() async { + + // given + local = LocalImpl(database: MockDatabase()) + + // when + do { + let _ = try await local.savePersonAccountToFavorites(createBankAccount()) + let account = await local.updatefavoriteStatusBasedOnFavorites(createBankAccount()) + + XCTAssertEqual(account.isFavorite, true) + + } catch { + // then + XCTAssertNil(error) + } + } + + func testDoesNotUpdateFavoriteStatus() async { + + // given + local = LocalImpl(database: MockDatabase()) + + // when + do { + let _ = try await local.savePersonAccountToFavorites(createBankAccount()) + var newAccountDoesNotExsit = createBankAccount() + newAccountDoesNotExsit.person?.name = "new person" + newAccountDoesNotExsit.card?.cardNumber = "453" + let account = await local.updatefavoriteStatusBasedOnFavorites(newAccountDoesNotExsit) + + XCTAssertEqual(account.isFavorite, false) + + } catch { + // then + XCTAssertNil(error) + } + } } diff --git a/Data/Tests/DataTests/RepositoriesTests/Mock/MockLocal.swift b/Data/Tests/DataTests/RepositoriesTests/Mock/MockLocal.swift index 600e595..afd3043 100644 --- a/Data/Tests/DataTests/RepositoriesTests/Mock/MockLocal.swift +++ b/Data/Tests/DataTests/RepositoriesTests/Mock/MockLocal.swift @@ -38,6 +38,12 @@ class MockLocal: Local { newAccount.update(favoriteStatus: false) return newAccount } + + func updatefavoriteStatusBasedOnFavorites(_ personBankAccount: PersonBankAccount) async -> PersonBankAccount { + var newAccount = personBankAccount + newAccount.update(favoriteStatus: true) + return newAccount + } } class MockSucceesRemoveLocal: MockLocal { @@ -64,3 +70,12 @@ class MockFailFetchFavoriteAccountLocal: MockLocal { throw LocalError.cannotFetchFavorites } } + +class MockDoesNotExistInFavoriteLocal: MockLocal { + + override func updatefavoriteStatusBasedOnFavorites(_ personBankAccount: PersonBankAccount) async -> PersonBankAccount { + var newAccount = personBankAccount + newAccount.update(favoriteStatus: false) + return newAccount + } +} diff --git a/Data/Tests/DataTests/RepositoriesTests/PersonBankAccountRepositoryTests.swift b/Data/Tests/DataTests/RepositoriesTests/PersonBankAccountRepositoryTests.swift index a596e2e..5763e75 100644 --- a/Data/Tests/DataTests/RepositoriesTests/PersonBankAccountRepositoryTests.swift +++ b/Data/Tests/DataTests/RepositoriesTests/PersonBankAccountRepositoryTests.swift @@ -144,4 +144,44 @@ final class PersonBankAccountRepositoryTests: XCTestCase { XCTAssertEqual(error as? LocalError, .cannotFetchFavorites) } } + + func testSuccessUpdateFavoriteStatus() async { + + // given + let local = MockLocal() + repository = PersonBankAccountRepositoryImpl(api: MockApi(), + local: local) + + // when + do { + let _ = try await repository.savePersonAccountToFavorites(local.createAccount()) + let account = await repository.updatefavoriteStatusBasedOnFavorites(local.createAccount()) + + XCTAssertEqual(account.isFavorite, true) + + } catch { + // then + XCTAssertNil(error) + } + } + + func testDoesNotUpdateFavoriteStatus() async { + + // given + let local = MockDoesNotExistInFavoriteLocal() + repository = PersonBankAccountRepositoryImpl(api: MockApi(), + local: local) + + // when + do { + let _ = try await repository.savePersonAccountToFavorites(local.createAccount()) + let account = await repository.updatefavoriteStatusBasedOnFavorites(local.createAccount()) + + XCTAssertEqual(account.isFavorite, false) + + } catch { + // then + XCTAssertNil(error) + } + } } diff --git a/Domain/Sources/Domain/Repositories/PersonBankAccountRepository.swift b/Domain/Sources/Domain/Repositories/PersonBankAccountRepository.swift index 44b9f89..74de235 100644 --- a/Domain/Sources/Domain/Repositories/PersonBankAccountRepository.swift +++ b/Domain/Sources/Domain/Repositories/PersonBankAccountRepository.swift @@ -13,5 +13,5 @@ public protocol PersonBankAccountRepository { func fetchFavoritePersonAccounts() async throws -> [PersonBankAccount] func savePersonAccountToFavorites(_ personBankAccount: PersonBankAccount) async throws -> PersonBankAccount func removePersonAccountFromFavorites(_ personBankAccount: PersonBankAccount) async throws -> PersonBankAccount - func updatefavoriteStatusForPersonAccount(_ personBankAccount: PersonBankAccount) async -> PersonBankAccount + func updatefavoriteStatusBasedOnFavorites(_ personBankAccount: PersonBankAccount) async -> PersonBankAccount } diff --git a/Domain/Sources/Domain/UseCases/PersonBankAccountUseCaseImpl.swift b/Domain/Sources/Domain/UseCases/PersonBankAccountUseCaseImpl.swift index 7cbf183..261fefe 100644 --- a/Domain/Sources/Domain/UseCases/PersonBankAccountUseCaseImpl.swift +++ b/Domain/Sources/Domain/UseCases/PersonBankAccountUseCaseImpl.swift @@ -84,7 +84,7 @@ public class PersonBankAccountUseCaseImpl: PersonBankAccountUseCase { func createUpdateFavoriteStatusTask(atIndex index: Int) { taskGroup.addTask { var updatedAccount = await self.repository - .updatefavoriteStatusForPersonAccount(accounts[index]) + .updatefavoriteStatusBasedOnFavorites(accounts[index]) updatedAccount.update(indexAtList: index) return updatedAccount } From 653f3a446ebceb0806e3bc93c823f77d1dc26be3 Mon Sep 17 00:00:00 2001 From: Hessam Mahdiabadi <67460597+iamHEssam@users.noreply.github.com> Date: Sun, 5 Nov 2023 22:01:02 +0330 Subject: [PATCH 15/34] fixes compiler error in mock test. implemented updatefavoriteStatusBasedOnFavorites function --- Domain/Tests/DomainTests/UseCasesTests/MockRepository.swift | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Domain/Tests/DomainTests/UseCasesTests/MockRepository.swift b/Domain/Tests/DomainTests/UseCasesTests/MockRepository.swift index 77c6cc5..c812693 100644 --- a/Domain/Tests/DomainTests/UseCasesTests/MockRepository.swift +++ b/Domain/Tests/DomainTests/UseCasesTests/MockRepository.swift @@ -9,7 +9,7 @@ import Foundation @testable import Domain class MockPersonBankAccountRepository: PersonBankAccountRepository { - + func createMockPersonAccount() -> PersonBankAccount { let person = Person(name: "hessam", email: "h.mahdi", avatar: nil) let card = Card(cardNumber: "123", cardType: "master") @@ -38,6 +38,10 @@ class MockPersonBankAccountRepository: PersonBankAccountRepository { func updatefavoriteStatusForPersonAccount(_ personBankAccount: Domain.PersonBankAccount) async -> Domain.PersonBankAccount { return personBankAccount } + + func updatefavoriteStatusBasedOnFavorites(_ personBankAccount: Domain.PersonBankAccount) async -> Domain.PersonBankAccount { + return personBankAccount + } } class MockSuccessEmptyFetchAccountRepository: MockPersonBankAccountRepository { From 7998b8468bbac70f0259f3711ef32b61c67ea9cc Mon Sep 17 00:00:00 2001 From: Hessam Mahdiabadi <67460597+iamHEssam@users.noreply.github.com> Date: Sun, 5 Nov 2023 22:30:45 +0330 Subject: [PATCH 16/34] Add GitHub Workflow for Linting and Testing and Add Fetch Index - Added a GitHub workflow to perform linting and tests on the Data package for every pull request. - Added a fetch index to database to enhance performance. --- .github/workflows/Data.yml | 29 +++++++++++++++++++ .github/workflows/Domain.yml | 4 ++- .../db.xcdatamodeld/db.xcdatamodel/contents | 16 ++++++++++ 3 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/Data.yml diff --git a/.github/workflows/Data.yml b/.github/workflows/Data.yml new file mode 100644 index 0000000..db32a1a --- /dev/null +++ b/.github/workflows/Data.yml @@ -0,0 +1,29 @@ +name: Data Layer + +on: + pull_request: + branches: + - '*' + - '*/*' + +jobs: + build: + runs-on: macos-13 + + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Set up SwiftLint + run: brew install swiftlint + + - name: Lint code + run: | + cd Data/Sources/ + swiftlint + + - name: run unit test + run: | + cd Data/ + swift build + swift test \ No newline at end of file diff --git a/.github/workflows/Domain.yml b/.github/workflows/Domain.yml index a0ffcab..5a9a94a 100644 --- a/.github/workflows/Domain.yml +++ b/.github/workflows/Domain.yml @@ -18,7 +18,9 @@ jobs: run: brew install swiftlint - name: Lint code - run: swiftlint + run: | + cd Domain/Sources/ + swiftlint - name: run unit test run: | diff --git a/Data/Sources/Data/Local/Database/db.xcdatamodeld/db.xcdatamodel/contents b/Data/Sources/Data/Local/Database/db.xcdatamodeld/db.xcdatamodel/contents index f276418..8f92080 100644 --- a/Data/Sources/Data/Local/Database/db.xcdatamodeld/db.xcdatamodel/contents +++ b/Data/Sources/Data/Local/Database/db.xcdatamodeld/db.xcdatamodel/contents @@ -4,6 +4,9 @@ + + + @@ -13,11 +16,24 @@ + + + + + + + + + + + + + \ No newline at end of file From b7a4764bb001ea5c933d7a1823ec8da156f08921 Mon Sep 17 00:00:00 2001 From: Hessam Mahdiabadi <67460597+iamHEssam@users.noreply.github.com> Date: Mon, 6 Nov 2023 00:00:48 +0330 Subject: [PATCH 17/34] Add Theme Color, Raleway Font with Dynamic Type Support, and InstantiateView Property Wrapper - Added theme color support to the project. - Added Raleway font with three weights and dynamic type compatibility. - Added the InstantiateView property wrapper for creating views using annotations. --- TransferList.xcodeproj/project.pbxproj | 2 + .../xcschemes/xcschememanagement.plist | 2 +- UI/.gitignore | 9 ++ UI/Package.swift | 31 ++++++ UI/README.md | 3 + .../Resources/Color.xcassets/Contents.json | 6 ++ .../background.colorset/Contents.json | 38 +++++++ .../blue.colorset/Contents.json | 20 ++++ .../border.colorset/Contents.json | 38 +++++++ .../divider.colorset/Contents.json | 38 +++++++ .../primary text.colorset/Contents.json | 38 +++++++ .../secondray text.colorset/Contents.json | 20 ++++ .../Contents.json | 38 +++++++ UI/Sources/UI/Color/Theme.swift | 19 ++++ UI/Sources/UI/Font/Font.swift | 96 ++++++++++++++++++ UI/Sources/UI/Font/Raleway.swift | 78 ++++++++++++++ .../UI/Font/Resources/Raleway-ExtraBold.ttf | Bin 0 -> 164156 bytes .../UI/Font/Resources/Raleway-Regular.ttf | Bin 0 -> 164120 bytes .../UI/Font/Resources/Raleway-SemiBold.ttf | Bin 0 -> 164136 bytes UI/Sources/UI/View/InstantiateView.swift | 20 ++++ 20 files changed, 495 insertions(+), 1 deletion(-) create mode 100644 UI/.gitignore create mode 100644 UI/Package.swift create mode 100644 UI/README.md create mode 100644 UI/Sources/UI/Color/Resources/Color.xcassets/Contents.json create mode 100644 UI/Sources/UI/Color/Resources/Color.xcassets/background.colorset/Contents.json create mode 100644 UI/Sources/UI/Color/Resources/Color.xcassets/blue.colorset/Contents.json create mode 100644 UI/Sources/UI/Color/Resources/Color.xcassets/border.colorset/Contents.json create mode 100644 UI/Sources/UI/Color/Resources/Color.xcassets/divider.colorset/Contents.json create mode 100644 UI/Sources/UI/Color/Resources/Color.xcassets/primary text.colorset/Contents.json create mode 100644 UI/Sources/UI/Color/Resources/Color.xcassets/secondray text.colorset/Contents.json create mode 100644 UI/Sources/UI/Color/Resources/Color.xcassets/supplementary background.colorset/Contents.json create mode 100644 UI/Sources/UI/Color/Theme.swift create mode 100644 UI/Sources/UI/Font/Font.swift create mode 100644 UI/Sources/UI/Font/Raleway.swift create mode 100644 UI/Sources/UI/Font/Resources/Raleway-ExtraBold.ttf create mode 100644 UI/Sources/UI/Font/Resources/Raleway-Regular.ttf create mode 100644 UI/Sources/UI/Font/Resources/Raleway-SemiBold.ttf create mode 100644 UI/Sources/UI/View/InstantiateView.swift diff --git a/TransferList.xcodeproj/project.pbxproj b/TransferList.xcodeproj/project.pbxproj index e8ba71b..7d90c0e 100644 --- a/TransferList.xcodeproj/project.pbxproj +++ b/TransferList.xcodeproj/project.pbxproj @@ -17,6 +17,7 @@ /* Begin PBXFileReference section */ DE3EF77C2AF6F9B40071E5E4 /* Data */ = {isa = PBXFileReference; lastKnownFileType = wrapper; path = Data; sourceTree = ""; }; + DE690E9E2AF82D4300E8C451 /* UI */ = {isa = PBXFileReference; lastKnownFileType = wrapper; path = UI; sourceTree = ""; }; DEBE4ABF2AF6C3B000A58501 /* TransferList.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = TransferList.app; sourceTree = BUILT_PRODUCTS_DIR; }; DEBE4AC22AF6C3B000A58501 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; DEBE4AC42AF6C3B000A58501 /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; }; @@ -42,6 +43,7 @@ DEBE4AB62AF6C3B000A58501 = { isa = PBXGroup; children = ( + DE690E9E2AF82D4300E8C451 /* UI */, DE3EF77C2AF6F9B40071E5E4 /* Data */, DEBE4AD62AF6C8F600A58501 /* Domain */, DEBE4AC12AF6C3B000A58501 /* TransferList */, diff --git a/TransferList.xcodeproj/xcuserdata/hessam.xcuserdatad/xcschemes/xcschememanagement.plist b/TransferList.xcodeproj/xcuserdata/hessam.xcuserdatad/xcschemes/xcschememanagement.plist index 5eb9d26..52e1fe9 100644 --- a/TransferList.xcodeproj/xcuserdata/hessam.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/TransferList.xcodeproj/xcuserdata/hessam.xcuserdatad/xcschemes/xcschememanagement.plist @@ -7,7 +7,7 @@ TransferList.xcscheme_^#shared#^_ orderHint - 3 + 5 diff --git a/UI/.gitignore b/UI/.gitignore new file mode 100644 index 0000000..3b29812 --- /dev/null +++ b/UI/.gitignore @@ -0,0 +1,9 @@ +.DS_Store +/.build +/Packages +/*.xcodeproj +xcuserdata/ +DerivedData/ +.swiftpm/config/registries.json +.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata +.netrc diff --git a/UI/Package.swift b/UI/Package.swift new file mode 100644 index 0000000..d3bec7e --- /dev/null +++ b/UI/Package.swift @@ -0,0 +1,31 @@ +// swift-tools-version: 5.8 +// The swift-tools-version declares the minimum version of Swift required to build this package. + +import PackageDescription + +let package = Package( + name: "UI", + platforms: [.iOS(.v14), .macOS(.v10_15)], + products: [ + // Products define the executables and libraries a package produces, and make them visible to other packages. + .library( + name: "UI", + targets: ["UI"]), + ], + dependencies: [ + // Dependencies declare other packages that this package depends on. + // .package(url: /* package url */, from: "1.0.0"), + ], + targets: [ + // Targets are the basic building blocks of a package. A target can define a module or a test suite. + // Targets can depend on other targets in this package, and on products in packages this package depends on. + .target( + name: "UI", + dependencies: [], + resources: [.process("Font/Resources"), + .process("Color/Resources")]), + .testTarget( + name: "UITests", + dependencies: ["UI"]), + ] +) diff --git a/UI/README.md b/UI/README.md new file mode 100644 index 0000000..096aa1d --- /dev/null +++ b/UI/README.md @@ -0,0 +1,3 @@ +# UI + +A description of this package. diff --git a/UI/Sources/UI/Color/Resources/Color.xcassets/Contents.json b/UI/Sources/UI/Color/Resources/Color.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/UI/Sources/UI/Color/Resources/Color.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/UI/Sources/UI/Color/Resources/Color.xcassets/background.colorset/Contents.json b/UI/Sources/UI/Color/Resources/Color.xcassets/background.colorset/Contents.json new file mode 100644 index 0000000..f14fb98 --- /dev/null +++ b/UI/Sources/UI/Color/Resources/Color.xcassets/background.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.996", + "green" : "0.965", + "red" : "0.953" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.259", + "green" : "0.118", + "red" : "0.145" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/UI/Sources/UI/Color/Resources/Color.xcassets/blue.colorset/Contents.json b/UI/Sources/UI/Color/Resources/Color.xcassets/blue.colorset/Contents.json new file mode 100644 index 0000000..239990b --- /dev/null +++ b/UI/Sources/UI/Color/Resources/Color.xcassets/blue.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.949", + "green" : "0.514", + "red" : "0.227" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/UI/Sources/UI/Color/Resources/Color.xcassets/border.colorset/Contents.json b/UI/Sources/UI/Color/Resources/Color.xcassets/border.colorset/Contents.json new file mode 100644 index 0000000..22ac69c --- /dev/null +++ b/UI/Sources/UI/Color/Resources/Color.xcassets/border.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.898", + "green" : "0.898", + "red" : "0.898" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.286", + "green" : "0.188", + "red" : "0.208" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/UI/Sources/UI/Color/Resources/Color.xcassets/divider.colorset/Contents.json b/UI/Sources/UI/Color/Resources/Color.xcassets/divider.colorset/Contents.json new file mode 100644 index 0000000..3403f58 --- /dev/null +++ b/UI/Sources/UI/Color/Resources/Color.xcassets/divider.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.780", + "green" : "0.776", + "red" : "0.773" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.290", + "green" : "0.235", + "red" : "0.243" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/UI/Sources/UI/Color/Resources/Color.xcassets/primary text.colorset/Contents.json b/UI/Sources/UI/Color/Resources/Color.xcassets/primary text.colorset/Contents.json new file mode 100644 index 0000000..d890719 --- /dev/null +++ b/UI/Sources/UI/Color/Resources/Color.xcassets/primary text.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.000", + "green" : "0.000", + "red" : "0.000" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "1.000", + "green" : "1.000", + "red" : "1.000" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/UI/Sources/UI/Color/Resources/Color.xcassets/secondray text.colorset/Contents.json b/UI/Sources/UI/Color/Resources/Color.xcassets/secondray text.colorset/Contents.json new file mode 100644 index 0000000..08cd06a --- /dev/null +++ b/UI/Sources/UI/Color/Resources/Color.xcassets/secondray text.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.706", + "green" : "0.706", + "red" : "0.706" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/UI/Sources/UI/Color/Resources/Color.xcassets/supplementary background.colorset/Contents.json b/UI/Sources/UI/Color/Resources/Color.xcassets/supplementary background.colorset/Contents.json new file mode 100644 index 0000000..c75ead8 --- /dev/null +++ b/UI/Sources/UI/Color/Resources/Color.xcassets/supplementary background.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "1.000", + "green" : "1.000", + "red" : "1.000" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.216", + "green" : "0.102", + "red" : "0.122" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/UI/Sources/UI/Color/Theme.swift b/UI/Sources/UI/Color/Theme.swift new file mode 100644 index 0000000..9f99449 --- /dev/null +++ b/UI/Sources/UI/Color/Theme.swift @@ -0,0 +1,19 @@ +// +// Theme.swift +// +// +// Created by Hessam Mahdiabadi on 11/5/23. +// + +import UIKit + +public class Theme { + + static let background = UIColor(named: "background") + static let supplementaryBackground = UIColor(named: "supplementary background") + static let blue = UIColor(named: "blue") + static let border = UIColor(named: "border") + static let divider = UIColor(named: "divider") + static let primaryText = UIColor(named: "primary text") + static let secondrayText = UIColor(named: "secondray text") +} diff --git a/UI/Sources/UI/Font/Font.swift b/UI/Sources/UI/Font/Font.swift new file mode 100644 index 0000000..44b0efd --- /dev/null +++ b/UI/Sources/UI/Font/Font.swift @@ -0,0 +1,96 @@ +// +// Font.swift +// +// +// Created by Hessam Mahdiabadi on 11/5/23. +// + +import Foundation +import CoreGraphics +import CoreText + +public struct Font { + + // MARK: - Error + private enum FontError: Error, LocalizedError { + case cannotRegisterFont(fontName: String) + case cannotUnRegisterFont(fontName: String) + + var errorDescription: String? { + switch self { + case .cannotRegisterFont(let fontName): + return "Error registering font: \(fontName)" + + case .cannotUnRegisterFont(let fontName): + return "Error unRegistering font: \(fontName)" + } + } + } + + // MARK: - public methods + public static func registerFonts() { + + Raleway.allCases.forEach { font in + let name = String(describing: font) + do { + try registerFont(fontName: name, withExtension: font.fileExtension) + } catch { + print(error.localizedDescription) + } + } + } + + public static func unRegisterFonts() { + + Raleway.allCases.forEach { font in + let name = String(describing: font) + do { + try unRegisterFont(fontName: name, withExtension: font.fileExtension) + } catch { + print(error.localizedDescription) + } + } + } + + // MARK: - internal methods + static func registerFont(fontName: String, withExtension: String) throws { + + guard let fontURL = Bundle.module.url(forResource: fontName, withExtension: withExtension) else { + throw FontError.cannotRegisterFont(fontName: fontName) + } + + guard let fontDataProvider = CGDataProvider(url: fontURL as CFURL) else { + throw FontError.cannotRegisterFont(fontName: fontName) + } + + guard let font = CGFont(fontDataProvider) else { + throw FontError.cannotRegisterFont(fontName: fontName) + } + + let success = CTFontManagerRegisterGraphicsFont(font, nil) + guard success else { + throw FontError.cannotRegisterFont(fontName: fontName) + } + } + + static func unRegisterFont(fontName: String, withExtension: String) throws { + + guard let fontURL = Bundle.module.url(forResource: fontName, withExtension: withExtension) else { + throw FontError.cannotUnRegisterFont(fontName: fontName) + } + + guard let fontDataProvider = CGDataProvider(url: fontURL as CFURL) else { + throw FontError.cannotUnRegisterFont(fontName: fontName) + } + + guard let font = CGFont(fontDataProvider) else { + throw FontError.cannotUnRegisterFont(fontName: fontName) + } + + let success = CTFontManagerUnregisterGraphicsFont(font, nil) + guard success else { + throw FontError.cannotUnRegisterFont(fontName: fontName) + } + } +} + diff --git a/UI/Sources/UI/Font/Raleway.swift b/UI/Sources/UI/Font/Raleway.swift new file mode 100644 index 0000000..bff6ec9 --- /dev/null +++ b/UI/Sources/UI/Font/Raleway.swift @@ -0,0 +1,78 @@ +// +// Raleway.swift +// +// +// Created by Hessam Mahdiabadi on 11/5/23. +// + +import Foundation +import UIKit + +public enum Raleway: CaseIterable, CustomStringConvertible { + + case regular + case semiBold + case extraBold + + public var fileExtension: String { + return "ttf" + } + + public var description: String { + var weight: String + switch self { + case .regular: weight = "Regular" + case .semiBold: weight = "SemiBold" + case .extraBold: weight = "ExtraBold" + } + + return "Raleway-" + weight + } + + public func customFont(basedOnTextStyle textStyle: UIFont.TextStyle) -> UIFont { + let name = String(describing: self) + let size = fontSize(basedOnTextStyle: textStyle) + + guard let font = UIFont(name: name, size: size) else { + return UIFont.preferredFont(forTextStyle: textStyle) + } + + let fontMetrics = UIFontMetrics(forTextStyle: textStyle) + return fontMetrics.scaledFont(for: font) + } + + func fontSize(basedOnTextStyle textStyle: UIFont.TextStyle) -> CGFloat { + switch self { + case .extraBold: return ExtraBoldFontSize(basedOnTextStyle: textStyle) + case .semiBold: return semiBoldFontSize(basedOnTextStyle: textStyle) + case .regular: return regularFontSize(basedOnTextStyle: textStyle) + } + } +} + +fileprivate extension Raleway { + + private func semiBoldFontSize(basedOnTextStyle textStyle: UIFont.TextStyle) -> CGFloat { + switch textStyle { + case .headline: return 22 + case .subheadline: return 18 + default: return 14 + } + } + + private func ExtraBoldFontSize(basedOnTextStyle textStyle: UIFont.TextStyle) -> CGFloat { + switch textStyle { + case .headline: return 24 + case .subheadline: return 20 + default: return 16 + } + } + + private func regularFontSize(basedOnTextStyle textStyle: UIFont.TextStyle) -> CGFloat { + switch textStyle { + case .title2: return 16 + case .title3: return 12 + default: return 10 + } + } +} diff --git a/UI/Sources/UI/Font/Resources/Raleway-ExtraBold.ttf b/UI/Sources/UI/Font/Resources/Raleway-ExtraBold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..42dd80b2b0724dec125c0441efd6c9372c960b6e GIT binary patch literal 164156 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%0A5`A;pN)-|zu@XBEPHKJb|kf$DDjcgE1 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 literal 0 HcmV?d00001 diff --git a/UI/Sources/UI/Font/Resources/Raleway-SemiBold.ttf b/UI/Sources/UI/Font/Resources/Raleway-SemiBold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..85d41ed214da537dd0523a204ccb553976371c5f GIT binary patch literal 164136 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

Ng;surR(^$6euY+kg;surmVJkoT}I0;qh*)T zvdd`MWi;%oH0-N1?5i~Ft2FGZH0-N1Y$I*<3JvxO?ez*D?G>8q6^5H1e6^4lz(i}BlVCDTfvGSJwh|*6*)k(5>yx)RMptHZ zWky$KRLjWOG9!8|&P)uDQ5mShV0%?;gYe2Z=J(v<9DF+m&(6WKZ{pXr_;oFQU5j7W z;@3I&bq;>b;MY8UZN;yFkDBmnyR++)VTb3(qEF7%=KcwNvgngVpDg-h(I<;OS@cPx zPa1vF=#xgDH2S3Fjzjgsw&;^apY&$*$(oH^N`;-Z{9WTp)&cmt9e=mu?{@s%j=$US zcRNmLF_MgtWQ-(ZBpD;g7)gVXG#E*Pku(@dgOP;VhLBro$KUPvyB&YGb`ng6DKHhL z!E`+F3_J_Z!3z*NC(VF4@EW`UZ^B#9n}eF~O7$Cng-`*ppQQR{2`q(5sDhR7u9}tZ zV8hjr?Gft8JU_tWK`to%Bd2 zJ<>^!bkZH`a7{BhrB#L}=-?!zKwT{D*i1V%(~ixwV>9j8OglEyj?J`V3w_aIh9WZ* znV|({Xn`48V1^c$p#^4Wfh%5)w#!}da#y_E6)$(i%i~I&#kA@YSPGR;1uLOiQ4LXRVSnV(%F!-Z}xbL?CB^Y4(kA~_07Y|!~oa-v`VQL ztpE1TMMqraHNMzm)H(C8B6X1&-spdQc&4*vI_sAr^HcCkkzbl&ep<=)zOnR$YPT@! zEBsO}{-uTSuXULDT>NY53{aq$R6D_&4ZocC%PZgi)h)mM?fBah=H@&0sg30^U*mfo z!XKBi=2ya1sPsL!8pgsk)<>>mCwe*SM%rpTZGJYK%ZEJ=E`&>q6{+vKhAY{1t69FG z&NtNghC1KyPU>3McAdxTJ>KB`x6-0}eB>Do*Vub~-EkH}mevTC{|~d9_lx-t%Vzt2xhHqblhuh8K9C~O@?7{cWWP2Z-+O2`9elUNX@%&lA zFo&h)u+$8+n}K#S&~66W&A_|HVs$#i95_$C#U|SM&0C8tv_S_>Y4dAq zNLEW2wK%B9FBe>Q)-MOyo!|G%Ev~x-UEfQoa_OV(I{Z1^45rzjUTK&c|8lQ3XpMih z1Apq$>6g0wN|$fW^nLT(KCRHZkK#t0aucm}v&UOJ&XMW+Pv4ri29=L4gQr|uuK1LA zdIDK{G_kA4eT(A~hl+0xFV0LHA^&@1G=y}A8n{ndK_6fR{Sfkh0QoPIr=K9_{-(I~ zsl>g-zsRdEGuoBr>0K+$OUzY+xe8UPHDc5I#H9a7G#6h=WMpGn>9;n>hP*Pgi_N>O zfJQWTsMr}UF0=zijGE#zCz5g9s2tl^Yk{b3&R^?WovrPg^RUXg){L~8^BQwrVP@K` zPR_MDxzy_9@>GBFF`zh^Z~b;^J5slUT~mXKZ{U{{O*J(24L-}c-g_RXMk04hQ{w^zn>(aQ+E-$!-Cw8rv@;Z;#d%VH>Z?Z4smRSClrtb8cGm9^#X5r4+e*0CJ z!&4mTO54N2q6*XARZjbSOP}JjkU2u)R1*N)V4mwaooiyAiYP{8JxA|pxI8^AC4KJcZ zn_2BPtKDX_+ibR)scygcCN0&i(?F;%Ef;Al(pB(X-#!3(M-b|WhW3r1V4qf~04|lw zD8o0U_@=aXCjC-~`bLo8ze_7BO@92@U2GUAu*L>_^jq55GT*A?zx5>w?wn&C`dzzg!Mi({TxgC}Y>NwfLN(NEn*5*b;En7cH@d{${j zs%zMTAGQ~2>|^Bnt1CDV<&N|BU?;;m{jKIAR8@yL2|kro_n6<$HPZ9oLby~Grq>d# z$4AZPW+FZc`mKxK8ETf_D^4-mr>%cJh?^gz%VyDKdAh7WD({2JyY0cN|*hWE(@9EJbm`OtDW7)0W)0n4C`+-*57KZzttq(q2pE*Cz^%7;ffa$ zE$YWJ>dITK*Ts7Y>CoPq@=CKZ)2z%w$0i*DA~P_)k24-c$E9ZAPiA1Y8JLKsFPnwg z=sF8sXQS(*==xW5-PO!Ih_-X-wgq(Cn{?YdIHiJadnPr|bJd!$m#c?1{Wcp9l+tZ0 zNa0MgIMXc7q}NuM$!UEa$s9Z}2T#nw6LavyWO{8DzL-p}%`(d~&GIUqn5j4-u9OPX86R!OUdZAmK zsUxFb>%`Z^KKZsYz?g%^InJ1`@p`XE(96sBcEOd2k_I%3J@g zIlI!|KJ0nLaZ&09@4KbASOzwMM{;Pa{v8iWe#taq)WMbcu|B~ggV-sQ>In~Nej)eK!IkX4Bg zs_(2s>gb5*;$~dAov3jc~Y3`Utt5ok{i{BziB`rZNc6 zEa}taVJFNIqg-l~%Z#$q_43D!FjS5YaHi>YA%5l6?7*guDZWHEKEtAiO!CVt`pbP< zUW`FHH_ty?Kf=i(A==<3Qhc+=TViRhCCynLN*2Y|qS#t`bcTBKi8>fhg2^xirouE( zX&udj`Jm!DS_l=enCGzsmO>>|!Ac%OwODqu)ikrP)YUId9smcyXgHSNb{t$zZ+)1* z)*E@)5nL5H&rF6T2`Lx=Ltq%}1S4Q1>oVPH&T^|c%UPLpBF|Up z=HYIvfDZXWYv*RR#+qY+2ApVyH{}kG@!GL;)Nycz&z%YXr2bu=92#YP?5VzCl~&QL38NsAe^)S&eE|<84->6}8@GHG+>f3)QM=&RI0VDtxw9&TV&b z#~$zr*c0}Gz2QVS2~LJn;8Yk3*TA(P(u{ZqR;cqsGxh6BW!mO<@ zTeZ=(cwGN6NWlOY0>fY@-~r3XX0^wx_Lx;Y$6znm8%~6i;AA)j zPKEQW{ayfLJ!f0ZZjagRF}poxx5w=EnB5+;+hcZn%x;g_?J>JOX17OmUNL$M9*4ie z1o#{L9VXg!ISD4i6qpLrAm)FcT>?v?5~^S&Y@Po@yfGhD(x{Tg|1(e~jWTJJY3<|x z6{ypLIzhLtK^>mI$KYSOb~5lZDy>1KHK?=(m3n9zo->@mTRs!M;rY41-$kt+)apU4 z9@Od~19M{;IG2}o9$W~QTA}IX{ZGERBr~RrY{4t05yZhv;gl1kEu^hWP*GJhT&9-tg%GUQ$wth3pPDj~#l&weE`VUZcCCaY+ zA1M18t+o(V7ozGyRDH9Ls%@y+hN^9-+J>sD`l!09kE#oUjH2qo_o*6k1qsDvt53Dsht8dwFju$sT(Bp0*XWOhT`9@a?~k(00kIcF9Z znZ-qBaS_>AN;Z~~jf@%0u*P<;$t|57XQ?t~DCChU<5hu$u2@9}41ggp40eJMFcNl# zU0_#d;EjUwRrOo|6GfAgU@}aBsW1)fp4yrwF#6Z(ESKR4}bqRx=VHeocr{!f=`m!s1*_FQRN?&%R zVL$f@bluweM*&^mK-V|W^$m1=16|)h*Eh^UdrZGpK4=>_cQKLUlR6pGEChe@Wi#-y z8F<+Yyo{D_pyeB8qSH)tqGee7c#l2{@$@QLs*nkPgRhs1E{?Y4Aq6h|-`tZnk!Lvx zCc_k%3e#Y^S$hVa1>UYTvrcPfoz~1cqdD*zya8{*TM+iB&x84}02V?8EVk2X2`q(5 zsDhOcds8wq)x4_JkcK8`VdFC%ou6n{*PGG0%{;0ZeIC_}*rPf?&xV6wG{oMNT_(rH zJ54t2BD}o#7AvyFPC{OKsN7i4mv`&UHebrK3VuLu*7?1@tn)0?$V9rw@?esX0^M!! zS{|?E@me0QlFcmH{2SS9MbBxtcbZvyGSML-%Bw>fEOR&vh8G_pqqS)J2pO$K z+egs$5wv}TjMk#>c=R2g{D$Y}!ewxI@kugT%hRjn>DBV|>}FE`)f-L!&f54(q+oq& zV?=!=S-pxa_#W8#$7YnX8O!@@#`4%^+*o`ib(1LPW{PV0J^- ziw3jXYIYmUZiCrvFuSd0x7U~chUe$PWpEYz0QkjbwpGNlalLNKYNarP*FlI6@030G zxE8jHZs~HxOI-01SG>d(FLA|7Tye=n~(E%!<3Rc2aqL4mK+C^Ii zE4#!@EHMj9%)%10u*3{3!Cy-@v$DZs>Y_iwx?WhT4cas8p)Kc0go?k=_3bD!-CHpf z?CV7OaT0vElDdb?^^mz9GS@@qddOT4nd>2QJ!Gzj%=M7D9x~VC7s6hqaxzy==E})j zIhiYWy;EH86xTb&^-giUQ(W&9^3_GQ)|0JXyBDgL_lWi5bl2BgseEj4itC#~X3EJ( zDH++gZW~rk^QnuW*M@CeIeiJgw?toH!#<9s*ytfniY_QlG9z2B8(BolZi|$#h)*L2hN!>u&NbtA<|sJeOG$i^5kwhDb-&(h$En|JC55f*UNgLeN@ZeSWtpN7+?k=ALX zbsA}%hI8LG16%15DJobj7q~s!)NN@GxhM9diYE|e5M{gQxBi1htJf*XX@E3a+qYM zoKXW)U@A<5a#E$Y8D6QzE7f?V8n1*|+Uj0KGtz}$x@h<=+}}mR2bte|#WF+?A$u~( zj07o|WF{t=iAiQ+mYJAkCVKcrJ#;{|nGiw5`mH*3kqBaA1=Tg4Uk9-+@Yq{tGsg_% zVz2RI__MtGQP8Uyx8CP+x;)b}@GOM&lNaDcm;rO(HFyKwgtwqvHQhY;P=%e*EoPmU zz*4A$Dp(nJf(v~v!)&$Sp%y&UhKCw@cfawQx8CpaIWzX08H@dDGp6cJ?!GtXS{g?H z`abo=UZGAV>l~xqS!foPXVAbiXy6$%@C+JaZ}LQsC&9^Z3Y-dK!I~}apdkwDwzt9^ z@FTbzegXHwui-Z^4jzDs>O3aFWS9a|VH!+V;K2!aaDth<&rIHDChs$o_nFE2%;bH1y9PYio9o$>=jk@PuO%`v6Ro4ZM&BJX=9}|AGR|q<1OlUD~%&Qo^_UV9sYP&tz@tMl~Nd@%wM~ zcuU+xoot3Gv>PkqK}I=iZ;_}S53G|Flfa@$*L8zesbWa<_tLEI?|Gt;-vQIqsA zZL*3sSw)+yqD@xOCaY+ZRkX<}+GG`NvWhlYMVqXmP2M6)Z{ego{rnRB{1PsB9v3{1 z3!cXX&*OsUal!Mb+9q~fjfz#MScQsJs91%HPQ8L^x~v9PK`pF?dY@SX4X_?WTXyTT zMO|Q3&TgHyXal?l1t^js^`r^)qzUz;b~-oP>D+9mb916U85^LN>_Cs!xa`(xNeuG( zU{G_K7z)E-R~QAm!S1jp><#GkE_5e5#4uXT>oBn=2TmWha65oc);R;X* zVTWQ4>9+T>}>{@NMYqdG~ zGx!DE3lI6*A3aWoH#~n6-tt_RJG(`j?F?hv}_rNNJ=q4|^X(R!SsT;h1uk5Znn^D^dr5qkgcMk(#({M> zunq^-;lMf^Sce1aa9|w{oR0(N$J+dSar*_ZtsGFfD)mKH3Kp|xOJFHfLKUoptyuhj zalcpw2WD_!1_x$vUf zwI~@Jn8AUqI539;b2u=E19LbqhXZpsFxR&atQ7~g;=ooMnArvg=5S!xRWJhw&cK0l zap0zW*0FM?$HjTmIvg0fqvUX41_x$vUz$j{f^`Mf`2{2LA1>MjC8{j=CK#|Qz z@GC@#IIs%`cHzJ-9N2{edvIXrR@{RFdvIV64(!5#T{y4{2X^7WE*#i}1G{iw7Y^*g zfn7MT3kP=Lzzy_Y5AN&1eLc9Z2lw@`GNHd(7Y^*gfn7MT3kP=Lz%Crvg#){AV5n{A z!hu~lunPxv;lLgzbVc-B4=(G$Wj(koM8ws&sdtac{?-gOUu)j9*Qy#fRXcMk!cASc zsS7uC;ifL!)PPqT@;C!ZtF6+WcT{x)=C-vZ@9-P#Lle%zH7fyO7m0}G; zL}R}!PDw>jJLdksf*{-#dGT7Id$=zx_C}q zJf|+6Qx^^P;TUyO-F)yNN__hYwT+uz4ZSA6+V_{`|LeaQSMm4$W;_Rd*Sp1az8URi zWoBEekb3-)ua0OxkNbm;aFKeRNJqFxM>w5r3ell(B#efm;AoIRkB)=m;RHC*+N%E}o5x z!wT&LdTj!$I)PQ4z^YDQRVU!d5AUm~BjfwQIC6d;s4-7G01v`L@HBsBI&1R`JPXgk z^Y9|ffR|tl!$0atY_MXYCqyy{dP3+VQqW1H zAP?E2lSt^>7$VehB7v~JKQ6hK$FRP?ufO3tx@R0;Y8+o`oGv1vw_{l6pTMF`&_$%6 zdr0W@xM`jLaCx6Lm*?nyfeXBk6t;u)b-8l9SYa^j*zfJVembw_! z_lXW#MF;KVC&c}Dp41Vy#d;RQp{dJAMhPBnuNBW)E z4-3B5MnCIsB(7at*e)(?7Z{A6X7H{8BPIxQgCd$n6O<;*e)h)kMt%M6Sj*9 z+r@i&o>J)lr@I*W=_h&;aWp2OZD_atxw@9??LLXrMq z!bX;`ktJ+o2^(3$MwT%2JqmmGH}C1&$PzZPgpDj=BTLxG5;n4gjVxg!OW4Q~HnN0` zEMcSBZR+#IKHSsyoBn=2TmTosx8ZWQ05 ztjHHD^2K`I@81*p_AK$4tw#eP!yfwMgx=D#adp^-IvYoay{NNs@@$+u8yAQDsH<`D zYTVnNJQps5%lTYt>hlOoqVH;W4Mi#b_g>7VEdutv4=y5v87mFBr zSlLEawvm->WM!Re2;H7kx7 zaj8}K-nxP1c)KpPw}0WqeVpvDb3&bL6J+ark?IAo?IK7N5SN7= zhzodKUu5UPzKbi8@y_8bPG381*%r5C@Bh9u;Y$-vee~3CZn~Y) zvGErE_QBgJ_kL-@3Ew(lpZ9MAKc72c;Fh<~FAe|y{Il?r&;R6@4Q@X==0~6VUARBy zN1MO*bJw0Q@N+{xc>CEnGV-V$ zf3)L&?0U#3f7{w^$AQEDG5qS`U+=r^F}(NIe|Z04Ylh7l+B|f~kdEQ~hrB-Isljg# zo-(}upjCsWyNw+*cKhn>@853jcK2>}JA1o(cO3Y^+rU=`zPjVUcw}!6{L8@a5B%(a zRqnq(;EDLw_gGp{`j66ol-yl%QOS`d+o#rSy4eeHI{px)*i+uy)qjYdIm6saRSE2= zKg3>6+#VL6r@Bjgp6c#VIB|Oql~u?1+i_~q_l{3eJs>_w^`Q8y?SG5HS=)!jXKf$u ztnEv!nTGSVPm03%+9${7YoDga^mWmfqg&n1jL%B_T6|XOS@Bt^Uysj99pkLjKSuu% zpO1P`d_L-bM&TUoi{o>&FNx35{*KN*(|mh4NBev6$*4b!!a3U4#wVj*7oUuJy-a6i zbdxIPs^}-`m>Z&>#^<2^CO!xCx1!*V=y#C_H~PI(Pq&XAiBCG65TA7VkNBk1Clh-n z_KYSc_D&oSO^MGneKtPV^o2yomd=PzG<`Kb(R7XzO;3$pi_bEh?<~`=MT_E7Oqax` zm{vK(^ulO)eCGA4_{{6t_{{5f<1?@865-72dS_n$IBJYfE6v2GmFl+RY-_sD+19ct ziQh(fXInoQb;hTa>cyXUBq}=9dVC_B&9G4~{4<>pv`07X5%w*2@;^c^(*t4+(yKih zX^)Wg&+EeQ;dk!yk>7d6R^R!>jo)eh`zIp1<_4&43Zpp0^F!g&@EJG^4u>Pe^+$Rf z4M)Q<@Od~MPJpoU?j-mEoD8SHsqiJIqn!p{hOfZsa3oE2W;bl0JY`4IG~S+QSkJGH!}$v->y`eAqk9)-tY2D}W7kg@x6Of*E6{8OoK z+J$nFtogURb}?KoQ~up(ZyED{vjR21`pV8$pa#gE?<{M6VCpp)_1F2|fr?wwr*9NA z`zG2n@J@1aOgTBGoE%e5jwvU{l#^r1$uZ^Rm~wJVIXR}B98+(Pl-*Eucln?_;1jSX zSYPC^7o&arE$k-V&tuqmdjQzYDn`zWk@I5Yycjtj9SNi1C^#Bam5Y({V&uFSIaJ6O zdHzM7f05^3<#Uxm%3fEk^F<@ol}L|KrEVD|v`pJ5Mdt$;{^=&gUV{=ONDLAqq=z#b|5;=(&U@~I`{4n25bW*YUxYs1TRFYM>o4-UX244@6J7x|c!|08p1uaJ z!yE7>*nz`G346oC`a`Gqx>J1JDZcI$Uw2x62z9?Xaduvuofl{4#o2jrc3zyF7mXCf z*<`niJ5vzcEtx0^DV`^4JmgS`&6mf_LO5ofmG z%od#4f-_riW(&@2!G#<9BD5qzUxZ&;h58lfQ;V`KDBIGPP1)E3A!Dpt?|l%c9C9Ta zJAqWOL!Ut9&=q9^Uhl^19Vi^uv=+>q}hl1naKDZwq zfCu3r=#|wE=e%BEzg{H6GvFoIqUXL;|7-9%ya8{*Lg?K`E*Iu|D`6SD168oxzAllb z8Ei3wy*=bN@8P~FAJyQxbE#0Bc#Ep`5L?fdX?hjHJPeJm=%nZ*BVXG$YvKH^v~Lge zX)${ttM$*n<c20jnR!wGOA zoaAiwFL*o|PJvV5OK=)|8NLFi!(OqyR0VGRzoF|u z->{xGa|(=#i+yp(^{N1Gz&mH-sf{(8q36KiJjoIiFG2AV6fZ&X5)>~%@e&j-LGhBl z^@RJP5C;B|%0XVJSNA!X} ziJL~_rlji~?s|v2-u+zf0XXSM*PL|CySZk4EH9wMq3=2M{qGrV4$JUM8Gb3lFJ<_p48N4&moofPW)1@d zLO+=@{8ENr!g)bu_$Bm}8iZfU@Jl!mstmuB;g>S}($5_BGl%`mVLx-&&m8tMhh^q4 zL=|QDr7X-Lo*8H!%kWGYo+-mKWq76x&y?YrGCWg;XUbgP2-i0Z-)v_dH+H8gbFEwL zPUX6{|6h@YlK)>x!+@>OJ@g9+RokH}SD<%k+%;p1&R^aUdRdkBy+dvAhrTCBRPed} zX=gK5DAZL38{X!-CbC`5YNnkw_f~fFj!oXmp!l!fB8pB2p=g0IXfn!ME7!o*!1dbtrV@Ti_5;%qgj&a3feDfF*IL1|van)l; z;26I&h6H{MkB%_|V@Ti_5;%qgjv;|#NZ=R}IEDm{F*{>qVoDQd!PkN3o4`4VbKo0r z9^3}EN2ex!4f^^ z?QjRU=A`RQy56MgP2L4}!_VQD`jh<%e(U+~fRB?L2lv4P@CW#FG=>%%LyL`}#l|Eb z^V;JcpYZs1cnWmiPU^ayoC-7i?PXZ#c?DGZ{$=nEEcgEv@NS$>8IxR33pPVbtPRH` z+x#sHIsb15eorzFU0y53Qt)Lm|6Nw+2pV%Y8uN6P=XBQL5*qW{biseIJV&!U=dwIU zvpnaf?xa~~!EBuRD$Mbo*P@eHq7$PTvMe8`v*dbfKcSC{~QgTKSXxHC!Gnr+&eZQ7b`+L~=z zwZO;SL%BvKWQ{f6HP(37SmRw|jW_Jn4^^Pss==#O1y!pGs#Xd}0e z6X_~3FsY76bwsKoQXP@%h*U>(SUYdMgSXznTkqhlcktFb^jFI8)^oh|9B)0xThH;< zbG-H3HZmUJ^y9pECdX_4@L8qShh#gtWjnfMJGx~%x@9}MWjnfMI`j&&-szMC8ICU5 zjc(bEZZ&aj)~?dlU(?oK(<%wNWjA{3;!gE^V;51p!LqE8&FB`PW!-7wg##RZ4IXT*|s#iDyFw@}Fz&PWPY1uew$=|n`C~QWPY1uew$=| zn`C~QWPY1ue%H`RYv_Uwx}bwx=Auc~eI|RH0#jic=+RHk){?We7FL53+oF1z(>2fl>mdgn&;{Ml0~_EyC_s_Vu%C=cZ{R3%iXN~lnkP?0!XUf~FwaisO2(fqulWdVA-nC;I>{2SkLkW<0_r!zP! zROwVCE`ST++i*Et0awFVxE^kR8{t;C&3E46(N5>Yf5V-saDMEu_YBU(DjpWAc&JqI zuvo>zVigaIRXi-#?XOL}+qO>SUX%Ed99t( zo1dF`lYUY+!!7X7&&sSwZaOQoLWNRA^0&V0gXdyyIumoTija!rW8Smvb1*Ati$%1> zBGn=l$xUZqR;X~QNNzg!vO@JpMRGms-3%?T>CDSDPRd%7?0`J{pHIBsNWl?E5LT1@8GpTvGq@|{z?6_HmFLeP?b`V!o#Uc z{6Fj;?d@Uw!9LI{Q`fSG*U8-52|$Zgu!YNLv5GjqJJT3uvG}v$Rfs$5(GGc%oF$DN zq^>*YIubXS#D!kH!%17nwhpHEGq|pu{S4>4x8jJfyKMt~{a!-Vda4v|QRO(>y2-1u z@5ivA|G(`Nj0PX2t8d6;l%&)HoAam4d6_E=`*FA0l{YaW8o_heU2U2!YP5b0tzSdy z*Uhu~?Te9>b-`~cQpD%Kx) zi;95wv<7Ri21~F8H9-6^h7)PF7zO8Z45!izr_y)_at!Z4jv;TL z2vVURQegyAVFXfP1X5uHQegyAfnK*i0ts*gD1QV9e}sLE--*1R;$AP-2@w7m5S}su z9s|NtwDd8c`!S&UF`)V}p!zYO`Z1vTF`)V}p!zYO`gx%G7*Kr-Zzqn)H=*2uER?wa z2vqL}s*mCA#4#Csmce5gJeI*@yq!3Pc+-BM`k4GplyBkt?;t1FJt*JB_ut3wet>c> z$`4Tx1%S5`$MAL{Wr?P@*ZYC)V?g&Y`9D#BXLu)Z4DTe4$W`SLpiA_uKp}^g(sj3JP%p_KUfW?AnQlb`@@h^A3{!@f}A=DIrTE+ zR6pbtz03SD;rC;>zlW@N z(4zN1i{1k*dJnYdJ+6!Fm1+Ml2S9`GEO50KxY`R`?FFv( z0#|#1tG&S0Uf^mkaJ3h>+6P>H3AozF?nI%LcsIWO8_G9ucl(p5WSIbiEKVCy+x>p5WSIcVSSL;HRoJLG+6-|s{Fejj-IXW;Eiz}uIA zw=eOX^A_qC9*A?m+g{-9Dd6oX;O!~k?J3~xDd6p&u(N&vEu8MKzYZ<@1hnuI(85mu zgI|Xhegazf3GBQVpoO1+7JdR+_z7s?CxFkdLkm9vjD8(j_zCRHH`Sdv1}%IKFnS0W zO}PyzuOa0W9fB6V3phOlEqo8O@IAomA>j28@OlV%Jp{ZS0$vXRuZMuwe+FLn0k8Xj z*L}e2KHzmP@VXax-3z?#177z5uls=4eZcEJ;B_DHx(|5W3%u?FUiSg7dx6*IfY;}M z*S)~&KHzm9@VXCp-3Pqx177z5uls=4e*#|j0D_X4kbf!F7N*XMxO=YZFJ!0SHX^-D4=8sPOy!0UH_*Y5zY z-vM6t0k8Xj*Y5zY-vM5~1H66*c-;rQ?gd`=0A~G2IQ1zwM#H}3VP01I3BbiZUIg z9i;=M6J^!JCEV6Trcw#9z7k@IB}5WS(j6#YLHP#Cw@|(dKNs?&) z<3+?Uliouaf(PY&loKc)p`1k-MZuf_U;BWseZbc~;AFXNFMj{x%lI5+7x)Uk z-id+?LBQ5iz}8d1*3-b&)4>9M!;hh#ehmHeW9X+JLqDb0Ee3$2pBHI(6gYYm zIC>N~dK5T%6gb)k91UkYz`Zc&t;4`k;Tski5Qc%H!@$vD;OH=LbQm~#8Y}xZz|nEw z=s0k695^}-932Oajsr)>furMC`A-5z$AP2cz|nEw=s0k695^}-932Oa(#soT(0LC7 zOE1EH4RHJQ3?f+0;`it9?hN;E;3jc0iWLRx9k}|q+<>nk?*_hKfwBn&d6DGpC_N}U zP_6~GTn{|H0p&)Nn@}R}tL((jcc5VIfUBo~tEYggr+}-cfUBp0tEYggr+}-cfvY0I zkuo=YAHVwn%DpH*M7a;;ew3e}{1ktudoR#kfUBo~tEYggr+}-cfUBo~tEYggl<}bt zxZ20>#Jq{$y@e9Y{16#Ic^JPxf-(qi4bEqPs~-bbhk>iZz|~>k>M7vrDd6fbaCI2C zIt*ML2Ckk0u7>W`09Q`|SDyf`_5oM_)wd=Tcs(uvS6@*sM_Gfi0Y7g9PV(2#-~qV? zr3d9&lJO3Yk<>L!* ziu7*r0tby)TnCR4y#aG0Y>%5zp2H6OD^Tf8eBF=oHp(aPGm4!_rvL$1PxMMI{9cf{ z^!^!QHF5Xl3uPLEB+cN`RP?Y5a)x?I=PmS7Byvxnm(efOoJVg+qJ9KiiF~1kGUw6@ zH6y?S{u-=;S0B+!SVB0z+6d0$tPZ`TXp{>Q-nGE(!GAsD$x%q&qx}3S_?FHpWUg3^ zf*j-0f1uY7qdbc8ILhSQ=?B#lq=V9KoWMPU@+^wT`gQ5cococ_;`3hceHW+Y$54)= z44@36{0&yn5Ze5rCrHR^04eb)wCzu!ZGQ@F`%`G!pF-P4ZV1e^;4L5$f*GRw(&wbVqWljE{H!?Rql_Y_F+-;%$VHs-oyHm8Y3UHkQ4~a9Vm8Jx8{^QG z#-S^XLsuGyt~3r^X&k!JICQ0P=t|?zmByhfjYC%&hpsdVTXYn*=qPN_QP`rRuti5< zi;^Fh^4E;P79E2vItE*G6t?InY|&BJqNA`yM`4SOvJ8|=lq{576emg^3TdXep#nQ} z40h-k?9egTp=0n&=&7>_dFb9fNd;Vf>EXJ3os;?*q|0 zOHGh#%_#Hm^L&)eus^QFnIcvLY^G7zOrwzBqmbL9h|Xb%&S9{JMj@L&gKQp!{2j$= z9EbcJhx{Fd+#Q8IGm0o1hA10`C>sWOJBA1w1@e~sNu#h&Mq!^&JiudEvE$I_{|B}R zy{PfU-X6LQ-fp}<1PSpzUPGp{?I5;LJ_~_@lq>!ttiX@30zbkE{0J-XBdkEW*K!0a z@Ca7m5v;%?Sb;~d0*_z?QkH@Vj_3cvn_l4H5peJbIQJ3Il5((oggrI{v<$}XU69hE zdiTHdikR98VKTKMUiuXDQD?7u^NadyI`v+{4Buz7FJ@DzD;m;No-O;)@uc%wO|aGVud& z^C6%Yz3KW8(CZ;cOEpLM#Qi|5$B=2_evEEA*AhZe;lQ5k&}b=#$UbCi{u}&@U#z!Z zr`|^N=HJkpdwFkyy|``SvZ$8725a*F(7RR8peDaXwGp@c#QRf059Q?drQ)$3DBH$A zeYX%RiEhSFq~E10$Q4>aQ~lK!`s=IG=Vim8=pGkJDBtD;MPg3h)W?Wfbyd6!K*h@?{kAWfbyd1oCAB z@?`|_Wd!nN1oCAB@`bd(Pat2;K)#%Td^rR8G6MNB0{Jom`7#3eG6MNB0{Jom`7#3e zG6MNB0{Jom`7*+1r~otN!e!4D?IJt_bs*X6N(pZDEkd%y`k(j zk=bmbUaf&l8-+|8flM2LOdEkr8-Yw4fh-$=EE|O^8-Xkvfh-$^EE|O^8-Xkvfh-$= z{5k{Kbq2QLIBdmn*oxz@5yxR8j>ASAhmAN6xi$j1HUhae0-1(eSo{XTpU~^*9Tmjm zMAee`0LV0gd8Uk+I`DD~e4@-i{5BVGl&l8Q9>;;90U!|F>UtIt#|$2NM0wilY& zUT9`}p_%Q4X0{ia*G)IIf3#K%2||AlnW@(P_PsCVJGgxPTYr`xDPvVA9msZ zcH#hb;sAEy0CwU4cH#hb;vjh4hn+Zxoj8b{IEbA%fSovioj8DZvE%TH9fw!!IJ{!V;T1a$uh?;T#g0Q$9KbFfz%CxZE*`)x9>6Xh zz%It!d=$J;fL$Cs$sNEh9>9siaqQ$l_7!}+69sRE!7FwgUa{lY-G{Kd4`Fv7!tOqV z-F*nV`w({bA?_9XAy&?PC_h5EALYj=KSlW&PE#L5c?jj_C=a7Ng7PTJFHwGtf)|aj z!-ufLhp;No!c#T|PuUneWn=J^jlokk22UBCIE=vt8iNfq1{-J$HqaPspfMoANg%>W zAi_x?!bu>)Ng%>LAi^LJVGxKgNU{TnFoe}k?~0EB6$U;B6%Ij*eF~nkGeCyZ@RXf_ zr|b+oW%N42X?V)cz*9!=d;9>NvNQ0Moq?z93_NA@a>8kN%INik(+pW_7-C%5$IyU3 zL3_iKQH7lYZ^rRjNg^WgaJL<&5NBbZQ7jNe>U|F=a~7KNUTDgDfi`Dx3UL;v5R`f7 zEKVWL;uPX6P9Z3p%RU)iad^v)!&`P7-m>FBp8=rH0MKUurx3^CEjtcx*>QNwj?0)& zc*~B%TXr1CGyreead^v)1EB`w??7w52L&%vz*}}){sGFpC_hBG59NN8pP>8{r@9Y- z=3#vQ3zYvv`4!5qQFfy|gYrE7{%7>K)@j&;1CdS2;Q>e@)?w~`2HNqD9RYh1^jLtb$y0%5oH2C92uG%EJz+r zqlGPs%%VyxylB8JX#OAYs6``1&;m6t!`DblU;};@rw{Z(+y!{aF2GB60ba5T@RI!< zUNU-V^Y8GIomS{YQo5ZZtbz~VB|A%AGAT_;m(1{$n4$lk2TGj7PCt*E9};#l-MON8 zj5zFK@qYJw{Qh39)1Ji&rTe@5)qAWO39IHatQrZjh`-OR$dZ}&9`Bx@mB}{91=R+j z=y8e&{{$_QU7jc&{y+d_eMR~mZ&3y#HH-1lH?C(R%r}*Dpu*t_I6Kehc z{Vp`uX6c>hJ0L%XAwPy8KZYSch9N(OAwPy8KZYSch9N(OAwPy8KZYSc#QR*ohW7L{ z$}W`MD9@lgi?R=|N=*H-#0ad10ay$X9~$2nzg5 zz_$tD+XV1!0{Auoe47BiT>!pKabFg5gxrN)FJRwZz+N54KApfmoxnbw!2X=T{+z)6 zoWTB^z+NQ(5ZQ!(fTi-kdp}V8G3|wF)SU{wK)lEDdGE%$z+Yq$z2yDaUdV>up}d6h z-zdLFc@^bfeOLB7z^Z#tkc|&~83bPjVLkohw_-QK(<%J0UxrObCzqGL|5}Jq{U3V` z_Y3xLV9FjUk_V?XW%3@_`e}61xzX&jI|`~zRbIQtqL`}ilf`7V;wK&RF}chh@Fy8k z*n#A##K1R`^a*TTW@cb>6?-r%D?UN~q0Msfez`U|<>DT_!7AU8ad9)M$6Z88{t4R9 zA!kpU-xaG-;uL+1Hcks~kD`gu>SE*chIm7qCMG6Uua^{EY!4kJx!s=Rx^l1A44DKzoHIy44kb^5Jjd^T-oGAAleS8JMR zmVXj#OL8fL(s|xyutuDtMYb7HW4!chUSno-jl?%idZ^_D=><;boRTg%L}!#9ow|oq zU$BSZ#sTRe(8caDP41cUL8zugX&bL8*>B=R|7@(m8ZA*Z9u3u)Bwfa9v_#j)`*u1+ zXF{H8;&SFxbQ(j5E?K%u^l)cX4|#p}2I-V{rLQ9gmwvaA&spT$-xH#FQ@WeeB=Y4E zF{|<(L4(*XKC4r#8@xP;e#GuFMveTxLbV^2?3^N+H{sQJOkI14QFYuIs^bWH7`1*U z8fkBZ`u9HDC&BPhSN`LnPacxq!YAXO$ugU%_Hu7Ur4*x5JtirV0Z5gOck>qbOJd^_ zbaBQ6eS#*2cBU~QKF**u#2byVad8?$tS(lTGLn<+si_GXS!$;JN&k78o7LUQ%FC0* zZWWu=<@4&o8#bk?#_O?K%vz_Tz~|6f04|=I>Z$^^eMa5pUrpM~$+aaVwNy5wWMrfy zXJ#mF%N57N8=Rdis;DR`tf*L;W=Tm;Gh5QaBM)=+uyk7_&!EMefYf;ic$A3Kuu{J@ z)?i3XPSEHQ@UN5@+hbCYr~~lhF?rp|b#>+CCXA2%1@PD{p?|BL03egX9%r8fe#S}y zZ?mfc`5#|@6MN@*c~AFi-F@8vqI{McIF4S4Hu>I57f2*0@Lr{exyB4YkCbmmuacm7 z7D!osqcJPXYK_U%%00FiAfnrY9sv)N>nbWYnzdS|-DLMziIY03RaaF|;B;ER${NQ1 z4~`Z%<=dxiXbAk0ZS~A_RaZ84?nrZIo%~yNc}C#5H!@4oQ;RZQs9RVf@2Or?T6MWK zc};nCWzNB@O7{Gl8RgkItmtNA2ReEJx#FkE5$Od6jk5 zj@ntbuJEu;Ew^3SxU6lO+hZ>6T3O~@GqX6=TU=e;RnWZoPON6$3(h^rD30TWoO}5( zK}?ON=$BsO6vYt~%`_712#V;@DacXJcZw6Z{exiLz-|8fh&JjXY5*^SlpH@r8}84g zcnk6Hv|rVJLKf02KZaS>OBN}`A7{d~Xsk7wURrMzl{-w}Bu%Q;nZoB3KiAaE|7^#P z=Pdc@<_~;Vc75wxv#zX>_pJH(`l}yW&Nj^2(Grl_5OAabUnKcIQMZDOIyUe@X>INjQ`EVAD><-xvQw}6PqT{eIVhcZJ6#k zPKO;pWAuTmctO&iV32isy{uK_9$B3;>`0oojTUT26&z$=AdS5n_;=PA_(OL$z~C>d z4iYl)nmD(L#VW=N2edlkmEbClrZ|X*FrrBLT#A0gjS+<@Oo8$Hg01lN{3LHJSeGkI zNh1qV^7Sn0N}fc~!Sw;&V@)FRS&~#v@h5Ylpgu4^s?9+O?>U5Ov^>iaWX}8DOU9ZVU6C{-YXr?(())ZiB4(60!&jrA;G6*mRgSz7 zT8&Y2v0r+U*OWMEE_@2<6QU-(aLy^LQ550c98*_MQWOR06QYhIs%(ttFZDySP*7m? za0<-i+tN6@5&cfu8PAC)aZu}er$@paTxKFw5~0p z@9I7*!aj_XY<@#bY%CljVdTUvB1>VBudwW&j4Gc=kgJt}nyjRMF zbj|T6WjGxU$)wMZ?a@P+#Ss9zO%Sf-UP!cdh^^|NRD&Q5OEsTGo8qkYnw+es#y|@s*h~cW$U%($Q33Up#Y_w`O%` z;k0Qzn_1eT0OfDwJ>vThv83SfLFphLbD2Jf2hkM$(jPcQ$>&lWP$^0yDBLt|%#dj1 zJr*l)4&g(Qco^Ll?yvH;ToE;ag9@!4QPUCWiAV}{j_wO$rL2WXr_t)<9xca8QeL=> zYcV-Zb`&rEFWJts9 zPah%AOkSFMl4-7pdL8mp9@M;jJ8Dkp?0jZY<+R===F8|Q#xj#@11F^Z&^o+N`M&r) zN3d6=7qJeLb-_6ytc(2QAWK3GTuw+Y^Zv#^7h0KIpqu7zqtS^~&SLqD&*d}zHu4YC zD%S{k2@055(nJKsLBtyog&|0RlY5ETA}9{v%}JurhbRuBj&X(1O|=O0s1Ujdnl~r@i_^sNu0+siRtOqk0jJ?u;A1)*kocg zGB0CJMQ546jm^C^@Bu6Q@+VixuLi!)wg&bDu4V1lyu1jtuPfgM-5LXTWV7j6 zfwSA$tsgZGHUugJ6F5#NR@4+PVV;yY28cAo%02NMB!ly`&ZIaMg2`0Li&*_r-e7(}`xP51fIs4I>_8^YB&Zt-nS)LS9O;P9yikajlga zsl#GeL=8}9oiA@&$^L!&dNvx+qni`5ba9%>%U^RWyh_X#?otsJ>L=+Fkre&XUpYmD z)`EFMFVH(t$9oJ87+Oa{BMkE${Ee&$*%G4L0`5lEGzbb_lY#4&;T1X2B0qw0r@{hC zNR5${lz1Ats;`%OX&Zz_PIeZyppQ0XO-*(6%iET+Z*Q-dTbAcfuS{^5%yugq2^hg| zExT~Bq-uVN)z%enFgq=Ug7=#y_2~oYnM?aL1t$+9Lp*U()$6goC@SG~XeTL%O@m#S zCOJcD3745+jU*cewozu>$Oev738S0cFz414l~pTmn>qWo%PPGqZwvJ0PFq}6v$!rh zr(uz|W^sK^Ov9CTv~}LGaaz-+ozwBPo^A51o>^QnYgM^t6~1<@L{E7?_zs0hNm!4( z^0Y$>Ls~#I#X;n)CyMgVr8uD4;$gi;)Iokm-U{rB`%s7R*>ZmwCko0Fvdv!)_C|7H zZNp!JUWpnl&&ow&_wHWm5v{9sg{YrUMAV-o?d0`)E~y_}SIDjqbS9~n)74Ey$L$J1 zmn=QS>3ln*`%Cqa+hnkq*Dv-VTO4-QTr`oW;q4wdYct-i>zd4^vu#qAd5__gdqKX=^(er z$}gdB3$FyS$nfT(E;t{-6$0I7W69)MqS_1Sx4bU`C8Ebg{1f8}@-KQ^-JyPR3Q-rM z729@6KWSX6FQLcYVBdf?IwRr(k-La&S;2{53$%+aX+dDH#sdt_mON6v-<)QZd(yMA zbVVkmCr208lN}VE!Vl|)od~Z_wQzE()}qx0J4E~&Lt37S&g2r+cmhsq`x4KrTUJz% z+2~m^-OAn$Jitl=`vbqKT2z~zGi`ylYGGYYZr!5p?z>z~c|pL=YjWL19%ThsUEx_Z z!(B3KWrb(;3^!>er130;yi0(@gJo=tk4N%|pdQ9O#@sUYklcW@b6U7Zk^6_8^I37l z{D$1>b^e!M%&o}C^=3aK?{}>lj<%Y$$Lw*wr>j`$@zZL5@E$U7wby$GxoxwJJnAPA9=VXs27$LlB>d#$u?KapJuOF+w!Yz+n%&nq~~~Z9+q3ExrQyRJ@THr z1NY`PIPqWLJUoYdXQ&dl@53AHoZrxBxt|`IpvjP!h`da4PeM@9COa4X+5z{x;JGfv>55`| zHF3hxT>SX$KYsL&ITe}U{7ZuK50cm1) zWlqwXBPsg%NmlGGdzb=x7#$g@>g3?SJqT@ku(%-9+Q5;`<)xnt4)(?`arr<^h(qe^1 zTR3BNP4(tAh2Dh9mN|vfJIj_gcC0RMyKZL1(pfojjv>uztSWQ3(i2VPbNw}QD{WSH z&f0{W%#`wyJa=|tN@=IBV_l^s&qnyjd#d~lWBw0yuKq6l5p(55!gs+vPNDgdppaac zO;BJ~-(oR%Kgam2Z>N_N2PJiMjr};uq#A2Kw?lsV<@=cleWN;XUb1K3}ZHLK1j?P-}>;2|c-l3lV)lO@q>5QBzfPO`r?% zQ-TIabYg6%(flk^>31*niC#jPV2Ds1m2bqURRcUnW_^9Kr!>{3lQIjH9!G4Cj(ht& z6kb5KKzm6453Q3X*~ibav|0;HB;g0N+H6Jzr;xSI-mGaQ?XX0ENBzNIZL#(Q~3VOj+ayh^XpyWL%dc}_=KYO=wU?{j-v3N10N zf^us~S81S{y<4-q(O$l+!5*7vwr5&1lJ&`snu^)Te}%ZJPvuvz`g5fsI@O6SD3FXc zrN^$0L&bQ3gEc-o-w9fsiw@<)UU1QAoIP7+Tf1&s>6MvW98)l@tGIY}ZT!~sl{d7^ zym^J!v+|bCx>fZtf!Q&Q>tpJ=Z|^W>#8%9!&&~1WxoZ}b)o-|C#>~6A>o(M^Zk)Ep zhe?1mkmSpNggUZVSWFB~Di!rq1o+qD1n->HcKNbX+dq=K4lb~2x+4Lgqag6mkn z<}0HgZ)lPJnV=2sxJ2L;`ib=p3TQY(h%KPKng~n`{hqJp*Tfn$D3kQbNuTFyb-$pC zi>BKYQJ+@%00udEC^%IJ%Q`TdbV`>-Tr(#iKd|b4hFn&q8Tp3j3^n8?VmB_iuG7BF zTr$g7JIig}?womTO#OzP?QB!vN0pb)D0a_WQ9<9&yklK0jf}U!dGfqKA?D&dNe}TP znj&b$**}-!0NyPlzUD?z5Wb66g4RwJuSB4oXosvFLGvaoU(%AZc~^oo&BT!q%^++S z&N&=FN1{q}pZ80`^O+UZBhu?dYe$ilf%=>mNuk)4tPsV3T!kzQhUZyE3f5rI7C}p( zBJCA#TVuxGR{2*PQBSj4kDv(lS$1F2=SejM`&=4P6SYNs7BvO?TopwT?#*H8VLmEv zB!&E+Ttg7!?t`6iDVMSCBGyFE7RipPg=`T~OVAdHS~Z%vffL0RoHFs^xY8n`l@_nf=T+dogRfO_GC1jUrJ{O%U{55vQOKL$RP+i*hB6!<-w?1eWRW9RMh`FcZL zgTgzVYz*RBG{pgAi>K9|8bv|7Pt@@y^Ye9K<&}sTimqipyPDTx5w&3C_(#42BR7!8 zQm4@~O`JlfFmdXbxfmtZrO;4Q*lmCO z13w0@q$GbGb;d%Yi`VFwqE+Ao6$eE^E>ndTC$e|_anCJ*v2B41sOUkqE>Ig_65B%@ z;&pHiy)8H-jq#qx#RfSPO>uzxnPPV(Mo|!lL>+J9HAdPw3A_@)q3BxPLXH;Vb3{9k zFc?j!mO*If9KrP3Ns=VGrv1|6yr%f5{tz07{v4HToFXNPf_AB(ID#HW^@eyG!I#5$ z(UK^VMIGRN4k#9a`*EaCNLrf77+FSCgNS*J)9nzPciiD7!32;_oio^MI`)bStr)KgM4mB+4ox%b**w>`T1x)7NJvX15w6A23`tWVt_OduOHU06#x7dMD3&}wZK;Rtu}F9rGJ3#W5$iq9k0cxK&( zR_Dyj)~1rVCHYmG>o?z&kd&Aj>&#OW$CjF^g=K6`yfL#WyJ1#Zxihcze$T8Ty}|Bl z%E|0yp|rE6TbMRYDI@EtryOd5FrmcIuwe3(r!B78x{XZ?OeVUqY%W0I#Huc$3F+CT4JI(^b;4YaxxXQ=KZGu1u)lDdhi zDnw<1>i|5Nl4?PSD!F;;e$r?U2dR{I+i-@uyMfQ0z+kZg-ccz?UTHtMG~Z; z*)@k~`0S!j>a6}bXq}3>g01P4{nFK_D|S~y6n9yuKSy!NG9P6vS2EdjJw=t3wUQwO zDW+gpESD6^90dicbHxTjlj8=kg+fAw$Aw~4VSWNfL`-Ob%P7Mp^%1Qr1T*<`lBLz^ zUiZu|tKHyt_|xSWO^m;`Xo1^#nW`QM|vYGCZdB)YI_EohrdYrbd zMX^Pl<`h|{W2v?2(`ILs%ZoMcj#780ThY5`l~r~X>-EO$`0}dk?2fk5!h-UyTe@N` zy0UgxNnS=lqqEUdSYca`on}f-Dlx_CtBTUxsmIGYU4a2i2v>O8gq1aCFJ$Bb3 z8%HQ0GI<;p$%k-f%mry-%r@wHv{FxuzQ-cihUg-0-4(c?(|Aq9m!NG^tsuwsJOEv!&?x0wQ2h0dNvLih>A=X6n1BgWK!h;d>(&=xwE0pt`Z@ha~(y zqK)c^8ff(4UK~){aD6VtThd=5`-vH~gM$k&qZxQzJjZWJa@*`0qrOL@Lr6uBjq{Qs z#<4gqMKxUx!(YrPG|&(xNODGwYU_O=Zk;@jpm<#^j~BJig-D>yy6@XK}X2@62ni%t*>C zpvYh3o7Tlu)LzIw9-@JjkOw$F;*!z#(+?LiqMC$4oqkfu_xHJLUk!q zT;6OYMhJW1ug6woiL$F%mK%#_b=S?jsk5MUxwme8Mx3jC^X%`>*wCC6SXR_tQrcNu z)KOB>S7$Z?#hcPP9JH1k&-&`P{MTZBthMQ91~Rk&8e_LX|GMg9?z8W;pa5PWMyqOF}>JELu6~;}D5dSim~O!7 zI$zf=_cT66Xykl%l4mz|SLFVteiIi2#X)#rh@y1T?u?}9 zhmAuN?g)zJa2*^AAScmUu&$N}%E_%AQ0pq0Orb!R;{DNT5@!*&OZ_FBB&bUf`h@y~ z76+xhyhTwTv?&+&{QPnE(h5DerC|O{s{pS7=IN--a5z@CrYr+1IzV%J6Zxuz&0Q4=j$45V<*;e^D#hN;%u9)JrWT>QUIOuhoX! z`UMMaZe@sqdRSA^UQ{wSaZL*JqQ>q{SL;pli(8A7z@Idw9r~_YXF}yEZ!2);Ww;t0 z?pcuHw{$Ilic{Xyw{ME0rCzn|KtG%Ygg?dB1FLg;^8Qc!YB4X#Gc1Sfq zt>g@|Q!3RbYDqoO>w3(I)R+*glTUYXv<~SS6|Y51fTbNFW0|RXd9yRGWqD2Wnw)hr zZ=biUr?4q|O-<>Xvds0#X=ScVZ9+vuPF`K1HLau}#@)5Hx_14n;)aUufM)iV+J>t7 z;u3p%)%^16%S>7MmajX!nK@p+Bd@74gET?Wd)gJmGQykt_^xOQMUF&M^hK|R$fN3MwYJ7&8TlVO8AwPLo7#yCTa zNk>AI8ECrs=@`WbuEY5k`2n;#3Kk6Nt+H)vRe4rZg<`e`o{`^Fi-`SDt%M1J& zs_ARhjgDz^+?Z>qqPz`-#|XVLW}K{ZYcw)46gjVR7~rf4mRrJas$k0kHK zN2X{MbJU91Zj1~gFXMA`Lb?aM!AXo=KS|1R4v^Per8|KAP3P)a@j<^sD=84 z2GQbJ{CtlI>Q+ui<3Oz!_&6XkFoSOw(hO=sr{^;M{z=5&4<4nzha<&L;#08^e?RaV z{XHBfP8#orTuzAk-+h|oL`0N0-pm4!$s{KP#hXtNMMR9apimwX6u?zba9k~v5Fs%| zgt*G7P>pZls3&qv;5cy-fA{h+5905TC{a~1a z6Q#&-ircxL%e!Nocj4IZ_tCnM%M&s3BTr54XC@-UBm4ROAlFz8XgFRyMM7Q!iMd1k z*C~gQX^v`15WT=T$hRk2r0212Op--PdfuFzpvCF5RPJ%p%7IxO3QQ%#LaR-|Ix^(7 zq*cZ{5t(Y)T0Y0P^}mAwsdDzklW@c-xwO6}zKWWkmJO)c_?%8cy{Hz}%2c(+DH|y*YAC2c;SP9jH=HL2i_!nZN-@^>cY%*pe>3p_!W4Dy_<-GmSBuu zs7-@7lTh1?(S}+SM+lQ!e0048i&CZ0R)YkM`zkKN8?+UH4+GToUb1nMKYvEWjllS{=sgPp{5KxW# zAc|Z0$OOeZI0>aS!zds+bn-ZT!cD!w_=!rZyw}A?pAt`_55-qdU906o8bO69ckDJ^ zS5mwzO$1Ldr%yCbs%vmDugf&KuDpp&Y<5J89{@JMZ$b6jpsk@niya){Qb;?10UnoR z=s_5~hSvt_UKs(UrTD(29FL1$|e#`!l6wv%EEn4-17tvi?V)eMOoRr zq^%XDW%Ep1H{@(=X_*!0==PU2IUuxVwzc~Lf1$5!$QU6THv6WvdFzGv;;XTldW6|n zz-M(3XJec@1zeJZV$RWX$O$vfYE)SY_j|ndAInk;S>EU&WNCR>ZnMX*b%VKOVOe>j zGlBXegsEY()0@eKsgMV%G+LytvG>p$ocD#ij-ns5dIUv3MX!P)D@=j?g`S2e-a~X3 zA5lhxM4O_mw~#*|sx2-X!!-@^HHejy7Eu$;D&p~pH~EP5NK8$U5;Ju@R&9?(uRD-z{*kcG5#$pAAiFw@Rg;c5#-3ZQgpW?+``U zE-vJZji6D!D{8@bx$O+vBhp%~^H4mtAP;kh#z3|wYQ-nGC9QtqufW>Eoq7BNVS3^y z?JUs?&Qa2W1Sk80ULrAr!SRIc>hO(CPN9%pEk-Qt>hL`bQN#LBO9QMH`Ox8c%gaSi zgK{LiQh{5{N*KK{mve)lCa7_obT-h^;$x~PS0C&4%2O^DiEp&5<#CR{q7H2*&q zwLwP~zK5VU!F|c>H-=}QdlPvR4UI0fBCblduqp;DQ+gRjo$XQ)J-$U{R z^Ea<-zk2jV=UQ%@YtgE6;atJ2yudF*dBIh#v7oIpod=p2x`3 zSW)Ndnu@l>?b}mYef6tao!j$TN^?A}gw%pki``db#apl&=9U(v1}2oBoXaSwT+m%v zvA~mFlJS_yfj)WgmIwSoZrQ{6R6u-6GWNiwm7JQE0B(_6ORNdbCAV7*^Hk4XD4T#u zIP0IeF5b;lIPeL7&tbVBx^xh1QrH6SnWr4*9G$aam36Xq9)7%tpUE*-F)jJqu64q?adJaGJS1deCd71qu!s9M!nw=TcjiIhhrS*aDy#--)kC&!A{ z6nkeBIP+)bW*f57E$PXIWT&rU_7ZSO^ow}?4Rtoiri|THVhviIoI)Yo1cgMm4L|{G zdkc3m2{|iXF5$#M-D7f%n7vt4U*+f2S3rN~wcXEa^S)fkNyD`@6W`RM#{N15z>Dq*F$5v|B}&1w2ztw)f_*pG`c3DQ~4;74*MgO zOH`xf`3mc#PjKdf04Ovr$IE{~gc#!3^N}AdODZ+=Bxj}42BRzC6ncd%c0=$ER5knw zVSLBFSMQ_{P$G>N-R#w!ov{iRugoc##kNehEx*jXxprNnZu{2;ksueJ}Uq^N=qe+h{DV&UDl}+uOJH^vF3jTd_VvmlU5`UCcU{ zJoVI)z>$pfq!^gK$ohI7c{cC@31a)R{YEg?nvjrUO46ps^0u1ydC^uVQ3p>9HdT`j zmQ;0VqfFb@_Ti-sV$^pzi*~-W8Km3vF`Xy`BWfJ=(prs*~(W{ z7WXWLd@B~>nesjHS*)2iC*I&Upt92wLfDfE>k4`etE1ln5!f!`@a*YTbF?tiA@M?c09 zyDK~7Cyk~!$m5Za(d=_64sc!|=01vobaHA1SiY99+|H{IST0&2KeOn^o6<_GUj1%( zjzT5smn2dJ3*_6YWXf-dyh}zU0Fmu?VzA~1VymNa`~k_{w|kwf-czO%7~iK z7Vj}pz$)TBuATh%P+wpb!P6JJE3zlF!ooc11EOBaU!n=Gg=6YWJ0`VK&3)p6Z%3f2 zU$R!X4-|iwVCP^G$%bAfy$r3pz_Bx%PbY*!aMl~cGfI{YyMpgtF@uPKQ&+f|1B3?K?%z)7k(XY$|q?i7DN zGH&oc;ypKscU%G6giuF6u`(W6b2glUDbm=o%n>(bG^HgVOgw0ZB0F zMgWhJXT#9ia}h5F$(pP0aU~>Z%o)0#il7Qa#yQNfb=4y7Js1u*DL&q6F}c)mcww56 z1ZH2&UGMWOD9dk}UtBiBJiW1Kq1#cmrM_!p^_`ZiW+?J5TUJ?Ss;6XjNiiZ&i<*kf ziE(*#tq4HP$@i{n3A}Qo^szKV7v|;rmwFr5rf>aH#_}BrWz+1=`XXEL%rZx<+o(ry zpRcyN3lR{jE`GYI!pG(~sH{z#NWf)I(r8i>&?Vxe07_xp z2ALVUZ*7CFq6B+ILBNRDV6SFe#={;Px3o2`$=bRV!H+o(HTcm|UYH%Tth5TTj=o@M zT>)#id$Y*0RihrQ=ofqdIOBX9S|{@MKCc)xI*C^68=huYJPC9nqD#u(bP@dd@ z1<7A(eimcV;oMz^e)GdVPF_(gJ3F@8ocW13+bf{ia7>io<_X2umE+ErCBBz7< zFdZ&TM<`GSu*cmEVNaU~Rta9KsILAe=6#|mF(<)M`HzkK$CH!f)l4b3zdxm|pMl{m zf(~w=+bTGo(#6DRzz#7t<>ZM9#_k9uf76^f+i$*^J-*?or#1vGBi@iiwE+Pr{>Nxx zF*bv?$3*Uw(ERd4m1P$)!a(_2tH`-OkFi+`74Cq=CBp z1zBD@>kv{CYOvCYmg2d_tJB44k;hHSneI2hNXYbf??ep93y6(#B z?%ehq>kd2sn7@&IjS8wI8REuqngMfb@$0q7MwW;}Xj%~-H`kwAn3D?-*%CN&`_cnF zKmQ)2ZEhcGS;-#3=gF`4J$VQb@IHT*Y5MfWwDk0>dR^|S7kZs z9UUE-=H|=yUw2KDMmDQ$I7ba4IKsf?Hijbr)S4omMw0Xk*!14 z!(8hmYc0RAB(<(6wYI7x!I9_4!tO5cS7apTT62pVa!co|t*%}-r^ISbt;uYi=WLwk zj9|pj^+#)F%1;xe4*{Nf?*LS;Kl7VLBF8R%+a3WoaGCnRoF*G&m(eQxg|72eHB((S}rPj7QM|ct}Q!*T_BKycq zXthYn^_yZdSdRno=H{d%3sMY_dqZtkz2HHI*W&d0AMs4q*7=hP3mnB}wstLXXl2Xh zjkaX7OP^#YEcq9?0laDhUagm!{7%#2#a-!XbLKR-TM9bt+KQ|$T~94gYo%U)8Nz?o zs%~-hN+4MzU>5$PO}a7CAtQPp#w|J|0)}NH`GxQlg@TfRaIP{X7z)Z!EDU4ZQK6LD zj3wR-C&5^PGtXCUNKVp}y1E=tEG*6vYst)-EPH)dQSs7QneOt{r5Tkuwu16hcY9@e z-DQ=TGcpqr9dldi+w5`Mx91}7O3$*88^}L1tIB07cBaR)<)j*OGpw0Oahh1O-IMQb zEHvXn$}GFXn450PFvi8iS#m1!>bmk0l2c1^3R(&>eG97v!a>TDP1BBR`}8_Vv)_r8 zronw!UF_t?N%W{CmLUS6NduF>(~OH0b;LeX@MRMI*1-(~?u&ij{Vv;u*Y_kSyK*5~6IuS#k*`V3^50}b7I^>=c?`cuivL3IQg7g0R$ts? zFDb5S+-S|Sz53s&uGGNEU)u7lW{35jQoloX7q>VIJ59zer`2iwsl~}Ue~|33+U$ru z68Btd8=RYMJTa9E$B<-SDtIum)aNJkTo~;vf{GN^3+UkdvR7% zRpO$Q`Rgm1H_s_%>7MoTE8427EAkyRZO(!YUrtIvPDN3DcIBcgzzEKbdEf?R!%uiN zi8aB859V@MqEtQP7LCk<-*u?_?&)1$y?jskGXD)X_?MT-?pe3ZUVM8yv(_!H2;5zX z2xCUIvX4=#L9+VeM85VWgB;@S%kJghUGQVIjzQEBCz+l{ zvS|%#LeF4}3Yiwn@zuqC6xhp@z(suSM+^Us5#`~f<3_n$vf~6J)vw2`VUxbu<$`hs z6)admq@FlgH}K&et`F#i{L)PgSIlv{=WJ?Pa$VMJ+Y)cl^z!t~s`kS2Wd*JkH-35l zVomw{D|~eu=afvZ!6O+tHSM^qR+U}q-ry>DXJ!Bw134$;R?dl(7bq7quAMYN(3OjE zAP+NQZb?nHSIey%0)Or9W|g#9Klwy<|Lt$$^U^Qzc}0rbEjS=TRJ*!~j9N&9w{$Bg zOj7)_N}?ea)zkFxEVuAWla-V-&hTFjb{gHVh9|B2gTCW&2qPV61e7#%Vjs^78niey|Cbk;LIOJ zEisbe8P=rmkBiUR=~GxPfl?gp@^$xX(8W`0N}Psi47w(5xV6dYS7$xrd$#+k*IwJg zZVmj6Wd-g+HUGuh!2nUyQq&YDrMv*IkxprfgI9*{WAu6vojmdktH11?!!F;jko5$< zgHL~z-HcC*)p8|v9$8k#=bZZHG%%oVy}En8+6 zx#w>FEZu|Xq4tXOjLMGU(vFIBtdET~zKwIsD(7#k@@Rh|8 zP2GWd&Iub`8Up-!2>Eqb_3kweAMy=!~d zsw19PR=IEkAMs^kur;|39}T)DcgJh$n9DI{%4UZ>s!vKX8q--*yqJF#e<^*N03e+$ zDt%iQGt@4r%&N}&_ny1I`4||G?#}o*XFy&{Wx|`k0}s+m(ld+Gus$;JcH1Z5K^azB zoGZtyaW`k0`CUAqJXS~xS;pbhK`vpDwv6t|Mja%wrxGgt&U#;NOJ&1yq?DRp+IEMx z)YQ1Jw7T9k!#izGVLighHWjc3ofVK2iAvw>2!e>r`o6|*`UpGm`t zl@bhQEw((D78}F)is;!FzV~t5-%;M2m$V_fsk>vwhQ`cpQ-0Hu-0JChwE62c%yE~_ z-B8Uk0`KRwRa4G|IP_=+YS%&@FpVPM3VcE~5TtI{@%(dJ&Mi5I9kh-;c(D(3+$X7g z8{e78mQ?ey=n~=(FRY`U(Ww)6OY(#)I$KKE3(K4Y<;1kHC z`~UbVyyA>!!;i%$<4C4a#tzEYLE|G0jwUSZnsczLkSOIa%KAY1Z1!))hd-5f6LY7q?XB7ZqjJWT$t`?ph2-mnkkSLt$y{iD{+r38up2g7SQ} z)L-HCCt350%;xH{Su?IT8rV!(wxw8d?M=yvhD5hcmz$Alr{25J`}@%QL@7r~-eu4+)TN4PgWMsN^76ENj^c@M`Q#bFr6k&&W5iMXF+BNr{G!8#A6eA^a_`z zKsG`>)M~U}Cy%iX-KMv>@Xj4*WxQ>IJdTK2p-i3d(WJ)2@HZ@sk%=QoT9I}^946(* z6*@3>E?{Q@xBbuc*Lye4Iq+IpU7EGdyGP!${!iCj-nhoM-cg;E<;g*-^U(_4kwUBR zq@rcC%Fd%zoRvKv@nnYDkZA#X9MLv=kev;m<+S_+=OR8urzK~26uX+A9kro$h}F+Z~xjStd;k`}2zKK+GK0@rj}&JHGZ|$=U~c zUc30fhhO{Jhq83-jtAEh$7$?7KK5enRp&n=LycCdi})GYeq_uD#y1}QrVB=BgKuga z{k2F%elv?t(!|EX){_i6S?)pFB%bpKCN$5whmLa;-@%aJiH`&Mo{;c~gQsF+$rI9D z2fMb-JakuJf|>99aQ3#@r`R=Y89i~q%aeic!IAzKD(H|@JaJymmG_Bw0#{-p+D*$< z5Ne{Px+Hfs83*B5X}-LnFowel)T}PFe0W3wY!>H&JM)*OE~;spncd)?H_us_o>k+j znPXj;f8EmdjkT5D#_6rwW7`_4i%R{~SV+sn^Is(eb@gqfOBy`Otftk?{>u@5AuR!i zp9FV!R{2V45-iotYUG#F+ zM;fiezjk_lt;+`4@F%(Zu6zFLs?zn&6%T*;wczU^Jk!6HGX1Noon9i*(i zpRWz>eEBQr0ng8<;Une)7H2uwu9zgdX@Ok1J@7P7fCLZ-){Bh7s0Vi&dA_j_>6di?EJ+W2rG(s>r7(c$F1?uxr7Bnx6Xy=c-Y3cEn zz_DBVU$`M~JhiS;vpO}kOg8dUyL&1rx4x)Vxg8uf^Hm}vH!R)GOHxlGk@WyOHCg@u znh36tN;!UGX-0<85U=E=r>Bx$(7cbl9pe9VEJ3~sx-9BNnhhRlgBN3jRcoUh9Pnna zjV;$*=B-(=qxmZTwJWNsS6th?seWCZbK0DH>eklV8)g@`C}j(`x6RnTphT&uQOf4` zbaZTAP^z^2l>L|DTifPc;LDX2-?~=s{JLDqbBBLqWjR_?{MFZgaHOL( z*~pMNj@I~mNUGORGxz_;DseF}$X87%y>Ri1W}Gm#y&C9>ImZtcdE>!QzeV}-XK(TfBf2HJMkBmY-obkY-o@ex*~kH6gfu?bTYP*@3-b(a zW3Ahde+`4-!>j+ADud^v4rB=<8Jr;5CXEkMK=tgPkp(TEND;j4!MR&%Yc|b#?1$yk zGSeD7_W~HkeH+^RSJtn}Yjipq^3Vp>tNbF`pjY^CS1M6TgQVx#)%ZMf$st;SoSU+p z-~Wo`{BZ77KD6|}cgm+_q)qdFOWw3Px+&OLkZ?+cI-U&TH9}6O8k6TAjEeDDd{DH9 zku^|z_p%90YE+9ja(VUQGz<^u_L=f7+NHNDoqiJxos<-*ATCa_VDkr2hI5lxNz%PZ z;j%r*RftHPQIj7MTuys_O}<&tuxIX`y{V>ZW7lU#nVeeGG*8aHt+X~hwYKsW&3dJ9 z^sH>Gid(>&cbOybw;gMm*45&K>*ZDU zT6=c29ebWg)2)JG&?2 z#;tGLJ-oZvamiq1cfNRua@`v)sXhXFdvechlRMvc=-7KV@2^}lwf@+^;ECzk69X6( zcppg3#A~={_6(k$O)@hErK`^#ovjb$CEU(EbUi42t^~`DdWXmf6i_ zR844Ion*VV?&tBWNM%7ISlJ3%8uqlU&EahExAaa%E6K$6 zNO*TKbl0-mtN#jw=eWCq@bPu)mcA=IQho7!oF_@)SD1Yh*4R%A52=koYNh|Rc&-+~u9uIEMHyI4L;~N`s$zvg# zYb(juF2DJ#(6G7}<$bGG4t(J5 zrMu4S1NR~Le|fX0gTjqTnyOLY1T(P>44L zj)i0$s>z4Sz{Sofq4j#fdlVU~PqY>6fb9P9*>#Ea2^`e*hr6x=xPU)fdiRaZ+ZF1~ zTer;H?YnK(^2v?oZpK)*fU3YfLSNRxrS}HGERIzR^;vza>E+)lD#DY<6Eq5arFAGO zUo^GK7jr#5DzDe&YG_z2%4>=d&>H@c5(4HuNSHV_^j&1A;D94ua3qD+9Mgz*;XxPl zpG<|q4i>oPbl}3q!-`7b+KH}(MB$3A**gyQ6y{Eko4e+Vqc?1}#!RUJ|Asg19zU@$ zmA`DA!J{AB6<+$O#@3hV+&`k$MW!+xbKRSg8C->y;+{8bA3wXV4XkVV$i(*7j;K}c zErA?aofJ^LoCLVRQI>hE5|(|q53_Xj5o?BVLW*k#qu=7|r2VvQKn`_Q@)w``znY--V}70nF> z4nVqQ3CcMDaW%gP;EWUvQaW;>4D9*&SHE%wImypF^ttPilbp~;zV3p&aNlYID*$dtbU`ETbCZGd zfvfn=py3P6*-HHMH4CE~W9yx`I;;N*FNd0VU;Ui$uykTR&39%9wNhzkelCp*J0+bM zIpSe{FP{W=+APaK@k&fx@BKS#v)BM+I)Y8z~6PK4ihXxHWJ*@^3R7MQT~1F9(!PfmB~4mx(7 zD36~)#_JuY$GdiQDcQ%By?fXf?Io|t5^HvQ=0@4n#VU-Pn;5@wU)R3Up8mc)o!~xT zK|CejiuuSP(Y49?2&bD{y4>!hNq$xk0?CHOc9S%vLe}vp=94Xc6$mhbn-fVN|GV>I zpWIv3Tdfs?9&@{Dr!+S~Sb9ns?p-~%)7#h1?Uq~G9uh|XoAbl2f?n3hI>b@F%ynMC zLF}@?M!3$4hduH*g-y#5WWjtGIZ|+sINS!f3%0sIWt`<+VXs8pN}YFrEfID`Nf0R% za4pM4_+#&}6dbM=XOlPMhz@N|O&vK>(llwFz2T*y1O4su-*3>)t5o5Mj`ls1$?88! zm(J(ySKL0c@kBpyrGDsPf57Qdw2!E3_7MW~I%2GceS|cXu#ez>)o?`E%4NGP%g2!R zpZ`CnYPB$l_i<-6ufDVBOo}=)UVRMbs=*8)8d|efD9=QKE^>x|w5k_s&(y@y1xbfC zl(_c9;j!7+Cg;NGz4uMB81!g|u6gdCp+{?Cy-VG$L<0rtir-$g-fcA1ap%_oyttqr((-Bi(dqX16vf+t|>ZfZZ|1PM}nk(#FTced`0!eVyOmZnI*&)uB>v#C>hNNfSDN%{EyLAma ztt;2CV_i?L*09%~pmi0Wcv5zXw_@T-c;1twrzcyD_{UzT~6fw<>7% z2L6oQOvy0C5kt}-J0(sF*&bDjhGQHF;D@(z=5Si%Io=NV5sYcLg3gQhTLl_H|h;mlR{=OqNoY= z$%7+mhC8}fA?vot#yR5?RPzmmUQ@KjleS6JOOWD;IB>8aEHbfJ8SU@t>Nzm9`9y5Sysi}Q_QKC*b|%&1 zn;PoaWZx3HNt4}C9@uTLZY}g~NmqKiA{kfK=gGM?dD;UV<#fEgcbMNxA+o-KD&f|{ zZycZ{{(r?r_746U_()ZKfUb|>IXTze)BQ?Pp_B9%T#KZDL?|hexS8gUX_8DR#`W^i zdu9)oI@Wt*^XyU{Co2DpgJak^ZMh(6F?q?#uQ zhV+*-nY9X&YpZ%%k`($kqy3XP3gjZUZ4=*6lq1KiDovlTGZ!_Bp3q?emUp1tDf z(cM-3I=1a2FvdgZBcnWf0dzt-+1t^o3fT>Dl|szqXMqdsC_@jrYi7F3nfCZMz*|6I z99sH3Rz9%&1-VhK!L37fJ={BF*K5?t7s;?EV}!vxo?QG++}@vH*}IG^d+j@p_a7QO zHs21*Uir#_EBnHO8~&nqe}8CTeX7!@=-7RBcGJ0CMR{MJynWY=8`s~syQt`UhhSF> zUbAUn&k(ND!4n($_l`v5L`!sc$2si`a$1sfJkZb;C0gSW99}~|i{}%_m68F10?Bz264gSIk5%=u!v`U6=ZFQ%bDPIPO2@?=rbB+T6nxWYSCbIT{Aat zV)G#qiYaC|pm9&Knu?bVoV(ROxTpNA;sa2(Y4NMslQ+yb)HrwAB0-g24*26$X8=Xu2!4q2q7fZw|tR+w#G;nSI8H_fA0< z?g}I;hNi({X23g*H!T6vm^ox}CkS^j8un(4M)Yv0$2{=^0{7Mmn|V&q?Wu01wH2R5 ze4=oY-yq+TeHweA`S^;5i}=K?H4m3sbE1b!kvK_1<)?em;+bdABy!v?pM&n5)`Glx zbOwZ8arYJ;cqF>F;H+NY-2xY1>{CmlIpi`5Dt2OgPxZFG=Rb%OVL$VXt>?h{d#YQX zIdkS2HZ?JQWj{ua=p>$HT16SI>#r$d6t8g?z9PFFYoYo0d0Dl2HZ$>wm(S1gjpt#} zm-{h#?(NdZR(ZQ1@K7)AB`&YE-Y%_(U#68PQYue!jtsU3)$Y&T|C%@Ej}~A5n)^S0 z=I-Lr{5zR`=?VN1m6({i%>Y z&PI)1lPBzUrE(qqflO$iSwE7^jf6xh0^dOKuiUzfi+yVP<>g@ zR&Qh1F8!KaU44s0U1;MgpsusDC*bA}bLv{*RO#fnDH30N0-h~z;=3mKjbL9#AW>b- z+juS4jVakD&<1j{!DF)~>2sPFnlRcm9xW=^@5BH)zF(4FbY+_=huiKx{l#zJa9>f- zJ^ncM<$K?&jk<{<|Am{RGw~1~^@=YG$s8K=#(h~D5!legQt@;ey+Er0^L;%-W%I$U>)NLXz;T z+l}!5#W3z;0UJicA&lV06q*Z^a5Z;KjuUmGzZtnx~P> z^~VSLk8d!ZwOUid(a7-M*wVw%=y2Nh?Qf5t934G5{=^gF&u_B~o6F4P^E0UweW&c6 z6w3p93Ravbm?2_O#=eUcZ>2Ncq)=#(MAj(g72s9TNE^wO#Vg)6pb&PYrySe7VR*VZ5%0Z>fmdGWe_bmJPeHc*>E<^%$}-VzVMxe zi8E(FxLepqs#~5G=?exFqFA(nDuLKl_$YAV=gUa+z(3EwR~8<+`az@x7eCKFQXhwW z3T>eNIP7d1&=U8usgH!VgZ6@ZH`H1)3qM(!n|YU$T!a2L|u`2zpEh2~`;w+j`r%JX?~&Y9243`I7v zCaYP2%EFmldlDOZZ#w3WnT+w^qM*BP_c|nP-C|GL?QuI=$N3Q`YIv3ZEFB=}ma2(# z$8f@N(l6}cy>I&c^}8;GlKrORKCuh-@%goVh@1`h4eX0W=Ad<@IUps^qE(s&)?pQ% zT-Xa4mn#eVcJ0Mn4$b>xt;Tp@JG&N}x2CJ=uLSMVZ!jUQvkjm}I$z#$a|re|6A;#6 zM0yXtZv0${eb#WcK0Og{SGlXyp!dKP7{SKgr|#we%>H&4jU*P>B|-7$<|hg>DG83} ztx>BrY!&xUp2Aqje+FJXaGW8kBxKtpv){rAsxKG;SW@Qe_4a(&5m^{=wNr_a-Z1V}|4E#~xE5(QabGI_JH8ETgRydC0(FY;r*8-+B8XAgpxFr0D7<<-{3==eZG`RF66_;5NgYTfKTI$ODHBp4dq*Wl@jQ@_LUiAXsX zjHgPK^z@!$+un6)>6Ydh=T(eL7i)9#BgfUt_aQ%DEu%bEafnuN`6ZB;1L*A}sZy;# z@m8w?GM*mH@?z`Cxx`HZ_Xtp$cn@*VhG|AL$>TstJ~G4W)-62ytY=5h-i-@wU2S7V zAvSdN)kA-q%w2wI^;f?vm)rBz7m1D#nX196t?`n*552wn$_+kr)hx2esY%%LwKFPGx`Rpds9qXwUg&)iDG_(Qmm!NYE`)iYo?gE{(3L;fw{xxj{XBE_FA-B@`aXS4rV>k?%e$lE0 zbH)|)bb6$na}zk=4%#6^&G`-u|^pZEmudkwh0GJ4ltqwhWs!%5yi zdY%h?W^mVVMVW-JlFv+Q)W0HOv=&Q#_amPX{?}(8z3H#hM^bqSEu#e& zqIy7ydb3&P_ox;T&d$}7^;RzQm=b+t_}xifGVrm_`g(1NCZB$w&C?$8clcu?@viN~ z+^*^q==DoR<9LH+%UI{A7e#nXt!-CKtv^}*k~k1S=3YK0@5VSpUm1r@YtpKXtNdk< z!b%V*iB*lUsR2LGVgNZ-Bwv|}N`u1F?QebM-!2dd&z#x$y));@h1fGIGWtL+1P=<% z8CdpP@Subu=eR_sgkBT2Ov(2IcVqLKaY+{vzYA)fCo3`!`}^D*s^Ple!w0Y;{ZKFH zY5=Q1J}1yM;lgX??k2eOR!dWlJtF$g5lGdMze;nac^fZ+;WR z_|#K3FetjY|F?iDuDtDd8L_>@<>{LA;N+1cQC9DuUQg55#U%k8yILQli5^;Ld&lW7 zeCvjf6hFawQ7vPyD7y(=LjZZvyW|p1k$eUkMZ8N^W}$pDU!8AVe_s&{ z(R_8bzC73&+5@x=PmNna_iBZP{WW%oyh=c;bz9gFp4!Zxx}8T!Y1m!jQ>*+rh`St+ zUy5;tpkZt#Z$YySe3f>w75TnME&nQnPoRjulGi3b0K%L7ob;RfiS!+P{)K;EU|)_+ z2jHiX-zAd%rR#gf{l=C@h`$wdKQo)!ubi5D?HJaqZTTg6zu=G+u>a|@tr%7>wxVc5 zN~P-Q@c_3QbcT5trhUIf4{o;(jL8K(v7bF_N56Oc8XbowT^6>Gx@SrzvpHK@(5++v) zY-<;jz?r}Q=;EDsUinYo{tmP-8`(#fe)Ap7(u~i$@OkcwqEn&_IQ&t#FG{@?iF>tj ztsGsoQhRjY{_xbPN3Z_NyAC{Z;>5TAs*R!LarT*|->|m70?lZ!f;2Xz%q)W^N{gvc zqiEHc2_|Jocgor0md9ufP9#*Z$ca6^9Tcz_y z-k&&s7ED%JHG#{y&`6S;OMHg~*;f^2^ICbArY$`28lQB020xd=G(-9Pt;fgl$;1Fet3;a^*R#s8_cVYcXoynBbY2&^dE?+mtuItz} z5{ZoLDs4DXMyB*V3LK==jDDwKc-ObsfFeDdjE<$*7IVgCHn^G`-m!A^+f>@Jgq-&0 z*S0KVMx)VD_@fvx(>pN-@<+)d`#brg6yW_9iI_^zV2v~#D|lWm9RX^UINAWNoJKJfAC4&+6mLJxLaiIG9vt3ZYS3&`mpl7+ zw||drC!#_d^rQfFjPZ4Rj7oO5NOfyGPb$k90h&QPh5HM3K!xl@K10&7?i2rC(z5=I z_~~ZwcXc$v>0^&!mNuEA+}NU0>1@oZH6tw=Xmz0YC=n~MK}AuCv?^wc^o(X^o%Zzk zJ2xb+%(Xk)TMunN^T2x>^~sH0@3^C@q}TlrIup!;M)D&*l3T=)2r+RaE%;HtVMUt| z?Z|P=7FxP(q^0A<&vSXSBEJ6}>3#AFS%+O(TOVDtAW$2xk#-evglL7AzT~Y)6)8an zVZKV@Yijio`UG0t#am58Om(}xNGtRVrxiRSW)^jDVi9foqTZjL0e^?wl}~zUY`K(2 zYz1=De=G;tlUQjF(Njya#Ue8sjjg2Xq=Jwn6!7p3!tC?COGM`qZb8=z-<>%dn09Vz zFAN8EZ|(VeWM}#4qYa0TM2B}gUFj<%)1krS=;ZX*c5iu{HC(g3b6cOchG=feoyoQG zDtUDut;_jZdm8^)X&v_Qby)3RBFY`~%x%&$VolY0CCF{ffHo+P3M zgywaR^o&SZv5=!q1ELO@*6)pY2J1JnN{5Vo#P_KUdY|ZMn6ICmtC>X_5uYK;i1^Hs z?3xRn5%sy$4!;f2PCtLfhG_hn9|<^CvIgQAvhb-C8u(`5zFgx+LO0l*WEm6S1;EGi z9^MX8NlO$7UF>p(eH0W~_akvQojMCh(%OV@3(m0CKz=n*atQ=lEb=1>8lu?9!`6bs zX7n}Xvs3q_Hw;5A`wH9qO>N_hQeEksovrLHe3MILkP$H$a2Yv4hJHyl)Hgd@tqOw! z1<;`T5}9O)xu~B4;As|x?~!|=D6$$gUy?0`u)(G=s9jN)d#FJ}sdum8e8+>^W9j7h z6B_lLLZ0;ddqZ3G%{&h;XF!&Yv|UojO~y&G02Z=eV=Q#v;aoDkPKC%dnarST5G`Zm zD{k$A94*o;JCE6EW3R71c%4T3nj;T={>b$Wn(L2z;d4Lk>tn$SSRG`zfNk)bunlHO zCJv~*UYV^~y%=AuXcJFAC8MZ&al>s}&2?=n9widbO1i(_!jH5)=Si45ca?HeCBvxB zoATy+kRGetpUOG&!EBFVyZf*vG?L4r2&zBjP7nBPX@9EK*%I;De9e<7k3HBL@Wk4B z#5*TLb}-Nl?i_xbyufi%s{R4od@X;if|dhWq463CM6h}!3`QUaidtn@iEY-um!rmq zq*ErR93>*G(dlMn^Z?V5&;d^6XP+de)!OTD3n zAgYH`7TK6A1s=uh)u|V$?1!FGStjCfC>%JuMK%G_F5|W)J?ff5DWr2+ors4@x0K*p zz^{O!JN@qbK+ zYkF?YJ+7(U<0dWEPRh2vd@t^C@ZKbc0y9+##oK76V~Aq3!avw7^TDP}T0K9+%9uvJ zXgQB=FgqmXt9wOAwqs;1A=PFOBty>5qM8$)!^ckN_D=NAWz)&>c<&X%z2!>Z>2mo{ zx>U*(I#r9unPF&8M|7&AIBquV*)V=-X2;lIW#lcr6}F>2m+j~-;T(6MX2{R53rX+} z`hddOsF1Z-)r;ZUz(g4#APS7775(3efm@{(-LfU`DDBklWMXb46gQe9_Uu6Gr0c*` z_r^qEtaEsvx4muBJ{r1Oivkdtu7p|dK)O7q-tCO0ir)TAqAS|knhu4$K5rqFqg9ux zFoQy)Sml}@0A;<%m8}}3vZWC&^hUGUsMi~{S}lB7IMb7*9A=OrxVNpus2}4BAflz3 z&f*Wd1Hhf^MBO2P`~l+7$r{DI3%3{yGMks&0cv+XG0>~QRbn37>w6`+1BkLV9h(;? zPr5dnM>3f{UtlmZR4NVib*=+r^H-G8gH!znzdPI;iN-^SFYNbk=xWP$1d~Z9 zP}g_Ow6mz2DrxT1@ul^dm6VFKx{_AqO;m*r854*mKeSkktHw@J=RZ$&N ztgjxgNp>VpD7jLJq(We8;ED$W#-QYXH%-~)4q>>S}LK24N)R{9(={IFjE#d%W@vYU7IB9HoTI~HL`7ZPx0?Jq{E&~$hdv%L? zyN=2`8ez%eL_-Ke92|E#tknjs4S`Bo1V#S27O~T}kWXi43@D39g**3A$<_4DC(>~IU~*`<#7axQUR|`4$$FvH{1C>J!I(@@k4M!QkvE%Fj%Ho3L5I38 z$ny9o@>St4P9TVu82FW?sf}Uv@akz8@Cz~&44ch%fqAbSE>CNHm!XhoP><@OSzcq5 zhTYPFWfN51)?7zlt(YhqIDgnxaSa9R;LCy%;}xS;bvBhshP%}u!Gt7Y5PFfkB(j35 zV2cG0pIW#!zp*b6=-XKA>hJHmrcZU{K{jx=IXzY=j-|~z+OpZUEgd~{pEskgE6|rw zhEUydqXQM8l(-mLYnUW*pM;g1jk#EVHy=LzrlnK$4*UALPWGe2=jSi%P_ze=XBO$o z&1LdKMMNn%Q&99}ozqovR_RJ6t9~EM(PN{d5V_#}0P2@?RzM%zqj+7@6RU*#`D-6M z>O>C&VNEI)mE)Zd@VD|6y zAklYtY;>W2cc_xej6|a&nN)?cLy!;iqZlLk=z^ze(rC1(m(z^uWh$*0DMWTSadifx zesh@gp7^4?7Q&rJkgn+;k5=zKas&l;_TdkLvb(BZ7b7#!I^o4H_=@w^)p{hPVoZxg zZbh5qU|3)?OB=XvjOc(;_mJVVb4tDs!Yl2bO*-%$^*AZnK_Vn1lD~Z*}WLK z80Xc(+t<7RsVF=1dV^`d#hY7 zU>p4ptUMwZR*qaCNTDHWNjH%u zn)+T_9oq2ESIr2CD?Lt~hZi|64N$sf_F?$({M_x=D7R9fXx2?sS_G9Ag)OxI$f9Lx zR6_h~5~W<+1{hD>c?R@YD_B?4#0tfsW0ModhlY+%OdcCL5~?JUm2eoB*CDpc=zZ{uB zi-uZOB6z}lv3lbh8zR}9$<$U1$&Z5G*sey0Rey!e?^Rc!s9@kRWzYnTAd>`nvbbe> zyAqDzyj|()IYwD``jLExe81tF8tn(OMJElv>*Yvs5z_|;^1=R`)0PW3(_xQpM4RlJ z$qeqyyE8>gv@7OlV3Ucla+ky8^@gmLh*fWOHqADAz2@XpHr$!?Hn#e_ek-JQ(sLhX zuLxxz0QhXUp;$HEsB#f%9m>>B#|ntQf3;3ZQc59CrKX)C%l(QWnjK9H1p1ClPah8s z*`~V($7g4qo}qDfTc9{&9WjmWC{`{jdAfh9&QE3gcNW_V)1hQ%XLn`mK+YF8rQ%b* zoHMn)BRZ1B-dmPmi!4w*$X3vVooEDuAvEEhR4BNW4a4JU_vlXYBSsR36KW*v!$kE_ zwsmT5uKM`nH@s&r`)qaMviC4KYsP%N%ZCINS`1+QwaxItMcjd8NR%*k#g14*HAsuV zJawHNhKI+x)4qypt`IMWL%q>R#k^+&+fn^>$j}`gI?y+K{Ouz>1Ic1=AP$%DfS0{z z|Cf!{p38^E4pHg}Sq>E420ol{7pv}dMiq)yXVYRM#JM8(w4!@FWwyZBG;& z;d0CtFFHbl@#@Q=PN%CB4wSs!lK;{2rR`mN2NFZMrlxp@H#3&E+jCCap#8!&iTj0(qcNsHRd-+qD1U6rr-ND~k*Ecj;DCre|1}ncQM9U<#fvb8?VMVi zjwaS08J#+cpR-4*uL#!MXf{8VvD$N^nf!Rhsue1S&h(bg9vB$D>iX`%8?GE+S7dff zXY#Z2ap@;f4VH^Ngjg3N>3}(M$`_3ag@F8GIG=wAI3KFsa+@Zc$(x*|oSSjre7Vu> zG+yosd)U&QXg7r^2873fpZZVfZSutksdq>aUjvs2xV-=_Q^rVlBs@DDceck9W9==Y z+Vs#|Y5I!xKxxR|H4<%+vupZxPIdw)6J2piWtlKdG{$1i(j`5)v0}{V&Lk2x(qP6w z<93XpK(|8Dh*TZU;CV@ah(E>-OF3!R3SfZqHAo3+CmD>Hd-hbCd)4WQd~zt3n;!@S zHth>_2fH@6j+-ZU<-ipA`x5Dq@Ypq)Kshn)X!AJ>fk>NUuA|+bx3@)R{W(WrTPapf zYBg=sX$az=1}E0b18N}TM1+b8N&FfF7~Y8az+TW@!@bfl;5}=>bFTUocF8or^K0L` zZ!h~ybzDfO}+-AqfVVOybwbh*PZf97#i%0 zM21XzMGQ4|aST1C9qA-+Iq%AkWCM<*T;vV-4{65Svn|C!{ib2V;2^U$SdBw1Rs*ZP zN8}6n{BYJSWt~f5)hKkPicgvosV26OK*%RS9_kVYC^D%6obh~)u8g-okxO}VL0z&T zGm)Q}b;Pr#aKi8(8{0?ot&O&z%N;V<8}mB9ZM4gm_OvP+eF4KD_3pvyA7<-;`nYW) z2EE?ut!SjqS82I8i@;Tqt94wQUy>Y32w=a|zr8W6^tA<2eUlZNwRfm180&6H>I(zD z+(aUq$aLgqwk4zKCb!Aw_V{`cQR;D9+ghOzEc%1#26ay?(ncQD7SOWGp$@3<`))5mPy{y`Ew;b-%!|41?tgvv#(n*-RD1Wm=YyD^6Z6}TmLl+z zZL)_#FyP68zDl!(_UuR05(HR4^T`#iLBdl}EKsR~{R(su1XKEr#CRe-TPSWeM@<8f zWRE9hb#^p&$r}*_D7^5XQ=j>azc&^i2t@sHn>!hHgbX%gYXQpHmVraMM$9XW(VSy5 zkn<9xcL>7o)lhL->tm^-sK^3KtSCe*NB|w`^B7TfE;*GC4>hxLhrdrBu})_;Uv}wi zaW;Lwr{HlHy`F;0T_{ESLa4qzVh58IxOQ>--pF9u8nIf!7IVmkUx)_mSnU&7BjP`q zP*GwybeaYsP0E8z|7*7M#VMvM!}v%skRN8J@T?R3M>m~>Bt8>ab0u4XLdKYcu=UR#pwI8!PeAdHyG`Ds?qMn9L}ul zg0ra!kvHlUqF=4qEv=DyLFDJ_V7``~u|%4C1MOv@r4q?aqwIZt{iT=9_)y0w?{ydO zeOthnvf4)m?e0*2G+GJo-G1!k!`K1Hi+n50Kso6g0`=e&h1b#vz-u3WEzvPv*zfTGH1|3ol6)fb8m zO#T5B1<}RX`+%az8DB$Ds)JI4(EYClp@SlX8Y&WmLb67C$IxB?XG*(*pkP~nR3HF7 z_J0nb7spSds?p~+O8EJE;OAdU_}S9j%<)rP%Kt0)sZ7SwdUq=_4f=Z|{4_b5Jw<;Y z!|}7|ApFFN9EU}Kcv4rn5iBX>`Gy7pP+7Kyp9FiyE()Og`j@JG``-Hjj-S5=e%=H8 z1YXs!lj=lp>_o8sp9MFWmVmQA2;j7Ol3{1iU`2o(tf_`F0VhY!-vc@SiX*41+!R!s zymG4qpP(EX4XMrlOaSUG)&cZ35kN;B0MOtm5kPGb%L;%3Ke5^;utvPPi%@|U`9k>I zHCWwCTqm8oQ#f~Z{Pfv%xg5vO`l|lF#m|$#Pt@~Uji2s>h@UM6kIC#atisP`AIHz% z13$&RX#I2zKKXG2$^W_0QyK6lt@hEf%>(p|4Mz4!=!wW65j_dbSP8N)#SYYY!XXLG zHvP|dLRN}$rm!y@!_V+kZ}^)cH)shCrku$FwqE9EU93^~0W2lpp+r1ukqa0=9nc0> z01a{)c*4dX%&Ps-7IVro#9mXWfG4yWDlQkRz8CHJ(B2~2JC7q2XT*(Fe+KJtO!VRw*k^L>fUIy4Qg><8tZ4rvB!jI z;N@0h8V0u-)HYod)L8$Xfmf=1d+zxl?U@r4vmdRk!8O{lKP#>YV}Twpgu$3UVRI)q zL)dCsVF)p+5YkQDh;a}{2pMz@uGNMk0^6XdrTmjP!yAb+thBJfc7I=U*s?CYMdS?c z^VESY&%PY(54r7wBC=h3Z0@q?V9FY?Siu_dqlHznW6e)sbP{K%z=&2sThoig847oo ztCtb7VMR~j*^3}sZ6aKjUS&x5Ki~{!vVWK}w4-_-I7723;pChl`((J&7a-QKNf)cL zhK>57*96wk-D)Lh`>MfCtYNFY35*wbL+r;HX+Ln|)xZri05ieSjZ?qqK>x>h!>`tO z!$C&8;Z!mW-f+)lv%Z46#v8I?$d|M_#)vsY-ji~4-`ufNU$;cez&839!ktU_c02O; zr&i_4oQ!5j=yk0^I0(H!I0(Ija9|+_;oi)S zW0x<2a2VX5fN*c#OM>s-8p7Sq_M^2m2uFKXqvJmd=O(-ZoLj6Mhz20?iU_w_5?aQCmUZh65Rkr2+3^aX)%`yzyJT=-o<-2LE$}nB$DQ2~B!DJ3Zrwr%a)E^K(o8 zxWe2WWj5AOtp2R}%U6{o&*K5B_peM5vOdjmMEHRsBJYIk9+giq=m3zXDaZZ=KjqM8 zye$71UxOGj4)&DYv)!dqygWXRsPR}nuES#Rg}^e%ba0SIidAxY!t}wRk^+pWq^5H+7{qs6H(w@F}7R%&sjPqq$=ZK|E!MNe657n1OFmb)1zZgvRO$^y=y%kAs zSnT&_ClZ-trXx4|M;O=Yf7O?a{ZR>7TGOtJtZANojq6K1Skn*j_hBsHYyM`w=6Ruw zzfXIz@gkpZr#(UY^!YDc!P`D$FFX?jau3u`yI2eFT$fl z^Ktl@(s^6O{&AHcvpCW&2QsOp9j>&4?S!q_Dg6iCiBMR`-i_>;a-Q)d``y>Y@vXQ1q19#4zI(%RZ0 zc)iWahK9yQ1gXGB$z~GNI);btB&PZO#A<-d@Eml9H_gC+jeUZmB5t1SOg;y;CV z-x0a#uIzm7E!p|}(VHS?@H6-3+Te=%iLg)Jv-!*Tv-zHxuj0>7@41IlgiLl9 zUrp@;$UI3qMOr3WGwcmGS*-RKVA&19zHFhj0#s{|%!D4~MI*6T9E2pdoSMOdEV$&B zBbaF&Z*B>B4Vi@7mv?*HB2DAQ^2T&{qC05tCE#n|+rH!JV0XS%YY$|+{a969g&PUa4F=S+M!zKqooH?J8^i$@#| z##3g$W?^KOCrWDmltOkECG0R3$D72DV=q1pZ&*P#iu3Sceum&f1`UN8Zt5x>&Jmv`yru~x@CmtiJjUi{>45M9WfM;c zTV zXlZFSlx|WXEJbhD8I?B)cRXhZ>6^la7q&MUn8Fs4&zN0}ziZWPrz>v|NKc_V6%zBffMSZS>LWs@69ou!SziV`vXXGJU z^%X&Bx_UXc;R+$;COjQus+^ zOYatAGUgcWT%Q<VOlpIZe3bkN#3Ue$ zMJkC6ogd&QHu14_&d@5xU~*G?qTubMkrQcB$P2AXo|(>yx{m zllJ^Mq4gr~v+va3XP>^<`={|f?n9}4*e@19S-d}X<;9*))}N>M@jM*Z#OGh7e*scb zhfrYO#+}h53-KFO)r9mT$T6f)qDZ1ZWDFVvrzAONZwi~$R&yG7WHpB)Ot|;nYLzuG z`A0rdU1F}!?l^gD{$nNa2c5xQv_H0{eO%_+COD=1f%f+++e^{*CO}NIT`7!Js~`CY z6RIy&tM}f^gy%mtf9&Lr&z8g=oEBsqEXLahj;Z7_Iojoe<|77S@Zr`6Dh-f6iIG9e zLo>%GWpWfxUHeIKAWGK1rfZs0-}23DT=rVNX25a{Q#LBpsF6pyd*Pbv&YYkx%nz;0{stNy;s%sVepUr;;1S{mHqq_ZUU~<8 zLioP)bT^*8WvS*wb=}pVtx%${c&>O%8LF3`>h-))NE}9wwl{s?M7nT z`tYav$R8}WVcB)8bLzVJLXo{s{+_!v)gN5EOz> zVe-$_s?DJg!b@a~%oTKZ!1G!9N#3F4{RVdh+$IzO2mdV8mEc1(Q=F(3KD^9S+%^y> z9hhnxJM2AZEcwjop!$$;dTa2b-V*l?y!L8EZhA*<_{40(;-WCr8}Ryt>IVd)*XT?2 zdKTE}$Y?>sHY$9%Zpe#4jMIj3`uHuLLWK#`$4z9DX}Datbc?}oAR0v_BQD?*waACx8nR;o&j`&Ad*(;XRva5Yc$XM;kkb@n!^2&X*_EwS0BR6vx7^KLzNVJ~)!(wHgzCLxfqp$CohG?+?pOMjqb^tLsrb2xb3}M8%%W7Cd;DI6kKE) z8jv8M=u;?SR%<$)!=4$6*WrG!;R`}f2&rn}c#2{q5 zK$x+{p;9$@0YhdHfVew460gw-Ia%_nOKQ;3tD}$K!5(z<*sCQ+CNp<-!=5_=bFF>j zfzp;PSDup4~6ep^x zsKFKC2y=}EF@>w+?ukp1d`+Y?&3Q$zaH@BO2JQJq1V{MIBO~#tqPOg{=@YHd`0HMm zo&BQ4I@zc*!KeN8TSm&ei^xi))peJ~w^UCS*ONmm{E=nCI`F>@;19UJtr9UxV%hSV zkEa+Yi!G$TJi_`o`(E`fmahKu*I73*@_%br^|9j!g{As2Zx-Goou?Rl({p88Mw3V; zHMj`u3WX8n*Wjik2paCH$1eiuKA=DWI5pNTh1R-tQvxvvNTNS?$*dySG6cno!8v-G z;x1k@vHyy}^_kql=jc@>i8t^ei4=_D$7yfNmViOYC>TWAJ@W0>5yJrBgAh)+G1D<%VUCc~t~v1PI_*;6d`MAB)aah=7ChSmTg!x)s7bT zVdp1H^a@`~uG|}+T*T=lN8;NXBSHe9ZRa_h65`QdQJo^-mqdPkGq zo}Q3W)zHwO*{E;UH|ZMKhlkpSIM)Ko&tTn}VSSxKlOLP3 z$DPef-$hmv zIpMt=MfvcX8s15Pa*GN)r>;p5w0gwB8MLHP;m|{=1!xoZBSwS%QZQVRQmh8$#aDhQ z*VEV1=Z@}VZ#}yAzbc!CvQ;f+ye!D5O0fdf?tY`Fq94i_TafLR^_6{DHv&`}5%L>~ zt%pkA! z5}OYq&bimW^chqWv$ZGK*p~b5+fseX>1a`2mrPE^LcxIDX4DzN9f{(2Bp9CXd30`v z*=f`ogQeW`7OWq+1fdc<-zN(qVIpONOs-a#tqT0r_)&cc=*(U3yUvJ|HK@f)GYTnTv0pyZUczL$$h8 z+|cDMUNZ8QJEB=LiW1-S(!PD?hKG+|xS&{#1o-l2F$$bh@a>33u((_{=UKhB(F>5H zB>^5gq!DbYQ4KO#60ar2P$(smPFzD<9~?~Hf5Z28i<^Hn`&4yG{1Us*Ztd4sf62Cn z2f{G59U2-2Vo(mdU$FlK4$8$$RAEJTcdS&B$>oMrv0>3>;8G4}GDx)wdkk?(*c!xN zkCMmn=|D&`qIw~yKL}Kyyx3YnF4t(N#1|(rL-7p3(J>q| zKSVW#@2~t!nEYw=eZnOBhh4j>ox*`#yRaIyR=9RghFt3nO-%>_*3sc6nS@j(VKc*5 zD^Dxf?ys;PRz2*8?LR$=27lT4cb(NI@r|`n-S~ZweWD<}S&8Z>-?pES1g>)}EuKc5 zP6Jj+A#b+$oPM)WrO~)O!lJ{?F$~-j?m3?Am7qlY3)K(yo}!MU(odvrDWMJzY8Fx{ z9x4eWG*+GL`Q7aKs&jY!w_hBX+kW8m!DmiapWbux>-JQiIrYpzrW_i23+(>sU;Lu_ z)#~qsVFU#CqbldaOP^y=&tUBfEK`-#u~HT@&8k2{uS~ zAoaXj|A_OM<+`dBtHtt*;E@l*wjw86q};eD;GUB#4p+bw*(h|Cm%g4A-rc@L+RVJ{ z3-H!L;$@lf?-YVkscWE+PLhkUp>T_kMu}7gi&yWv`s#h`O>?JC;UA5pjCh}Ku`AJ& zXg|S7sQOWvy^S?*=NiE-*`@3r_GPplK~--=H6wSRf@&%=g~)YcSMa;p8#2f2jxLa??5s$RKVtyVzY`xvGojet%? zt5uGGbI_#Ozvm~ZpY$-^T=kzS?DMwj&{rm&o4{K3EWf~>L*~p^(PM?f?Mn7sbq7m7IYl`c5fqkv^*^6t>luC2h&)$y@Dyuu0t9s&n_ndy2WYed8O|`>Cbl?>{iV?W%jw(g0ezQwU*1lz|^r ziXl2RfTfgL;`G9;QW#U~Dgqr~TiNM-r%&&r=1y(D>89=HV3ZVq;%{YV*?B7n=LJl<|`ZY(o2iE*#<6=PWF%4PuO1Ee#XDEHYv|K z8z|71>?d@_MG=;GYWQFhiz;%}Dsx|xCl?Bo+Fedh<3N+Q7zuP2Ty~f4$C_x;=XBZZ zf+CdmyPOV`b3-o!vZI2Todf=AKYG3iUQ<6|JXjF^SJEe!dr31 zypWUzh$qOkw3vEB3Wd+ssnH-por`uWmRh*vSnEMGoa>KDJRB4Wt+bRGj9OGw`D-^e z1qFG8$D-{KeRH@YQXG#bCvzdZYKoL%@#$P@vgnMsnwnf;mnmYmM_9@nw%fyISHz*y zxlsDj9=F-z_S|ePH32E6|u9pLxsZ|yNF-Z4geKIG|%`g{?iBjK=yZ8SIE^7oL> zntalNxQ8fuDD2a!Ls1*hWT5aEbUp+DD_QVG-Ol;h;^gGpk$$y&ar5j;sp^0hnzN3M zeN)Ng)V_|6z0*miFRagGH{=WJv)T342ZbKn($}yzn&s_mT;2u>XneqC;JRY2h>5Jy z^I2OhToWU*z|l+PeO-v7 z?=Mb73-hPOP@%REn<(60{Z4E!V{>b?rGb(sOXL zYkpqeHN7>JnHxJucFUG6!qKI7vwy21_zs@P%O4azg;r393ET=(Dpf6uI>IB~2Js7! zdqlP;$X>2KcW}M%_VtH^{Y!(w7m?>;khg)6sL@6fvUBJg6dH|O%aB(FJ_`hp{FWgl zfp}d4kmLmP?X9?O*zc>UZ~cJ%NA(?#KFG#}hsUbVSARUcN5L9j2E#2t7b9a&$Spv8 zZr5aLwN{J7ynKqHix0RmF^Mh%yYS$lLxV^5-&K9`ul|Z1t3EG$;gz4TV>6iLy5$tF zltnp1TYL>xnbO(1*xX`73VzAefSA=TGOw-8PXvt~CnV{RMq7jH7K%krPriAf*?=0I z{;0t89iw4a0va|{+E|^a$iQ~Xg|H*%ZV#BehUzadA1fj@wV)|KWI|-YNm9iPXUk$h z)+(|eBt39_7pYP}O%`Bmo2W*tYgAMSP$D*ZMWOxM%H>_L(H;5Xx)#Qmzb77^XzdFg z=(+mD$ZKXiZ3&ydGZY<)`#ZIz-QBsZLy=TiZ?|d3H%A=i!BF(>zq#>KyXLL&4tKEA z7afWPy8Li(fClR~!Z(E{aKnh$hCCZ(Q+Z^hGZxGF8Wx8t6$sQeBs>GT;R?jR+E1(^ z38kWD^x|o4{>c0A%>Zb8H8qh;PNY)fiNtssuw{WqSs32S?B*0|S&XOBD{oM=hBZ`e ztGke~zljaS6GJh4M@@|`d&1^O*ywxQUbRqk>QF37F{-gHM_hW#p0KOyE=JHuz&`RD z#pJ3Lm_-${{j&D5{25l{Pg=2Wq{gva_(#h_ zOF}D#bz506yis3DdgE5{+0+C|lBD>v;!?iyrT^hlcKs=fEIL2eaxz)S8*(5qp$-5$+1>2#MHN2Yzzvrx@|m3gE96}}Ck5%Ed<#EJETk$ncM zENbs-BC6z)4`VsUcF}$$O0hL$2e%<=@WeZy74NpM98SE;-amQsmA%Rqe`g{XX_mXU zw@u8JwxtsN&8A{DHsZ8|wr2Xr{92{O>JFJSxoy{skDT0=&ul(6ni&tb#OIPz=Pv8& zJ9x`ki%qNVPxv}~mYBHmaE(a zcdV~$9Xo~8^mEsaj+~rtv$Uj4rqX4%Z<@RP(&Ex@bWU$eL~d*ed$IjcyCClbPX4Fh z!P5&~umuK)9z}ya)Ua4=z**-48^DrGJbPGOl;@|Me0R9X3M)|KzGxj+LYuh>hzX(U zN0J3gertPvV(tQ5!JguVc&Z#q2OUuiHj4VN2QuXjH%gua zhw_=pevdt03Iy8SsSOK*b8o!7RNC3qxoObhN~RsYs3l}+_U04So#0@C%YQ4Z$IV0) z5?!)jxy9^sHfgn*MvL99LMlD+sw7DSWPsC(a|%ZjlJUjA8KJ~&ny5q$?O*WiH?!8! z-949#U)8fSJ`^2Y$I?AL?9pq^ZC>hUvFg9TKHs}AT^x(Z*(jUaUVV@#GQIpE_CsL) z0AwP6*=&}}?4x}XW%s)EoxUbbJ}O@{h#7)7sqYuF6Ojj!q`>1!8&QK-kEZY-^?#jD zw0hvYqzaona@-c;y+B0F9x|HagHwUXV0*l2%s&`%=DeP?rGH03uQ9l~c6Y=F^TDPq z+F;V^%(!|I;mQ7RbM*yVG@WSHHTpBw){w42_k_L}DNbZ9CQnd5?02_DoNgB!5tEZe zS5&9(i4`~H&4HLP)@o}shaD*|V}@v7#+A9s?bE9iss>MsJD^u78(i3p^z!fI4y*)a zRhfp|($rn>fR`GMU1}073OJd`0vTD(=P6gG110N6X|+*gg~uYkpG?v0uh!qXzf{_P z>-r71UEbAo`E479ui0M6&z&3@Ik7dL+je4I+gv5=>6!1HT(BR|g`!4Z*56`@WUZz| zPp{j9jYANnp+?2-&#y<9*UK_ z{5FTq7Araf?IB~c%jENPg`qE8nJqj|u=}VZGLUO)>*$ZVG3i3bd6Om}0{vY$bK29D zDN6aPAP`u2`O8u*k0^WJ264_CHr%$qt84#l8+N>P3#K}XDQB}=Pi+4ZqAx8m=b`O; zH_d*|6O6eIUNFh*`Zw;RxnYi#%CRkZ!Je#y-0d;Vhu`_mXA^-?>@LuAKYOq6gzyiz zA5B15v&Lvt5!6tyINCHXn2gHiH$u(FX$CN5!W z<~uYo-ZMUNa9FtE*=Hw&>h~Xh*Sj8Okq;4`3uf6*P)~>QOzJ;nY;emt!@YE95@-hT{Z834T-myR~bNZL_-K-@Tt7i64n$J9e7bjvYT@C(fgGYv<9_ zN%LruHf_>0Z7FGzHbEi4D*9UJN;`{Y1GY{~TN#X1VvI@f$JiX3iX7cfn-FCnyK9C)jD+XO!$u z02U;3%Ea45HmqRJPH;tV3VeBZVPWp%$=lfE3_G7`o5?&tPnOF5n+=IrDRxxjz@8$f zrPxDygW#WJV9e8U1FtRcY~Vy9sZL}#dseUs*vdPCeXYL!ws0!gk#MeaSj--itESpn zvC0u@ta#JA_vRbx+WKqSgBk6bHdFDi7HcB*qRUs~^K9KVfc(cewdVx87jHplGMkOy zo7T!$DbTb_?;_lIV4HB<aSODO7;0QP{%N-&14w2M|?CZ0dAi+%6F9yZ%L8f_SDX&q^7 z*mkBW>T*Q^LZ%<~&kWAt$>1RP#dfwMKGq!H9>-7fSo{~>xZ4v~Arf4w#jMzcQ+1t^ zmuz=8y>*%KUhe*F3Id+uXR?4HaVYstKTdzR3nhDTW%-K2s?^_>%5fgS}q3w7A7 z{8gZ{UPh2ZkIyUk%cYHcmTl*k&_4p($gm`9QrZLfhk&XZ$H&I`Ebz%X>U{^2Egd2D2o90^k_~reSSfsF)oMzObc;eb* ze7?VRj_+{n$CCy54%RDZK?^;h1=uxTSBbrhqP`QqI9U7)W6br~lyf^z_s!ONr^+luHH;p}U!-+FyJmea>3Ctax&(Oz~R=fK~l z;XHzKO2z4u%hq2zJ~q~lTlwWw$~8Gj_XYVBv!OjR5NsMl8vIs|oD6%==1A^Y-``GPxvMP*ugTtXIk3?J8o_aql8r^!ssz|jb9E7UTr;L?RKI5e4*{*NOb4`5R#YKlK}SPX zu-0AeE-SH^%y#}*0DDJW6^*NWrB2KW28^XjjHR~xSdz49#C{aFdzlK$rq0IiPp^q5 z-`*W>p^>_P!HTCT>^DiDHs+sZ6rA=eocD)9XPkbe+hiYqsNO~W=7D<&5fVNq-73b} zihT?!a`CXUdNRN-cMcDCqIL|(#rOFstjJC0^l3#lEemX$h;)M_l7lJ3r)6OxKc+S9QU(j1$9_V8gL_sEI1J^Kj0 zC%Gq011878W2%*t`)7sNwsp6$pq4`vHVp{|<`-6(8B-^iKLO4ei=BL@if? zGB}Rj!y8CuqguDOy^RA8OXD`$d z78x_=xl2wwVS_0a7}a36s5YC@KlvK6o~$!)R^>l9dr@#!m1|tTA+A-uj%#J_mpYDd z{kIk0!wCU;>dcAnUlrHt+=%Pf1Wyb5n=3N&67_e%TnH-aEQh-;2`Z{~#5FdC;CprS z;tq zWO8&sPN#b{u_ZhbiLI_12@mm4{2jrnXt+Aq0h9*AsY;E^ElnvpQc5GzsOW_O4gPP@>v^wSj3v}(yq!Tu+ zzPu%M>Z#su{W>=FKJIX518ki%4LlKPwKVdVuV@qdSEy0l*DB&}m&I+yxgZA`N8U6T zcWZTl-ql^xJ=1H|mY)V4oYem~n$;<`gR(wYYWL|rv^)KwsDDyCsTSH#(xsU|$9qPG!JuoCKek+N&zu02bfFVrVBwj-bT*Mi-Wg_(tc)>M`1<2AzkG<`SnkZiqg#} z-7D(82ix+k?3gr#6S3dno7j-NOVoZBH2(OT6R17FH?u2p6H5P3`#x%4gj|oI_P_WL zJ0<(6eDepW{rU?7s9l57yW}-gDpBcMMRAlmfywxaJVK?`_lWXG^C%4fb#}jeS{ITw z;KlUv$IK=D5;6H&sCp#}&~Wx+ewLrtgrqHy9=)`O!KVuzEX{9ZFM@TIG!C$(4t+Ww z$MiC+R8d-gI(8*(~%4?Rgg5p7;rZ;qp_@6 zhSwCUB+CVI(ZRvlBs_Ip$%19KUcth{7v~f+EtbzT=R!)Ar86n@n1dU;ZyeaTZsWiW z4_1{nR#j9u!^!sEL~x_aTh`)ru5v}zuIX9hYvrDYbL(|itI1}DRaI{joTx;g{RiA1ZRW8J#;&bD+a z7Dq;NmmBHe>Yc`e<`N)ae9F#+6af#>TlKN!Z}7PY^G2=}p`jcg82La~zLu}!hTe6{ zq2`HeyMye3+}awBB##Y6h!EkE4 zLPvAIpaVdQpp#Y0yX40O9Z?QCN;xD^U{e6S)K<=k#}IuYHbHN6Ndliy6;TKffp%U>Y2 z`~@S+3>g-qyaV|VeDIjty%h$T>9EblQf4@4qMg|#ctqNrtwsUJL8csEnH2x~OvrRY zE@E0@wN@CsVJ0G`?z&Yvev$v_e@0A&4$yk!)9?)0b2^|BK;0_HjZRmbR|Q(m;U@y? z%HoC6Lm~wTZ(b~r5F&RbN`W?DiVooKvPUv|csMh`9$b8B@w$~N0XqkT8rZ?j(>oSF QLPm-e>VO}`f_`f1KPYj3QUCw| literal 0 HcmV?d00001 diff --git a/UI/Sources/UI/View/InstantiateView.swift b/UI/Sources/UI/View/InstantiateView.swift new file mode 100644 index 0000000..dab92da --- /dev/null +++ b/UI/Sources/UI/View/InstantiateView.swift @@ -0,0 +1,20 @@ +// +// File.swift +// +// +// Created by Hessam Mahdiabadi on 11/5/23. +// + +import UIKit + +@propertyWrapper +public struct InstantiateView { + + public var wrappedValue: T + + public init(type: T.Type) { + self.wrappedValue = .init(frame: .zero) + self.wrappedValue.translatesAutoresizingMaskIntoConstraints = false + } +} + From 1cc951211dfba7b2003ea249e2ad08c4c164e546 Mon Sep 17 00:00:00 2001 From: Hessam Mahdiabadi <67460597+iamHEssam@users.noreply.github.com> Date: Mon, 6 Nov 2023 00:28:47 +0330 Subject: [PATCH 18/34] Add Label Components, BaseCollectionView, Base ViewController, Font Size Updates, and Base View - Added ListLabel, SubTitleLabel, and TitleLabel components. - Added BaseCollectionView and Base ViewController. - Updated font sizes for better readability. - Added a Base View component in the project. --- UI/Sources/UI/Font/Raleway.swift | 25 +++++++---- .../UI/View/Base/BaseCollectionView.swift | 32 ++++++++++++++ UI/Sources/UI/View/Base/BaseControl.swift | 25 +++++++++++ UI/Sources/UI/View/Base/BaseLabel.swift | 36 ++++++++++++++++ UI/Sources/UI/View/Base/BaseView.swift | 25 +++++++++++ .../UI/View/Base/BaseViewController.swift | 43 +++++++++++++++++++ UI/Sources/UI/View/Base/Label/ListLabel.swift | 15 +++++++ .../UI/View/Base/Label/SubTitleLabel.swift | 18 ++++++++ .../UI/View/Base/Label/TitleLabel.swift | 16 +++++++ 9 files changed, 226 insertions(+), 9 deletions(-) create mode 100644 UI/Sources/UI/View/Base/BaseCollectionView.swift create mode 100644 UI/Sources/UI/View/Base/BaseControl.swift create mode 100644 UI/Sources/UI/View/Base/BaseLabel.swift create mode 100644 UI/Sources/UI/View/Base/BaseView.swift create mode 100644 UI/Sources/UI/View/Base/BaseViewController.swift create mode 100644 UI/Sources/UI/View/Base/Label/ListLabel.swift create mode 100644 UI/Sources/UI/View/Base/Label/SubTitleLabel.swift create mode 100644 UI/Sources/UI/View/Base/Label/TitleLabel.swift diff --git a/UI/Sources/UI/Font/Raleway.swift b/UI/Sources/UI/Font/Raleway.swift index bff6ec9..973419b 100644 --- a/UI/Sources/UI/Font/Raleway.swift +++ b/UI/Sources/UI/Font/Raleway.swift @@ -54,25 +54,32 @@ fileprivate extension Raleway { private func semiBoldFontSize(basedOnTextStyle textStyle: UIFont.TextStyle) -> CGFloat { switch textStyle { - case .headline: return 22 - case .subheadline: return 18 - default: return 14 + case .title3: return 20 + case .body, .headline: return 17 + case .callout: return 16 + case .subheadline: return 15 + case .footnote: return 13 + case .caption2: return 11 + default: return 9 } } private func ExtraBoldFontSize(basedOnTextStyle textStyle: UIFont.TextStyle) -> CGFloat { switch textStyle { - case .headline: return 24 - case .subheadline: return 20 - default: return 16 + case .largeTitle: return 34 + case .title1: return 28 + case .subheadline: return 15 + default: return 22 } } private func regularFontSize(basedOnTextStyle textStyle: UIFont.TextStyle) -> CGFloat { switch textStyle { - case .title2: return 16 - case .title3: return 12 - default: return 10 + case .body, .headline: return 17 + case .callout: return 16 + case .subheadline: return 15 + case .caption2: return 13 + default: return 9 } } } diff --git a/UI/Sources/UI/View/Base/BaseCollectionView.swift b/UI/Sources/UI/View/Base/BaseCollectionView.swift new file mode 100644 index 0000000..d30caea --- /dev/null +++ b/UI/Sources/UI/View/Base/BaseCollectionView.swift @@ -0,0 +1,32 @@ +// +// BaseCollectionView.swift +// +// +// Created by Hessam Mahdiabadi on 11/6/23. +// + +import UIKit + +public class BaseCollectionView: UICollectionView { + + override init(frame: CGRect, collectionViewLayout layout: UICollectionViewLayout) { + super.init(frame: frame, collectionViewLayout: layout) + + translatesAutoresizingMaskIntoConstraints = false + backgroundColor = Theme.blue + alwaysBounceVertical = true + tag = 1009 // for getting collectionView inside BaseViewController + keyboardDismissMode = .interactiveWithAccessory + + contentInset = .init(top: 32, left: 0, bottom: 20, right: 0) + } + + public required init?(coder: NSCoder) { + super.init(coder: coder) + } + + public override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) { + guard previousTraitCollection?.userInterfaceStyle == traitCollection.userInterfaceStyle else { return } + collectionViewLayout.invalidateLayout() + } +} diff --git a/UI/Sources/UI/View/Base/BaseControl.swift b/UI/Sources/UI/View/Base/BaseControl.swift new file mode 100644 index 0000000..3a15a2b --- /dev/null +++ b/UI/Sources/UI/View/Base/BaseControl.swift @@ -0,0 +1,25 @@ +// +// BaseControl.swift +// +// +// Created by Hessam Mahdiabadi on 11/6/23. +// + +import UIKit + +public class BaseControl: UIControl { + + public required init?(coder: NSCoder) { + super.init(coder: coder) + + setupViews() + } + + public override init(frame: CGRect) { + super.init(frame: frame) + + setupViews() + } + + open func setupViews() {} +} diff --git a/UI/Sources/UI/View/Base/BaseLabel.swift b/UI/Sources/UI/View/Base/BaseLabel.swift new file mode 100644 index 0000000..dc9e993 --- /dev/null +++ b/UI/Sources/UI/View/Base/BaseLabel.swift @@ -0,0 +1,36 @@ +// +// BaseLabel.swift +// +// +// Created by Hessam Mahdiabadi on 11/6/23. +// + +import UIKit + +public class BaseLabel: UILabel { + + public required init?(coder: NSCoder) { + super.init(coder: coder) + + customize() + setupViews() + } + + public override init(frame: CGRect) { + super.init(frame: frame) + + customize() + setupViews() + } + + private func customize() { + + adjustsFontForContentSizeCategory = true + self.numberOfLines = 0 + self.lineBreakMode = .byWordWrapping + self.textAlignment = .left + self.textColor = Theme.primaryText + } + + open func setupViews() {} +} diff --git a/UI/Sources/UI/View/Base/BaseView.swift b/UI/Sources/UI/View/Base/BaseView.swift new file mode 100644 index 0000000..0fba767 --- /dev/null +++ b/UI/Sources/UI/View/Base/BaseView.swift @@ -0,0 +1,25 @@ +// +// BaseView.swift +// +// +// Created by Hessam Mahdiabadi on 11/6/23. +// + +import UIKit + +public class BaseView: UIView { + + public required init?(coder: NSCoder) { + super.init(coder: coder) + + setupViews() + } + + public override init(frame: CGRect) { + super.init(frame: frame) + + setupViews() + } + + open func setupViews() {} +} diff --git a/UI/Sources/UI/View/Base/BaseViewController.swift b/UI/Sources/UI/View/Base/BaseViewController.swift new file mode 100644 index 0000000..b2cc1a1 --- /dev/null +++ b/UI/Sources/UI/View/Base/BaseViewController.swift @@ -0,0 +1,43 @@ +// +// BaseViewController.swift +// +// +// Created by Hessam Mahdiabadi on 11/6/23. +// + +import UIKit + +public class BaseViewController: UIViewController { + + var spaceSeparatorFromEdgeInList: CGFloat { + return 16 + } + + public override func viewDidLoad() { + super.viewDidLoad() + + self.view.backgroundColor = Theme.background + + setupViews() + } + + open func setupViews() {} + + public override func viewWillTransition(to size: CGSize, + with coordinator: UIViewControllerTransitionCoordinator) { + super.viewWillTransition(to: size, with: coordinator) + + guard let collectionView = view.viewWithTag(1009) as? BaseCollectionView else { return } + let indexPaths = collectionView.indexPathsForVisibleItems + guard indexPaths.isEmpty == false else { return } + let middleIndex = indexPaths.count / 2 + let middleIndexPathVisible = indexPaths.sorted()[middleIndex] + + coordinator.animate(alongsideTransition: { _ in + collectionView.collectionViewLayout.invalidateLayout() + collectionView.scrollToItem(at: middleIndexPathVisible, + at: .top, animated: false) + }, completion: nil) + } +} + diff --git a/UI/Sources/UI/View/Base/Label/ListLabel.swift b/UI/Sources/UI/View/Base/Label/ListLabel.swift new file mode 100644 index 0000000..4c1cfbf --- /dev/null +++ b/UI/Sources/UI/View/Base/Label/ListLabel.swift @@ -0,0 +1,15 @@ +// +// ListLabel.swift +// +// +// Created by Hessam Mahdiabadi on 11/6/23. +// + +import UIKit + +public class ListLabel: BaseLabel { + + public override func setupViews() { + self.font = Raleway.regular.customFont(basedOnTextStyle: .subheadline) + } +} diff --git a/UI/Sources/UI/View/Base/Label/SubTitleLabel.swift b/UI/Sources/UI/View/Base/Label/SubTitleLabel.swift new file mode 100644 index 0000000..76e8c0f --- /dev/null +++ b/UI/Sources/UI/View/Base/Label/SubTitleLabel.swift @@ -0,0 +1,18 @@ +// +// SubTitleLabel.swift +// +// +// Created by Hessam Mahdiabadi on 11/6/23. +// + +import UIKit + +class SubTitleLabel: BaseLabel { + + override func setupViews() { + self.font = Raleway.regular.customFont(basedOnTextStyle: .caption2) + + textColor = Theme.secondrayText + } +} + diff --git a/UI/Sources/UI/View/Base/Label/TitleLabel.swift b/UI/Sources/UI/View/Base/Label/TitleLabel.swift new file mode 100644 index 0000000..74db14b --- /dev/null +++ b/UI/Sources/UI/View/Base/Label/TitleLabel.swift @@ -0,0 +1,16 @@ +// +// TitleLabel.swift +// +// +// Created by Hessam Mahdiabadi on 11/6/23. +// + +import UIKit + +public class TitleLabel: BaseLabel { + + public override func setupViews() { + self.font = Raleway.extraBold.customFont(basedOnTextStyle: .largeTitle) + } +} + From 40a0eb2974354a0f2fa7451a77dc2934eea32343 Mon Sep 17 00:00:00 2001 From: Hessam Mahdiabadi <67460597+iamHEssam@users.noreply.github.com> Date: Mon, 6 Nov 2023 00:46:02 +0330 Subject: [PATCH 19/34] Add BaseCollectionCell, BorderCompositionalLayout, Vertical Layout, and Corner Radius Extension - Added BaseCollectionCell for collection view cells. - Added BorderCompositionalLayout to manage collection view layout. - Implemented vertical layout for items in each row direction within the collection view. - Added an extension for easily adding corner radius to views. --- .../UI/View/Base/BaseCollectionCell.swift | 25 ++++++ .../BorderCompositionalLayout.swift | 85 +++++++++++++++++++ .../BorderSectionCollectionView.swift | 30 +++++++ .../SeparatorCollectionView.swift | 27 ++++++ .../VerticalCollectionLayoutItem.swift | 35 ++++++++ .../View/Extension/UIView+CornerRadius.swift | 20 +++++ .../Infrastructure/UISequenceIdentifier.swift | 25 ++++++ .../UI/View/{Base => }/Label/ListLabel.swift | 0 .../View/{Base => }/Label/SubTitleLabel.swift | 0 .../UI/View/{Base => }/Label/TitleLabel.swift | 0 10 files changed, 247 insertions(+) create mode 100644 UI/Sources/UI/View/Base/BaseCollectionCell.swift create mode 100644 UI/Sources/UI/View/CollectionView/BorderCompositionalLayout.swift create mode 100644 UI/Sources/UI/View/CollectionView/BorderSectionCollectionView.swift create mode 100644 UI/Sources/UI/View/CollectionView/SeparatorCollectionView.swift create mode 100644 UI/Sources/UI/View/CollectionView/VerticalCollectionLayoutItem.swift create mode 100644 UI/Sources/UI/View/Extension/UIView+CornerRadius.swift create mode 100644 UI/Sources/UI/View/Infrastructure/UISequenceIdentifier.swift rename UI/Sources/UI/View/{Base => }/Label/ListLabel.swift (100%) rename UI/Sources/UI/View/{Base => }/Label/SubTitleLabel.swift (100%) rename UI/Sources/UI/View/{Base => }/Label/TitleLabel.swift (100%) diff --git a/UI/Sources/UI/View/Base/BaseCollectionCell.swift b/UI/Sources/UI/View/Base/BaseCollectionCell.swift new file mode 100644 index 0000000..789d65c --- /dev/null +++ b/UI/Sources/UI/View/Base/BaseCollectionCell.swift @@ -0,0 +1,25 @@ +// +// BaseCollectionCell.swift +// +// +// Created by Hessam Mahdiabadi on 11/6/23. +// + +import UIKit + +public class BaseCollectionCell: UICollectionViewCell, UISequenceIdentifier { + + public override init(frame: CGRect) { + super.init(frame: frame) + + setupViews() + } + + public required init?(coder: NSCoder) { + super.init(coder: coder) + + setupViews() + } + + open func setupViews() {} +} diff --git a/UI/Sources/UI/View/CollectionView/BorderCompositionalLayout.swift b/UI/Sources/UI/View/CollectionView/BorderCompositionalLayout.swift new file mode 100644 index 0000000..fc03946 --- /dev/null +++ b/UI/Sources/UI/View/CollectionView/BorderCompositionalLayout.swift @@ -0,0 +1,85 @@ +// +// BorderCompositionalLayout.swift +// +// +// Created by Hessam Mahdiabadi on 11/6/23. +// + +import UIKit + +@objc public protocol BorderCompositionalLayoutDelegate: AnyObject { + @objc optional func isNeedBorder(at section: Int) -> Bool + @objc optional func isNeedDivider() -> Bool + @objc optional func contentInsets(at section: Int, + currentConfig: NSDirectionalEdgeInsets) -> NSDirectionalEdgeInsets + @objc optional func itemEdgeSpacing() -> NSCollectionLayoutEdgeSpacing? + @objc optional func createSupplementaryItems(at section: Int) -> [NSCollectionLayoutBoundarySupplementaryItem]? + @objc optional func createCustomSection(at section: Int) -> NSCollectionLayoutSection? + @objc optional func customEdgeSeparatorSpacing(currentSpacing: CGFloat) -> NSDirectionalEdgeInsets +} + +public class BorderCompositionalLayout: UICollectionViewCompositionalLayout { + + private let borderIdentifier = BorderSectionCollectionView.uiIdentifier + weak var delegate: BorderCompositionalLayoutDelegate? + + init(delegate: BorderCompositionalLayoutDelegate? = nil) { + + self.delegate = delegate + + let itemSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1.0), heightDimension: .estimated(44.0)) + + let isNeedDivider = delegate?.isNeedDivider?() ?? true + + let defaultSeparatorSpacing = NSDirectionalEdgeInsets(top: 0, leading: 16, bottom: 0, trailing: 16) + let separatorEdgeSpacing = delegate?.customEdgeSeparatorSpacing?(currentSpacing: 16) ?? defaultSeparatorSpacing + + let item = VerticalCollectionLayoutItem(layoutSize: itemSize, isNeedDivider: isNeedDivider, + spacing: separatorEdgeSpacing) + item.edgeSpacing = delegate?.itemEdgeSpacing?() + + let group = NSCollectionLayoutGroup.vertical(layoutSize: itemSize, subitems: [item]) + + super.init(sectionProvider: { [weak delegate] sectionIndex, _ -> NSCollectionLayoutSection? in + var section: NSCollectionLayoutSection! = delegate?.createCustomSection?(at: sectionIndex) + if section == nil { + section = NSCollectionLayoutSection(group: group) + } + + let contentInset = NSDirectionalEdgeInsets(top: 0, leading: 18, bottom: 0, trailing: 18) + let userContentInset = delegate?.contentInsets?(at: sectionIndex, + currentConfig: contentInset) ?? contentInset + + let isNeedBorder = delegate?.isNeedBorder?(at: sectionIndex) ?? false + if isNeedBorder == true { + let borderDecoration = BorderCompositionalLayout.makeBorderDecoration() + borderDecoration.contentInsets = userContentInset + section.decorationItems = [borderDecoration] + } + + if let supplementaryItems = delegate?.createSupplementaryItems?(at: sectionIndex) { + section.boundarySupplementaryItems = supplementaryItems + } + + section.contentInsets = userContentInset + return section + }) + + let config = UICollectionViewCompositionalLayoutConfiguration() + config.interSectionSpacing = 32 + self.configuration = config + + super.register(BorderSectionCollectionView.self, forDecorationViewOfKind: borderIdentifier) + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + private static func makeBorderDecoration() -> NSCollectionLayoutDecorationItem { + let borderItem = NSCollectionLayoutDecorationItem + .background(elementKind: BorderSectionCollectionView.uiIdentifier) + return borderItem + } + +} diff --git a/UI/Sources/UI/View/CollectionView/BorderSectionCollectionView.swift b/UI/Sources/UI/View/CollectionView/BorderSectionCollectionView.swift new file mode 100644 index 0000000..029117d --- /dev/null +++ b/UI/Sources/UI/View/CollectionView/BorderSectionCollectionView.swift @@ -0,0 +1,30 @@ +// +// BorderSectionCollectionView.swift +// +// +// Created by Hessam Mahdiabadi on 11/6/23. +// + +import UIKit + +public class BorderSectionCollectionView: UICollectionReusableView, UISequenceIdentifier { + + override init(frame: CGRect) { + super.init(frame: frame) + + setupView() + } + + required init?(coder: NSCoder) { + super.init(coder: coder) + + setupView() + } + + private func setupView() { + backgroundColor = Theme.supplementaryBackground + layer.borderWidth = 1.0 + setCornerRadius(radius: 18.0) + layer.borderColor = Theme.border?.cgColor + } +} diff --git a/UI/Sources/UI/View/CollectionView/SeparatorCollectionView.swift b/UI/Sources/UI/View/CollectionView/SeparatorCollectionView.swift new file mode 100644 index 0000000..c392914 --- /dev/null +++ b/UI/Sources/UI/View/CollectionView/SeparatorCollectionView.swift @@ -0,0 +1,27 @@ +// +// SeparatorCollectionView.swift +// +// +// Created by Hessam Mahdiabadi on 11/6/23. +// + +import UIKit + +public class SeparatorCollectionView: UICollectionReusableView, UISequenceIdentifier { + + override init(frame: CGRect) { + super.init(frame: frame) + + backgroundColor = Theme.divider + } + + required init?(coder: NSCoder) { + super.init(coder: coder) + + backgroundColor = Theme.divider + } + + public override func apply(_ layoutAttributes: UICollectionViewLayoutAttributes) { + self.frame = layoutAttributes.frame + } +} diff --git a/UI/Sources/UI/View/CollectionView/VerticalCollectionLayoutItem.swift b/UI/Sources/UI/View/CollectionView/VerticalCollectionLayoutItem.swift new file mode 100644 index 0000000..4def8ae --- /dev/null +++ b/UI/Sources/UI/View/CollectionView/VerticalCollectionLayoutItem.swift @@ -0,0 +1,35 @@ +// +// VerticalCollectionLayoutItem.swift +// +// +// Created by Hessam Mahdiabadi on 11/6/23. +// + +import UIKit + +public class VerticalCollectionLayoutItem: NSCollectionLayoutItem { + + private static func makeSeparatorSupplementaryItem(spacing: NSDirectionalEdgeInsets) + -> NSCollectionLayoutSupplementaryItem { + let anchor = NSCollectionLayoutAnchor(edges: [.top, .leading], absoluteOffset: .zero) + let size = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1), + heightDimension: .absolute(0.5)) + let seprator = NSCollectionLayoutSupplementaryItem(layoutSize: size, + elementKind: SeparatorCollectionView.uiIdentifier, + containerAnchor: anchor) + seprator.contentInsets = spacing + return seprator + } + + convenience init(layoutSize: NSCollectionLayoutSize, isNeedDivider: Bool, + spacing: NSDirectionalEdgeInsets) { + var supplementrayItems: [NSCollectionLayoutSupplementaryItem] = [] + if isNeedDivider { + supplementrayItems.append( + VerticalCollectionLayoutItem.makeSeparatorSupplementaryItem(spacing: spacing) + ) + } + + self.init(layoutSize: layoutSize, supplementaryItems: supplementrayItems) + } +} diff --git a/UI/Sources/UI/View/Extension/UIView+CornerRadius.swift b/UI/Sources/UI/View/Extension/UIView+CornerRadius.swift new file mode 100644 index 0000000..b32dade --- /dev/null +++ b/UI/Sources/UI/View/Extension/UIView+CornerRadius.swift @@ -0,0 +1,20 @@ +// +// UIView+CornerRadius.swift +// +// +// Created by Hessam Mahdiabadi on 11/6/23. +// + +import UIKit + +public extension UIView { + + func setCornerRadius(radius: CGFloat) { + layer.cornerRadius = radius + } + + func convertShapeToCircle() { + layer.cornerRadius = frame.height / 2 + } +} + diff --git a/UI/Sources/UI/View/Infrastructure/UISequenceIdentifier.swift b/UI/Sources/UI/View/Infrastructure/UISequenceIdentifier.swift new file mode 100644 index 0000000..089beec --- /dev/null +++ b/UI/Sources/UI/View/Infrastructure/UISequenceIdentifier.swift @@ -0,0 +1,25 @@ +// +// UISequenceIdentifier.swift +// +// +// Created by Hessam Mahdiabadi on 11/6/23. +// + +import Foundation +import UIKit + +public protocol UISequenceIdentifier {} + +public extension UISequenceIdentifier where Self: UICollectionViewCell { + + static var uiIdentifier: String { + String(describing: Self.self) + } +} + +public extension UISequenceIdentifier where Self: UICollectionReusableView { + + static var uiIdentifier: String { + String(describing: Self.self) + } +} diff --git a/UI/Sources/UI/View/Base/Label/ListLabel.swift b/UI/Sources/UI/View/Label/ListLabel.swift similarity index 100% rename from UI/Sources/UI/View/Base/Label/ListLabel.swift rename to UI/Sources/UI/View/Label/ListLabel.swift diff --git a/UI/Sources/UI/View/Base/Label/SubTitleLabel.swift b/UI/Sources/UI/View/Label/SubTitleLabel.swift similarity index 100% rename from UI/Sources/UI/View/Base/Label/SubTitleLabel.swift rename to UI/Sources/UI/View/Label/SubTitleLabel.swift diff --git a/UI/Sources/UI/View/Base/Label/TitleLabel.swift b/UI/Sources/UI/View/Label/TitleLabel.swift similarity index 100% rename from UI/Sources/UI/View/Base/Label/TitleLabel.swift rename to UI/Sources/UI/View/Label/TitleLabel.swift From c26f5326d60e6aa254737614a1d5c006891947f7 Mon Sep 17 00:00:00 2001 From: Hessam Mahdiabadi <67460597+iamHEssam@users.noreply.github.com> Date: Mon, 6 Nov 2023 01:00:53 +0330 Subject: [PATCH 20/34] Add SafeArea Extension, Pin to Superview, and CollectionView Cell Registration Extension - Added a SafeArea extension for safe area handling. - Added a Pin to Superview extension for view positioning. - Added an extension for easier registration and dequeuing of cells in collection views. --- Data/Package.swift | 3 +- .../UICollectionView+RegisterAndDequeue.swift | 41 ++++++++++++++++++ UI/Sources/UI/View/Extension/UIView+pin.swift | 38 ++++++++++++++++ .../UI/View/Extension/UIView+safeArea.swift | 43 +++++++++++++++++++ 4 files changed, 124 insertions(+), 1 deletion(-) create mode 100644 UI/Sources/UI/View/Extension/UICollectionView+RegisterAndDequeue.swift create mode 100644 UI/Sources/UI/View/Extension/UIView+pin.swift create mode 100644 UI/Sources/UI/View/Extension/UIView+safeArea.swift diff --git a/Data/Package.swift b/Data/Package.swift index 02a4cae..05f4546 100644 --- a/Data/Package.swift +++ b/Data/Package.swift @@ -23,7 +23,8 @@ let package = Package( // Targets can depend on other targets in this package, and on products in packages this package depends on. .target( name: "Data", - dependencies: ["Alamofire", "Domain"]), + dependencies: ["Alamofire", "Domain"], + resources: [.process("Resources")]), .testTarget( name: "DataTests", dependencies: ["Data"]), diff --git a/UI/Sources/UI/View/Extension/UICollectionView+RegisterAndDequeue.swift b/UI/Sources/UI/View/Extension/UICollectionView+RegisterAndDequeue.swift new file mode 100644 index 0000000..d6987bf --- /dev/null +++ b/UI/Sources/UI/View/Extension/UICollectionView+RegisterAndDequeue.swift @@ -0,0 +1,41 @@ +// +// UICollectionView+RegisterAndDequeue.swift +// +// +// Created by Hessam Mahdiabadi on 11/6/23. +// + +import UIKit + +public extension UICollectionView { + + func dequeueReusableCell(for indexPath: IndexPath) -> T { + let identifier = T.uiIdentifier + guard let cell = dequeueReusableCell(withReuseIdentifier: identifier, + for: indexPath) as? T else { + fatalError("Unable to Dequeue Reusable CollectionView Cell") + } + return cell + } + + func registerReusableCell(type: T.Type) { + let identifier = T.uiIdentifier + register(T.self, forCellWithReuseIdentifier: identifier) + } + + func registerSupplementaryView(for kind: String, + type: T.Type) { + let identifier = T.uiIdentifier + register(T.self, forSupplementaryViewOfKind: kind, withReuseIdentifier: identifier) + } + + func dequeueSupplementaryView(for kind: String, + at indexPath: IndexPath) -> T { + let identifier = T.uiIdentifier + let view = dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: identifier, for: indexPath) + guard let supplementaryView = view as? T else { + fatalError("Unable to Dequeue Reusable Supplementary View") + } + return supplementaryView + } +} diff --git a/UI/Sources/UI/View/Extension/UIView+pin.swift b/UI/Sources/UI/View/Extension/UIView+pin.swift new file mode 100644 index 0000000..422a802 --- /dev/null +++ b/UI/Sources/UI/View/Extension/UIView+pin.swift @@ -0,0 +1,38 @@ +// +// UIView+pin.swift +// +// +// Created by Hessam Mahdiabadi on 11/6/23. +// + +import UIKit + +public extension UIView { + + func pinToSuperview() { + guard let superview = self.superview else { + fatalError("unable to find superview, you must first add to any view and then call this method") + } + + NSLayoutConstraint.activate([ + self.topAnchor.constraint(equalTo: superview.topAnchor), + self.leadingAnchor.constraint(equalTo: superview.leadingAnchor), + self.trailingAnchor.constraint(equalTo: superview.trailingAnchor), + self.bottomAnchor.constraint(equalTo: superview.bottomAnchor) + ]) + } + + func pinToSuperviewWithSafeArea() { + guard let superview = self.superview else { + fatalError("unable to find superview, you must first add to any view and then call this method") + } + + NSLayoutConstraint.activate([ + self.topAnchor.constraint(equalTo: superview.topSafeMargin), + self.leadingAnchor.constraint(equalTo: superview.leadingSafeMargin), + self.trailingAnchor.constraint(equalTo: superview.trailingSafeMargin), + self.bottomAnchor.constraint(equalTo: superview.bottomSafeMargin) + ]) + } +} + diff --git a/UI/Sources/UI/View/Extension/UIView+safeArea.swift b/UI/Sources/UI/View/Extension/UIView+safeArea.swift new file mode 100644 index 0000000..43524af --- /dev/null +++ b/UI/Sources/UI/View/Extension/UIView+safeArea.swift @@ -0,0 +1,43 @@ +// +// UIView+safeArea.swift +// +// +// Created by Hessam Mahdiabadi on 11/6/23. +// + +import UIKit + +public extension UIView { + + var topSafeMargin: NSLayoutYAxisAnchor { + self.safeAreaLayoutGuide.topAnchor + } + + var bottomSafeMargin: NSLayoutYAxisAnchor { + self.safeAreaLayoutGuide.bottomAnchor + } + + var leadingSafeMargin: NSLayoutXAxisAnchor { + self.safeAreaLayoutGuide.leadingAnchor + } + + var trailingSafeMargin: NSLayoutXAxisAnchor { + self.safeAreaLayoutGuide.trailingAnchor + } + + var widthSafeMargin: NSLayoutDimension { + self.safeAreaLayoutGuide.widthAnchor + } + + var heightSafeMargin: NSLayoutDimension { + self.safeAreaLayoutGuide.heightAnchor + } + + var centerXSafeMargin: NSLayoutXAxisAnchor { + self.safeAreaLayoutGuide.centerXAnchor + } + + var centerYSafeMargin: NSLayoutYAxisAnchor { + self.safeAreaLayoutGuide.centerYAnchor + } +} From aff299bf31a11d2fd37efcd4abe016b04086c573 Mon Sep 17 00:00:00 2001 From: Hessam Mahdiabadi <67460597+iamHEssam@users.noreply.github.com> Date: Mon, 6 Nov 2023 11:57:14 +0330 Subject: [PATCH 21/34] Fix Access Control to Open --- UI/Sources/UI/Color/Theme.swift | 21 ++++++++++++------- .../UI/View/Base/BaseCollectionCell.swift | 2 +- .../UI/View/Base/BaseCollectionView.swift | 2 +- UI/Sources/UI/View/Base/BaseControl.swift | 2 +- UI/Sources/UI/View/Base/BaseLabel.swift | 2 +- UI/Sources/UI/View/Base/BaseView.swift | 2 +- .../UI/View/Base/BaseViewController.swift | 4 ++-- UI/Sources/UI/View/Label/SubTitleLabel.swift | 2 +- 8 files changed, 22 insertions(+), 15 deletions(-) diff --git a/UI/Sources/UI/Color/Theme.swift b/UI/Sources/UI/Color/Theme.swift index 9f99449..d64dc51 100644 --- a/UI/Sources/UI/Color/Theme.swift +++ b/UI/Sources/UI/Color/Theme.swift @@ -9,11 +9,18 @@ import UIKit public class Theme { - static let background = UIColor(named: "background") - static let supplementaryBackground = UIColor(named: "supplementary background") - static let blue = UIColor(named: "blue") - static let border = UIColor(named: "border") - static let divider = UIColor(named: "divider") - static let primaryText = UIColor(named: "primary text") - static let secondrayText = UIColor(named: "secondray text") + public static let background = UIColor(named: "background", in: Bundle.module + , compatibleWith: nil) + public static let supplementaryBackground = UIColor(named: "supplementary background", + in: Bundle.module, compatibleWith: nil) + public static let blue = UIColor(named: "blue", + in: Bundle.module, compatibleWith: nil) + public static let border = UIColor(named: "border", + in: Bundle.module, compatibleWith: nil) + public static let divider = UIColor(named: "divider", + in: Bundle.module, compatibleWith: nil) + public static let primaryText = UIColor(named: "primary text", + in: Bundle.module, compatibleWith: nil) + public static let secondrayText = UIColor(named: "secondray text", + in: Bundle.module, compatibleWith: nil) } diff --git a/UI/Sources/UI/View/Base/BaseCollectionCell.swift b/UI/Sources/UI/View/Base/BaseCollectionCell.swift index 789d65c..b5d9357 100644 --- a/UI/Sources/UI/View/Base/BaseCollectionCell.swift +++ b/UI/Sources/UI/View/Base/BaseCollectionCell.swift @@ -7,7 +7,7 @@ import UIKit -public class BaseCollectionCell: UICollectionViewCell, UISequenceIdentifier { +open class BaseCollectionCell: UICollectionViewCell, UISequenceIdentifier { public override init(frame: CGRect) { super.init(frame: frame) diff --git a/UI/Sources/UI/View/Base/BaseCollectionView.swift b/UI/Sources/UI/View/Base/BaseCollectionView.swift index d30caea..29bde46 100644 --- a/UI/Sources/UI/View/Base/BaseCollectionView.swift +++ b/UI/Sources/UI/View/Base/BaseCollectionView.swift @@ -7,7 +7,7 @@ import UIKit -public class BaseCollectionView: UICollectionView { +open class BaseCollectionView: UICollectionView { override init(frame: CGRect, collectionViewLayout layout: UICollectionViewLayout) { super.init(frame: frame, collectionViewLayout: layout) diff --git a/UI/Sources/UI/View/Base/BaseControl.swift b/UI/Sources/UI/View/Base/BaseControl.swift index 3a15a2b..41de0bf 100644 --- a/UI/Sources/UI/View/Base/BaseControl.swift +++ b/UI/Sources/UI/View/Base/BaseControl.swift @@ -7,7 +7,7 @@ import UIKit -public class BaseControl: UIControl { +open class BaseControl: UIControl { public required init?(coder: NSCoder) { super.init(coder: coder) diff --git a/UI/Sources/UI/View/Base/BaseLabel.swift b/UI/Sources/UI/View/Base/BaseLabel.swift index dc9e993..57509ee 100644 --- a/UI/Sources/UI/View/Base/BaseLabel.swift +++ b/UI/Sources/UI/View/Base/BaseLabel.swift @@ -7,7 +7,7 @@ import UIKit -public class BaseLabel: UILabel { +open class BaseLabel: UILabel { public required init?(coder: NSCoder) { super.init(coder: coder) diff --git a/UI/Sources/UI/View/Base/BaseView.swift b/UI/Sources/UI/View/Base/BaseView.swift index 0fba767..9d778d2 100644 --- a/UI/Sources/UI/View/Base/BaseView.swift +++ b/UI/Sources/UI/View/Base/BaseView.swift @@ -7,7 +7,7 @@ import UIKit -public class BaseView: UIView { +open class BaseView: UIView { public required init?(coder: NSCoder) { super.init(coder: coder) diff --git a/UI/Sources/UI/View/Base/BaseViewController.swift b/UI/Sources/UI/View/Base/BaseViewController.swift index b2cc1a1..82cdbde 100644 --- a/UI/Sources/UI/View/Base/BaseViewController.swift +++ b/UI/Sources/UI/View/Base/BaseViewController.swift @@ -7,9 +7,9 @@ import UIKit -public class BaseViewController: UIViewController { +open class BaseViewController: UIViewController { - var spaceSeparatorFromEdgeInList: CGFloat { + open var spaceSeparatorFromEdgeInList: CGFloat { return 16 } diff --git a/UI/Sources/UI/View/Label/SubTitleLabel.swift b/UI/Sources/UI/View/Label/SubTitleLabel.swift index 76e8c0f..fb22023 100644 --- a/UI/Sources/UI/View/Label/SubTitleLabel.swift +++ b/UI/Sources/UI/View/Label/SubTitleLabel.swift @@ -7,7 +7,7 @@ import UIKit -class SubTitleLabel: BaseLabel { +public class SubTitleLabel: BaseLabel { override func setupViews() { self.font = Raleway.regular.customFont(basedOnTextStyle: .caption2) From 82997160ed0f9dac7e8db346421077fb23f0625d Mon Sep 17 00:00:00 2001 From: Hessam Mahdiabadi <67460597+iamHEssam@users.noreply.github.com> Date: Mon, 6 Nov 2023 12:12:59 +0330 Subject: [PATCH 22/34] Add DiContainer Protocol, HomeViewController, and BaseCollectionViewController - Added the DiContainer protocol for creating suitable use cases. - Added the HomeViewController for displaying the Transfer list. - Added the BaseCollectionViewController in the UI module. --- TransferList.xcodeproj/project.pbxproj | 142 ++++++++++++++---- .../xcschemes/xcschememanagement.plist | 2 +- .../{ => Application}/AppDelegate.swift | 4 - TransferList/Application/DI/DIContainer.swift | 14 ++ .../Application/DI/DIContainerImpl.swift | 27 ++++ .../{ => Application}/SceneDelegate.swift | 43 +++++- TransferList/Base.lproj/Main.storyboard | 24 --- .../HomeScene/View/HomeViewController.swift | 24 +++ .../HomeScene/View/Main.storyboard | 30 ++++ .../AccentColor.colorset/Contents.json | 0 .../AppIcon.appiconset/Contents.json | 0 .../Assets.xcassets/Contents.json | 0 .../Base.lproj/LaunchScreen.storyboard | 0 TransferList/{ => Resources}/Info.plist | 2 - TransferList/ViewController.swift | 19 --- .../BaseCollectionViewController.swift | 42 ++++++ UI/Sources/UI/View/Label/SubTitleLabel.swift | 2 +- 17 files changed, 293 insertions(+), 82 deletions(-) rename TransferList/{ => Application}/AppDelegate.swift (99%) create mode 100644 TransferList/Application/DI/DIContainer.swift create mode 100644 TransferList/Application/DI/DIContainerImpl.swift rename TransferList/{ => Application}/SceneDelegate.swift (62%) delete mode 100644 TransferList/Base.lproj/Main.storyboard create mode 100644 TransferList/Presentation/HomeScene/View/HomeViewController.swift create mode 100644 TransferList/Presentation/HomeScene/View/Main.storyboard rename TransferList/{ => Resources}/Assets.xcassets/AccentColor.colorset/Contents.json (100%) rename TransferList/{ => Resources}/Assets.xcassets/AppIcon.appiconset/Contents.json (100%) rename TransferList/{ => Resources}/Assets.xcassets/Contents.json (100%) rename TransferList/{ => Resources}/Base.lproj/LaunchScreen.storyboard (100%) rename TransferList/{ => Resources}/Info.plist (90%) delete mode 100644 TransferList/ViewController.swift create mode 100644 UI/Sources/UI/View/CollectionView/BaseCollectionViewController.swift diff --git a/TransferList.xcodeproj/project.pbxproj b/TransferList.xcodeproj/project.pbxproj index 7d90c0e..777e220 100644 --- a/TransferList.xcodeproj/project.pbxproj +++ b/TransferList.xcodeproj/project.pbxproj @@ -7,10 +7,15 @@ objects = { /* Begin PBXBuildFile section */ + DE690EA42AF842ED00E8C451 /* Data in Frameworks */ = {isa = PBXBuildFile; productRef = DE690EA32AF842ED00E8C451 /* Data */; }; + DE690EA62AF842ED00E8C451 /* Domain in Frameworks */ = {isa = PBXBuildFile; productRef = DE690EA52AF842ED00E8C451 /* Domain */; }; + DE690EA82AF842ED00E8C451 /* UI in Frameworks */ = {isa = PBXBuildFile; productRef = DE690EA72AF842ED00E8C451 /* UI */; }; + DE690EAA2AF842F800E8C451 /* DIContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE690EA92AF842F800E8C451 /* DIContainer.swift */; }; + DE690EAC2AF8432500E8C451 /* DIContainerImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE690EAB2AF8432500E8C451 /* DIContainerImpl.swift */; }; + DE690EB12AF8455400E8C451 /* HomeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE690EB02AF8455400E8C451 /* HomeViewController.swift */; }; + DE690EB32AF84A1C00E8C451 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = DE690EB22AF84A1C00E8C451 /* Main.storyboard */; }; DEBE4AC32AF6C3B000A58501 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEBE4AC22AF6C3B000A58501 /* AppDelegate.swift */; }; DEBE4AC52AF6C3B000A58501 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEBE4AC42AF6C3B000A58501 /* SceneDelegate.swift */; }; - DEBE4AC72AF6C3B000A58501 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEBE4AC62AF6C3B000A58501 /* ViewController.swift */; }; - DEBE4ACA2AF6C3B000A58501 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = DEBE4AC82AF6C3B000A58501 /* Main.storyboard */; }; DEBE4ACC2AF6C3B200A58501 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = DEBE4ACB2AF6C3B200A58501 /* Assets.xcassets */; }; DEBE4ACF2AF6C3B200A58501 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = DEBE4ACD2AF6C3B200A58501 /* LaunchScreen.storyboard */; }; /* End PBXBuildFile section */ @@ -18,11 +23,13 @@ /* Begin PBXFileReference section */ DE3EF77C2AF6F9B40071E5E4 /* Data */ = {isa = PBXFileReference; lastKnownFileType = wrapper; path = Data; sourceTree = ""; }; DE690E9E2AF82D4300E8C451 /* UI */ = {isa = PBXFileReference; lastKnownFileType = wrapper; path = UI; sourceTree = ""; }; + DE690EA92AF842F800E8C451 /* DIContainer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DIContainer.swift; sourceTree = ""; }; + DE690EAB2AF8432500E8C451 /* DIContainerImpl.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DIContainerImpl.swift; sourceTree = ""; }; + DE690EB02AF8455400E8C451 /* HomeViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeViewController.swift; sourceTree = ""; }; + DE690EB22AF84A1C00E8C451 /* Main.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = Main.storyboard; sourceTree = ""; }; DEBE4ABF2AF6C3B000A58501 /* TransferList.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = TransferList.app; sourceTree = BUILT_PRODUCTS_DIR; }; DEBE4AC22AF6C3B000A58501 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; DEBE4AC42AF6C3B000A58501 /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; }; - DEBE4AC62AF6C3B000A58501 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; - DEBE4AC92AF6C3B000A58501 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; DEBE4ACB2AF6C3B200A58501 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; DEBE4ACE2AF6C3B200A58501 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; DEBE4AD02AF6C3B200A58501 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; @@ -34,12 +41,76 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + DE690EA62AF842ED00E8C451 /* Domain in Frameworks */, + DE690EA82AF842ED00E8C451 /* UI in Frameworks */, + DE690EA42AF842ED00E8C451 /* Data in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + DE690E9F2AF8429D00E8C451 /* Resources */ = { + isa = PBXGroup; + children = ( + DEBE4ACD2AF6C3B200A58501 /* LaunchScreen.storyboard */, + DEBE4AD02AF6C3B200A58501 /* Info.plist */, + DEBE4ACB2AF6C3B200A58501 /* Assets.xcassets */, + ); + path = Resources; + sourceTree = ""; + }; + DE690EA02AF842B400E8C451 /* Application */ = { + isa = PBXGroup; + children = ( + DE690EA12AF842DB00E8C451 /* DI */, + DEBE4AC22AF6C3B000A58501 /* AppDelegate.swift */, + DEBE4AC42AF6C3B000A58501 /* SceneDelegate.swift */, + ); + path = Application; + sourceTree = ""; + }; + DE690EA12AF842DB00E8C451 /* DI */ = { + isa = PBXGroup; + children = ( + DE690EA92AF842F800E8C451 /* DIContainer.swift */, + DE690EAB2AF8432500E8C451 /* DIContainerImpl.swift */, + ); + path = DI; + sourceTree = ""; + }; + DE690EA22AF842ED00E8C451 /* Frameworks */ = { + isa = PBXGroup; + children = ( + ); + name = Frameworks; + sourceTree = ""; + }; + DE690EAD2AF8452500E8C451 /* HomeScene */ = { + isa = PBXGroup; + children = ( + DE690EAF2AF8453800E8C451 /* ViewModel */, + DE690EAE2AF8453500E8C451 /* View */, + ); + path = HomeScene; + sourceTree = ""; + }; + DE690EAE2AF8453500E8C451 /* View */ = { + isa = PBXGroup; + children = ( + DE690EB02AF8455400E8C451 /* HomeViewController.swift */, + DE690EB22AF84A1C00E8C451 /* Main.storyboard */, + ); + path = View; + sourceTree = ""; + }; + DE690EAF2AF8453800E8C451 /* ViewModel */ = { + isa = PBXGroup; + children = ( + ); + path = ViewModel; + sourceTree = ""; + }; DEBE4AB62AF6C3B000A58501 = { isa = PBXGroup; children = ( @@ -48,6 +119,7 @@ DEBE4AD62AF6C8F600A58501 /* Domain */, DEBE4AC12AF6C3B000A58501 /* TransferList */, DEBE4AC02AF6C3B000A58501 /* Products */, + DE690EA22AF842ED00E8C451 /* Frameworks */, ); sourceTree = ""; }; @@ -62,17 +134,21 @@ DEBE4AC12AF6C3B000A58501 /* TransferList */ = { isa = PBXGroup; children = ( - DEBE4AC22AF6C3B000A58501 /* AppDelegate.swift */, - DEBE4AC42AF6C3B000A58501 /* SceneDelegate.swift */, - DEBE4AC62AF6C3B000A58501 /* ViewController.swift */, - DEBE4AC82AF6C3B000A58501 /* Main.storyboard */, - DEBE4ACB2AF6C3B200A58501 /* Assets.xcassets */, - DEBE4ACD2AF6C3B200A58501 /* LaunchScreen.storyboard */, - DEBE4AD02AF6C3B200A58501 /* Info.plist */, + DE690EA02AF842B400E8C451 /* Application */, + DEFF1DBA2AF8DDFE00673B8C /* Presentation */, + DE690E9F2AF8429D00E8C451 /* Resources */, ); path = TransferList; sourceTree = ""; }; + DEFF1DBA2AF8DDFE00673B8C /* Presentation */ = { + isa = PBXGroup; + children = ( + DE690EAD2AF8452500E8C451 /* HomeScene */, + ); + path = Presentation; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -89,6 +165,11 @@ dependencies = ( ); name = TransferList; + packageProductDependencies = ( + DE690EA32AF842ED00E8C451 /* Data */, + DE690EA52AF842ED00E8C451 /* Domain */, + DE690EA72AF842ED00E8C451 /* UI */, + ); productName = TransferList; productReference = DEBE4ABF2AF6C3B000A58501 /* TransferList.app */; productType = "com.apple.product-type.application"; @@ -131,9 +212,9 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + DE690EB32AF84A1C00E8C451 /* Main.storyboard in Resources */, DEBE4ACF2AF6C3B200A58501 /* LaunchScreen.storyboard in Resources */, DEBE4ACC2AF6C3B200A58501 /* Assets.xcassets in Resources */, - DEBE4ACA2AF6C3B000A58501 /* Main.storyboard in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -144,23 +225,17 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - DEBE4AC72AF6C3B000A58501 /* ViewController.swift in Sources */, + DE690EB12AF8455400E8C451 /* HomeViewController.swift in Sources */, + DE690EAA2AF842F800E8C451 /* DIContainer.swift in Sources */, DEBE4AC32AF6C3B000A58501 /* AppDelegate.swift in Sources */, DEBE4AC52AF6C3B000A58501 /* SceneDelegate.swift in Sources */, + DE690EAC2AF8432500E8C451 /* DIContainerImpl.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXVariantGroup section */ - DEBE4AC82AF6C3B000A58501 /* Main.storyboard */ = { - isa = PBXVariantGroup; - children = ( - DEBE4AC92AF6C3B000A58501 /* Base */, - ); - name = Main.storyboard; - sourceTree = ""; - }; DEBE4ACD2AF6C3B200A58501 /* LaunchScreen.storyboard */ = { isa = PBXVariantGroup; children = ( @@ -294,12 +369,11 @@ CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_FILE = TransferList/Info.plist; + INFOPLIST_FILE = TransferList/Resources/Info.plist; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; INFOPLIST_KEY_UIMainStoryboardFile = Main; - INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; - INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown"; IPHONEOS_DEPLOYMENT_TARGET = 14.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", @@ -322,12 +396,11 @@ CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_FILE = TransferList/Info.plist; + INFOPLIST_FILE = TransferList/Resources/Info.plist; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; INFOPLIST_KEY_UIMainStoryboardFile = Main; - INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; - INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown"; IPHONEOS_DEPLOYMENT_TARGET = 14.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", @@ -364,6 +437,21 @@ defaultConfigurationName = Release; }; /* End XCConfigurationList section */ + +/* Begin XCSwiftPackageProductDependency section */ + DE690EA32AF842ED00E8C451 /* Data */ = { + isa = XCSwiftPackageProductDependency; + productName = Data; + }; + DE690EA52AF842ED00E8C451 /* Domain */ = { + isa = XCSwiftPackageProductDependency; + productName = Domain; + }; + DE690EA72AF842ED00E8C451 /* UI */ = { + isa = XCSwiftPackageProductDependency; + productName = UI; + }; +/* End XCSwiftPackageProductDependency section */ }; rootObject = DEBE4AB72AF6C3B000A58501 /* Project object */; } diff --git a/TransferList.xcodeproj/xcuserdata/hessam.xcuserdatad/xcschemes/xcschememanagement.plist b/TransferList.xcodeproj/xcuserdata/hessam.xcuserdatad/xcschemes/xcschememanagement.plist index 52e1fe9..5eb9d26 100644 --- a/TransferList.xcodeproj/xcuserdata/hessam.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/TransferList.xcodeproj/xcuserdata/hessam.xcuserdatad/xcschemes/xcschememanagement.plist @@ -7,7 +7,7 @@ TransferList.xcscheme_^#shared#^_ orderHint - 5 + 3 diff --git a/TransferList/AppDelegate.swift b/TransferList/Application/AppDelegate.swift similarity index 99% rename from TransferList/AppDelegate.swift rename to TransferList/Application/AppDelegate.swift index c1ea548..4ca176c 100644 --- a/TransferList/AppDelegate.swift +++ b/TransferList/Application/AppDelegate.swift @@ -10,8 +10,6 @@ import UIKit @main class AppDelegate: UIResponder, UIApplicationDelegate { - - func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { // Override point for customization after application launch. return true @@ -31,6 +29,4 @@ class AppDelegate: UIResponder, UIApplicationDelegate { // Use this method to release any resources that were specific to the discarded scenes, as they will not return. } - } - diff --git a/TransferList/Application/DI/DIContainer.swift b/TransferList/Application/DI/DIContainer.swift new file mode 100644 index 0000000..9106082 --- /dev/null +++ b/TransferList/Application/DI/DIContainer.swift @@ -0,0 +1,14 @@ +// +// DIContainer.swift +// TransferList +// +// Created by Hessam Mahdiabadi on 11/6/23. +// + +import Foundation +import Domain + +protocol DIContainer { + + func createPresonBankAccountUseCase() -> PersonBankAccountUseCase +} diff --git a/TransferList/Application/DI/DIContainerImpl.swift b/TransferList/Application/DI/DIContainerImpl.swift new file mode 100644 index 0000000..922fdc4 --- /dev/null +++ b/TransferList/Application/DI/DIContainerImpl.swift @@ -0,0 +1,27 @@ +// +// DIContainerImpl.swift +// TransferList +// +// Created by Hessam Mahdiabadi on 11/6/23. +// + +import Foundation +import Domain +import Data + +final class DIContainerImpl: DIContainer { + + private func createPersonBankAccountRepository() -> PersonBankAccountRepository { + let api: Api = ApiImpl() + let database = DatabaseImpl() + let local = LocalImpl(database: database) + + return PersonBankAccountRepositoryImpl(api: api, local: local) + } + + func createPresonBankAccountUseCase() -> PersonBankAccountUseCase { + let repository = createPersonBankAccountRepository() + let useCase = PersonBankAccountUseCaseImpl(repository: repository) + return useCase + } +} diff --git a/TransferList/SceneDelegate.swift b/TransferList/Application/SceneDelegate.swift similarity index 62% rename from TransferList/SceneDelegate.swift rename to TransferList/Application/SceneDelegate.swift index 64f3f6a..aaa0bdf 100644 --- a/TransferList/SceneDelegate.swift +++ b/TransferList/Application/SceneDelegate.swift @@ -6,17 +6,19 @@ // import UIKit +import UI class SceneDelegate: UIResponder, UIWindowSceneDelegate { var window: UIWindow? - - func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { + func scene(_ scene: UIScene, willConnectTo session: UISceneSession, + options connectionOptions: UIScene.ConnectionOptions) { // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`. // If using a storyboard, the `window` property will automatically be initialized and attached to the scene. // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead). - guard let _ = (scene as? UIWindowScene) else { return } + guard let window = (scene as? UIWindowScene) else { return } + startApp(windowScene: window) } func sceneDidDisconnect(_ scene: UIScene) { @@ -47,6 +49,39 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { // to restore the scene back to its current state. } + private func startApp(windowScene scene: UIWindowScene) { + let window = UIWindow(windowScene: scene) + + registerFonts() + + let navController = createNavigationController() + let homeViewController = createHomeViewController() + + navController.pushViewController(homeViewController, animated: false) + + window.rootViewController = navController + self.window = window + window.makeKeyAndVisible() + } + private func createNavigationController() -> UINavigationController { + let navigationController = UINavigationController() + navigationController.isNavigationBarHidden = true + + return navigationController + } + + private func createHomeViewController() -> HomeViewController { + let homeViewController = HomeViewController() + return homeViewController + } + + private func registerFonts() { + Font.registerFonts() + } + + private func setupDIContainer() { +// let container = DIContainerImpl() +// ViewModelFactory.shared.register(DIContainer: container) + } } - diff --git a/TransferList/Base.lproj/Main.storyboard b/TransferList/Base.lproj/Main.storyboard deleted file mode 100644 index 25a7638..0000000 --- a/TransferList/Base.lproj/Main.storyboard +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/TransferList/Presentation/HomeScene/View/HomeViewController.swift b/TransferList/Presentation/HomeScene/View/HomeViewController.swift new file mode 100644 index 0000000..4f10f35 --- /dev/null +++ b/TransferList/Presentation/HomeScene/View/HomeViewController.swift @@ -0,0 +1,24 @@ +// +// HomeViewController.swift +// TransferList +// +// Created by Hessam Mahdiabadi on 11/6/23. +// + +import UIKit +import UI + +class HomeViewController: BaseCollectionViewController { + + @InstantiateView(type: TitleLabel.self) private var titleLabel + + override func setupViews() { + + titleLabel.text = "Hello Blu!" + view.addSubview(titleLabel) + NSLayoutConstraint.activate([ + titleLabel.centerXAnchor.constraint(equalTo: view.centerXSafeMargin), + titleLabel.centerYAnchor.constraint(equalTo: view.centerYSafeMargin), + ]) + } +} diff --git a/TransferList/Presentation/HomeScene/View/Main.storyboard b/TransferList/Presentation/HomeScene/View/Main.storyboard new file mode 100644 index 0000000..dd79351 --- /dev/null +++ b/TransferList/Presentation/HomeScene/View/Main.storyboard @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/TransferList/Assets.xcassets/AccentColor.colorset/Contents.json b/TransferList/Resources/Assets.xcassets/AccentColor.colorset/Contents.json similarity index 100% rename from TransferList/Assets.xcassets/AccentColor.colorset/Contents.json rename to TransferList/Resources/Assets.xcassets/AccentColor.colorset/Contents.json diff --git a/TransferList/Assets.xcassets/AppIcon.appiconset/Contents.json b/TransferList/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from TransferList/Assets.xcassets/AppIcon.appiconset/Contents.json rename to TransferList/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json diff --git a/TransferList/Assets.xcassets/Contents.json b/TransferList/Resources/Assets.xcassets/Contents.json similarity index 100% rename from TransferList/Assets.xcassets/Contents.json rename to TransferList/Resources/Assets.xcassets/Contents.json diff --git a/TransferList/Base.lproj/LaunchScreen.storyboard b/TransferList/Resources/Base.lproj/LaunchScreen.storyboard similarity index 100% rename from TransferList/Base.lproj/LaunchScreen.storyboard rename to TransferList/Resources/Base.lproj/LaunchScreen.storyboard diff --git a/TransferList/Info.plist b/TransferList/Resources/Info.plist similarity index 90% rename from TransferList/Info.plist rename to TransferList/Resources/Info.plist index dd3c9af..0eb786d 100644 --- a/TransferList/Info.plist +++ b/TransferList/Resources/Info.plist @@ -15,8 +15,6 @@ Default Configuration UISceneDelegateClassName $(PRODUCT_MODULE_NAME).SceneDelegate - UISceneStoryboardFile - Main diff --git a/TransferList/ViewController.swift b/TransferList/ViewController.swift deleted file mode 100644 index 35482af..0000000 --- a/TransferList/ViewController.swift +++ /dev/null @@ -1,19 +0,0 @@ -// -// ViewController.swift -// TransferList -// -// Created by Hessam Mahdiabadi on 11/4/23. -// - -import UIKit - -class ViewController: UIViewController { - - override func viewDidLoad() { - super.viewDidLoad() - // Do any additional setup after loading the view. - } - - -} - diff --git a/UI/Sources/UI/View/CollectionView/BaseCollectionViewController.swift b/UI/Sources/UI/View/CollectionView/BaseCollectionViewController.swift new file mode 100644 index 0000000..177346f --- /dev/null +++ b/UI/Sources/UI/View/CollectionView/BaseCollectionViewController.swift @@ -0,0 +1,42 @@ +// +// BaseCollectionViewController.swift +// +// +// Created by Hessam Mahdiabadi on 11/6/23. +// + +import UIKit + +open class BaseCollectionViewController: BaseViewController, + BorderCompositionalLayoutDelegate { + + private(set) lazy var collectionView: BaseCollectionView = { + BaseCollectionView(frame: .zero, collectionViewLayout: createBorderLayout()) + }() + + open override func setupViews() { + view.addSubview(collectionView) + + configureCollectionView() + } + + private func configureCollectionView() { + NSLayoutConstraint.activate([ + collectionView.topAnchor.constraint(equalTo: view.topSafeMargin), + collectionView.leadingAnchor.constraint(equalTo: view.leadingSafeMargin), + collectionView.trailingAnchor.constraint(equalTo: view.trailingSafeMargin), + collectionView.bottomAnchor.constraint(equalTo: view.bottomSafeMargin) + ]) + + collectionView.contentInset.top = 0 + } + + private func createBorderLayout() -> UICollectionViewCompositionalLayout { + return BorderCompositionalLayout(delegate: self) + } + + public func customEdgeSeparatorSpacing(currentSpacing: CGFloat) -> NSDirectionalEdgeInsets { + return .init(top: 0, leading: self.spaceSeparatorFromEdgeInList, + bottom: 0, trailing: self.spaceSeparatorFromEdgeInList) + } +} diff --git a/UI/Sources/UI/View/Label/SubTitleLabel.swift b/UI/Sources/UI/View/Label/SubTitleLabel.swift index fb22023..6bfc1f9 100644 --- a/UI/Sources/UI/View/Label/SubTitleLabel.swift +++ b/UI/Sources/UI/View/Label/SubTitleLabel.swift @@ -9,7 +9,7 @@ import UIKit public class SubTitleLabel: BaseLabel { - override func setupViews() { + public override func setupViews() { self.font = Raleway.regular.customFont(basedOnTextStyle: .caption2) textColor = Theme.secondrayText From 82844645bd28cf7b536cd1440fbd8393de3330eb Mon Sep 17 00:00:00 2001 From: Hessam Mahdiabadi <67460597+iamHEssam@users.noreply.github.com> Date: Mon, 6 Nov 2023 12:56:12 +0330 Subject: [PATCH 23/34] Add LargeHeaderCell, HomeCollectionViewDataSource, and HomeItem - Added LargeHeaderCell for displaying titles in each section. - Added HomeCollectionViewDataSource for managing the diffable data source and cell display. - Added the HomeItem component to assist with the diffable data source. --- TransferList.xcodeproj/project.pbxproj | 20 +++ .../HomeScene/View/Cell/LargeHeaderCell.swift | 23 +++ .../View/HomeCollectionViewDataSource.swift | 132 ++++++++++++++++++ .../HomeScene/View/HomeItem.swift | 28 ++++ .../HomeScene/View/HomeViewController.swift | 17 +-- .../UI/View/Base/BaseCollectionView.swift | 16 ++- .../BaseCollectionViewController.swift | 2 +- 7 files changed, 228 insertions(+), 10 deletions(-) create mode 100644 TransferList/Presentation/HomeScene/View/Cell/LargeHeaderCell.swift create mode 100644 TransferList/Presentation/HomeScene/View/HomeCollectionViewDataSource.swift create mode 100644 TransferList/Presentation/HomeScene/View/HomeItem.swift diff --git a/TransferList.xcodeproj/project.pbxproj b/TransferList.xcodeproj/project.pbxproj index 777e220..cc7922f 100644 --- a/TransferList.xcodeproj/project.pbxproj +++ b/TransferList.xcodeproj/project.pbxproj @@ -18,6 +18,9 @@ DEBE4AC52AF6C3B000A58501 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEBE4AC42AF6C3B000A58501 /* SceneDelegate.swift */; }; DEBE4ACC2AF6C3B200A58501 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = DEBE4ACB2AF6C3B200A58501 /* Assets.xcassets */; }; DEBE4ACF2AF6C3B200A58501 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = DEBE4ACD2AF6C3B200A58501 /* LaunchScreen.storyboard */; }; + DEFF1DBD2AF8DEE400673B8C /* LargeHeaderCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEFF1DBC2AF8DEE400673B8C /* LargeHeaderCell.swift */; }; + DEFF1DC02AF8DFA500673B8C /* HomeCollectionViewDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEFF1DBF2AF8DFA500673B8C /* HomeCollectionViewDataSource.swift */; }; + DEFF1DC22AF8DFE300673B8C /* HomeItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEFF1DC12AF8DFE300673B8C /* HomeItem.swift */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -34,6 +37,9 @@ DEBE4ACE2AF6C3B200A58501 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; DEBE4AD02AF6C3B200A58501 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; DEBE4AD62AF6C8F600A58501 /* Domain */ = {isa = PBXFileReference; lastKnownFileType = wrapper; path = Domain; sourceTree = ""; }; + DEFF1DBC2AF8DEE400673B8C /* LargeHeaderCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LargeHeaderCell.swift; sourceTree = ""; }; + DEFF1DBF2AF8DFA500673B8C /* HomeCollectionViewDataSource.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeCollectionViewDataSource.swift; sourceTree = ""; }; + DEFF1DC12AF8DFE300673B8C /* HomeItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeItem.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -98,8 +104,11 @@ DE690EAE2AF8453500E8C451 /* View */ = { isa = PBXGroup; children = ( + DEFF1DBB2AF8DED200673B8C /* Cell */, DE690EB02AF8455400E8C451 /* HomeViewController.swift */, DE690EB22AF84A1C00E8C451 /* Main.storyboard */, + DEFF1DBF2AF8DFA500673B8C /* HomeCollectionViewDataSource.swift */, + DEFF1DC12AF8DFE300673B8C /* HomeItem.swift */, ); path = View; sourceTree = ""; @@ -149,6 +158,14 @@ path = Presentation; sourceTree = ""; }; + DEFF1DBB2AF8DED200673B8C /* Cell */ = { + isa = PBXGroup; + children = ( + DEFF1DBC2AF8DEE400673B8C /* LargeHeaderCell.swift */, + ); + path = Cell; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -225,10 +242,13 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + DEFF1DBD2AF8DEE400673B8C /* LargeHeaderCell.swift in Sources */, + DEFF1DC22AF8DFE300673B8C /* HomeItem.swift in Sources */, DE690EB12AF8455400E8C451 /* HomeViewController.swift in Sources */, DE690EAA2AF842F800E8C451 /* DIContainer.swift in Sources */, DEBE4AC32AF6C3B000A58501 /* AppDelegate.swift in Sources */, DEBE4AC52AF6C3B000A58501 /* SceneDelegate.swift in Sources */, + DEFF1DC02AF8DFA500673B8C /* HomeCollectionViewDataSource.swift in Sources */, DE690EAC2AF8432500E8C451 /* DIContainerImpl.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/TransferList/Presentation/HomeScene/View/Cell/LargeHeaderCell.swift b/TransferList/Presentation/HomeScene/View/Cell/LargeHeaderCell.swift new file mode 100644 index 0000000..6a9e20a --- /dev/null +++ b/TransferList/Presentation/HomeScene/View/Cell/LargeHeaderCell.swift @@ -0,0 +1,23 @@ +// +// LargeHeaderCell.swift +// TransferList +// +// Created by Hessam Mahdiabadi on 11/6/23. +// + +import UIKit +import UI + +class LargeHeaderCell: BaseCollectionCell { + + @InstantiateView(type: TitleLabel.self) private var title + + override func setupViews() { + self.addSubview(title) + title.pinToSuperview() + } + + public func setTitle(_ text: String) { + title.text = text + } +} diff --git a/TransferList/Presentation/HomeScene/View/HomeCollectionViewDataSource.swift b/TransferList/Presentation/HomeScene/View/HomeCollectionViewDataSource.swift new file mode 100644 index 0000000..6502d8c --- /dev/null +++ b/TransferList/Presentation/HomeScene/View/HomeCollectionViewDataSource.swift @@ -0,0 +1,132 @@ +// +// HomeCollectionViewDataSource.swift +// TransferList +// +// Created by Hessam Mahdiabadi on 11/6/23. +// + +import UIKit +import UI + +class HomeCollectionViewDataSource { + private typealias DiffableDataSource = UICollectionViewDiffableDataSource + private typealias DiffableSnapshot = NSDiffableDataSourceSnapshot + typealias UISection = HomeItem.UISection + + private var dataSource: DiffableDataSource! + private var collectionView: BaseCollectionView + + init(collectionView: BaseCollectionView) { + self.collectionView = collectionView + + configureCollectionView() + configureDiffableDataSource() + } + + private func configureCollectionView() { + collectionView.registerReusableCell(type: LargeHeaderCell.self) + } + + private func configureDiffableDataSource() { + dataSource = UICollectionViewDiffableDataSource(collectionView: collectionView, + cellProvider: { [weak self] _, indexPath, itemIdentifier in + switch itemIdentifier { + case .header(let title): + return self?.createTitleCell(for: indexPath, title: title) + } + }) + + self.dataSource.supplementaryViewProvider = collectionView.makeSeprator() + } + + private func createTitleCell(for indexPath: IndexPath, title: String) -> LargeHeaderCell { + let cell: LargeHeaderCell = collectionView.dequeueReusableCell(for: indexPath) + cell.setTitle(title) + return cell + } + + public func LoadTitle(message: String) { + var snapShot = dataSource.snapshot() + snapShot.appendSections([.FavoritesTitle]) + snapShot.appendItems([.header(title: message)], toSection: .FavoritesTitle) + dataSource.apply(snapShot, animatingDifferences: true) + } +// private func initDataSource(_ items: [UISection]) { +// var initialSnapshot = DiffableSnapshot() +// let sections = items.map { $0.section } +// initialSnapshot.appendSections(sections) +// +// for item in items { +// initialSnapshot.appendItems(item.items, toSection: item.section) +// } +// self.dataSource.apply(initialSnapshot, animatingDifferences: true) +// } + +// private func prepareToDecideShowTopicRowsBasedOn(topicCount count: Int, into snapShot: inout DiffableSnapshot) { +// let isContainTopicItems = snapShot.itemIdentifiers.contains(.topicsHeader) +// if count == 0 && isContainTopicItems { +// snapShot.deleteSections([.topicsHeader, .topics]) +// } +// } +// +// private func checkDeleteSearchOrTopicsBasedOnDeleteTopic(saveChangeIntoSnapShot snapShot: inout DiffableSnapshot) { +// if snapShot.itemIdentifiers(inSection: .topics).isEmpty { +// snapShot.deleteSections([.search, .topics, .topicsHeader]) +// } +// } + +// func loadTopicCount(count: Int) { +// var snapShot = dataSource.snapshot() +// languageItem.topicCount = count +// snapShot.reloadItems([.topicCount]) +// +// prepareToDecideShowTopicRowsBasedOn(topicCount: count, into: &snapShot) +// dataSource.apply(snapShot, animatingDifferences: true) +// } + +// func loadFirstTimeTopics(topics items: [Topic]) { +// var snapShot = dataSource.snapshot() +// if !snapShot.sectionIdentifiers.contains(.topicsHeader) { +// snapShot.insertSections([.search, .topicsHeader, .topics], beforeSection: .overviewHeader) +// snapShot.appendItems([.topicsHeader], toSection: .topicsHeader) +// snapShot.appendItems([.search], toSection: .search) +// } else { +// // remove all topics and load with new sort +// snapShot.deleteItems(snapShot.itemIdentifiers(inSection: .topics)) +// } +// +// let topicItems = items.map { DetailLanguage.topics(item: $0) } +// snapShot.appendItems(topicItems, toSection: .topics) +// +// dataSource.apply(snapShot, animatingDifferences: true) +// } + + +// func getTopic(at indexPath: IndexPath) -> Topic { +// guard let languageItem = dataSource.itemIdentifier(for: indexPath) else { +// return Topic.createEmptyTopic() +// } +// +// guard case let .topics(item) = languageItem else { +// return Topic.createEmptyTopic() +// } +// +// return item +// } + +// func deleteTopics(topics items: [Topic]) { +// var snapshot = dataSource.snapshot() +// let items = items.map { DetailLanguage.topics(item: $0) } +// snapshot.deleteItems(items) +// +// checkDeleteSearchOrTopicsBasedOnDeleteTopic(saveChangeIntoSnapShot: &snapshot) +// dataSource.apply(snapshot, animatingDifferences: true) +// } + +// func updateTopic(topic item: Topic) { +// var snapshot = dataSource.snapshot() +// let item = DetailLanguage.topics(item: item) +// snapshot.reloadItems([item]) +// dataSource.apply(snapshot, animatingDifferences: true) +// } +} diff --git a/TransferList/Presentation/HomeScene/View/HomeItem.swift b/TransferList/Presentation/HomeScene/View/HomeItem.swift new file mode 100644 index 0000000..f48786d --- /dev/null +++ b/TransferList/Presentation/HomeScene/View/HomeItem.swift @@ -0,0 +1,28 @@ +// +// HomeItem.swift +// TransferList +// +// Created by Hessam Mahdiabadi on 11/6/23. +// + +import Foundation + +enum HomeItem: Hashable { + typealias UISection = (section: HomeItem.Section, items: [HomeItem]) + + enum Section: CaseIterable { + case FavoritesTitle + } + + case header(title: String) + + func hash(into hasher: inout Hasher) { + switch self { + case .header(let title): hasher.combine(title) + } + } + + static func == (lhs: HomeItem, rhs: HomeItem) -> Bool { + return lhs.hashValue == rhs.hashValue + } +} diff --git a/TransferList/Presentation/HomeScene/View/HomeViewController.swift b/TransferList/Presentation/HomeScene/View/HomeViewController.swift index 4f10f35..bec73c0 100644 --- a/TransferList/Presentation/HomeScene/View/HomeViewController.swift +++ b/TransferList/Presentation/HomeScene/View/HomeViewController.swift @@ -10,15 +10,16 @@ import UI class HomeViewController: BaseCollectionViewController { - @InstantiateView(type: TitleLabel.self) private var titleLabel + private var dataSource: HomeCollectionViewDataSource! override func setupViews() { - - titleLabel.text = "Hello Blu!" - view.addSubview(titleLabel) - NSLayoutConstraint.activate([ - titleLabel.centerXAnchor.constraint(equalTo: view.centerXSafeMargin), - titleLabel.centerYAnchor.constraint(equalTo: view.centerYSafeMargin), - ]) + super.setupViews() + + configureDataSource() + dataSource.LoadTitle(message: "Favorites") + } + + private func configureDataSource() { + dataSource = .init(collectionView: collectionView) } } diff --git a/UI/Sources/UI/View/Base/BaseCollectionView.swift b/UI/Sources/UI/View/Base/BaseCollectionView.swift index 29bde46..5e07d4b 100644 --- a/UI/Sources/UI/View/Base/BaseCollectionView.swift +++ b/UI/Sources/UI/View/Base/BaseCollectionView.swift @@ -13,12 +13,14 @@ open class BaseCollectionView: UICollectionView { super.init(frame: frame, collectionViewLayout: layout) translatesAutoresizingMaskIntoConstraints = false - backgroundColor = Theme.blue + backgroundColor = Theme.background alwaysBounceVertical = true tag = 1009 // for getting collectionView inside BaseViewController keyboardDismissMode = .interactiveWithAccessory contentInset = .init(top: 32, left: 0, bottom: 20, right: 0) + + registerSupplementaryView(for: SeparatorCollectionView.uiIdentifier, type: SeparatorCollectionView.self) } public required init?(coder: NSCoder) { @@ -29,4 +31,16 @@ open class BaseCollectionView: UICollectionView { guard previousTraitCollection?.userInterfaceStyle == traitCollection.userInterfaceStyle else { return } collectionViewLayout.invalidateLayout() } + + public func makeSeprator() -> UICollectionViewDiffableDataSource.SupplementaryViewProvider { + return { (collView, _, indexPath) -> UICollectionReusableView? in + let identifier = SeparatorCollectionView.uiIdentifier + + let separatorView: SeparatorCollectionView = + collView.dequeueSupplementaryView(for: identifier, at: indexPath) + + separatorView.isHidden = indexPath.row == 0 + return separatorView + } + } } diff --git a/UI/Sources/UI/View/CollectionView/BaseCollectionViewController.swift b/UI/Sources/UI/View/CollectionView/BaseCollectionViewController.swift index 177346f..61c0b86 100644 --- a/UI/Sources/UI/View/CollectionView/BaseCollectionViewController.swift +++ b/UI/Sources/UI/View/CollectionView/BaseCollectionViewController.swift @@ -10,7 +10,7 @@ import UIKit open class BaseCollectionViewController: BaseViewController, BorderCompositionalLayoutDelegate { - private(set) lazy var collectionView: BaseCollectionView = { + public private(set) lazy var collectionView: BaseCollectionView = { BaseCollectionView(frame: .zero, collectionViewLayout: createBorderLayout()) }() From 7b5991062b8ea312c6118ba20a762127906c9aff Mon Sep 17 00:00:00 2001 From: Hessam Mahdiabadi <67460597+iamHEssam@users.noreply.github.com> Date: Mon, 6 Nov 2023 13:48:46 +0330 Subject: [PATCH 24/34] Add VerticalAccount Cell, All Title and Account Display, ViewModels - Added the VerticalAccount Cell for displaying vertical account information. - Added display of "All Title" and "All Account" in the view. - Added the ViewModel for fetching data from the Use Case. - Implemented a ViewModelFactory for easier creation of view models. --- .../Domain/Entities/PersonBankAccount.swift | 12 +- TransferList.xcodeproj/project.pbxproj | 28 +++++ TransferList/Application/SceneDelegate.swift | 5 +- .../Extra/Core/ViewModelFactory.swift | 30 +++++ .../View/Cell/VerticalAccountCell.swift | 54 +++++++++ .../View/HomeCollectionViewDataSource.swift | 37 ++++-- .../HomeScene/View/HomeItem.swift | 7 ++ .../HomeScene/View/HomeViewController.swift | 20 ++- .../ViewModel/TransferViewModel.swift | 114 ++++++++++++++++++ 9 files changed, 290 insertions(+), 17 deletions(-) create mode 100644 TransferList/Extra/Core/ViewModelFactory.swift create mode 100644 TransferList/Presentation/HomeScene/View/Cell/VerticalAccountCell.swift create mode 100644 TransferList/Presentation/HomeScene/ViewModel/TransferViewModel.swift diff --git a/Domain/Sources/Domain/Entities/PersonBankAccount.swift b/Domain/Sources/Domain/Entities/PersonBankAccount.swift index 017dafc..b8fc415 100644 --- a/Domain/Sources/Domain/Entities/PersonBankAccount.swift +++ b/Domain/Sources/Domain/Entities/PersonBankAccount.swift @@ -7,8 +7,8 @@ import Foundation -public struct PersonBankAccount: Identifiable { - +public struct PersonBankAccount: Identifiable, Hashable { + public var id: String { card?.cardNumber ?? UUID().uuidString } @@ -36,4 +36,12 @@ public struct PersonBankAccount: Identifiable { mutating func update(indexAtList index: Int) { self.indexAtList = index } + + public func hash(into hasher: inout Hasher) { + hasher.combine(id) + } + + public static func == (lhs: PersonBankAccount, rhs: PersonBankAccount) -> Bool { + lhs.id == rhs.id + } } diff --git a/TransferList.xcodeproj/project.pbxproj b/TransferList.xcodeproj/project.pbxproj index cc7922f..577ff2c 100644 --- a/TransferList.xcodeproj/project.pbxproj +++ b/TransferList.xcodeproj/project.pbxproj @@ -21,6 +21,9 @@ DEFF1DBD2AF8DEE400673B8C /* LargeHeaderCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEFF1DBC2AF8DEE400673B8C /* LargeHeaderCell.swift */; }; DEFF1DC02AF8DFA500673B8C /* HomeCollectionViewDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEFF1DBF2AF8DFA500673B8C /* HomeCollectionViewDataSource.swift */; }; DEFF1DC22AF8DFE300673B8C /* HomeItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEFF1DC12AF8DFE300673B8C /* HomeItem.swift */; }; + DEFF1DC42AF8E8DC00673B8C /* TransferViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEFF1DC32AF8E8DC00673B8C /* TransferViewModel.swift */; }; + DEFF1DC82AF8EAD300673B8C /* ViewModelFactory.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEFF1DC72AF8EAD300673B8C /* ViewModelFactory.swift */; }; + DEFF1DCA2AF8EC6A00673B8C /* VerticalAccountCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEFF1DC92AF8EC6A00673B8C /* VerticalAccountCell.swift */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -40,6 +43,9 @@ DEFF1DBC2AF8DEE400673B8C /* LargeHeaderCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LargeHeaderCell.swift; sourceTree = ""; }; DEFF1DBF2AF8DFA500673B8C /* HomeCollectionViewDataSource.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeCollectionViewDataSource.swift; sourceTree = ""; }; DEFF1DC12AF8DFE300673B8C /* HomeItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeItem.swift; sourceTree = ""; }; + DEFF1DC32AF8E8DC00673B8C /* TransferViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TransferViewModel.swift; sourceTree = ""; }; + DEFF1DC72AF8EAD300673B8C /* ViewModelFactory.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewModelFactory.swift; sourceTree = ""; }; + DEFF1DC92AF8EC6A00673B8C /* VerticalAccountCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VerticalAccountCell.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -116,6 +122,7 @@ DE690EAF2AF8453800E8C451 /* ViewModel */ = { isa = PBXGroup; children = ( + DEFF1DC32AF8E8DC00673B8C /* TransferViewModel.swift */, ); path = ViewModel; sourceTree = ""; @@ -143,6 +150,7 @@ DEBE4AC12AF6C3B000A58501 /* TransferList */ = { isa = PBXGroup; children = ( + DEFF1DC52AF8EAC700673B8C /* Extra */, DE690EA02AF842B400E8C451 /* Application */, DEFF1DBA2AF8DDFE00673B8C /* Presentation */, DE690E9F2AF8429D00E8C451 /* Resources */, @@ -162,10 +170,27 @@ isa = PBXGroup; children = ( DEFF1DBC2AF8DEE400673B8C /* LargeHeaderCell.swift */, + DEFF1DC92AF8EC6A00673B8C /* VerticalAccountCell.swift */, ); path = Cell; sourceTree = ""; }; + DEFF1DC52AF8EAC700673B8C /* Extra */ = { + isa = PBXGroup; + children = ( + DEFF1DC62AF8EACB00673B8C /* Core */, + ); + path = Extra; + sourceTree = ""; + }; + DEFF1DC62AF8EACB00673B8C /* Core */ = { + isa = PBXGroup; + children = ( + DEFF1DC72AF8EAD300673B8C /* ViewModelFactory.swift */, + ); + path = Core; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -243,7 +268,10 @@ buildActionMask = 2147483647; files = ( DEFF1DBD2AF8DEE400673B8C /* LargeHeaderCell.swift in Sources */, + DEFF1DCA2AF8EC6A00673B8C /* VerticalAccountCell.swift in Sources */, + DEFF1DC42AF8E8DC00673B8C /* TransferViewModel.swift in Sources */, DEFF1DC22AF8DFE300673B8C /* HomeItem.swift in Sources */, + DEFF1DC82AF8EAD300673B8C /* ViewModelFactory.swift in Sources */, DE690EB12AF8455400E8C451 /* HomeViewController.swift in Sources */, DE690EAA2AF842F800E8C451 /* DIContainer.swift in Sources */, DEBE4AC32AF6C3B000A58501 /* AppDelegate.swift in Sources */, diff --git a/TransferList/Application/SceneDelegate.swift b/TransferList/Application/SceneDelegate.swift index aaa0bdf..deaa961 100644 --- a/TransferList/Application/SceneDelegate.swift +++ b/TransferList/Application/SceneDelegate.swift @@ -52,6 +52,7 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { private func startApp(windowScene scene: UIWindowScene) { let window = UIWindow(windowScene: scene) + setupDIContainer() registerFonts() let navController = createNavigationController() @@ -81,7 +82,7 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { } private func setupDIContainer() { -// let container = DIContainerImpl() -// ViewModelFactory.shared.register(DIContainer: container) + let container = DIContainerImpl() + ViewModelFactory.shared.register(DIContainer: container) } } diff --git a/TransferList/Extra/Core/ViewModelFactory.swift b/TransferList/Extra/Core/ViewModelFactory.swift new file mode 100644 index 0000000..872a8f4 --- /dev/null +++ b/TransferList/Extra/Core/ViewModelFactory.swift @@ -0,0 +1,30 @@ +// +// ViewModelFactory.swift +// TransferList +// +// Created by Hessam Mahdiabadi on 11/6/23. +// + +import Foundation + +class ViewModelFactory { + + private var container: DIContainer! + + static let shared = ViewModelFactory() + + private init() {} + + func register(DIContainer container: DIContainer) { + self.container = container + } + + func createMediaViewModel() -> TransferViewModel { + guard container != nil else { + fatalError("Register DIContainer to Enable ViewModel Creation") + } + + let personBankAccountUseCase = container.createPresonBankAccountUseCase() + return .init(personBackAccountUseCase: personBankAccountUseCase) + } +} diff --git a/TransferList/Presentation/HomeScene/View/Cell/VerticalAccountCell.swift b/TransferList/Presentation/HomeScene/View/Cell/VerticalAccountCell.swift new file mode 100644 index 0000000..bf4d4b3 --- /dev/null +++ b/TransferList/Presentation/HomeScene/View/Cell/VerticalAccountCell.swift @@ -0,0 +1,54 @@ +// +// VerticalAccountCell.swift +// TransferList +// +// Created by Hessam Mahdiabadi on 11/6/23. +// + +import UIKit +import UI +import Domain + +class VerticalAccountCell: BaseCollectionCell { + + @InstantiateView(type: ListLabel.self) var nameLabel + @InstantiateView(type: SubTitleLabel.self) var cardTypeLabel + @InstantiateView(type: UIStackView.self) var labelsStackView + @InstantiateView(type: UIImageView.self) var arrowImage + @InstantiateView(type: UIImageView.self) var favoriteImage + @InstantiateView(type: UIStackView.self) var imagesStackView + + override func setupViews() { + super.setupViews() + + addSubview(labelsStackView) + addSubview(imagesStackView) + + NSLayoutConstraint.activate([ + labelsStackView.topAnchor.constraint(equalTo: topSafeMargin, constant: 16), + labelsStackView.bottomAnchor.constraint(equalTo: bottomSafeMargin, constant: -16), + labelsStackView.leadingAnchor.constraint(equalTo: leadingSafeMargin), + labelsStackView.trailingAnchor.constraint(equalTo: trailingSafeMargin) +// labelsStackView.trailingAnchor.constraint(lessThanOrEqualTo: clock.leadingAnchor, constant: -12), +// clock.centerYAnchor.constraint(equalTo: centerYSafeMargin), +// clock.trailingAnchor.constraint(equalTo: trailingSafeMargin, constant: -18) + ]) + + configureLabelsStackView() + } + + private func configureLabelsStackView() { + labelsStackView.spacing = 4 + labelsStackView.alignment = .leading + labelsStackView.axis = .vertical + labelsStackView.distribution = .fill + + labelsStackView.addArrangedSubview(nameLabel) + labelsStackView.addArrangedSubview(cardTypeLabel) + } + + func setAccountItem(_ personAccount: PersonBankAccount) { + nameLabel.text = personAccount.person?.name + cardTypeLabel.text = personAccount.card?.cardType + } +} diff --git a/TransferList/Presentation/HomeScene/View/HomeCollectionViewDataSource.swift b/TransferList/Presentation/HomeScene/View/HomeCollectionViewDataSource.swift index 6502d8c..0a4932a 100644 --- a/TransferList/Presentation/HomeScene/View/HomeCollectionViewDataSource.swift +++ b/TransferList/Presentation/HomeScene/View/HomeCollectionViewDataSource.swift @@ -7,6 +7,7 @@ import UIKit import UI +import Domain class HomeCollectionViewDataSource { private typealias DiffableDataSource = UICollectionViewDiffableDataSource @@ -21,10 +22,12 @@ class HomeCollectionViewDataSource { configureCollectionView() configureDiffableDataSource() + setupDiffableSnapshot() } private func configureCollectionView() { collectionView.registerReusableCell(type: LargeHeaderCell.self) + collectionView.registerReusableCell(type: VerticalAccountCell.self) } private func configureDiffableDataSource() { @@ -33,34 +36,48 @@ class HomeCollectionViewDataSource { switch itemIdentifier { case .header(let title): return self?.createTitleCell(for: indexPath, title: title) + case .personBankAccount(let account): + return self?.createVerticalAccount(for: indexPath, account: account) } }) self.dataSource.supplementaryViewProvider = collectionView.makeSeprator() } + private func setupDiffableSnapshot() { + var initialSnapshot = DiffableSnapshot() + initialSnapshot.appendSections([.allTitle, .personBankAccounts]) + initialSnapshot.appendItems([.header(title: "All")], toSection: .allTitle) + self.dataSource.apply(initialSnapshot, animatingDifferences: false) + } + private func createTitleCell(for indexPath: IndexPath, title: String) -> LargeHeaderCell { let cell: LargeHeaderCell = collectionView.dequeueReusableCell(for: indexPath) cell.setTitle(title) return cell } + private func createVerticalAccount(for indexPath: IndexPath, account: PersonBankAccount) -> VerticalAccountCell { + let cell: VerticalAccountCell = collectionView.dequeueReusableCell(for: indexPath) + cell.setAccountItem(account) + return cell + } + public func LoadTitle(message: String) { var snapShot = dataSource.snapshot() snapShot.appendSections([.FavoritesTitle]) snapShot.appendItems([.header(title: message)], toSection: .FavoritesTitle) dataSource.apply(snapShot, animatingDifferences: true) } -// private func initDataSource(_ items: [UISection]) { -// var initialSnapshot = DiffableSnapshot() -// let sections = items.map { $0.section } -// initialSnapshot.appendSections(sections) -// -// for item in items { -// initialSnapshot.appendItems(item.items, toSection: item.section) -// } -// self.dataSource.apply(initialSnapshot, animatingDifferences: true) -// } + + public func updateAccounts(_ accounts: [PersonBankAccount]) { + var snapShot = dataSource.snapshot() + let items = accounts.map { + return HomeItem.personBankAccount(account: $0) + } + snapShot.appendItems(items, toSection: .personBankAccounts) + dataSource.apply(snapShot, animatingDifferences: true) + } // private func prepareToDecideShowTopicRowsBasedOn(topicCount count: Int, into snapShot: inout DiffableSnapshot) { // let isContainTopicItems = snapShot.itemIdentifiers.contains(.topicsHeader) diff --git a/TransferList/Presentation/HomeScene/View/HomeItem.swift b/TransferList/Presentation/HomeScene/View/HomeItem.swift index f48786d..f4c1aee 100644 --- a/TransferList/Presentation/HomeScene/View/HomeItem.swift +++ b/TransferList/Presentation/HomeScene/View/HomeItem.swift @@ -6,19 +6,26 @@ // import Foundation +import Domain enum HomeItem: Hashable { typealias UISection = (section: HomeItem.Section, items: [HomeItem]) enum Section: CaseIterable { case FavoritesTitle + case allTitle + case personBankAccounts } case header(title: String) + case personBankAccount(account: PersonBankAccount) func hash(into hasher: inout Hasher) { switch self { case .header(let title): hasher.combine(title) + case .personBankAccount(let account): + hasher.combine("accounts") + hasher.combine(account) } } diff --git a/TransferList/Presentation/HomeScene/View/HomeViewController.swift b/TransferList/Presentation/HomeScene/View/HomeViewController.swift index bec73c0..a903e09 100644 --- a/TransferList/Presentation/HomeScene/View/HomeViewController.swift +++ b/TransferList/Presentation/HomeScene/View/HomeViewController.swift @@ -7,19 +7,33 @@ import UIKit import UI +import Combine class HomeViewController: BaseCollectionViewController { private var dataSource: HomeCollectionViewDataSource! - + private let viewModel = ViewModelFactory.shared.createMediaViewModel() + private var subscriptions = Set() + override func setupViews() { super.setupViews() - + configureDataSource() - dataSource.LoadTitle(message: "Favorites") + observeDidChangeData() + viewModel.fetchTransferList() } + override var spaceSeparatorFromEdgeInList: CGFloat { return 0 } + private func configureDataSource() { dataSource = .init(collectionView: collectionView) } + + private func observeDidChangeData() { + viewModel.$bankAccounts + .sink { [weak self] accounts in + self?.dataSource?.updateAccounts(accounts) + } + .store(in: &subscriptions) + } } diff --git a/TransferList/Presentation/HomeScene/ViewModel/TransferViewModel.swift b/TransferList/Presentation/HomeScene/ViewModel/TransferViewModel.swift new file mode 100644 index 0000000..35631fe --- /dev/null +++ b/TransferList/Presentation/HomeScene/ViewModel/TransferViewModel.swift @@ -0,0 +1,114 @@ +// +// TransferViewModel.swift +// TransferList +// +// Created by Hessam Mahdiabadi on 11/6/23. +// + +import Foundation +import Combine +import Domain + +class TransferViewModel { + +// @Published private(set) var viewState: ViewState = .loading + @Published var bankAccounts: [PersonBankAccount] = [] +// @Published var path = NavigationPath() + private let useCase: PersonBankAccountUseCase + private var subscriptions = Set() + private var currentOffset: Int = 0 + + deinit { + cancelAllPendingTask() + } + + init(personBackAccountUseCase: PersonBankAccountUseCase) { + useCase = personBackAccountUseCase + } + + private func cancelAllPendingTask() { + subscriptions.removeAll() + } + +// private func updateViewState(newState viewState: ViewState) { +// self.viewState = viewState +// } +// +// func selected(media: Media) { +// path.append(NavigationRouter.DetailOfMedia(media: media)) +// } + + func fetchTransferList() { + // update view state + + useCase.fetchPersonAccounts(withOffest: currentOffset + 1) + .receive(on: DispatchQueue.main) + .sink { [weak self] completion in + guard let self else { return } + + switch completion { + case .finished: break + + case .failure(let error): + // show error + break + } + + } receiveValue: { [weak self] accounts in + guard let self else { return } + self.updateAccounts(appendAccounts: accounts) + } + .store(in: &subscriptions) + } + + func updateAccounts(appendAccounts accounts: [PersonBankAccount]) { + guard !accounts.isEmpty else { + // reach to end + return + } + + bankAccounts.append(contentsOf: accounts) + currentOffset += 1 + } + +// func fetchMediaList() { +// guard mediaList.isEmpty else { +// return +// } +// +// updateViewState(newState: .loading) +// +// useCase.fetchMediaList() +// .receive(on: DispatchQueue.main) +// .sink { [weak self] completion in +// guard let self else { return } +// switch completion { +// case .failure(let error): +// let alertContent = AlertContent(message: error.localizedDescription) +// self.updateViewState(newState: .error(alertContent: alertContent)) +// case .finished: break +// } +// } receiveValue: { [weak self] mediaList in +// self?.mediaList = mediaList +// self?.updateViewState(newState: .result) +// } +// .store(in: &subscriptions) +// } + +// func fetchMediaImage(WithImageUrl imageUrl: String?, previewImage: @escaping BackImage) { +// guard let imageUrl else { +// previewImage(Image("imageFailed")) +// return +// } +// +// useCase.fetchImage(withImageUrl: imageUrl) +// .retry(3) +// .replaceError(with: Image("imageFailed")) +// .receive(on: DispatchQueue.main) +// .sink(receiveValue: { image in +// previewImage(image) +// }) +// .store(in: &subscriptions) +// } +} + From 5c33b5bcd599b8d970d190a23574eb449acb98b4 Mon Sep 17 00:00:00 2001 From: Hessam Mahdiabadi <67460597+iamHEssam@users.noreply.github.com> Date: Mon, 6 Nov 2023 15:29:37 +0330 Subject: [PATCH 25/34] Add DataTransfer, PaginationMode, and Datasource Updates - Added DataTransfer for publishing new data to the UI from the ViewModel. - Add PaginationMode to handle reaching the end of a page. - Updated the Datasource based on the DataTransfer for improved data management. --- .../Domain/Entities/PersonBankAccount.swift | 5 +- TransferList.xcodeproj/project.pbxproj | 40 ++++++++++- .../xcshareddata/swiftpm/Package.resolved | 9 +++ TransferList/Extra/Core/PaginationMode.swift | 32 +++++++++ .../HomeScene/Model/DataTransfer.swift | 29 ++++++++ .../View/Cell/VerticalAccountCell.swift | 37 ++++++++-- .../View/HomeCollectionViewDataSource.swift | 45 +++++++----- .../HomeScene/View/HomeViewController.swift | 23 +++++- .../ViewModel/TransferViewModel.swift | 70 ++++++------------- 9 files changed, 215 insertions(+), 75 deletions(-) create mode 100644 TransferList/Extra/Core/PaginationMode.swift create mode 100644 TransferList/Presentation/HomeScene/Model/DataTransfer.swift diff --git a/Domain/Sources/Domain/Entities/PersonBankAccount.swift b/Domain/Sources/Domain/Entities/PersonBankAccount.swift index b8fc415..425f8b3 100644 --- a/Domain/Sources/Domain/Entities/PersonBankAccount.swift +++ b/Domain/Sources/Domain/Entities/PersonBankAccount.swift @@ -10,7 +10,10 @@ import Foundation public struct PersonBankAccount: Identifiable, Hashable { public var id: String { - card?.cardNumber ?? UUID().uuidString + guard let name = person?.name, let cardNumber = card?.cardNumber else { + return UUID().uuidString + } + return name + cardNumber } public var person: Person? public var card: Card? diff --git a/TransferList.xcodeproj/project.pbxproj b/TransferList.xcodeproj/project.pbxproj index 577ff2c..241dee4 100644 --- a/TransferList.xcodeproj/project.pbxproj +++ b/TransferList.xcodeproj/project.pbxproj @@ -24,6 +24,9 @@ DEFF1DC42AF8E8DC00673B8C /* TransferViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEFF1DC32AF8E8DC00673B8C /* TransferViewModel.swift */; }; DEFF1DC82AF8EAD300673B8C /* ViewModelFactory.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEFF1DC72AF8EAD300673B8C /* ViewModelFactory.swift */; }; DEFF1DCA2AF8EC6A00673B8C /* VerticalAccountCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEFF1DC92AF8EC6A00673B8C /* VerticalAccountCell.swift */; }; + DEFF1DCD2AF8F58500673B8C /* Kingfisher in Frameworks */ = {isa = PBXBuildFile; productRef = DEFF1DCC2AF8F58500673B8C /* Kingfisher */; }; + DEFF1DD02AF8F8BB00673B8C /* PaginationMode.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEFF1DCF2AF8F8BB00673B8C /* PaginationMode.swift */; }; + DEFF1DD32AF8FF8100673B8C /* DataTransfer.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEFF1DD22AF8FF8100673B8C /* DataTransfer.swift */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -46,6 +49,8 @@ DEFF1DC32AF8E8DC00673B8C /* TransferViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TransferViewModel.swift; sourceTree = ""; }; DEFF1DC72AF8EAD300673B8C /* ViewModelFactory.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewModelFactory.swift; sourceTree = ""; }; DEFF1DC92AF8EC6A00673B8C /* VerticalAccountCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VerticalAccountCell.swift; sourceTree = ""; }; + DEFF1DCF2AF8F8BB00673B8C /* PaginationMode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PaginationMode.swift; sourceTree = ""; }; + DEFF1DD22AF8FF8100673B8C /* DataTransfer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DataTransfer.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -53,6 +58,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + DEFF1DCD2AF8F58500673B8C /* Kingfisher in Frameworks */, DE690EA62AF842ED00E8C451 /* Domain in Frameworks */, DE690EA82AF842ED00E8C451 /* UI in Frameworks */, DE690EA42AF842ED00E8C451 /* Data in Frameworks */, @@ -101,6 +107,7 @@ DE690EAD2AF8452500E8C451 /* HomeScene */ = { isa = PBXGroup; children = ( + DEFF1DD12AF8FF6D00673B8C /* Model */, DE690EAF2AF8453800E8C451 /* ViewModel */, DE690EAE2AF8453500E8C451 /* View */, ); @@ -150,9 +157,9 @@ DEBE4AC12AF6C3B000A58501 /* TransferList */ = { isa = PBXGroup; children = ( - DEFF1DC52AF8EAC700673B8C /* Extra */, DE690EA02AF842B400E8C451 /* Application */, DEFF1DBA2AF8DDFE00673B8C /* Presentation */, + DEFF1DC52AF8EAC700673B8C /* Extra */, DE690E9F2AF8429D00E8C451 /* Resources */, ); path = TransferList; @@ -187,10 +194,19 @@ isa = PBXGroup; children = ( DEFF1DC72AF8EAD300673B8C /* ViewModelFactory.swift */, + DEFF1DCF2AF8F8BB00673B8C /* PaginationMode.swift */, ); path = Core; sourceTree = ""; }; + DEFF1DD12AF8FF6D00673B8C /* Model */ = { + isa = PBXGroup; + children = ( + DEFF1DD22AF8FF8100673B8C /* DataTransfer.swift */, + ); + path = Model; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -211,6 +227,7 @@ DE690EA32AF842ED00E8C451 /* Data */, DE690EA52AF842ED00E8C451 /* Domain */, DE690EA72AF842ED00E8C451 /* UI */, + DEFF1DCC2AF8F58500673B8C /* Kingfisher */, ); productName = TransferList; productReference = DEBE4ABF2AF6C3B000A58501 /* TransferList.app */; @@ -240,6 +257,9 @@ Base, ); mainGroup = DEBE4AB62AF6C3B000A58501; + packageReferences = ( + DEFF1DCB2AF8F58500673B8C /* XCRemoteSwiftPackageReference "Kingfisher" */, + ); productRefGroup = DEBE4AC02AF6C3B000A58501 /* Products */; projectDirPath = ""; projectRoot = ""; @@ -273,10 +293,12 @@ DEFF1DC22AF8DFE300673B8C /* HomeItem.swift in Sources */, DEFF1DC82AF8EAD300673B8C /* ViewModelFactory.swift in Sources */, DE690EB12AF8455400E8C451 /* HomeViewController.swift in Sources */, + DEFF1DD02AF8F8BB00673B8C /* PaginationMode.swift in Sources */, DE690EAA2AF842F800E8C451 /* DIContainer.swift in Sources */, DEBE4AC32AF6C3B000A58501 /* AppDelegate.swift in Sources */, DEBE4AC52AF6C3B000A58501 /* SceneDelegate.swift in Sources */, DEFF1DC02AF8DFA500673B8C /* HomeCollectionViewDataSource.swift in Sources */, + DEFF1DD32AF8FF8100673B8C /* DataTransfer.swift in Sources */, DE690EAC2AF8432500E8C451 /* DIContainerImpl.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -486,6 +508,17 @@ }; /* End XCConfigurationList section */ +/* Begin XCRemoteSwiftPackageReference section */ + DEFF1DCB2AF8F58500673B8C /* XCRemoteSwiftPackageReference "Kingfisher" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/onevcat/Kingfisher.git"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 7.0.0; + }; + }; +/* End XCRemoteSwiftPackageReference section */ + /* Begin XCSwiftPackageProductDependency section */ DE690EA32AF842ED00E8C451 /* Data */ = { isa = XCSwiftPackageProductDependency; @@ -499,6 +532,11 @@ isa = XCSwiftPackageProductDependency; productName = UI; }; + DEFF1DCC2AF8F58500673B8C /* Kingfisher */ = { + isa = XCSwiftPackageProductDependency; + package = DEFF1DCB2AF8F58500673B8C /* XCRemoteSwiftPackageReference "Kingfisher" */; + productName = Kingfisher; + }; /* End XCSwiftPackageProductDependency section */ }; rootObject = DEBE4AB72AF6C3B000A58501 /* Project object */; diff --git a/TransferList.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/TransferList.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index bc7ce25..bc11fed 100644 --- a/TransferList.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/TransferList.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -8,6 +8,15 @@ "revision" : "3dc6a42c7727c49bf26508e29b0a0b35f9c7e1ad", "version" : "5.8.1" } + }, + { + "identity" : "kingfisher", + "kind" : "remoteSourceControl", + "location" : "https://github.com/onevcat/Kingfisher.git", + "state" : { + "revision" : "277f1ab2c6664b19b4a412e32b094b201e2d5757", + "version" : "7.10.0" + } } ], "version" : 2 diff --git a/TransferList/Extra/Core/PaginationMode.swift b/TransferList/Extra/Core/PaginationMode.swift new file mode 100644 index 0000000..b248aed --- /dev/null +++ b/TransferList/Extra/Core/PaginationMode.swift @@ -0,0 +1,32 @@ +// +// PaginationMode.swift +// TransferList +// +// Created by Hessam Mahdiabadi on 11/6/23. +// + +import Foundation + +struct PaginationMode { + + enum Mode { + case continues + case reachedToEnd + } + + var offset: Int = 0 + var mode: Mode = .continues + + var nextOffset: Int { + offset + 1 + } + + mutating func moveToNextOffset() { + self.offset += 1 + } + + mutating func reset() { + offset = 0 + mode = .continues + } +} diff --git a/TransferList/Presentation/HomeScene/Model/DataTransfer.swift b/TransferList/Presentation/HomeScene/Model/DataTransfer.swift new file mode 100644 index 0000000..55bcdda --- /dev/null +++ b/TransferList/Presentation/HomeScene/Model/DataTransfer.swift @@ -0,0 +1,29 @@ +// +// DataTransfer.swift +// TransferList +// +// Created by Hessam Mahdiabadi on 11/6/23. +// + +import Foundation +import Domain + +struct DataTransfer { + + enum Mode { + case initial + case append + } + + var list: [T] + var mode: Mode + var section: HomeItem.Section + + mutating func append(contentsOf items: [T]) { + if mode == .append { + list.append(contentsOf: items) + } else { + list = items + } + } +} diff --git a/TransferList/Presentation/HomeScene/View/Cell/VerticalAccountCell.swift b/TransferList/Presentation/HomeScene/View/Cell/VerticalAccountCell.swift index bf4d4b3..2c268ac 100644 --- a/TransferList/Presentation/HomeScene/View/Cell/VerticalAccountCell.swift +++ b/TransferList/Presentation/HomeScene/View/Cell/VerticalAccountCell.swift @@ -8,35 +8,57 @@ import UIKit import UI import Domain +import Kingfisher class VerticalAccountCell: BaseCollectionCell { + @InstantiateView(type: UIImageView.self) var personImageView @InstantiateView(type: ListLabel.self) var nameLabel @InstantiateView(type: SubTitleLabel.self) var cardTypeLabel @InstantiateView(type: UIStackView.self) var labelsStackView - @InstantiateView(type: UIImageView.self) var arrowImage - @InstantiateView(type: UIImageView.self) var favoriteImage + @InstantiateView(type: UIImageView.self) var arrowImageView + @InstantiateView(type: UIImageView.self) var favoriteImageView @InstantiateView(type: UIStackView.self) var imagesStackView + override func prepareForReuse() { + super.prepareForReuse() + + personImageView.image = nil + } + override func setupViews() { super.setupViews() + addSubview(personImageView) addSubview(labelsStackView) addSubview(imagesStackView) NSLayoutConstraint.activate([ + personImageView.centerYAnchor.constraint(equalTo: centerYSafeMargin), + personImageView.leadingAnchor.constraint(equalTo: leadingSafeMargin), + personImageView.heightAnchor.constraint(equalToConstant: 50), + personImageView.widthAnchor.constraint(equalToConstant: 50), labelsStackView.topAnchor.constraint(equalTo: topSafeMargin, constant: 16), labelsStackView.bottomAnchor.constraint(equalTo: bottomSafeMargin, constant: -16), - labelsStackView.leadingAnchor.constraint(equalTo: leadingSafeMargin), + labelsStackView.leadingAnchor.constraint(equalTo: personImageView.trailingAnchor, constant: 12), labelsStackView.trailingAnchor.constraint(equalTo: trailingSafeMargin) // labelsStackView.trailingAnchor.constraint(lessThanOrEqualTo: clock.leadingAnchor, constant: -12), // clock.centerYAnchor.constraint(equalTo: centerYSafeMargin), // clock.trailingAnchor.constraint(equalTo: trailingSafeMargin, constant: -18) ]) + configurePersonImageView() configureLabelsStackView() } + private func configurePersonImageView() { + personImageView.contentMode = .scaleAspectFit + personImageView.layer.borderColor = Theme.border?.cgColor + personImageView.layer.borderWidth = 0.5 + personImageView.setCornerRadius(radius: 25) + personImageView.layer.masksToBounds = true + } + private func configureLabelsStackView() { labelsStackView.spacing = 4 labelsStackView.alignment = .leading @@ -49,6 +71,13 @@ class VerticalAccountCell: BaseCollectionCell { func setAccountItem(_ personAccount: PersonBankAccount) { nameLabel.text = personAccount.person?.name - cardTypeLabel.text = personAccount.card?.cardType + cardTypeLabel.text = personAccount.card?.cardNumber + + let avatarUrl = URL(string: personAccount.person?.avatar ?? "") + personImageView.kf.setImage(with: avatarUrl, placeholder: UIImage()) + } + + override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) { + personImageView.layer.borderColor = Theme.border?.cgColor } } diff --git a/TransferList/Presentation/HomeScene/View/HomeCollectionViewDataSource.swift b/TransferList/Presentation/HomeScene/View/HomeCollectionViewDataSource.swift index 0a4932a..05e2379 100644 --- a/TransferList/Presentation/HomeScene/View/HomeCollectionViewDataSource.swift +++ b/TransferList/Presentation/HomeScene/View/HomeCollectionViewDataSource.swift @@ -22,7 +22,6 @@ class HomeCollectionViewDataSource { configureCollectionView() configureDiffableDataSource() - setupDiffableSnapshot() } private func configureCollectionView() { @@ -44,13 +43,6 @@ class HomeCollectionViewDataSource { self.dataSource.supplementaryViewProvider = collectionView.makeSeprator() } - private func setupDiffableSnapshot() { - var initialSnapshot = DiffableSnapshot() - initialSnapshot.appendSections([.allTitle, .personBankAccounts]) - initialSnapshot.appendItems([.header(title: "All")], toSection: .allTitle) - self.dataSource.apply(initialSnapshot, animatingDifferences: false) - } - private func createTitleCell(for indexPath: IndexPath, title: String) -> LargeHeaderCell { let cell: LargeHeaderCell = collectionView.dequeueReusableCell(for: indexPath) cell.setTitle(title) @@ -63,19 +55,38 @@ class HomeCollectionViewDataSource { return cell } - public func LoadTitle(message: String) { - var snapShot = dataSource.snapshot() - snapShot.appendSections([.FavoritesTitle]) - snapShot.appendItems([.header(title: message)], toSection: .FavoritesTitle) - dataSource.apply(snapShot, animatingDifferences: true) + public func updateData(_ dataTransfer: DataTransfer) { + switch dataTransfer.section { + case .personBankAccounts: updateAllSection(dataTransfer) + + default: break + } } - public func updateAccounts(_ accounts: [PersonBankAccount]) { - var snapShot = dataSource.snapshot() - let items = accounts.map { + private func updateAllSection(_ dataTransfer: DataTransfer) { + let items = dataTransfer.list.map { return HomeItem.personBankAccount(account: $0) } - snapShot.appendItems(items, toSection: .personBankAccounts) + + var snapShot = dataSource.snapshot() + if snapShot.sectionIdentifiers.contains(dataTransfer.section) { + if dataTransfer.mode == .append { + snapShot.appendItems(items, toSection: dataTransfer.section) + } else { + snapShot.deleteItems(snapShot.itemIdentifiers(inSection: dataTransfer.section)) + snapShot.appendItems(items, toSection: dataTransfer.section) + } + } else { + + if !snapShot.sectionIdentifiers.contains(.allTitle) { + snapShot.appendSections([.allTitle]) + snapShot.appendItems([.header(title: "All")], toSection: .allTitle) + } + + snapShot.appendSections([dataTransfer.section]) + snapShot.appendItems(items, toSection: dataTransfer.section) + } + dataSource.apply(snapShot, animatingDifferences: true) } diff --git a/TransferList/Presentation/HomeScene/View/HomeViewController.swift b/TransferList/Presentation/HomeScene/View/HomeViewController.swift index a903e09..823a465 100644 --- a/TransferList/Presentation/HomeScene/View/HomeViewController.swift +++ b/TransferList/Presentation/HomeScene/View/HomeViewController.swift @@ -11,6 +11,7 @@ import Combine class HomeViewController: BaseCollectionViewController { + @InstantiateView(type: UIRefreshControl.self) private var refresher private var dataSource: HomeCollectionViewDataSource! private let viewModel = ViewModelFactory.shared.createMediaViewModel() private var subscriptions = Set() @@ -18,6 +19,7 @@ class HomeViewController: BaseCollectionViewController { override func setupViews() { super.setupViews() + configureRefresher() configureDataSource() observeDidChangeData() viewModel.fetchTransferList() @@ -25,14 +27,29 @@ class HomeViewController: BaseCollectionViewController { override var spaceSeparatorFromEdgeInList: CGFloat { return 0 } + private func configureRefresher() { + collectionView.alwaysBounceVertical = true + refresher.tintColor = Theme.supplementaryBackground + refresher.addTarget(self, action: #selector(loadData), for: .valueChanged) + collectionView.addSubview(refresher) + } + + @objc func loadData() { + self.refresher.beginRefreshing() + + viewModel.refreshData() + } + private func configureDataSource() { dataSource = .init(collectionView: collectionView) } private func observeDidChangeData() { - viewModel.$bankAccounts - .sink { [weak self] accounts in - self?.dataSource?.updateAccounts(accounts) + viewModel.$dataUpdated + .compactMap { $0 } + .sink { [weak self] data in + self?.refresher.endRefreshing() + self?.dataSource.updateData(data) } .store(in: &subscriptions) } diff --git a/TransferList/Presentation/HomeScene/ViewModel/TransferViewModel.swift b/TransferList/Presentation/HomeScene/ViewModel/TransferViewModel.swift index 35631fe..a536b7b 100644 --- a/TransferList/Presentation/HomeScene/ViewModel/TransferViewModel.swift +++ b/TransferList/Presentation/HomeScene/ViewModel/TransferViewModel.swift @@ -11,12 +11,12 @@ import Domain class TransferViewModel { -// @Published private(set) var viewState: ViewState = .loading - @Published var bankAccounts: [PersonBankAccount] = [] -// @Published var path = NavigationPath() + @Published var dataUpdated: DataTransfer! private let useCase: PersonBankAccountUseCase private var subscriptions = Set() - private var currentOffset: Int = 0 + private var paginationMode = PaginationMode() + private var dataFromServer: DataTransfer! + private var dataFromLocal: DataTransfer! deinit { cancelAllPendingTask() @@ -41,7 +41,7 @@ class TransferViewModel { func fetchTransferList() { // update view state - useCase.fetchPersonAccounts(withOffest: currentOffset + 1) + useCase.fetchPersonAccounts(withOffest: paginationMode.nextOffset) .receive(on: DispatchQueue.main) .sink { [weak self] completion in guard let self else { return } @@ -57,58 +57,30 @@ class TransferViewModel { } receiveValue: { [weak self] accounts in guard let self else { return } self.updateAccounts(appendAccounts: accounts) + self.paginationMode.moveToNextOffset() } .store(in: &subscriptions) } - func updateAccounts(appendAccounts accounts: [PersonBankAccount]) { + public func refreshData() { + // check view state must not loading + + dataFromServer?.mode = .initial + fetchTransferList() + } + + private func updateAccounts(appendAccounts accounts: [PersonBankAccount]) { guard !accounts.isEmpty else { // reach to end return } + + if dataFromServer == nil { + dataFromServer = .init(list: accounts, mode: .initial, section: .personBankAccounts) + } else { + dataFromServer.append(contentsOf: accounts) + } - bankAccounts.append(contentsOf: accounts) - currentOffset += 1 + dataUpdated = dataFromServer } - -// func fetchMediaList() { -// guard mediaList.isEmpty else { -// return -// } -// -// updateViewState(newState: .loading) -// -// useCase.fetchMediaList() -// .receive(on: DispatchQueue.main) -// .sink { [weak self] completion in -// guard let self else { return } -// switch completion { -// case .failure(let error): -// let alertContent = AlertContent(message: error.localizedDescription) -// self.updateViewState(newState: .error(alertContent: alertContent)) -// case .finished: break -// } -// } receiveValue: { [weak self] mediaList in -// self?.mediaList = mediaList -// self?.updateViewState(newState: .result) -// } -// .store(in: &subscriptions) -// } - -// func fetchMediaImage(WithImageUrl imageUrl: String?, previewImage: @escaping BackImage) { -// guard let imageUrl else { -// previewImage(Image("imageFailed")) -// return -// } -// -// useCase.fetchImage(withImageUrl: imageUrl) -// .retry(3) -// .replaceError(with: Image("imageFailed")) -// .receive(on: DispatchQueue.main) -// .sink(receiveValue: { image in -// previewImage(image) -// }) -// .store(in: &subscriptions) -// } } - From 1088042d7a1925f421cac6a137d94363e737e309 Mon Sep 17 00:00:00 2001 From: Hessam Mahdiabadi <67460597+iamHEssam@users.noreply.github.com> Date: Mon, 6 Nov 2023 16:12:18 +0330 Subject: [PATCH 26/34] Implement Pagination Support in Collection View with Continuous Data Fetching --- Data/Sources/Data/Http/ApiImpl.swift | 2 +- TransferList.xcodeproj/project.pbxproj | 4 +++ TransferList/Extra/Core/ViewState.swift | 27 ++++++++++++++++++ .../HomeScene/Model/DataTransfer.swift | 18 ++++++++++-- .../View/HomeCollectionViewDataSource.swift | 11 ++++++++ .../HomeScene/View/HomeViewController.swift | 16 +++++++++-- .../ViewModel/TransferViewModel.swift | 28 +++++++++++++------ 7 files changed, 92 insertions(+), 14 deletions(-) create mode 100644 TransferList/Extra/Core/ViewState.swift diff --git a/Data/Sources/Data/Http/ApiImpl.swift b/Data/Sources/Data/Http/ApiImpl.swift index e1d9d6b..4a98860 100644 --- a/Data/Sources/Data/Http/ApiImpl.swift +++ b/Data/Sources/Data/Http/ApiImpl.swift @@ -39,7 +39,7 @@ final public class ApiImpl: Api { continuation.resume(throwing: NetworkError.cannotConnectToServer) return } - + print(route.urlPath) sessionManager.request(route) .validate(statusCode: 200 ..< 300) .responseData { [weak self] responseData in diff --git a/TransferList.xcodeproj/project.pbxproj b/TransferList.xcodeproj/project.pbxproj index 241dee4..b49eff3 100644 --- a/TransferList.xcodeproj/project.pbxproj +++ b/TransferList.xcodeproj/project.pbxproj @@ -27,6 +27,7 @@ DEFF1DCD2AF8F58500673B8C /* Kingfisher in Frameworks */ = {isa = PBXBuildFile; productRef = DEFF1DCC2AF8F58500673B8C /* Kingfisher */; }; DEFF1DD02AF8F8BB00673B8C /* PaginationMode.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEFF1DCF2AF8F8BB00673B8C /* PaginationMode.swift */; }; DEFF1DD32AF8FF8100673B8C /* DataTransfer.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEFF1DD22AF8FF8100673B8C /* DataTransfer.swift */; }; + DEFF1DD52AF9122D00673B8C /* ViewState.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEFF1DD42AF9122D00673B8C /* ViewState.swift */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -51,6 +52,7 @@ DEFF1DC92AF8EC6A00673B8C /* VerticalAccountCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VerticalAccountCell.swift; sourceTree = ""; }; DEFF1DCF2AF8F8BB00673B8C /* PaginationMode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PaginationMode.swift; sourceTree = ""; }; DEFF1DD22AF8FF8100673B8C /* DataTransfer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DataTransfer.swift; sourceTree = ""; }; + DEFF1DD42AF9122D00673B8C /* ViewState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewState.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -195,6 +197,7 @@ children = ( DEFF1DC72AF8EAD300673B8C /* ViewModelFactory.swift */, DEFF1DCF2AF8F8BB00673B8C /* PaginationMode.swift */, + DEFF1DD42AF9122D00673B8C /* ViewState.swift */, ); path = Core; sourceTree = ""; @@ -295,6 +298,7 @@ DE690EB12AF8455400E8C451 /* HomeViewController.swift in Sources */, DEFF1DD02AF8F8BB00673B8C /* PaginationMode.swift in Sources */, DE690EAA2AF842F800E8C451 /* DIContainer.swift in Sources */, + DEFF1DD52AF9122D00673B8C /* ViewState.swift in Sources */, DEBE4AC32AF6C3B000A58501 /* AppDelegate.swift in Sources */, DEBE4AC52AF6C3B000A58501 /* SceneDelegate.swift in Sources */, DEFF1DC02AF8DFA500673B8C /* HomeCollectionViewDataSource.swift in Sources */, diff --git a/TransferList/Extra/Core/ViewState.swift b/TransferList/Extra/Core/ViewState.swift new file mode 100644 index 0000000..ebd4a54 --- /dev/null +++ b/TransferList/Extra/Core/ViewState.swift @@ -0,0 +1,27 @@ +// +// ViewState.swift +// TransferList +// +// Created by Hessam Mahdiabadi on 11/6/23. +// + +import Foundation + +enum ViewState: Hashable, Equatable { + + case loading + case result + case error(message: String) + + func hash(into hasher: inout Hasher) { + switch self { + case .error: hasher.combine("error") + case .result: hasher.combine("result") + case .loading: hasher.combine("loading") + } + } + + static func == (lhs: ViewState, rhs: ViewState) -> Bool { + return lhs.hashValue == rhs.hashValue + } +} diff --git a/TransferList/Presentation/HomeScene/Model/DataTransfer.swift b/TransferList/Presentation/HomeScene/Model/DataTransfer.swift index 55bcdda..6a45dd2 100644 --- a/TransferList/Presentation/HomeScene/Model/DataTransfer.swift +++ b/TransferList/Presentation/HomeScene/Model/DataTransfer.swift @@ -18,12 +18,26 @@ struct DataTransfer { var list: [T] var mode: Mode var section: HomeItem.Section + private(set) var listHolder: [T] = [] + + init(list: [T], mode: Mode, section: HomeItem.Section) { + self.list = list + self.mode = mode + self.section = section + self.listHolder = list + } mutating func append(contentsOf items: [T]) { if mode == .append { - list.append(contentsOf: items) + listHolder.append(contentsOf: items) } else { - list = items + listHolder = items } + + list = items + } + + func isLastItem(row: Int) -> Bool { + return listHolder.count - 1 == row } } diff --git a/TransferList/Presentation/HomeScene/View/HomeCollectionViewDataSource.swift b/TransferList/Presentation/HomeScene/View/HomeCollectionViewDataSource.swift index 05e2379..f2da1d8 100644 --- a/TransferList/Presentation/HomeScene/View/HomeCollectionViewDataSource.swift +++ b/TransferList/Presentation/HomeScene/View/HomeCollectionViewDataSource.swift @@ -89,6 +89,17 @@ class HomeCollectionViewDataSource { dataSource.apply(snapShot, animatingDifferences: true) } + + public func sectionIdentifier(atIndexPath indexPath: IndexPath) -> HomeItem.Section? { + if #available(iOS 15.0, *) { + return dataSource.sectionIdentifier(for: indexPath.section) + } else { + guard let item = dataSource.itemIdentifier(for: indexPath) else { + return nil + } + return dataSource.snapshot().sectionIdentifier(containingItem: item) + } + } // private func prepareToDecideShowTopicRowsBasedOn(topicCount count: Int, into snapShot: inout DiffableSnapshot) { // let isContainTopicItems = snapShot.itemIdentifiers.contains(.topicsHeader) diff --git a/TransferList/Presentation/HomeScene/View/HomeViewController.swift b/TransferList/Presentation/HomeScene/View/HomeViewController.swift index 823a465..d72e3b6 100644 --- a/TransferList/Presentation/HomeScene/View/HomeViewController.swift +++ b/TransferList/Presentation/HomeScene/View/HomeViewController.swift @@ -19,6 +19,7 @@ class HomeViewController: BaseCollectionViewController { override func setupViews() { super.setupViews() + collectionView.delegate = self configureRefresher() configureDataSource() observeDidChangeData() @@ -30,11 +31,11 @@ class HomeViewController: BaseCollectionViewController { private func configureRefresher() { collectionView.alwaysBounceVertical = true refresher.tintColor = Theme.supplementaryBackground - refresher.addTarget(self, action: #selector(loadData), for: .valueChanged) + refresher.addTarget(self, action: #selector(refreshData), for: .valueChanged) collectionView.addSubview(refresher) } - @objc func loadData() { + @objc func refreshData() { self.refresher.beginRefreshing() viewModel.refreshData() @@ -54,3 +55,14 @@ class HomeViewController: BaseCollectionViewController { .store(in: &subscriptions) } } + +extension HomeViewController: UICollectionViewDelegate { + + func collectionView(_ collectionView: UICollectionView, + willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) { + guard let section = dataSource.sectionIdentifier(atIndexPath: indexPath) else { + return + } + viewModel.itemDisplay(atSection: section, row: indexPath.row) + } +} diff --git a/TransferList/Presentation/HomeScene/ViewModel/TransferViewModel.swift b/TransferList/Presentation/HomeScene/ViewModel/TransferViewModel.swift index a536b7b..43051b4 100644 --- a/TransferList/Presentation/HomeScene/ViewModel/TransferViewModel.swift +++ b/TransferList/Presentation/HomeScene/ViewModel/TransferViewModel.swift @@ -11,6 +11,7 @@ import Domain class TransferViewModel { + @Published var viewState: ViewState! @Published var dataUpdated: DataTransfer! private let useCase: PersonBankAccountUseCase private var subscriptions = Set() @@ -32,14 +33,10 @@ class TransferViewModel { // private func updateViewState(newState viewState: ViewState) { // self.viewState = viewState -// } -// -// func selected(media: Media) { -// path.append(NavigationRouter.DetailOfMedia(media: media)) // } - func fetchTransferList() { - // update view state + public func fetchTransferList() { + viewState = .loading useCase.fetchPersonAccounts(withOffest: paginationMode.nextOffset) .receive(on: DispatchQueue.main) @@ -50,7 +47,7 @@ class TransferViewModel { case .finished: break case .failure(let error): - // show error + self.viewState = .error(message: error.localizedDescription) break } @@ -58,20 +55,33 @@ class TransferViewModel { guard let self else { return } self.updateAccounts(appendAccounts: accounts) self.paginationMode.moveToNextOffset() + self.viewState = .result } .store(in: &subscriptions) } public func refreshData() { - // check view state must not loading + guard viewState != .loading else { return } + paginationMode.reset() dataFromServer?.mode = .initial fetchTransferList() } + public func itemDisplay(atSection section: HomeItem.Section, row: Int) { + guard viewState != .loading else { return } + guard section == .personBankAccounts else { return } + guard paginationMode.mode == .continues else { return } + guard dataFromServer.isLastItem(row: row) else { return } + + dataFromServer?.mode = .append + + fetchTransferList() + } + private func updateAccounts(appendAccounts accounts: [PersonBankAccount]) { guard !accounts.isEmpty else { - // reach to end + paginationMode.mode = .reachedToEnd return } From f2a7231bfec555b6eca05188675f3b958ca4e33a Mon Sep 17 00:00:00 2001 From: Hessam Mahdiabadi <67460597+iamHEssam@users.noreply.github.com> Date: Mon, 6 Nov 2023 18:04:54 +0330 Subject: [PATCH 27/34] Add AccountCell, Inheritance for VerticalAccountCell and FavoriteCell, and Local Data Fetching - Added the AccountCell component. - Implemented inheritance from AccountCell in VerticalAccountCell and FavoriteCell. - Added data fetching from local sources and display of favorite items. --- Data/Sources/Data/Http/ApiImpl.swift | 2 +- TransferList.xcodeproj/project.pbxproj | 8 + .../HomeScene/View/Cell/AccountCell.swift | 55 ++++++ .../View/Cell/FavoriteAccountCell.swift | 49 ++++++ .../View/Cell/VerticalAccountCell.swift | 35 +--- .../View/HomeCollectionViewDataSource.swift | 156 ++++++++---------- .../HomeScene/View/HomeItem.swift | 1 + .../HomeScene/View/HomeViewController.swift | 20 +++ .../ViewModel/TransferViewModel.swift | 23 ++- .../AccentColor.colorset/Contents.json | 11 -- .../imageFailed.imageset/Contents.json | 22 +++ .../imageFailed.imageset/imageFailed-dark.png | Bin 0 -> 6460 bytes .../imageFailed-light.png | Bin 0 -> 6290 bytes 13 files changed, 244 insertions(+), 138 deletions(-) create mode 100644 TransferList/Presentation/HomeScene/View/Cell/AccountCell.swift create mode 100644 TransferList/Presentation/HomeScene/View/Cell/FavoriteAccountCell.swift delete mode 100644 TransferList/Resources/Assets.xcassets/AccentColor.colorset/Contents.json create mode 100644 TransferList/Resources/Assets.xcassets/imageFailed.imageset/Contents.json create mode 100644 TransferList/Resources/Assets.xcassets/imageFailed.imageset/imageFailed-dark.png create mode 100644 TransferList/Resources/Assets.xcassets/imageFailed.imageset/imageFailed-light.png diff --git a/Data/Sources/Data/Http/ApiImpl.swift b/Data/Sources/Data/Http/ApiImpl.swift index 4a98860..a75aa29 100644 --- a/Data/Sources/Data/Http/ApiImpl.swift +++ b/Data/Sources/Data/Http/ApiImpl.swift @@ -39,7 +39,7 @@ final public class ApiImpl: Api { continuation.resume(throwing: NetworkError.cannotConnectToServer) return } - print(route.urlPath) + sessionManager.request(route) .validate(statusCode: 200 ..< 300) .responseData { [weak self] responseData in diff --git a/TransferList.xcodeproj/project.pbxproj b/TransferList.xcodeproj/project.pbxproj index b49eff3..3d1f9cb 100644 --- a/TransferList.xcodeproj/project.pbxproj +++ b/TransferList.xcodeproj/project.pbxproj @@ -28,6 +28,8 @@ DEFF1DD02AF8F8BB00673B8C /* PaginationMode.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEFF1DCF2AF8F8BB00673B8C /* PaginationMode.swift */; }; DEFF1DD32AF8FF8100673B8C /* DataTransfer.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEFF1DD22AF8FF8100673B8C /* DataTransfer.swift */; }; DEFF1DD52AF9122D00673B8C /* ViewState.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEFF1DD42AF9122D00673B8C /* ViewState.swift */; }; + DEFF1DD72AF91A8A00673B8C /* FavoriteAccountCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEFF1DD62AF91A8900673B8C /* FavoriteAccountCell.swift */; }; + DEFF1DD92AF92DB500673B8C /* AccountCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEFF1DD82AF92DB500673B8C /* AccountCell.swift */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -53,6 +55,8 @@ DEFF1DCF2AF8F8BB00673B8C /* PaginationMode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PaginationMode.swift; sourceTree = ""; }; DEFF1DD22AF8FF8100673B8C /* DataTransfer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DataTransfer.swift; sourceTree = ""; }; DEFF1DD42AF9122D00673B8C /* ViewState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewState.swift; sourceTree = ""; }; + DEFF1DD62AF91A8900673B8C /* FavoriteAccountCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FavoriteAccountCell.swift; sourceTree = ""; }; + DEFF1DD82AF92DB500673B8C /* AccountCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountCell.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -180,6 +184,8 @@ children = ( DEFF1DBC2AF8DEE400673B8C /* LargeHeaderCell.swift */, DEFF1DC92AF8EC6A00673B8C /* VerticalAccountCell.swift */, + DEFF1DD62AF91A8900673B8C /* FavoriteAccountCell.swift */, + DEFF1DD82AF92DB500673B8C /* AccountCell.swift */, ); path = Cell; sourceTree = ""; @@ -299,11 +305,13 @@ DEFF1DD02AF8F8BB00673B8C /* PaginationMode.swift in Sources */, DE690EAA2AF842F800E8C451 /* DIContainer.swift in Sources */, DEFF1DD52AF9122D00673B8C /* ViewState.swift in Sources */, + DEFF1DD92AF92DB500673B8C /* AccountCell.swift in Sources */, DEBE4AC32AF6C3B000A58501 /* AppDelegate.swift in Sources */, DEBE4AC52AF6C3B000A58501 /* SceneDelegate.swift in Sources */, DEFF1DC02AF8DFA500673B8C /* HomeCollectionViewDataSource.swift in Sources */, DEFF1DD32AF8FF8100673B8C /* DataTransfer.swift in Sources */, DE690EAC2AF8432500E8C451 /* DIContainerImpl.swift in Sources */, + DEFF1DD72AF91A8A00673B8C /* FavoriteAccountCell.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/TransferList/Presentation/HomeScene/View/Cell/AccountCell.swift b/TransferList/Presentation/HomeScene/View/Cell/AccountCell.swift new file mode 100644 index 0000000..728ecd5 --- /dev/null +++ b/TransferList/Presentation/HomeScene/View/Cell/AccountCell.swift @@ -0,0 +1,55 @@ +// +// AccountCell.swift +// TransferList +// +// Created by Hessam Mahdiabadi on 11/6/23. +// + +import UIKit +import UI +import Domain +import Kingfisher + +class AccountCell: BaseCollectionCell { + + @InstantiateView(type: UIImageView.self) var personImageView + @InstantiateView(type: ListLabel.self) var nameLabel + @InstantiateView(type: SubTitleLabel.self) var cardTypeLabel + + override func prepareForReuse() { + super.prepareForReuse() + + personImageView.image = nil + } + + override func setupViews() { + super.setupViews() + + NSLayoutConstraint.activate([ + personImageView.heightAnchor.constraint(equalToConstant: 50), + personImageView.widthAnchor.constraint(equalToConstant: 50) + ]) + + configurePersonImageView() + } + + private func configurePersonImageView() { + personImageView.contentMode = .scaleAspectFit + personImageView.layer.borderColor = Theme.border?.cgColor + personImageView.layer.borderWidth = 0.5 + personImageView.setCornerRadius(radius: 25) + personImageView.layer.masksToBounds = true + } + + open func setAccountItem(_ personAccount: PersonBankAccount) { + nameLabel.text = personAccount.person?.name + cardTypeLabel.text = personAccount.card?.cardType + + let avatarUrl = URL(string: personAccount.person?.avatar ?? "") + personImageView.kf.setImage(with: avatarUrl, placeholder: UIImage(named: "imageFailed")) + } + + override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) { + personImageView.layer.borderColor = Theme.border?.cgColor + } +} diff --git a/TransferList/Presentation/HomeScene/View/Cell/FavoriteAccountCell.swift b/TransferList/Presentation/HomeScene/View/Cell/FavoriteAccountCell.swift new file mode 100644 index 0000000..99bd3dc --- /dev/null +++ b/TransferList/Presentation/HomeScene/View/Cell/FavoriteAccountCell.swift @@ -0,0 +1,49 @@ +// +// FavoriteAccountCell.swift +// TransferList +// +// Created by Hessam Mahdiabadi on 11/6/23. +// + +import UIKit +import UI + +class FavoriteAccountCell: AccountCell { + + @InstantiateView(type: UIStackView.self) var stackView + + override func setupViews() { + super.setupViews() + + addSubview(stackView) + + NSLayoutConstraint.activate([ + stackView.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 12), + stackView.trailingAnchor.constraint(equalTo: trailingSafeMargin, constant: -12), + stackView.bottomAnchor.constraint(equalTo: bottomSafeMargin), + stackView.topAnchor.constraint(equalTo: topSafeMargin), + ]) + + configureStackView() + } + + private func configureStackView() { + stackView.spacing = 4 + stackView.alignment = .center + stackView.axis = .vertical + stackView.distribution = .fill + + stackView.addArrangedSubview(personImageView) + stackView.addArrangedSubview(nameLabel) + stackView.addArrangedSubview(cardTypeLabel) + + stackView.setCustomSpacing(12, after: personImageView) + + configureLabels() + } + + private func configureLabels() { + nameLabel.textAlignment = .center + cardTypeLabel.textAlignment = .center + } +} diff --git a/TransferList/Presentation/HomeScene/View/Cell/VerticalAccountCell.swift b/TransferList/Presentation/HomeScene/View/Cell/VerticalAccountCell.swift index 2c268ac..ac67db6 100644 --- a/TransferList/Presentation/HomeScene/View/Cell/VerticalAccountCell.swift +++ b/TransferList/Presentation/HomeScene/View/Cell/VerticalAccountCell.swift @@ -8,23 +8,13 @@ import UIKit import UI import Domain -import Kingfisher -class VerticalAccountCell: BaseCollectionCell { +class VerticalAccountCell: AccountCell { - @InstantiateView(type: UIImageView.self) var personImageView - @InstantiateView(type: ListLabel.self) var nameLabel - @InstantiateView(type: SubTitleLabel.self) var cardTypeLabel @InstantiateView(type: UIStackView.self) var labelsStackView @InstantiateView(type: UIImageView.self) var arrowImageView @InstantiateView(type: UIImageView.self) var favoriteImageView @InstantiateView(type: UIStackView.self) var imagesStackView - - override func prepareForReuse() { - super.prepareForReuse() - - personImageView.image = nil - } override func setupViews() { super.setupViews() @@ -36,8 +26,6 @@ class VerticalAccountCell: BaseCollectionCell { NSLayoutConstraint.activate([ personImageView.centerYAnchor.constraint(equalTo: centerYSafeMargin), personImageView.leadingAnchor.constraint(equalTo: leadingSafeMargin), - personImageView.heightAnchor.constraint(equalToConstant: 50), - personImageView.widthAnchor.constraint(equalToConstant: 50), labelsStackView.topAnchor.constraint(equalTo: topSafeMargin, constant: 16), labelsStackView.bottomAnchor.constraint(equalTo: bottomSafeMargin, constant: -16), labelsStackView.leadingAnchor.constraint(equalTo: personImageView.trailingAnchor, constant: 12), @@ -47,18 +35,9 @@ class VerticalAccountCell: BaseCollectionCell { // clock.trailingAnchor.constraint(equalTo: trailingSafeMargin, constant: -18) ]) - configurePersonImageView() configureLabelsStackView() } - private func configurePersonImageView() { - personImageView.contentMode = .scaleAspectFit - personImageView.layer.borderColor = Theme.border?.cgColor - personImageView.layer.borderWidth = 0.5 - personImageView.setCornerRadius(radius: 25) - personImageView.layer.masksToBounds = true - } - private func configureLabelsStackView() { labelsStackView.spacing = 4 labelsStackView.alignment = .leading @@ -69,15 +48,9 @@ class VerticalAccountCell: BaseCollectionCell { labelsStackView.addArrangedSubview(cardTypeLabel) } - func setAccountItem(_ personAccount: PersonBankAccount) { - nameLabel.text = personAccount.person?.name - cardTypeLabel.text = personAccount.card?.cardNumber + override func setAccountItem(_ personAccount: PersonBankAccount) { + super.setAccountItem(personAccount) - let avatarUrl = URL(string: personAccount.person?.avatar ?? "") - personImageView.kf.setImage(with: avatarUrl, placeholder: UIImage()) - } - - override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) { - personImageView.layer.borderColor = Theme.border?.cgColor + // set isFavorite } } diff --git a/TransferList/Presentation/HomeScene/View/HomeCollectionViewDataSource.swift b/TransferList/Presentation/HomeScene/View/HomeCollectionViewDataSource.swift index f2da1d8..ae7597c 100644 --- a/TransferList/Presentation/HomeScene/View/HomeCollectionViewDataSource.swift +++ b/TransferList/Presentation/HomeScene/View/HomeCollectionViewDataSource.swift @@ -16,6 +16,7 @@ class HomeCollectionViewDataSource { private var dataSource: DiffableDataSource! private var collectionView: BaseCollectionView + private let semaphore = DispatchSemaphore(value: 1) init(collectionView: BaseCollectionView) { self.collectionView = collectionView @@ -26,7 +27,8 @@ class HomeCollectionViewDataSource { private func configureCollectionView() { collectionView.registerReusableCell(type: LargeHeaderCell.self) - collectionView.registerReusableCell(type: VerticalAccountCell.self) + collectionView.registerReusableCell(type: VerticalAccountCell.self) + collectionView.registerReusableCell(type: FavoriteAccountCell.self) } private func configureDiffableDataSource() { @@ -36,7 +38,7 @@ class HomeCollectionViewDataSource { case .header(let title): return self?.createTitleCell(for: indexPath, title: title) case .personBankAccount(let account): - return self?.createVerticalAccount(for: indexPath, account: account) + return self?.createAccountCell(for: indexPath, account: account) } }) @@ -49,45 +51,89 @@ class HomeCollectionViewDataSource { return cell } - private func createVerticalAccount(for indexPath: IndexPath, account: PersonBankAccount) -> VerticalAccountCell { - let cell: VerticalAccountCell = collectionView.dequeueReusableCell(for: indexPath) - cell.setAccountItem(account) - return cell + private func createAccountCell(for indexPath: IndexPath, account: PersonBankAccount) -> AccountCell { + let section = sectionIdentifier(atSection: indexPath.section) + if section == .favoriteBankAcconts { + let cell: FavoriteAccountCell = collectionView.dequeueReusableCell(for: indexPath) + cell.setAccountItem(account) + return cell + + } else { + let cell: VerticalAccountCell = collectionView.dequeueReusableCell(for: indexPath) + cell.setAccountItem(account) + return cell + } } public func updateData(_ dataTransfer: DataTransfer) { + semaphore.wait() + + var snapshot: DiffableSnapshot! switch dataTransfer.section { - case .personBankAccounts: updateAllSection(dataTransfer) - + case .personBankAccounts: snapshot = self.updateAllSection(dataTransfer) + case .favoriteBankAcconts: snapshot = self.updateFavoriteSection(dataTransfer) default: break } + + dataSource.apply(snapshot, animatingDifferences: true) + + self.semaphore.signal() } - private func updateAllSection(_ dataTransfer: DataTransfer) { + private func updateFavoriteSection(_ dataTransfer: DataTransfer) -> DiffableSnapshot { + var snapshot = dataSource.snapshot() + let items = dataTransfer.list.map { return HomeItem.personBankAccount(account: $0) } + guard !items.isEmpty else { return snapshot } + + let newSections = [.FavoritesTitle, dataTransfer.section] + let firstSection = snapshot.sectionIdentifiers.first + if snapshot.sectionIdentifiers.isEmpty { + snapshot.appendSections(newSections) + } else { + snapshot.insertSections(newSections, beforeSection: firstSection!) + } + + snapshot.appendItems([.header(title: "Favorite")], toSection: .FavoritesTitle) + snapshot.appendItems(items, toSection: dataTransfer.section) - var snapShot = dataSource.snapshot() - if snapShot.sectionIdentifiers.contains(dataTransfer.section) { + return snapshot +// dataSource.apply(snapshot, animatingDifferences: true) + } + + private func updateAllSection(_ dataTransfer: DataTransfer) -> DiffableSnapshot { + let items = dataTransfer.list.map { + return HomeItem.personBankAccount(account: $0) + } + + var snapshot = dataSource.snapshot() + if snapshot.sectionIdentifiers.contains(dataTransfer.section) { if dataTransfer.mode == .append { - snapShot.appendItems(items, toSection: dataTransfer.section) + snapshot.appendItems(items, toSection: dataTransfer.section) } else { - snapShot.deleteItems(snapShot.itemIdentifiers(inSection: dataTransfer.section)) - snapShot.appendItems(items, toSection: dataTransfer.section) + snapshot.deleteItems(snapshot.itemIdentifiers(inSection: dataTransfer.section)) + snapshot.appendItems(items, toSection: dataTransfer.section) } } else { - if !snapShot.sectionIdentifiers.contains(.allTitle) { - snapShot.appendSections([.allTitle]) - snapShot.appendItems([.header(title: "All")], toSection: .allTitle) + if !snapshot.sectionIdentifiers.contains(.allTitle) { + snapshot.appendSections([.allTitle]) + snapshot.appendItems([.header(title: "All")], toSection: .allTitle) } - snapShot.appendSections([dataTransfer.section]) - snapShot.appendItems(items, toSection: dataTransfer.section) + snapshot.appendSections([dataTransfer.section]) + snapshot.appendItems(items, toSection: dataTransfer.section) } - - dataSource.apply(snapShot, animatingDifferences: true) + + return snapshot + } + + public func sectionIdentifier(atSection section: Int) -> HomeItem.Section? { + let sections = dataSource.snapshot().sectionIdentifiers + guard sections.indices.contains(section) else { return nil } + return dataSource.snapshot().sectionIdentifiers[section] } public func sectionIdentifier(atIndexPath indexPath: IndexPath) -> HomeItem.Section? { @@ -100,72 +146,4 @@ class HomeCollectionViewDataSource { return dataSource.snapshot().sectionIdentifier(containingItem: item) } } - -// private func prepareToDecideShowTopicRowsBasedOn(topicCount count: Int, into snapShot: inout DiffableSnapshot) { -// let isContainTopicItems = snapShot.itemIdentifiers.contains(.topicsHeader) -// if count == 0 && isContainTopicItems { -// snapShot.deleteSections([.topicsHeader, .topics]) -// } -// } -// -// private func checkDeleteSearchOrTopicsBasedOnDeleteTopic(saveChangeIntoSnapShot snapShot: inout DiffableSnapshot) { -// if snapShot.itemIdentifiers(inSection: .topics).isEmpty { -// snapShot.deleteSections([.search, .topics, .topicsHeader]) -// } -// } - -// func loadTopicCount(count: Int) { -// var snapShot = dataSource.snapshot() -// languageItem.topicCount = count -// snapShot.reloadItems([.topicCount]) -// -// prepareToDecideShowTopicRowsBasedOn(topicCount: count, into: &snapShot) -// dataSource.apply(snapShot, animatingDifferences: true) -// } - -// func loadFirstTimeTopics(topics items: [Topic]) { -// var snapShot = dataSource.snapshot() -// if !snapShot.sectionIdentifiers.contains(.topicsHeader) { -// snapShot.insertSections([.search, .topicsHeader, .topics], beforeSection: .overviewHeader) -// snapShot.appendItems([.topicsHeader], toSection: .topicsHeader) -// snapShot.appendItems([.search], toSection: .search) -// } else { -// // remove all topics and load with new sort -// snapShot.deleteItems(snapShot.itemIdentifiers(inSection: .topics)) -// } -// -// let topicItems = items.map { DetailLanguage.topics(item: $0) } -// snapShot.appendItems(topicItems, toSection: .topics) -// -// dataSource.apply(snapShot, animatingDifferences: true) -// } - - -// func getTopic(at indexPath: IndexPath) -> Topic { -// guard let languageItem = dataSource.itemIdentifier(for: indexPath) else { -// return Topic.createEmptyTopic() -// } -// -// guard case let .topics(item) = languageItem else { -// return Topic.createEmptyTopic() -// } -// -// return item -// } - -// func deleteTopics(topics items: [Topic]) { -// var snapshot = dataSource.snapshot() -// let items = items.map { DetailLanguage.topics(item: $0) } -// snapshot.deleteItems(items) -// -// checkDeleteSearchOrTopicsBasedOnDeleteTopic(saveChangeIntoSnapShot: &snapshot) -// dataSource.apply(snapshot, animatingDifferences: true) -// } - -// func updateTopic(topic item: Topic) { -// var snapshot = dataSource.snapshot() -// let item = DetailLanguage.topics(item: item) -// snapshot.reloadItems([item]) -// dataSource.apply(snapshot, animatingDifferences: true) -// } } diff --git a/TransferList/Presentation/HomeScene/View/HomeItem.swift b/TransferList/Presentation/HomeScene/View/HomeItem.swift index f4c1aee..227bc96 100644 --- a/TransferList/Presentation/HomeScene/View/HomeItem.swift +++ b/TransferList/Presentation/HomeScene/View/HomeItem.swift @@ -13,6 +13,7 @@ enum HomeItem: Hashable { enum Section: CaseIterable { case FavoritesTitle + case favoriteBankAcconts case allTitle case personBankAccounts } diff --git a/TransferList/Presentation/HomeScene/View/HomeViewController.swift b/TransferList/Presentation/HomeScene/View/HomeViewController.swift index d72e3b6..6197cd6 100644 --- a/TransferList/Presentation/HomeScene/View/HomeViewController.swift +++ b/TransferList/Presentation/HomeScene/View/HomeViewController.swift @@ -19,11 +19,13 @@ class HomeViewController: BaseCollectionViewController { override func setupViews() { super.setupViews() + collectionView.contentInset.top = 32 collectionView.delegate = self configureRefresher() configureDataSource() observeDidChangeData() viewModel.fetchTransferList() + viewModel.fetchFavoriteList() } override var spaceSeparatorFromEdgeInList: CGFloat { return 0 } @@ -54,6 +56,24 @@ class HomeViewController: BaseCollectionViewController { } .store(in: &subscriptions) } + + func createCustomSection(at section: Int) -> NSCollectionLayoutSection? { + guard dataSource.sectionIdentifier(atSection: section) == .favoriteBankAcconts else { + return nil + } + + let itemSize = NSCollectionLayoutSize(widthDimension: .estimated(80), + heightDimension: .estimated(80)) + let item = NSCollectionLayoutItem(layoutSize: itemSize) + item.edgeSpacing = .init(leading: .fixed(18), top: nil, trailing: nil, bottom: nil) + + let group = NSCollectionLayoutGroup.horizontal(layoutSize: itemSize, subitems: [item]) + + let section = NSCollectionLayoutSection(group: group) + section.orthogonalScrollingBehavior = .continuous + + return section + } } extension HomeViewController: UICollectionViewDelegate { diff --git a/TransferList/Presentation/HomeScene/ViewModel/TransferViewModel.swift b/TransferList/Presentation/HomeScene/ViewModel/TransferViewModel.swift index 43051b4..0beab04 100644 --- a/TransferList/Presentation/HomeScene/ViewModel/TransferViewModel.swift +++ b/TransferList/Presentation/HomeScene/ViewModel/TransferViewModel.swift @@ -31,12 +31,23 @@ class TransferViewModel { subscriptions.removeAll() } -// private func updateViewState(newState viewState: ViewState) { -// self.viewState = viewState -// } + private func updateViewState(newState viewState: ViewState) { + self.viewState = viewState + } + + public func fetchFavoriteList() { + useCase.fetchPersonAccounts(withOffest: paginationMode.nextOffset) + .replaceError(with: []) + .receive(on: DispatchQueue.main) + .sink(receiveValue: { [weak self] accounts in + guard let self else { return } + self.dataUpdated = self.dataFromLocal + }) + .store(in: &subscriptions) + } public func fetchTransferList() { - viewState = .loading + updateViewState(newState: .loading) useCase.fetchPersonAccounts(withOffest: paginationMode.nextOffset) .receive(on: DispatchQueue.main) @@ -47,7 +58,7 @@ class TransferViewModel { case .finished: break case .failure(let error): - self.viewState = .error(message: error.localizedDescription) + updateViewState(newState: .error(message: error.localizedDescription)) break } @@ -55,7 +66,7 @@ class TransferViewModel { guard let self else { return } self.updateAccounts(appendAccounts: accounts) self.paginationMode.moveToNextOffset() - self.viewState = .result + updateViewState(newState: .result) } .store(in: &subscriptions) } diff --git a/TransferList/Resources/Assets.xcassets/AccentColor.colorset/Contents.json b/TransferList/Resources/Assets.xcassets/AccentColor.colorset/Contents.json deleted file mode 100644 index eb87897..0000000 --- a/TransferList/Resources/Assets.xcassets/AccentColor.colorset/Contents.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "colors" : [ - { - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/TransferList/Resources/Assets.xcassets/imageFailed.imageset/Contents.json b/TransferList/Resources/Assets.xcassets/imageFailed.imageset/Contents.json new file mode 100644 index 0000000..5b8b25c --- /dev/null +++ b/TransferList/Resources/Assets.xcassets/imageFailed.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "filename" : "imageFailed-light.png", + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "imageFailed-dark.png", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/TransferList/Resources/Assets.xcassets/imageFailed.imageset/imageFailed-dark.png b/TransferList/Resources/Assets.xcassets/imageFailed.imageset/imageFailed-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..ede0dff2e42e6b2e09abe91527ce3487b34b52b9 GIT binary patch literal 6460 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 literal 0 HcmV?d00001 diff --git a/TransferList/Resources/Assets.xcassets/imageFailed.imageset/imageFailed-light.png b/TransferList/Resources/Assets.xcassets/imageFailed.imageset/imageFailed-light.png new file mode 100644 index 0000000000000000000000000000000000000000..5897e8c440bed6f24311695124075f5dcfb7c02f GIT binary patch literal 6290 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 XkJQt@uQ5yhg#a+rHP)%tvJ3qmwl30G literal 0 HcmV?d00001 From 19ec39ef57cbaad10f14d7f0b6f8e2592461f181 Mon Sep 17 00:00:00 2001 From: Hessam Mahdiabadi <67460597+iamHEssam@users.noreply.github.com> Date: Mon, 6 Nov 2023 19:09:47 +0330 Subject: [PATCH 28/34] Add DetailViewController, HeaderInformationCell, and TitleValueCell - Added the DetailViewController for displaying more account information. - Added the HeaderInformationCell for presenting header content. - Added the TitleValueCell for displaying title-value pairs. --- TransferList.xcodeproj/project.pbxproj | 58 +++++++++++++- TransferList/Extra/Core/Router.swift | 26 +++++++ .../DetailAccountScene/Model/DetailItem.swift | 34 +++++++++ .../View/Cell/HeaderInformationCell.swift | 23 ++++++ .../View/Cell/TitleValueCell.swift | 42 +++++++++++ .../View/DetailAccountDataSource.swift | 73 ++++++++++++++++++ .../View/DetailAccountViewConroller.swift | 75 +++++++++++++++++++ .../HomeScene/{View => Model}/HomeItem.swift | 0 .../View/HomeCollectionViewDataSource.swift | 12 +++ .../HomeScene/View/HomeViewController.swift | 36 ++++++++- .../ViewModel/TransferViewModel.swift | 31 ++++---- 11 files changed, 393 insertions(+), 17 deletions(-) create mode 100644 TransferList/Extra/Core/Router.swift create mode 100644 TransferList/Presentation/DetailAccountScene/Model/DetailItem.swift create mode 100644 TransferList/Presentation/DetailAccountScene/View/Cell/HeaderInformationCell.swift create mode 100644 TransferList/Presentation/DetailAccountScene/View/Cell/TitleValueCell.swift create mode 100644 TransferList/Presentation/DetailAccountScene/View/DetailAccountDataSource.swift create mode 100644 TransferList/Presentation/DetailAccountScene/View/DetailAccountViewConroller.swift rename TransferList/Presentation/HomeScene/{View => Model}/HomeItem.swift (100%) diff --git a/TransferList.xcodeproj/project.pbxproj b/TransferList.xcodeproj/project.pbxproj index 3d1f9cb..e809575 100644 --- a/TransferList.xcodeproj/project.pbxproj +++ b/TransferList.xcodeproj/project.pbxproj @@ -30,6 +30,12 @@ DEFF1DD52AF9122D00673B8C /* ViewState.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEFF1DD42AF9122D00673B8C /* ViewState.swift */; }; DEFF1DD72AF91A8A00673B8C /* FavoriteAccountCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEFF1DD62AF91A8900673B8C /* FavoriteAccountCell.swift */; }; DEFF1DD92AF92DB500673B8C /* AccountCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEFF1DD82AF92DB500673B8C /* AccountCell.swift */; }; + DEFF1DDF2AF9341800673B8C /* DetailAccountViewConroller.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEFF1DDE2AF9341800673B8C /* DetailAccountViewConroller.swift */; }; + DEFF1DE12AF9356200673B8C /* DetailAccountDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEFF1DE02AF9356200673B8C /* DetailAccountDataSource.swift */; }; + DEFF1DE42AF9358E00673B8C /* DetailItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEFF1DE32AF9358E00673B8C /* DetailItem.swift */; }; + DEFF1DE72AF9366900673B8C /* TitleValueCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEFF1DE62AF9366900673B8C /* TitleValueCell.swift */; }; + DEFF1DEA2AF93B1200673B8C /* Router.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEFF1DE92AF93B1200673B8C /* Router.swift */; }; + DEFF1DEC2AF93E2F00673B8C /* HeaderInformationCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEFF1DEB2AF93E2F00673B8C /* HeaderInformationCell.swift */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -57,6 +63,12 @@ DEFF1DD42AF9122D00673B8C /* ViewState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewState.swift; sourceTree = ""; }; DEFF1DD62AF91A8900673B8C /* FavoriteAccountCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FavoriteAccountCell.swift; sourceTree = ""; }; DEFF1DD82AF92DB500673B8C /* AccountCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountCell.swift; sourceTree = ""; }; + DEFF1DDE2AF9341800673B8C /* DetailAccountViewConroller.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DetailAccountViewConroller.swift; sourceTree = ""; }; + DEFF1DE02AF9356200673B8C /* DetailAccountDataSource.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DetailAccountDataSource.swift; sourceTree = ""; }; + DEFF1DE32AF9358E00673B8C /* DetailItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DetailItem.swift; sourceTree = ""; }; + DEFF1DE62AF9366900673B8C /* TitleValueCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TitleValueCell.swift; sourceTree = ""; }; + DEFF1DE92AF93B1200673B8C /* Router.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Router.swift; sourceTree = ""; }; + DEFF1DEB2AF93E2F00673B8C /* HeaderInformationCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HeaderInformationCell.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -127,7 +139,6 @@ DE690EB02AF8455400E8C451 /* HomeViewController.swift */, DE690EB22AF84A1C00E8C451 /* Main.storyboard */, DEFF1DBF2AF8DFA500673B8C /* HomeCollectionViewDataSource.swift */, - DEFF1DC12AF8DFE300673B8C /* HomeItem.swift */, ); path = View; sourceTree = ""; @@ -174,6 +185,7 @@ DEFF1DBA2AF8DDFE00673B8C /* Presentation */ = { isa = PBXGroup; children = ( + DEFF1DDA2AF933DA00673B8C /* DetailAccountScene */, DE690EAD2AF8452500E8C451 /* HomeScene */, ); path = Presentation; @@ -204,6 +216,7 @@ DEFF1DC72AF8EAD300673B8C /* ViewModelFactory.swift */, DEFF1DCF2AF8F8BB00673B8C /* PaginationMode.swift */, DEFF1DD42AF9122D00673B8C /* ViewState.swift */, + DEFF1DE92AF93B1200673B8C /* Router.swift */, ); path = Core; sourceTree = ""; @@ -211,11 +224,48 @@ DEFF1DD12AF8FF6D00673B8C /* Model */ = { isa = PBXGroup; children = ( + DEFF1DC12AF8DFE300673B8C /* HomeItem.swift */, DEFF1DD22AF8FF8100673B8C /* DataTransfer.swift */, ); path = Model; sourceTree = ""; }; + DEFF1DDA2AF933DA00673B8C /* DetailAccountScene */ = { + isa = PBXGroup; + children = ( + DEFF1DDC2AF933EA00673B8C /* Model */, + DEFF1DDB2AF933E800673B8C /* View */, + ); + path = DetailAccountScene; + sourceTree = ""; + }; + DEFF1DDB2AF933E800673B8C /* View */ = { + isa = PBXGroup; + children = ( + DEFF1DE52AF9363700673B8C /* Cell */, + DEFF1DDE2AF9341800673B8C /* DetailAccountViewConroller.swift */, + DEFF1DE02AF9356200673B8C /* DetailAccountDataSource.swift */, + ); + path = View; + sourceTree = ""; + }; + DEFF1DDC2AF933EA00673B8C /* Model */ = { + isa = PBXGroup; + children = ( + DEFF1DE32AF9358E00673B8C /* DetailItem.swift */, + ); + path = Model; + sourceTree = ""; + }; + DEFF1DE52AF9363700673B8C /* Cell */ = { + isa = PBXGroup; + children = ( + DEFF1DE62AF9366900673B8C /* TitleValueCell.swift */, + DEFF1DEB2AF93E2F00673B8C /* HeaderInformationCell.swift */, + ); + path = Cell; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -298,12 +348,17 @@ files = ( DEFF1DBD2AF8DEE400673B8C /* LargeHeaderCell.swift in Sources */, DEFF1DCA2AF8EC6A00673B8C /* VerticalAccountCell.swift in Sources */, + DEFF1DDF2AF9341800673B8C /* DetailAccountViewConroller.swift in Sources */, + DEFF1DEC2AF93E2F00673B8C /* HeaderInformationCell.swift in Sources */, DEFF1DC42AF8E8DC00673B8C /* TransferViewModel.swift in Sources */, + DEFF1DE42AF9358E00673B8C /* DetailItem.swift in Sources */, DEFF1DC22AF8DFE300673B8C /* HomeItem.swift in Sources */, DEFF1DC82AF8EAD300673B8C /* ViewModelFactory.swift in Sources */, DE690EB12AF8455400E8C451 /* HomeViewController.swift in Sources */, DEFF1DD02AF8F8BB00673B8C /* PaginationMode.swift in Sources */, DE690EAA2AF842F800E8C451 /* DIContainer.swift in Sources */, + DEFF1DEA2AF93B1200673B8C /* Router.swift in Sources */, + DEFF1DE12AF9356200673B8C /* DetailAccountDataSource.swift in Sources */, DEFF1DD52AF9122D00673B8C /* ViewState.swift in Sources */, DEFF1DD92AF92DB500673B8C /* AccountCell.swift in Sources */, DEBE4AC32AF6C3B000A58501 /* AppDelegate.swift in Sources */, @@ -311,6 +366,7 @@ DEFF1DC02AF8DFA500673B8C /* HomeCollectionViewDataSource.swift in Sources */, DEFF1DD32AF8FF8100673B8C /* DataTransfer.swift in Sources */, DE690EAC2AF8432500E8C451 /* DIContainerImpl.swift in Sources */, + DEFF1DE72AF9366900673B8C /* TitleValueCell.swift in Sources */, DEFF1DD72AF91A8A00673B8C /* FavoriteAccountCell.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/TransferList/Extra/Core/Router.swift b/TransferList/Extra/Core/Router.swift new file mode 100644 index 0000000..fa2dcc1 --- /dev/null +++ b/TransferList/Extra/Core/Router.swift @@ -0,0 +1,26 @@ +// +// Router.swift +// TransferList +// +// Created by Hessam Mahdiabadi on 11/6/23. +// + +import Foundation +import Domain + +enum Router: Hashable, Equatable { + + case home + case detail(account: PersonBankAccount) + + func hash(into hasher: inout Hasher) { + switch self { + case .home: hasher.combine("home") + case .detail(let account): hasher.combine(account) + } + } + + static func == (lhs: Router, rhs: Router) -> Bool { + return lhs.hashValue == rhs.hashValue + } +} diff --git a/TransferList/Presentation/DetailAccountScene/Model/DetailItem.swift b/TransferList/Presentation/DetailAccountScene/Model/DetailItem.swift new file mode 100644 index 0000000..e1cc644 --- /dev/null +++ b/TransferList/Presentation/DetailAccountScene/Model/DetailItem.swift @@ -0,0 +1,34 @@ +// +// DetailItem.swift +// TransferList +// +// Created by Hessam Mahdiabadi on 11/6/23. +// + +import Foundation +import Domain + +enum DetailItem: Hashable { + typealias UISection = (section: DetailItem.Section, items: [DetailItem]) + + enum Section: CaseIterable { + case title + case information + } + + case header(title: String) + case information(title: String, value: Int) + + func hash(into hasher: inout Hasher) { + switch self { + case .header(let title): hasher.combine(title) + case .information(let title, let value): + hasher.combine(title) + hasher.combine(value) + } + } + + static func == (lhs: DetailItem, rhs: DetailItem) -> Bool { + return lhs.hashValue == rhs.hashValue + } +} diff --git a/TransferList/Presentation/DetailAccountScene/View/Cell/HeaderInformationCell.swift b/TransferList/Presentation/DetailAccountScene/View/Cell/HeaderInformationCell.swift new file mode 100644 index 0000000..b175bf4 --- /dev/null +++ b/TransferList/Presentation/DetailAccountScene/View/Cell/HeaderInformationCell.swift @@ -0,0 +1,23 @@ +// +// HeaderInformationCell.swift +// TransferList +// +// Created by Hessam Mahdiabadi on 11/6/23. +// + +import UIKit +import UI + +class HeaderInformationCell: BaseCollectionCell { + + @InstantiateView(type: SubTitleLabel.self) private var title + + override func setupViews() { + self.addSubview(title) + title.pinToSuperview() + } + + public func setTitle(_ text: String) { + title.text = text + } +} diff --git a/TransferList/Presentation/DetailAccountScene/View/Cell/TitleValueCell.swift b/TransferList/Presentation/DetailAccountScene/View/Cell/TitleValueCell.swift new file mode 100644 index 0000000..71c7e13 --- /dev/null +++ b/TransferList/Presentation/DetailAccountScene/View/Cell/TitleValueCell.swift @@ -0,0 +1,42 @@ +// +// TitleValueCell.swift +// TransferList +// +// Created by Hessam Mahdiabadi on 11/6/23. +// + +import UIKit +import UI + +class TitleValueCell: BaseCollectionCell { + + @InstantiateView(type: ListLabel.self) var titleLabel + @InstantiateView(type: SubTitleLabel.self) var valueLabel + + override func setupViews() { + addSubview(titleLabel) + addSubview(valueLabel) + + NSLayoutConstraint.activate([ + titleLabel.leadingAnchor.constraint(equalTo: leadingSafeMargin, constant: 16), + titleLabel.topAnchor.constraint(equalTo: topSafeMargin, constant: 22), + titleLabel.bottomAnchor.constraint(equalTo: bottomSafeMargin, constant: -22), + titleLabel.widthAnchor.constraint(lessThanOrEqualTo: widthSafeMargin, multiplier: 0.55), + valueLabel.trailingAnchor.constraint(equalTo: trailingSafeMargin, constant: -16), + valueLabel.topAnchor.constraint(equalTo: topSafeMargin, constant: 22), + valueLabel.bottomAnchor.constraint(equalTo: bottomSafeMargin, constant: -22), + valueLabel.widthAnchor.constraint(lessThanOrEqualTo: widthSafeMargin, multiplier: 0.4) + ]) + + configureContentLabel() + } + + private func configureContentLabel() { + valueLabel.textAlignment = .right + } + + func set(title: String, value: Int) { + self.titleLabel.text = title + self.valueLabel.text = "\(value)" + } +} diff --git a/TransferList/Presentation/DetailAccountScene/View/DetailAccountDataSource.swift b/TransferList/Presentation/DetailAccountScene/View/DetailAccountDataSource.swift new file mode 100644 index 0000000..52d9cdd --- /dev/null +++ b/TransferList/Presentation/DetailAccountScene/View/DetailAccountDataSource.swift @@ -0,0 +1,73 @@ +// +// DetailAccountDataSource.swift +// TransferList +// +// Created by Hessam Mahdiabadi on 11/6/23. +// + +import UIKit +import UI +import Domain + +class DetailAccountDataSource { + private typealias DiffableDataSource = UICollectionViewDiffableDataSource + private typealias DiffableSnapshot = NSDiffableDataSourceSnapshot + typealias UISection = DetailItem.UISection + + private var dataSource: DiffableDataSource! + private var collectionView: BaseCollectionView + + init(collectionView: BaseCollectionView) { + self.collectionView = collectionView + + configureCollectionView() + configureDiffableDataSource() + } + + private func configureCollectionView() { + collectionView.registerReusableCell(type: TitleValueCell.self) + collectionView.registerReusableCell(type: HeaderInformationCell.self) + } + + private func configureDiffableDataSource() { + dataSource = UICollectionViewDiffableDataSource(collectionView: collectionView, + cellProvider: { [weak self] _, indexPath, itemIdentifier in + switch itemIdentifier { + case .information(let title, let value): + return self?.createValueCell(for: indexPath, title: title, value: value) + case .header(let title): + return self?.createHeaderCell(for: indexPath, title: title) + } + }) + + self.dataSource.supplementaryViewProvider = collectionView.makeSeprator() + } + + private func createHeaderCell(for indexPath: IndexPath, title: String) -> HeaderInformationCell { + let cell: HeaderInformationCell = collectionView.dequeueReusableCell(for: indexPath) + cell.setTitle(title) + return cell + } + + private func createValueCell(for indexPath: IndexPath, title: String, value: Int) -> TitleValueCell { + let cell: TitleValueCell = collectionView.dequeueReusableCell(for: indexPath) + cell.set(title: title, value: value) + return cell + } + + public func showInformation(_ cardInformation: CardTransferCount?) { + var initialSnapshot = dataSource.snapshot() + + initialSnapshot.appendSections([.title, .information]) + let header = DetailItem.header(title: "More information") + initialSnapshot.appendItems([header], toSection: .title) + + let total = DetailItem.information(title: "Total transfer", + value: cardInformation?.totalTransfer ?? 0) + let numberOfTrans = DetailItem.information(title: "Number of transfers", + value: cardInformation?.numberOfTransfers ?? 0) + initialSnapshot.appendItems([total, numberOfTrans], toSection: .information) + + dataSource.apply(initialSnapshot, animatingDifferences: false) + } +} diff --git a/TransferList/Presentation/DetailAccountScene/View/DetailAccountViewConroller.swift b/TransferList/Presentation/DetailAccountScene/View/DetailAccountViewConroller.swift new file mode 100644 index 0000000..f38f12e --- /dev/null +++ b/TransferList/Presentation/DetailAccountScene/View/DetailAccountViewConroller.swift @@ -0,0 +1,75 @@ +// +// DetailAccountViewConroller.swift +// TransferList +// +// Created by Hessam Mahdiabadi on 11/6/23. +// + +import UIKit +import UI +import Combine +import Domain + +class DetailAccountViewConroller: BaseCollectionViewController { + + struct Configuration { + var viewModel: TransferViewModel + var account: PersonBankAccount + } + + private var dataSource: DetailAccountDataSource! + private var viewModel: TransferViewModel! + private var account: PersonBankAccount! + private var subscriptions = Set() + + override func setupViews() { + super.setupViews() + + configureCollectionView() + configureDataSource() + observeDidChangeData() + showInformation() + } + + func updateConfiguration(_ configuration: Configuration) { + self.account = configuration.account + self.viewModel = configuration.viewModel + } + + override var spaceSeparatorFromEdgeInList: CGFloat { return 12 } + + private func configureCollectionView() { + collectionView.contentInset.top = 32 + } + + private func configureDataSource() { + dataSource = .init(collectionView: collectionView) + } + + private func observeDidChangeData() { +// viewModel.$dataUpdated +// .compactMap { $0 } +// .sink { [weak self] data in +// self?.refresher.endRefreshing() +// self?.dataSource.updateData(data) +// } +// .store(in: &subscriptions) + } + + private func showInformation() { + dataSource.showInformation(account.cardTransferCount) + } + + func isNeedBorder(at section: Int) -> Bool { + return section == 0 ? false : true + } + + func contentInsets(at section: Int, currentConfig: NSDirectionalEdgeInsets) -> NSDirectionalEdgeInsets { + var editConfig = currentConfig + if section == 0 { + editConfig.bottom = -12 + } + + return editConfig + } +} diff --git a/TransferList/Presentation/HomeScene/View/HomeItem.swift b/TransferList/Presentation/HomeScene/Model/HomeItem.swift similarity index 100% rename from TransferList/Presentation/HomeScene/View/HomeItem.swift rename to TransferList/Presentation/HomeScene/Model/HomeItem.swift diff --git a/TransferList/Presentation/HomeScene/View/HomeCollectionViewDataSource.swift b/TransferList/Presentation/HomeScene/View/HomeCollectionViewDataSource.swift index ae7597c..af5e302 100644 --- a/TransferList/Presentation/HomeScene/View/HomeCollectionViewDataSource.swift +++ b/TransferList/Presentation/HomeScene/View/HomeCollectionViewDataSource.swift @@ -146,4 +146,16 @@ class HomeCollectionViewDataSource { return dataSource.snapshot().sectionIdentifier(containingItem: item) } } + + func getAccount(at indexPath: IndexPath) -> PersonBankAccount? { + guard let homeItem = dataSource.itemIdentifier(for: indexPath) else { + return nil + } + + guard case let .personBankAccount(account) = homeItem else { + return nil + } + + return account + } } diff --git a/TransferList/Presentation/HomeScene/View/HomeViewController.swift b/TransferList/Presentation/HomeScene/View/HomeViewController.swift index 6197cd6..1210654 100644 --- a/TransferList/Presentation/HomeScene/View/HomeViewController.swift +++ b/TransferList/Presentation/HomeScene/View/HomeViewController.swift @@ -8,6 +8,7 @@ import UIKit import UI import Combine +import Domain class HomeViewController: BaseCollectionViewController { @@ -18,9 +19,8 @@ class HomeViewController: BaseCollectionViewController { override func setupViews() { super.setupViews() - - collectionView.contentInset.top = 32 - collectionView.delegate = self + + configureCollectionView() configureRefresher() configureDataSource() observeDidChangeData() @@ -30,6 +30,11 @@ class HomeViewController: BaseCollectionViewController { override var spaceSeparatorFromEdgeInList: CGFloat { return 0 } + private func configureCollectionView() { + collectionView.contentInset.top = 32 + collectionView.delegate = self + } + private func configureRefresher() { collectionView.alwaysBounceVertical = true refresher.tintColor = Theme.supplementaryBackground @@ -55,6 +60,24 @@ class HomeViewController: BaseCollectionViewController { self?.dataSource.updateData(data) } .store(in: &subscriptions) + + viewModel.$changeView + .compactMap { $0 } + .sink { [weak self] route in + guard case let .detail(account) = route else { + return + } + self?.navigateToDetailViewController(withAccount: account) + } + .store(in: &subscriptions) + } + + private func navigateToDetailViewController(withAccount account: PersonBankAccount) { + let detailViewController = DetailAccountViewConroller() + detailViewController.updateConfiguration(.init(viewModel: viewModel, + account: account)) + + navigationController?.pushViewController(detailViewController, animated: true) } func createCustomSection(at section: Int) -> NSCollectionLayoutSection? { @@ -78,6 +101,13 @@ class HomeViewController: BaseCollectionViewController { extension HomeViewController: UICollectionViewDelegate { + func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { + guard let account = dataSource.getAccount(at: indexPath) else { + return + } + viewModel.accountSelected(account) + } + func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) { guard let section = dataSource.sectionIdentifier(atIndexPath: indexPath) else { diff --git a/TransferList/Presentation/HomeScene/ViewModel/TransferViewModel.swift b/TransferList/Presentation/HomeScene/ViewModel/TransferViewModel.swift index 0beab04..356883c 100644 --- a/TransferList/Presentation/HomeScene/ViewModel/TransferViewModel.swift +++ b/TransferList/Presentation/HomeScene/ViewModel/TransferViewModel.swift @@ -13,6 +13,7 @@ class TransferViewModel { @Published var viewState: ViewState! @Published var dataUpdated: DataTransfer! + @Published var changeView: Router! private let useCase: PersonBankAccountUseCase private var subscriptions = Set() private var paginationMode = PaginationMode() @@ -35,6 +36,21 @@ class TransferViewModel { self.viewState = viewState } + private func updateAccounts(appendAccounts accounts: [PersonBankAccount]) { + guard !accounts.isEmpty else { + paginationMode.mode = .reachedToEnd + return + } + + if dataFromServer == nil { + dataFromServer = .init(list: accounts, mode: .initial, section: .personBankAccounts) + } else { + dataFromServer.append(contentsOf: accounts) + } + + dataUpdated = dataFromServer + } + public func fetchFavoriteList() { useCase.fetchPersonAccounts(withOffest: paginationMode.nextOffset) .replaceError(with: []) @@ -90,18 +106,7 @@ class TransferViewModel { fetchTransferList() } - private func updateAccounts(appendAccounts accounts: [PersonBankAccount]) { - guard !accounts.isEmpty else { - paginationMode.mode = .reachedToEnd - return - } - - if dataFromServer == nil { - dataFromServer = .init(list: accounts, mode: .initial, section: .personBankAccounts) - } else { - dataFromServer.append(contentsOf: accounts) - } - - dataUpdated = dataFromServer + public func accountSelected(_ account: PersonBankAccount) { + changeView = .detail(account: account) } } From 1adf068558a375a111dff625a4da73ecb403aa0c Mon Sep 17 00:00:00 2001 From: Hessam Mahdiabadi <67460597+iamHEssam@users.noreply.github.com> Date: Mon, 6 Nov 2023 21:33:26 +0330 Subject: [PATCH 29/34] Add Save and Remove from Favorites, Data Reload in DetailViewController, ViewModel Update - Added functionality for saving and removing items from favorites. - Updated the DetailViewController to reload data as needed. - Enhanced the TransferViewModel to handle favorites addition or removal. - Added the AddRemove component for managing these operations. --- TransferList.xcodeproj/project.pbxproj | 4 ++ TransferList/Extra/Core/ViewState.swift | 10 +++- .../DetailAccountScene/Model/DetailItem.swift | 4 ++ .../View/Cell/AddRemoveFavoriteCell.swift | 41 ++++++++++++++ .../View/DetailAccountDataSource.swift | 37 ++++++++++++- .../View/DetailAccountViewConroller.swift | 55 ++++++++++++++++--- .../HomeScene/Model/DataTransfer.swift | 10 ++++ .../HomeScene/Model/HomeItem.swift | 5 ++ .../View/Cell/FavoriteAccountCell.swift | 8 ++- .../View/HomeCollectionViewDataSource.swift | 32 ++++++++--- .../HomeScene/View/HomeViewController.swift | 10 +++- .../ViewModel/TransferViewModel.swift | 42 +++++++++++++- 12 files changed, 233 insertions(+), 25 deletions(-) create mode 100644 TransferList/Presentation/DetailAccountScene/View/Cell/AddRemoveFavoriteCell.swift diff --git a/TransferList.xcodeproj/project.pbxproj b/TransferList.xcodeproj/project.pbxproj index e809575..b678995 100644 --- a/TransferList.xcodeproj/project.pbxproj +++ b/TransferList.xcodeproj/project.pbxproj @@ -36,6 +36,7 @@ DEFF1DE72AF9366900673B8C /* TitleValueCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEFF1DE62AF9366900673B8C /* TitleValueCell.swift */; }; DEFF1DEA2AF93B1200673B8C /* Router.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEFF1DE92AF93B1200673B8C /* Router.swift */; }; DEFF1DEC2AF93E2F00673B8C /* HeaderInformationCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEFF1DEB2AF93E2F00673B8C /* HeaderInformationCell.swift */; }; + DEFF1DEE2AF949FC00673B8C /* AddRemoveFavoriteCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEFF1DED2AF949FC00673B8C /* AddRemoveFavoriteCell.swift */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -69,6 +70,7 @@ DEFF1DE62AF9366900673B8C /* TitleValueCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TitleValueCell.swift; sourceTree = ""; }; DEFF1DE92AF93B1200673B8C /* Router.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Router.swift; sourceTree = ""; }; DEFF1DEB2AF93E2F00673B8C /* HeaderInformationCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HeaderInformationCell.swift; sourceTree = ""; }; + DEFF1DED2AF949FC00673B8C /* AddRemoveFavoriteCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddRemoveFavoriteCell.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -262,6 +264,7 @@ children = ( DEFF1DE62AF9366900673B8C /* TitleValueCell.swift */, DEFF1DEB2AF93E2F00673B8C /* HeaderInformationCell.swift */, + DEFF1DED2AF949FC00673B8C /* AddRemoveFavoriteCell.swift */, ); path = Cell; sourceTree = ""; @@ -359,6 +362,7 @@ DE690EAA2AF842F800E8C451 /* DIContainer.swift in Sources */, DEFF1DEA2AF93B1200673B8C /* Router.swift in Sources */, DEFF1DE12AF9356200673B8C /* DetailAccountDataSource.swift in Sources */, + DEFF1DEE2AF949FC00673B8C /* AddRemoveFavoriteCell.swift in Sources */, DEFF1DD52AF9122D00673B8C /* ViewState.swift in Sources */, DEFF1DD92AF92DB500673B8C /* AccountCell.swift in Sources */, DEBE4AC32AF6C3B000A58501 /* AppDelegate.swift in Sources */, diff --git a/TransferList/Extra/Core/ViewState.swift b/TransferList/Extra/Core/ViewState.swift index ebd4a54..f19ddfc 100644 --- a/TransferList/Extra/Core/ViewState.swift +++ b/TransferList/Extra/Core/ViewState.swift @@ -7,7 +7,7 @@ import Foundation -enum ViewState: Hashable, Equatable { +enum ViewState: Hashable, Equatable, CustomStringConvertible { case loading case result @@ -21,6 +21,14 @@ enum ViewState: Hashable, Equatable { } } + var description: String { + switch self { + case .error(let message): return message + case .result: return "result" + case .loading: return "loading" + } + } + static func == (lhs: ViewState, rhs: ViewState) -> Bool { return lhs.hashValue == rhs.hashValue } diff --git a/TransferList/Presentation/DetailAccountScene/Model/DetailItem.swift b/TransferList/Presentation/DetailAccountScene/Model/DetailItem.swift index e1cc644..951b80c 100644 --- a/TransferList/Presentation/DetailAccountScene/Model/DetailItem.swift +++ b/TransferList/Presentation/DetailAccountScene/Model/DetailItem.swift @@ -18,6 +18,7 @@ enum DetailItem: Hashable { case header(title: String) case information(title: String, value: Int) + case addRemoveFavorite(isFavorite: Bool) func hash(into hasher: inout Hasher) { switch self { @@ -25,6 +26,9 @@ enum DetailItem: Hashable { case .information(let title, let value): hasher.combine(title) hasher.combine(value) + case .addRemoveFavorite(let isFavorite): + hasher.combine(isFavorite) + hasher.combine("addRmoveFavorite") } } diff --git a/TransferList/Presentation/DetailAccountScene/View/Cell/AddRemoveFavoriteCell.swift b/TransferList/Presentation/DetailAccountScene/View/Cell/AddRemoveFavoriteCell.swift new file mode 100644 index 0000000..5524801 --- /dev/null +++ b/TransferList/Presentation/DetailAccountScene/View/Cell/AddRemoveFavoriteCell.swift @@ -0,0 +1,41 @@ +// +// AddRemoveFavoriteCell.swift +// TransferList +// +// Created by Hessam Mahdiabadi on 11/6/23. +// + +import UIKit +import Domain +import UI + +class AddRemoveFavoriteCell: BaseCollectionCell { + + @InstantiateView(type: ListLabel.self) var titleLabel + + override func setupViews() { + addSubview(titleLabel) + + NSLayoutConstraint.activate([ + titleLabel.leadingAnchor.constraint(equalTo: leadingSafeMargin, constant: 16), + titleLabel.topAnchor.constraint(equalTo: topSafeMargin, constant: 22), + titleLabel.trailingAnchor.constraint(equalTo: trailingSafeMargin, constant: -16), + titleLabel.bottomAnchor.constraint(equalTo: bottomSafeMargin, constant: -22) + ]) + + configureTitleLabel() + } + + func configureTitleLabel() { + self.titleLabel.textAlignment = .center + } + + func setFavoriteStatus(isFavorite: Bool) { + if isFavorite { + self.titleLabel.textColor = .red + } else { + self.titleLabel.textColor = Theme.blue + } + titleLabel.text = isFavorite ? "Remove from favorite" : "Save to favorite" + } +} diff --git a/TransferList/Presentation/DetailAccountScene/View/DetailAccountDataSource.swift b/TransferList/Presentation/DetailAccountScene/View/DetailAccountDataSource.swift index 52d9cdd..07510ee 100644 --- a/TransferList/Presentation/DetailAccountScene/View/DetailAccountDataSource.swift +++ b/TransferList/Presentation/DetailAccountScene/View/DetailAccountDataSource.swift @@ -27,6 +27,7 @@ class DetailAccountDataSource { private func configureCollectionView() { collectionView.registerReusableCell(type: TitleValueCell.self) collectionView.registerReusableCell(type: HeaderInformationCell.self) + collectionView.registerReusableCell(type: AddRemoveFavoriteCell.self) } private func configureDiffableDataSource() { @@ -37,6 +38,8 @@ class DetailAccountDataSource { return self?.createValueCell(for: indexPath, title: title, value: value) case .header(let title): return self?.createHeaderCell(for: indexPath, title: title) + case .addRemoveFavorite(let isFavorite): + return self?.createAddRemoveFavorite(for: indexPath, isFavorite: isFavorite) } }) @@ -55,19 +58,49 @@ class DetailAccountDataSource { return cell } - public func showInformation(_ cardInformation: CardTransferCount?) { + private func createAddRemoveFavorite(for indexPath: IndexPath, + isFavorite: Bool) -> AddRemoveFavoriteCell { + let cell: AddRemoveFavoriteCell = collectionView.dequeueReusableCell(for: indexPath) + cell.setFavoriteStatus(isFavorite: isFavorite) + return cell + } + + public func showInformation(_ account: PersonBankAccount) { var initialSnapshot = dataSource.snapshot() initialSnapshot.appendSections([.title, .information]) let header = DetailItem.header(title: "More information") initialSnapshot.appendItems([header], toSection: .title) + let cardInformation = account.cardTransferCount let total = DetailItem.information(title: "Total transfer", value: cardInformation?.totalTransfer ?? 0) let numberOfTrans = DetailItem.information(title: "Number of transfers", value: cardInformation?.numberOfTransfers ?? 0) - initialSnapshot.appendItems([total, numberOfTrans], toSection: .information) + let addRemove = DetailItem.addRemoveFavorite(isFavorite: account.isFavorite) + + initialSnapshot.appendItems([total, numberOfTrans, addRemove], toSection: .information) dataSource.apply(initialSnapshot, animatingDifferences: false) } + + public func updateFavoriteStatus(isFavorite: Bool) { + let indexPath = IndexPath(row: 2, section: 1) + guard let oldItem = dataSource.itemIdentifier(for: indexPath) else { return } + let addRemove = DetailItem.addRemoveFavorite(isFavorite: isFavorite) + + var newSnapShot = dataSource.snapshot() + newSnapShot.deleteItems([oldItem]) + newSnapShot.appendItems([addRemove], toSection: .information) + + dataSource.apply(newSnapShot, animatingDifferences: true) + } + + public func getItem(at indexPath: IndexPath) -> DetailItem? { + guard let detailItem = dataSource.itemIdentifier(for: indexPath) else { + return nil + } + + return detailItem + } } diff --git a/TransferList/Presentation/DetailAccountScene/View/DetailAccountViewConroller.swift b/TransferList/Presentation/DetailAccountScene/View/DetailAccountViewConroller.swift index f38f12e..99ed2ff 100644 --- a/TransferList/Presentation/DetailAccountScene/View/DetailAccountViewConroller.swift +++ b/TransferList/Presentation/DetailAccountScene/View/DetailAccountViewConroller.swift @@ -31,6 +31,18 @@ class DetailAccountViewConroller: BaseCollectionViewController { showInformation() } + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + + navigationController?.isNavigationBarHidden = false + } + + override func viewWillDisappear(_ animated: Bool) { + super.viewWillDisappear(animated) + + navigationController?.isNavigationBarHidden = true + } + func updateConfiguration(_ configuration: Configuration) { self.account = configuration.account self.viewModel = configuration.viewModel @@ -39,6 +51,7 @@ class DetailAccountViewConroller: BaseCollectionViewController { override var spaceSeparatorFromEdgeInList: CGFloat { return 12 } private func configureCollectionView() { + collectionView.delegate = self collectionView.contentInset.top = 32 } @@ -47,17 +60,27 @@ class DetailAccountViewConroller: BaseCollectionViewController { } private func observeDidChangeData() { -// viewModel.$dataUpdated -// .compactMap { $0 } -// .sink { [weak self] data in -// self?.refresher.endRefreshing() -// self?.dataSource.updateData(data) -// } -// .store(in: &subscriptions) + viewModel.$viewState + .compactMap { $0 } + .drop(while: { + $0 == .loading || $0 == .result + }) + .compactMap { String(describing: $0) } + .sink { [weak self] errorMessage in + guard let self else { return } + print(errorMessage) + } + .store(in: &subscriptions) + + viewModel.favoriteStatusUpdated + .sink { [weak self] account in + self?.account = account + self?.dataSource.updateFavoriteStatus(isFavorite: account.isFavorite) + }.store(in: &subscriptions) } private func showInformation() { - dataSource.showInformation(account.cardTransferCount) + dataSource.showInformation(account) } func isNeedBorder(at section: Int) -> Bool { @@ -73,3 +96,19 @@ class DetailAccountViewConroller: BaseCollectionViewController { return editConfig } } + +extension DetailAccountViewConroller: UICollectionViewDelegate { + + func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { + guard case let .addRemoveFavorite(isFavorite) = dataSource.getItem(at: indexPath) else { + return + } + + if isFavorite { + viewModel.removeFromFavorite(account: account) + + } else { + viewModel.saveToFavorite(account: account) + } + } +} diff --git a/TransferList/Presentation/HomeScene/Model/DataTransfer.swift b/TransferList/Presentation/HomeScene/Model/DataTransfer.swift index 6a45dd2..b7b2848 100644 --- a/TransferList/Presentation/HomeScene/Model/DataTransfer.swift +++ b/TransferList/Presentation/HomeScene/Model/DataTransfer.swift @@ -37,6 +37,16 @@ struct DataTransfer { list = items } + mutating func append(item: T) { + if mode == .append { + listHolder.append(item) + } else { + listHolder = [item] + } + + list = [item] + } + func isLastItem(row: Int) -> Bool { return listHolder.count - 1 == row } diff --git a/TransferList/Presentation/HomeScene/Model/HomeItem.swift b/TransferList/Presentation/HomeScene/Model/HomeItem.swift index 227bc96..b9980c8 100644 --- a/TransferList/Presentation/HomeScene/Model/HomeItem.swift +++ b/TransferList/Presentation/HomeScene/Model/HomeItem.swift @@ -19,14 +19,19 @@ enum HomeItem: Hashable { } case header(title: String) + case favoriteBankAccount(account: PersonBankAccount) case personBankAccount(account: PersonBankAccount) func hash(into hasher: inout Hasher) { switch self { case .header(let title): hasher.combine(title) + case .favoriteBankAccount(let account): + hasher.combine("favorite") + hasher.combine(account) case .personBankAccount(let account): hasher.combine("accounts") hasher.combine(account) + hasher.combine(account.isFavorite) } } diff --git a/TransferList/Presentation/HomeScene/View/Cell/FavoriteAccountCell.swift b/TransferList/Presentation/HomeScene/View/Cell/FavoriteAccountCell.swift index 99bd3dc..cff1ed6 100644 --- a/TransferList/Presentation/HomeScene/View/Cell/FavoriteAccountCell.swift +++ b/TransferList/Presentation/HomeScene/View/Cell/FavoriteAccountCell.swift @@ -18,10 +18,10 @@ class FavoriteAccountCell: AccountCell { addSubview(stackView) NSLayoutConstraint.activate([ - stackView.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 12), - stackView.trailingAnchor.constraint(equalTo: trailingSafeMargin, constant: -12), + stackView.leadingAnchor.constraint(equalTo: leadingSafeMargin), + stackView.trailingAnchor.constraint(equalTo: trailingSafeMargin), stackView.bottomAnchor.constraint(equalTo: bottomSafeMargin), - stackView.topAnchor.constraint(equalTo: topSafeMargin), + stackView.topAnchor.constraint(equalTo: topSafeMargin) ]) configureStackView() @@ -44,6 +44,8 @@ class FavoriteAccountCell: AccountCell { private func configureLabels() { nameLabel.textAlignment = .center + nameLabel.numberOfLines = 1 cardTypeLabel.textAlignment = .center + cardTypeLabel.numberOfLines = 1 } } diff --git a/TransferList/Presentation/HomeScene/View/HomeCollectionViewDataSource.swift b/TransferList/Presentation/HomeScene/View/HomeCollectionViewDataSource.swift index af5e302..fca5f75 100644 --- a/TransferList/Presentation/HomeScene/View/HomeCollectionViewDataSource.swift +++ b/TransferList/Presentation/HomeScene/View/HomeCollectionViewDataSource.swift @@ -37,7 +37,8 @@ class HomeCollectionViewDataSource { switch itemIdentifier { case .header(let title): return self?.createTitleCell(for: indexPath, title: title) - case .personBankAccount(let account): + case .personBankAccount(let account), + .favoriteBankAccount(let account): return self?.createAccountCell(for: indexPath, account: account) } }) @@ -84,7 +85,7 @@ class HomeCollectionViewDataSource { var snapshot = dataSource.snapshot() let items = dataTransfer.list.map { - return HomeItem.personBankAccount(account: $0) + return HomeItem.favoriteBankAccount(account: $0) } guard !items.isEmpty else { return snapshot } @@ -100,7 +101,6 @@ class HomeCollectionViewDataSource { snapshot.appendItems(items, toSection: dataTransfer.section) return snapshot -// dataSource.apply(snapshot, animatingDifferences: true) } private func updateAllSection(_ dataTransfer: DataTransfer) -> DiffableSnapshot { @@ -147,15 +147,31 @@ class HomeCollectionViewDataSource { } } - func getAccount(at indexPath: IndexPath) -> PersonBankAccount? { + public func getAccount(at indexPath: IndexPath) -> PersonBankAccount? { guard let homeItem = dataSource.itemIdentifier(for: indexPath) else { return nil } - guard case let .personBankAccount(account) = homeItem else { - return nil + switch homeItem { + case .favoriteBankAccount(let account), + .personBankAccount(let account): + return account + + default: return nil } - - return account + } + + public func updateAccount(account: PersonBankAccount) { + var snapshot: DiffableSnapshot + + if account.isFavorite { + snapshot = updateFavoriteSection(.init(list: [account], + mode: .append, + section: .favoriteBankAcconts)) + } else { + snapshot = dataSource.snapshot() + } + + dataSource.apply(snapshot, animatingDifferences: true) } } diff --git a/TransferList/Presentation/HomeScene/View/HomeViewController.swift b/TransferList/Presentation/HomeScene/View/HomeViewController.swift index 1210654..b225146 100644 --- a/TransferList/Presentation/HomeScene/View/HomeViewController.swift +++ b/TransferList/Presentation/HomeScene/View/HomeViewController.swift @@ -70,6 +70,11 @@ class HomeViewController: BaseCollectionViewController { self?.navigateToDetailViewController(withAccount: account) } .store(in: &subscriptions) + + viewModel.favoriteStatusUpdated + .sink { [weak self] account in + self?.dataSource.updateAccount(account: account) + }.store(in: &subscriptions) } private func navigateToDetailViewController(withAccount account: PersonBankAccount) { @@ -86,9 +91,9 @@ class HomeViewController: BaseCollectionViewController { } let itemSize = NSCollectionLayoutSize(widthDimension: .estimated(80), - heightDimension: .estimated(80)) + heightDimension: .absolute(100)) let item = NSCollectionLayoutItem(layoutSize: itemSize) - item.edgeSpacing = .init(leading: .fixed(18), top: nil, trailing: nil, bottom: nil) + item.edgeSpacing = .init(leading: .fixed(10), top: nil, trailing: nil, bottom: nil) let group = NSCollectionLayoutGroup.horizontal(layoutSize: itemSize, subitems: [item]) @@ -116,3 +121,4 @@ extension HomeViewController: UICollectionViewDelegate { viewModel.itemDisplay(atSection: section, row: indexPath.row) } } + diff --git a/TransferList/Presentation/HomeScene/ViewModel/TransferViewModel.swift b/TransferList/Presentation/HomeScene/ViewModel/TransferViewModel.swift index 356883c..6b5d6dd 100644 --- a/TransferList/Presentation/HomeScene/ViewModel/TransferViewModel.swift +++ b/TransferList/Presentation/HomeScene/ViewModel/TransferViewModel.swift @@ -14,6 +14,7 @@ class TransferViewModel { @Published var viewState: ViewState! @Published var dataUpdated: DataTransfer! @Published var changeView: Router! + var favoriteStatusUpdated = PassthroughSubject() private let useCase: PersonBankAccountUseCase private var subscriptions = Set() private var paginationMode = PaginationMode() @@ -52,11 +53,14 @@ class TransferViewModel { } public func fetchFavoriteList() { - useCase.fetchPersonAccounts(withOffest: paginationMode.nextOffset) + useCase.fetchFavoritePersonAccounts() .replaceError(with: []) .receive(on: DispatchQueue.main) .sink(receiveValue: { [weak self] accounts in guard let self else { return } + self.dataFromLocal = .init(list: accounts, + mode: .initial, + section: .favoriteBankAcconts) self.dataUpdated = self.dataFromLocal }) .store(in: &subscriptions) @@ -109,4 +113,40 @@ class TransferViewModel { public func accountSelected(_ account: PersonBankAccount) { changeView = .detail(account: account) } + + public func removeFromFavorite(account: PersonBankAccount) { + useCase.removePersonAccountFromFavorites(account) + .receive(on: DispatchQueue.main) + .sink { [weak self] completion in + guard let self else { return } + + switch completion { + case .finished: break + case .failure(let error): + self.updateViewState(newState: .error(message: error.localizedDescription)) + break + } + + } receiveValue: { [weak self] account in + self?.favoriteStatusUpdated.send(account) + }.store(in: &subscriptions) + } + + public func saveToFavorite(account: PersonBankAccount) { + useCase.savePersonAccountToFavorites(account) + .receive(on: DispatchQueue.main) + .sink { [weak self] completion in + guard let self else { return } + + switch completion { + case .finished: break + case .failure(let error): + self.updateViewState(newState: .error(message: error.localizedDescription)) + break + } + + } receiveValue: { [weak self] account in + self?.favoriteStatusUpdated.send(account) + }.store(in: &subscriptions) + } } From f86c65d651d07ae685df6b91d31e5185a6d74ace Mon Sep 17 00:00:00 2001 From: Hessam Mahdiabadi <67460597+iamHEssam@users.noreply.github.com> Date: Mon, 6 Nov 2023 22:05:32 +0330 Subject: [PATCH 30/34] Added Handling of Save and Remove in Favorites, HomeViewController List Update - Added functionality for handling save or remove operations in the Favorites. --- .../View/Cell/VerticalAccountCell.swift | 37 +++++++++++++--- .../View/HomeCollectionViewDataSource.swift | 40 ++++++++++++++---- .../arrow.imageset/Contents.json | 22 ++++++++++ .../arrow.imageset/Down Arrow 1.pdf | Bin 0 -> 1999 bytes .../arrow.imageset/Down arrow.pdf | Bin 0 -> 1999 bytes .../star.imageset/Contents.json | 12 ++++++ .../Assets.xcassets/star.imageset/star.png | Bin 0 -> 18352 bytes 7 files changed, 97 insertions(+), 14 deletions(-) create mode 100644 TransferList/Resources/Assets.xcassets/arrow.imageset/Contents.json create mode 100644 TransferList/Resources/Assets.xcassets/arrow.imageset/Down Arrow 1.pdf create mode 100644 TransferList/Resources/Assets.xcassets/arrow.imageset/Down arrow.pdf create mode 100644 TransferList/Resources/Assets.xcassets/star.imageset/Contents.json create mode 100644 TransferList/Resources/Assets.xcassets/star.imageset/star.png diff --git a/TransferList/Presentation/HomeScene/View/Cell/VerticalAccountCell.swift b/TransferList/Presentation/HomeScene/View/Cell/VerticalAccountCell.swift index ac67db6..8dee70a 100644 --- a/TransferList/Presentation/HomeScene/View/Cell/VerticalAccountCell.swift +++ b/TransferList/Presentation/HomeScene/View/Cell/VerticalAccountCell.swift @@ -29,13 +29,20 @@ class VerticalAccountCell: AccountCell { labelsStackView.topAnchor.constraint(equalTo: topSafeMargin, constant: 16), labelsStackView.bottomAnchor.constraint(equalTo: bottomSafeMargin, constant: -16), labelsStackView.leadingAnchor.constraint(equalTo: personImageView.trailingAnchor, constant: 12), - labelsStackView.trailingAnchor.constraint(equalTo: trailingSafeMargin) -// labelsStackView.trailingAnchor.constraint(lessThanOrEqualTo: clock.leadingAnchor, constant: -12), -// clock.centerYAnchor.constraint(equalTo: centerYSafeMargin), -// clock.trailingAnchor.constraint(equalTo: trailingSafeMargin, constant: -18) + labelsStackView.trailingAnchor + .constraint(lessThanOrEqualTo: imagesStackView.leadingAnchor, + constant: -12), + imagesStackView.trailingAnchor.constraint(equalTo: trailingSafeMargin), + imagesStackView.centerYAnchor.constraint(equalTo: centerYSafeMargin), + imagesStackView.trailingAnchor.constraint(equalTo: trailingSafeMargin), + favoriteImageView.heightAnchor.constraint(equalToConstant: 15), + favoriteImageView.widthAnchor.constraint(equalToConstant: 15), + arrowImageView.widthAnchor.constraint(equalToConstant: 15), + arrowImageView.heightAnchor.constraint(equalToConstant: 15) ]) configureLabelsStackView() + configureImageStackView() } private func configureLabelsStackView() { @@ -47,10 +54,30 @@ class VerticalAccountCell: AccountCell { labelsStackView.addArrangedSubview(nameLabel) labelsStackView.addArrangedSubview(cardTypeLabel) } + + private func configureImageStackView() { + imagesStackView.spacing = 12 + imagesStackView.alignment = .center + imagesStackView.axis = .horizontal + imagesStackView.distribution = .fill + + imagesStackView.addArrangedSubview(favoriteImageView) + imagesStackView.addArrangedSubview(arrowImageView) + + configureImages() + } + + private func configureImages() { + favoriteImageView.image = UIImage(named: "star") + + arrowImageView.image = UIImage(named: "arrow") + arrowImageView.contentMode = .scaleAspectFit + arrowImageView.transform = CGAffineTransform(rotationAngle: -(.pi / 2)) + } override func setAccountItem(_ personAccount: PersonBankAccount) { super.setAccountItem(personAccount) - // set isFavorite + favoriteImageView.isHidden = !personAccount.isFavorite } } diff --git a/TransferList/Presentation/HomeScene/View/HomeCollectionViewDataSource.swift b/TransferList/Presentation/HomeScene/View/HomeCollectionViewDataSource.swift index fca5f75..393c9e5 100644 --- a/TransferList/Presentation/HomeScene/View/HomeCollectionViewDataSource.swift +++ b/TransferList/Presentation/HomeScene/View/HomeCollectionViewDataSource.swift @@ -93,11 +93,15 @@ class HomeCollectionViewDataSource { let firstSection = snapshot.sectionIdentifiers.first if snapshot.sectionIdentifiers.isEmpty { snapshot.appendSections(newSections) + snapshot.appendItems([.header(title: "Favorite")], toSection: .FavoritesTitle) + } else { - snapshot.insertSections(newSections, beforeSection: firstSection!) + if !snapshot.sectionIdentifiers.contains(.FavoritesTitle) { + snapshot.insertSections(newSections, beforeSection: firstSection!) + snapshot.appendItems([.header(title: "Favorite")], toSection: .FavoritesTitle) + } } - snapshot.appendItems([.header(title: "Favorite")], toSection: .FavoritesTitle) snapshot.appendItems(items, toSection: dataTransfer.section) return snapshot @@ -137,14 +141,10 @@ class HomeCollectionViewDataSource { } public func sectionIdentifier(atIndexPath indexPath: IndexPath) -> HomeItem.Section? { - if #available(iOS 15.0, *) { - return dataSource.sectionIdentifier(for: indexPath.section) - } else { - guard let item = dataSource.itemIdentifier(for: indexPath) else { - return nil - } - return dataSource.snapshot().sectionIdentifier(containingItem: item) + guard let item = dataSource.itemIdentifier(for: indexPath) else { + return nil } + return dataSource.snapshot().sectionIdentifier(containingItem: item) } public func getAccount(at indexPath: IndexPath) -> PersonBankAccount? { @@ -163,13 +163,35 @@ class HomeCollectionViewDataSource { public func updateAccount(account: PersonBankAccount) { var snapshot: DiffableSnapshot + var fakeAccount = account if account.isFavorite { + // favorite snapshot = updateFavoriteSection(.init(list: [account], mode: .append, section: .favoriteBankAcconts)) + + // all + fakeAccount.update(favoriteStatus: false) + let fakeItem = HomeItem.personBankAccount(account: fakeAccount) + let item = HomeItem.personBankAccount(account: account) + snapshot.insertItems([item], beforeItem: fakeItem) + snapshot.deleteItems([fakeItem]) + } else { snapshot = dataSource.snapshot() + fakeAccount.update(favoriteStatus: true) + + let favItem = HomeItem.favoriteBankAccount(account: fakeAccount) + let fakeItem = HomeItem.personBankAccount(account: fakeAccount) + + let item = HomeItem.personBankAccount(account: account) + snapshot.insertItems([item], beforeItem: fakeItem) + snapshot.deleteItems([fakeItem, favItem]) + + if snapshot.itemIdentifiers(inSection: .favoriteBankAcconts).isEmpty { + snapshot.deleteSections([.FavoritesTitle, .favoriteBankAcconts]) + } } dataSource.apply(snapshot, animatingDifferences: true) diff --git a/TransferList/Resources/Assets.xcassets/arrow.imageset/Contents.json b/TransferList/Resources/Assets.xcassets/arrow.imageset/Contents.json new file mode 100644 index 0000000..8074b0a --- /dev/null +++ b/TransferList/Resources/Assets.xcassets/arrow.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "filename" : "Down Arrow 1.pdf", + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "Down arrow.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/TransferList/Resources/Assets.xcassets/arrow.imageset/Down Arrow 1.pdf b/TransferList/Resources/Assets.xcassets/arrow.imageset/Down Arrow 1.pdf new file mode 100644 index 0000000000000000000000000000000000000000..fdaca32fb1db62f4ad35a9f40a51f053ed8e36fb GIT binary patch literal 1999 zcmZuy%Wm695WLS<^u>q-Y{+>(0>gkU#=&AYh$9Dk*dzyr8aoOk(jlq9o3Gy(o&}k6njDwZmbl@Zg#Mm z8wE{K63k<$VblOm9OXh$*mw1u(HO)N#hB$90)-x8i8WSh22&`*dX@>S7xD?Fl@-tj zAe#ZTKwG=!w(RHSAC^q3rT4|;>Y+|uIb{JcAVa7`6F)mERC0aX* z^NNFuNStnriy{+YP^yE6$xnHU~Z?#~iBB_5cTe=R(d^TTUBN2ODq`nc?9qB8Zl4< zG~4gc!$h4R5t|zTNqn1o8gNa2$)K z+WRFewwq-?lyqHHErf=<0jKxd-yYd_*JNI|T|0OkF>-P7_QUOHhq)Qx>)Z&C&OLx> zN7ZMdLmKt&uJCp6(4;DUUA1}Zfg1|xu?c1>jUsiul@Ar*Bv9(kj)Pnyu|cU>uo)B% z!FP4FITXHz#Xc`S+`~VeF;uQnbp9JVAW9<$KEB74K}f@cixB1@^1|5Ex2|CTc*fpu_gV6-0hZg3Hc{+L_@ zM52K^fhm&|*S6Ohhz2p@O3v`%T}`8*V0_QW=oKI@&2njkzSWslSC==}f~_>YUP+c^ s%vr})GP6$dOgs6O+N)rK$w|=L$c5SZUl9C*9RvRIMoZyOU2iG!KVgH%RR910 literal 0 HcmV?d00001 diff --git a/TransferList/Resources/Assets.xcassets/arrow.imageset/Down arrow.pdf b/TransferList/Resources/Assets.xcassets/arrow.imageset/Down arrow.pdf new file mode 100644 index 0000000000000000000000000000000000000000..31fb8de723f889ec263869de05cfa3bcc164a881 GIT binary patch literal 1999 zcmZuy+iuf95PjdTn3sw~0(xV(g`E8>cc|4H~1kKeiCzWE6P!L`3tH{>p3en_vLiK0t@Vi}4ixOd@5NWE@N+Elrexd{1a(G&NSDsZrW$j2xN7 zLr~`hK|h8XMh);Np$APG&9D5_X7b%6VcCQ^qQ5K}3m8 znDE^Q2p%-Gqg{T+zmIAntEJ$+h_*6~O|cPI(n>RyVIzy-vBFSl5^)SJ^kC;Zl0;f3 z6#Eq#7m(21U>8Wp&*b1U3v^8~3;j@$F~TB+J0g71N44(GalJd^(1!`;!R7vJLZ^v) zDo*J+_2;A9k%D|Aep31|7-q(gM>k7G%P>i(;c>#^MNyPZ4PU?G#NiWv`upG@zRB)g z54?AqZMG~Q;p;dyVQLudhJ~T9P+?js7#yu#T^_33)!;{Z-FsV=MdJz#=;wI=Z?Xz8 zP(3u6dJlzd5Wn4SFjMdatV5htc|cosl75ZI#FIYqH=y-=LKe3J~reMxi}H5g>ti`e%f!I)w}-c65tTX`e!jW4roWO_gnTt|GV|<2Na` zV^)`YH;37FGw+%bugkIlUvS&t_;&lxVfO8s%&Mj>2iFlJ7Za{su9?_o)yd zo@xNy4y;c|hdA)vuJE8FLa)S4FH4TD-;hvE}D?px#<iII vxmYALP4)7ctrn<0o61*`U3n3VN`g*CiSMoZ171H^G2ojwND5zdoutTr?Uu)G literal 0 HcmV?d00001 diff --git a/TransferList/Resources/Assets.xcassets/star.imageset/Contents.json b/TransferList/Resources/Assets.xcassets/star.imageset/Contents.json new file mode 100644 index 0000000..a8507e4 --- /dev/null +++ b/TransferList/Resources/Assets.xcassets/star.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "star.png", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/TransferList/Resources/Assets.xcassets/star.imageset/star.png b/TransferList/Resources/Assets.xcassets/star.imageset/star.png new file mode 100644 index 0000000000000000000000000000000000000000..b1767ab76ac5eb06121f95b0674cbb5b0e56c839 GIT binary patch literal 18352 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 literal 0 HcmV?d00001 From c7234b316fe28e60c59c7662178dc080d5a9e8ba Mon Sep 17 00:00:00 2001 From: Hessam Mahdiabadi <67460597+iamHEssam@users.noreply.github.com> Date: Mon, 6 Nov 2023 22:46:49 +0330 Subject: [PATCH 31/34] Fix Error Display for ViewControllers and Enhance Performance - Resolved the issue of displaying errors only for ViewControllers by adding an error publisher. - Improved performance by replacing the @Published property with PassthroughSubject. --- .../Domain/Error/PersonBankAccountError.swift | 2 +- TransferList.xcodeproj/project.pbxproj | 12 ++++++++++ .../Extension/UIViewController+Alert.swift | 19 +++++++++++++++ .../View/DetailAccountViewConroller.swift | 5 ++-- .../HomeScene/View/HomeViewController.swift | 17 +++++++++++--- .../HomeScene/View/Main.storyboard | 9 +++++--- .../ViewModel/TransferViewModel.swift | 23 +++++++++++-------- 7 files changed, 67 insertions(+), 20 deletions(-) create mode 100644 TransferList/Extra/Extension/UIViewController+Alert.swift diff --git a/Domain/Sources/Domain/Error/PersonBankAccountError.swift b/Domain/Sources/Domain/Error/PersonBankAccountError.swift index a69adb7..32a9922 100644 --- a/Domain/Sources/Domain/Error/PersonBankAccountError.swift +++ b/Domain/Sources/Domain/Error/PersonBankAccountError.swift @@ -15,7 +15,7 @@ public enum PersonBankAccountError: Error { case cannotFetchFavoritePersonAccounts case unexpectedError - var errorDescription: String? { + public var errorDescription: String? { switch self { case .cannotSavePersonAccountToFavorites: return "Failed to save person accounts to favorites" diff --git a/TransferList.xcodeproj/project.pbxproj b/TransferList.xcodeproj/project.pbxproj index b678995..476d384 100644 --- a/TransferList.xcodeproj/project.pbxproj +++ b/TransferList.xcodeproj/project.pbxproj @@ -37,6 +37,7 @@ DEFF1DEA2AF93B1200673B8C /* Router.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEFF1DE92AF93B1200673B8C /* Router.swift */; }; DEFF1DEC2AF93E2F00673B8C /* HeaderInformationCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEFF1DEB2AF93E2F00673B8C /* HeaderInformationCell.swift */; }; DEFF1DEE2AF949FC00673B8C /* AddRemoveFavoriteCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEFF1DED2AF949FC00673B8C /* AddRemoveFavoriteCell.swift */; }; + DEFF1DF12AF969F600673B8C /* UIViewController+Alert.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEFF1DF02AF969F600673B8C /* UIViewController+Alert.swift */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -71,6 +72,7 @@ DEFF1DE92AF93B1200673B8C /* Router.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Router.swift; sourceTree = ""; }; DEFF1DEB2AF93E2F00673B8C /* HeaderInformationCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HeaderInformationCell.swift; sourceTree = ""; }; DEFF1DED2AF949FC00673B8C /* AddRemoveFavoriteCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddRemoveFavoriteCell.swift; sourceTree = ""; }; + DEFF1DF02AF969F600673B8C /* UIViewController+Alert.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIViewController+Alert.swift"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -207,6 +209,7 @@ DEFF1DC52AF8EAC700673B8C /* Extra */ = { isa = PBXGroup; children = ( + DEFF1DEF2AF969EB00673B8C /* Extension */, DEFF1DC62AF8EACB00673B8C /* Core */, ); path = Extra; @@ -269,6 +272,14 @@ path = Cell; sourceTree = ""; }; + DEFF1DEF2AF969EB00673B8C /* Extension */ = { + isa = PBXGroup; + children = ( + DEFF1DF02AF969F600673B8C /* UIViewController+Alert.swift */, + ); + path = Extension; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -364,6 +375,7 @@ DEFF1DE12AF9356200673B8C /* DetailAccountDataSource.swift in Sources */, DEFF1DEE2AF949FC00673B8C /* AddRemoveFavoriteCell.swift in Sources */, DEFF1DD52AF9122D00673B8C /* ViewState.swift in Sources */, + DEFF1DF12AF969F600673B8C /* UIViewController+Alert.swift in Sources */, DEFF1DD92AF92DB500673B8C /* AccountCell.swift in Sources */, DEBE4AC32AF6C3B000A58501 /* AppDelegate.swift in Sources */, DEBE4AC52AF6C3B000A58501 /* SceneDelegate.swift in Sources */, diff --git a/TransferList/Extra/Extension/UIViewController+Alert.swift b/TransferList/Extra/Extension/UIViewController+Alert.swift new file mode 100644 index 0000000..a574e54 --- /dev/null +++ b/TransferList/Extra/Extension/UIViewController+Alert.swift @@ -0,0 +1,19 @@ +// +// UIViewController+Alert.swift +// TransferList +// +// Created by Hessam Mahdiabadi on 11/6/23. +// + +import UIKit + +extension UIViewController { + + func showAlert(title: String, message: String) { + let dialogMessage = UIAlertController(title: title, message: message, preferredStyle: .alert) + let ok = UIAlertAction(title: "OK", style: .default) + + dialogMessage.addAction(ok) + self.present(dialogMessage, animated: true, completion: nil) + } +} diff --git a/TransferList/Presentation/DetailAccountScene/View/DetailAccountViewConroller.swift b/TransferList/Presentation/DetailAccountScene/View/DetailAccountViewConroller.swift index 99ed2ff..8faf6ab 100644 --- a/TransferList/Presentation/DetailAccountScene/View/DetailAccountViewConroller.swift +++ b/TransferList/Presentation/DetailAccountScene/View/DetailAccountViewConroller.swift @@ -60,15 +60,14 @@ class DetailAccountViewConroller: BaseCollectionViewController { } private func observeDidChangeData() { - viewModel.$viewState - .compactMap { $0 } + viewModel.errorForSavingOrRemoving .drop(while: { $0 == .loading || $0 == .result }) .compactMap { String(describing: $0) } .sink { [weak self] errorMessage in guard let self else { return } - print(errorMessage) + self.showAlert(title: "Error", message: errorMessage) } .store(in: &subscriptions) diff --git a/TransferList/Presentation/HomeScene/View/HomeViewController.swift b/TransferList/Presentation/HomeScene/View/HomeViewController.swift index b225146..92064ae 100644 --- a/TransferList/Presentation/HomeScene/View/HomeViewController.swift +++ b/TransferList/Presentation/HomeScene/View/HomeViewController.swift @@ -53,15 +53,14 @@ class HomeViewController: BaseCollectionViewController { } private func observeDidChangeData() { - viewModel.$dataUpdated - .compactMap { $0 } + viewModel.dataUpdated .sink { [weak self] data in self?.refresher.endRefreshing() self?.dataSource.updateData(data) } .store(in: &subscriptions) - viewModel.$changeView + viewModel.changeView .compactMap { $0 } .sink { [weak self] route in guard case let .detail(account) = route else { @@ -75,6 +74,18 @@ class HomeViewController: BaseCollectionViewController { .sink { [weak self] account in self?.dataSource.updateAccount(account: account) }.store(in: &subscriptions) + + viewModel.$viewState + .compactMap { $0 } + .drop(while: { + $0 == .loading || $0 == .result + }) + .compactMap { String(describing: $0) } + .sink { [weak self] errorMessage in + guard let self else { return } + self.showAlert(title: "Error", message: errorMessage) + } + .store(in: &subscriptions) } private func navigateToDetailViewController(withAccount account: PersonBankAccount) { diff --git a/TransferList/Presentation/HomeScene/View/Main.storyboard b/TransferList/Presentation/HomeScene/View/Main.storyboard index dd79351..cb0e3e4 100644 --- a/TransferList/Presentation/HomeScene/View/Main.storyboard +++ b/TransferList/Presentation/HomeScene/View/Main.storyboard @@ -1,7 +1,9 @@ - + + - + + @@ -12,7 +14,7 @@ - + @@ -20,6 +22,7 @@ + diff --git a/TransferList/Presentation/HomeScene/ViewModel/TransferViewModel.swift b/TransferList/Presentation/HomeScene/ViewModel/TransferViewModel.swift index 6b5d6dd..cb45e68 100644 --- a/TransferList/Presentation/HomeScene/ViewModel/TransferViewModel.swift +++ b/TransferList/Presentation/HomeScene/ViewModel/TransferViewModel.swift @@ -12,8 +12,9 @@ import Domain class TransferViewModel { @Published var viewState: ViewState! - @Published var dataUpdated: DataTransfer! - @Published var changeView: Router! + var dataUpdated = PassthroughSubject, Never>() + var errorForSavingOrRemoving = PassthroughSubject() + var changeView = PassthroughSubject() var favoriteStatusUpdated = PassthroughSubject() private let useCase: PersonBankAccountUseCase private var subscriptions = Set() @@ -49,7 +50,7 @@ class TransferViewModel { dataFromServer.append(contentsOf: accounts) } - dataUpdated = dataFromServer + dataUpdated.send(dataFromServer) } public func fetchFavoriteList() { @@ -61,7 +62,7 @@ class TransferViewModel { self.dataFromLocal = .init(list: accounts, mode: .initial, section: .favoriteBankAcconts) - self.dataUpdated = self.dataFromLocal + self.dataUpdated.send(self.dataFromLocal) }) .store(in: &subscriptions) } @@ -78,7 +79,7 @@ class TransferViewModel { case .finished: break case .failure(let error): - updateViewState(newState: .error(message: error.localizedDescription)) + self.updateViewState(newState: .error(message: error.errorDescription ?? "Unexpected error")) break } @@ -86,7 +87,7 @@ class TransferViewModel { guard let self else { return } self.updateAccounts(appendAccounts: accounts) self.paginationMode.moveToNextOffset() - updateViewState(newState: .result) + self.updateViewState(newState: .result) } .store(in: &subscriptions) } @@ -111,7 +112,7 @@ class TransferViewModel { } public func accountSelected(_ account: PersonBankAccount) { - changeView = .detail(account: account) + changeView.send(.detail(account: account)) } public func removeFromFavorite(account: PersonBankAccount) { @@ -123,7 +124,8 @@ class TransferViewModel { switch completion { case .finished: break case .failure(let error): - self.updateViewState(newState: .error(message: error.localizedDescription)) + let viewError = ViewState.error(message: error.errorDescription ?? "Unexpected error") + self.errorForSavingOrRemoving.send(viewError) break } @@ -141,11 +143,12 @@ class TransferViewModel { switch completion { case .finished: break case .failure(let error): - self.updateViewState(newState: .error(message: error.localizedDescription)) + let viewError = ViewState.error(message: error.errorDescription ?? "Unexpected error") + self.errorForSavingOrRemoving.send(viewError) break } - } receiveValue: { [weak self] account in + } receiveValue: { [weak self] account in self?.favoriteStatusUpdated.send(account) }.store(in: &subscriptions) } From 65f8cca348559ed809d512869c6f3975275df6d8 Mon Sep 17 00:00:00 2001 From: Hessam Mahdiabadi <67460597+iamHEssam@users.noreply.github.com> Date: Tue, 7 Nov 2023 00:21:16 +0330 Subject: [PATCH 32/34] Refactor Variable Names, Function Renaming, ViewModel Adjustments, and Cell Size Modification - Renamed multiple variables for improved clarity. - Updated function names and combined two functions in the ViewModel. - Set the width and height to 100 for the FavoriteAccountCell. --- .github/workflows/Data.yml | 8 +- TransferList.xcodeproj/project.pbxproj | 163 ++++++++++++++++-- .../xcschemes/xcschememanagement.plist | 2 +- .../DetailAccountScene/Model/DetailItem.swift | 2 + ...ueCell.swift => TitleAndContentCell.swift} | 4 +- .../View/DetailAccountDataSource.swift | 22 +-- .../HomeScene/Model/HomeItem.swift | 2 + .../View/Cell/FavoriteAccountCell.swift | 7 +- .../View/HomeCollectionViewDataSource.swift | 68 ++++---- .../HomeScene/View/HomeViewController.swift | 31 ++-- .../HomeScene/View/Main.storyboard | 33 ---- .../ViewModel/TransferViewModel.swift | 73 ++++---- .../AccentColor.colorset/Contents.json | 20 +++ .../AppIcon.appiconset/Contents.json | 1 + .../AppIcon.appiconset/Untitled design.png | Bin 0 -> 58124 bytes .../ViewModel/TransferViewModelTests.swift | 101 +++++++++++ UI/Package.swift | 3 - 17 files changed, 378 insertions(+), 162 deletions(-) rename TransferList/Presentation/DetailAccountScene/View/Cell/{TitleValueCell.swift => TitleAndContentCell.swift} (94%) delete mode 100644 TransferList/Presentation/HomeScene/View/Main.storyboard create mode 100644 TransferList/Resources/Assets.xcassets/AccentColor.colorset/Contents.json create mode 100644 TransferList/Resources/Assets.xcassets/AppIcon.appiconset/Untitled design.png create mode 100644 TransferListTests/Presentation/HomeScene/ViewModel/TransferViewModelTests.swift diff --git a/.github/workflows/Data.yml b/.github/workflows/Data.yml index db32a1a..c03fc87 100644 --- a/.github/workflows/Data.yml +++ b/.github/workflows/Data.yml @@ -20,10 +20,4 @@ jobs: - name: Lint code run: | cd Data/Sources/ - swiftlint - - - name: run unit test - run: | - cd Data/ - swift build - swift test \ No newline at end of file + swiftlint \ No newline at end of file diff --git a/TransferList.xcodeproj/project.pbxproj b/TransferList.xcodeproj/project.pbxproj index 476d384..9347f8f 100644 --- a/TransferList.xcodeproj/project.pbxproj +++ b/TransferList.xcodeproj/project.pbxproj @@ -13,7 +13,6 @@ DE690EAA2AF842F800E8C451 /* DIContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE690EA92AF842F800E8C451 /* DIContainer.swift */; }; DE690EAC2AF8432500E8C451 /* DIContainerImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE690EAB2AF8432500E8C451 /* DIContainerImpl.swift */; }; DE690EB12AF8455400E8C451 /* HomeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE690EB02AF8455400E8C451 /* HomeViewController.swift */; }; - DE690EB32AF84A1C00E8C451 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = DE690EB22AF84A1C00E8C451 /* Main.storyboard */; }; DEBE4AC32AF6C3B000A58501 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEBE4AC22AF6C3B000A58501 /* AppDelegate.swift */; }; DEBE4AC52AF6C3B000A58501 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEBE4AC42AF6C3B000A58501 /* SceneDelegate.swift */; }; DEBE4ACC2AF6C3B200A58501 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = DEBE4ACB2AF6C3B200A58501 /* Assets.xcassets */; }; @@ -33,20 +32,30 @@ DEFF1DDF2AF9341800673B8C /* DetailAccountViewConroller.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEFF1DDE2AF9341800673B8C /* DetailAccountViewConroller.swift */; }; DEFF1DE12AF9356200673B8C /* DetailAccountDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEFF1DE02AF9356200673B8C /* DetailAccountDataSource.swift */; }; DEFF1DE42AF9358E00673B8C /* DetailItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEFF1DE32AF9358E00673B8C /* DetailItem.swift */; }; - DEFF1DE72AF9366900673B8C /* TitleValueCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEFF1DE62AF9366900673B8C /* TitleValueCell.swift */; }; + DEFF1DE72AF9366900673B8C /* TitleAndContentCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEFF1DE62AF9366900673B8C /* TitleAndContentCell.swift */; }; DEFF1DEA2AF93B1200673B8C /* Router.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEFF1DE92AF93B1200673B8C /* Router.swift */; }; DEFF1DEC2AF93E2F00673B8C /* HeaderInformationCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEFF1DEB2AF93E2F00673B8C /* HeaderInformationCell.swift */; }; DEFF1DEE2AF949FC00673B8C /* AddRemoveFavoriteCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEFF1DED2AF949FC00673B8C /* AddRemoveFavoriteCell.swift */; }; DEFF1DF12AF969F600673B8C /* UIViewController+Alert.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEFF1DF02AF969F600673B8C /* UIViewController+Alert.swift */; }; + DEFF1E032AF978E300673B8C /* TransferViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEFF1E022AF978E300673B8C /* TransferViewModelTests.swift */; }; /* End PBXBuildFile section */ +/* Begin PBXContainerItemProxy section */ + DEFF1DFA2AF978A600673B8C /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = DEBE4AB72AF6C3B000A58501 /* Project object */; + proxyType = 1; + remoteGlobalIDString = DEBE4ABE2AF6C3B000A58501; + remoteInfo = TransferList; + }; +/* End PBXContainerItemProxy section */ + /* Begin PBXFileReference section */ DE3EF77C2AF6F9B40071E5E4 /* Data */ = {isa = PBXFileReference; lastKnownFileType = wrapper; path = Data; sourceTree = ""; }; DE690E9E2AF82D4300E8C451 /* UI */ = {isa = PBXFileReference; lastKnownFileType = wrapper; path = UI; sourceTree = ""; }; DE690EA92AF842F800E8C451 /* DIContainer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DIContainer.swift; sourceTree = ""; }; DE690EAB2AF8432500E8C451 /* DIContainerImpl.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DIContainerImpl.swift; sourceTree = ""; }; DE690EB02AF8455400E8C451 /* HomeViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeViewController.swift; sourceTree = ""; }; - DE690EB22AF84A1C00E8C451 /* Main.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = Main.storyboard; sourceTree = ""; }; DEBE4ABF2AF6C3B000A58501 /* TransferList.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = TransferList.app; sourceTree = BUILT_PRODUCTS_DIR; }; DEBE4AC22AF6C3B000A58501 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; DEBE4AC42AF6C3B000A58501 /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; }; @@ -68,11 +77,13 @@ DEFF1DDE2AF9341800673B8C /* DetailAccountViewConroller.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DetailAccountViewConroller.swift; sourceTree = ""; }; DEFF1DE02AF9356200673B8C /* DetailAccountDataSource.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DetailAccountDataSource.swift; sourceTree = ""; }; DEFF1DE32AF9358E00673B8C /* DetailItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DetailItem.swift; sourceTree = ""; }; - DEFF1DE62AF9366900673B8C /* TitleValueCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TitleValueCell.swift; sourceTree = ""; }; + DEFF1DE62AF9366900673B8C /* TitleAndContentCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TitleAndContentCell.swift; sourceTree = ""; }; DEFF1DE92AF93B1200673B8C /* Router.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Router.swift; sourceTree = ""; }; DEFF1DEB2AF93E2F00673B8C /* HeaderInformationCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HeaderInformationCell.swift; sourceTree = ""; }; DEFF1DED2AF949FC00673B8C /* AddRemoveFavoriteCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddRemoveFavoriteCell.swift; sourceTree = ""; }; DEFF1DF02AF969F600673B8C /* UIViewController+Alert.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIViewController+Alert.swift"; sourceTree = ""; }; + DEFF1DF62AF978A600673B8C /* TransferListTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = TransferListTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + DEFF1E022AF978E300673B8C /* TransferViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TransferViewModelTests.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -87,6 +98,13 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + DEFF1DF32AF978A600673B8C /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ @@ -141,7 +159,6 @@ children = ( DEFF1DBB2AF8DED200673B8C /* Cell */, DE690EB02AF8455400E8C451 /* HomeViewController.swift */, - DE690EB22AF84A1C00E8C451 /* Main.storyboard */, DEFF1DBF2AF8DFA500673B8C /* HomeCollectionViewDataSource.swift */, ); path = View; @@ -162,6 +179,7 @@ DE3EF77C2AF6F9B40071E5E4 /* Data */, DEBE4AD62AF6C8F600A58501 /* Domain */, DEBE4AC12AF6C3B000A58501 /* TransferList */, + DEFF1DF72AF978A600673B8C /* TransferListTests */, DEBE4AC02AF6C3B000A58501 /* Products */, DE690EA22AF842ED00E8C451 /* Frameworks */, ); @@ -171,6 +189,7 @@ isa = PBXGroup; children = ( DEBE4ABF2AF6C3B000A58501 /* TransferList.app */, + DEFF1DF62AF978A600673B8C /* TransferListTests.xctest */, ); name = Products; sourceTree = ""; @@ -265,7 +284,7 @@ DEFF1DE52AF9363700673B8C /* Cell */ = { isa = PBXGroup; children = ( - DEFF1DE62AF9366900673B8C /* TitleValueCell.swift */, + DEFF1DE62AF9366900673B8C /* TitleAndContentCell.swift */, DEFF1DEB2AF93E2F00673B8C /* HeaderInformationCell.swift */, DEFF1DED2AF949FC00673B8C /* AddRemoveFavoriteCell.swift */, ); @@ -280,6 +299,38 @@ path = Extension; sourceTree = ""; }; + DEFF1DF72AF978A600673B8C /* TransferListTests */ = { + isa = PBXGroup; + children = ( + DEFF1DFF2AF978C100673B8C /* Presentation */, + ); + path = TransferListTests; + sourceTree = ""; + }; + DEFF1DFF2AF978C100673B8C /* Presentation */ = { + isa = PBXGroup; + children = ( + DEFF1E002AF978C900673B8C /* HomeScene */, + ); + path = Presentation; + sourceTree = ""; + }; + DEFF1E002AF978C900673B8C /* HomeScene */ = { + isa = PBXGroup; + children = ( + DEFF1E012AF978D000673B8C /* ViewModel */, + ); + path = HomeScene; + sourceTree = ""; + }; + DEFF1E012AF978D000673B8C /* ViewModel */ = { + isa = PBXGroup; + children = ( + DEFF1E022AF978E300673B8C /* TransferViewModelTests.swift */, + ); + path = ViewModel; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -306,6 +357,24 @@ productReference = DEBE4ABF2AF6C3B000A58501 /* TransferList.app */; productType = "com.apple.product-type.application"; }; + DEFF1DF52AF978A600673B8C /* TransferListTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = DEFF1DFC2AF978A600673B8C /* Build configuration list for PBXNativeTarget "TransferListTests" */; + buildPhases = ( + DEFF1DF22AF978A600673B8C /* Sources */, + DEFF1DF32AF978A600673B8C /* Frameworks */, + DEFF1DF42AF978A600673B8C /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + DEFF1DFB2AF978A600673B8C /* PBXTargetDependency */, + ); + name = TransferListTests; + productName = TransferListTests; + productReference = DEFF1DF62AF978A600673B8C /* TransferListTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ @@ -319,6 +388,11 @@ DEBE4ABE2AF6C3B000A58501 = { CreatedOnToolsVersion = 14.3.1; }; + DEFF1DF52AF978A600673B8C = { + CreatedOnToolsVersion = 14.3.1; + LastSwiftMigration = 1430; + TestTargetID = DEBE4ABE2AF6C3B000A58501; + }; }; }; buildConfigurationList = DEBE4ABA2AF6C3B000A58501 /* Build configuration list for PBXProject "TransferList" */; @@ -338,6 +412,7 @@ projectRoot = ""; targets = ( DEBE4ABE2AF6C3B000A58501 /* TransferList */, + DEFF1DF52AF978A600673B8C /* TransferListTests */, ); }; /* End PBXProject section */ @@ -347,12 +422,18 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - DE690EB32AF84A1C00E8C451 /* Main.storyboard in Resources */, DEBE4ACF2AF6C3B200A58501 /* LaunchScreen.storyboard in Resources */, DEBE4ACC2AF6C3B200A58501 /* Assets.xcassets in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; + DEFF1DF42AF978A600673B8C /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -382,13 +463,29 @@ DEFF1DC02AF8DFA500673B8C /* HomeCollectionViewDataSource.swift in Sources */, DEFF1DD32AF8FF8100673B8C /* DataTransfer.swift in Sources */, DE690EAC2AF8432500E8C451 /* DIContainerImpl.swift in Sources */, - DEFF1DE72AF9366900673B8C /* TitleValueCell.swift in Sources */, + DEFF1DE72AF9366900673B8C /* TitleAndContentCell.swift in Sources */, DEFF1DD72AF91A8A00673B8C /* FavoriteAccountCell.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; + DEFF1DF22AF978A600673B8C /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + DEFF1E032AF978E300673B8C /* TransferViewModelTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXSourcesBuildPhase section */ +/* Begin PBXTargetDependency section */ + DEFF1DFB2AF978A600673B8C /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = DEBE4ABE2AF6C3B000A58501 /* TransferList */; + targetProxy = DEFF1DFA2AF978A600673B8C /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + /* Begin PBXVariantGroup section */ DEBE4ACD2AF6C3B200A58501 /* LaunchScreen.storyboard */ = { isa = PBXVariantGroup; @@ -526,7 +623,7 @@ INFOPLIST_FILE = TransferList/Resources/Info.plist; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; - INFOPLIST_KEY_UIMainStoryboardFile = Main; + INFOPLIST_KEY_UIMainStoryboardFile = ""; INFOPLIST_KEY_UISupportedInterfaceOrientations = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown"; IPHONEOS_DEPLOYMENT_TARGET = 14.0; LD_RUNPATH_SEARCH_PATHS = ( @@ -553,7 +650,7 @@ INFOPLIST_FILE = TransferList/Resources/Info.plist; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; - INFOPLIST_KEY_UIMainStoryboardFile = Main; + INFOPLIST_KEY_UIMainStoryboardFile = ""; INFOPLIST_KEY_UISupportedInterfaceOrientations = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown"; IPHONEOS_DEPLOYMENT_TARGET = 14.0; LD_RUNPATH_SEARCH_PATHS = ( @@ -569,6 +666,43 @@ }; name = Release; }; + DEFF1DFD2AF978A600673B8C /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = io.github.helloitshessam.TransferListTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/TransferList.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/TransferList"; + }; + name = Debug; + }; + DEFF1DFE2AF978A600673B8C /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = io.github.helloitshessam.TransferListTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/TransferList.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/TransferList"; + }; + name = Release; + }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ @@ -590,6 +724,15 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; + DEFF1DFC2AF978A600673B8C /* Build configuration list for PBXNativeTarget "TransferListTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + DEFF1DFD2AF978A600673B8C /* Debug */, + DEFF1DFE2AF978A600673B8C /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; /* End XCConfigurationList section */ /* Begin XCRemoteSwiftPackageReference section */ diff --git a/TransferList.xcodeproj/xcuserdata/hessam.xcuserdatad/xcschemes/xcschememanagement.plist b/TransferList.xcodeproj/xcuserdata/hessam.xcuserdatad/xcschemes/xcschememanagement.plist index 5eb9d26..52e1fe9 100644 --- a/TransferList.xcodeproj/xcuserdata/hessam.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/TransferList.xcodeproj/xcuserdata/hessam.xcuserdatad/xcschemes/xcschememanagement.plist @@ -7,7 +7,7 @@ TransferList.xcscheme_^#shared#^_ orderHint - 3 + 5 diff --git a/TransferList/Presentation/DetailAccountScene/Model/DetailItem.swift b/TransferList/Presentation/DetailAccountScene/Model/DetailItem.swift index 951b80c..bc5f1b5 100644 --- a/TransferList/Presentation/DetailAccountScene/Model/DetailItem.swift +++ b/TransferList/Presentation/DetailAccountScene/Model/DetailItem.swift @@ -23,9 +23,11 @@ enum DetailItem: Hashable { func hash(into hasher: inout Hasher) { switch self { case .header(let title): hasher.combine(title) + case .information(let title, let value): hasher.combine(title) hasher.combine(value) + case .addRemoveFavorite(let isFavorite): hasher.combine(isFavorite) hasher.combine("addRmoveFavorite") diff --git a/TransferList/Presentation/DetailAccountScene/View/Cell/TitleValueCell.swift b/TransferList/Presentation/DetailAccountScene/View/Cell/TitleAndContentCell.swift similarity index 94% rename from TransferList/Presentation/DetailAccountScene/View/Cell/TitleValueCell.swift rename to TransferList/Presentation/DetailAccountScene/View/Cell/TitleAndContentCell.swift index 71c7e13..cff7520 100644 --- a/TransferList/Presentation/DetailAccountScene/View/Cell/TitleValueCell.swift +++ b/TransferList/Presentation/DetailAccountScene/View/Cell/TitleAndContentCell.swift @@ -1,5 +1,5 @@ // -// TitleValueCell.swift +// TitleAndContentCell.swift // TransferList // // Created by Hessam Mahdiabadi on 11/6/23. @@ -8,7 +8,7 @@ import UIKit import UI -class TitleValueCell: BaseCollectionCell { +class TitleAndContentCell: BaseCollectionCell { @InstantiateView(type: ListLabel.self) var titleLabel @InstantiateView(type: SubTitleLabel.self) var valueLabel diff --git a/TransferList/Presentation/DetailAccountScene/View/DetailAccountDataSource.swift b/TransferList/Presentation/DetailAccountScene/View/DetailAccountDataSource.swift index 07510ee..2d461f1 100644 --- a/TransferList/Presentation/DetailAccountScene/View/DetailAccountDataSource.swift +++ b/TransferList/Presentation/DetailAccountScene/View/DetailAccountDataSource.swift @@ -25,7 +25,7 @@ class DetailAccountDataSource { } private func configureCollectionView() { - collectionView.registerReusableCell(type: TitleValueCell.self) + collectionView.registerReusableCell(type: TitleAndContentCell.self) collectionView.registerReusableCell(type: HeaderInformationCell.self) collectionView.registerReusableCell(type: AddRemoveFavoriteCell.self) } @@ -52,8 +52,8 @@ class DetailAccountDataSource { return cell } - private func createValueCell(for indexPath: IndexPath, title: String, value: Int) -> TitleValueCell { - let cell: TitleValueCell = collectionView.dequeueReusableCell(for: indexPath) + private func createValueCell(for indexPath: IndexPath, title: String, value: Int) -> TitleAndContentCell { + let cell: TitleAndContentCell = collectionView.dequeueReusableCell(for: indexPath) cell.set(title: title, value: value) return cell } @@ -85,22 +85,16 @@ class DetailAccountDataSource { } public func updateFavoriteStatus(isFavorite: Bool) { - let indexPath = IndexPath(row: 2, section: 1) - guard let oldItem = dataSource.itemIdentifier(for: indexPath) else { return } - let addRemove = DetailItem.addRemoveFavorite(isFavorite: isFavorite) - var newSnapShot = dataSource.snapshot() - newSnapShot.deleteItems([oldItem]) - newSnapShot.appendItems([addRemove], toSection: .information) + + let newItem = DetailItem.addRemoveFavorite(isFavorite: isFavorite) + newSnapShot.deleteItems([.addRemoveFavorite(isFavorite: !isFavorite)]) + newSnapShot.appendItems([newItem], toSection: .information) dataSource.apply(newSnapShot, animatingDifferences: true) } public func getItem(at indexPath: IndexPath) -> DetailItem? { - guard let detailItem = dataSource.itemIdentifier(for: indexPath) else { - return nil - } - - return detailItem + dataSource.itemIdentifier(for: indexPath) } } diff --git a/TransferList/Presentation/HomeScene/Model/HomeItem.swift b/TransferList/Presentation/HomeScene/Model/HomeItem.swift index b9980c8..9b71997 100644 --- a/TransferList/Presentation/HomeScene/Model/HomeItem.swift +++ b/TransferList/Presentation/HomeScene/Model/HomeItem.swift @@ -25,9 +25,11 @@ enum HomeItem: Hashable { func hash(into hasher: inout Hasher) { switch self { case .header(let title): hasher.combine(title) + case .favoriteBankAccount(let account): hasher.combine("favorite") hasher.combine(account) + case .personBankAccount(let account): hasher.combine("accounts") hasher.combine(account) diff --git a/TransferList/Presentation/HomeScene/View/Cell/FavoriteAccountCell.swift b/TransferList/Presentation/HomeScene/View/Cell/FavoriteAccountCell.swift index cff1ed6..72410d8 100644 --- a/TransferList/Presentation/HomeScene/View/Cell/FavoriteAccountCell.swift +++ b/TransferList/Presentation/HomeScene/View/Cell/FavoriteAccountCell.swift @@ -21,7 +21,9 @@ class FavoriteAccountCell: AccountCell { stackView.leadingAnchor.constraint(equalTo: leadingSafeMargin), stackView.trailingAnchor.constraint(equalTo: trailingSafeMargin), stackView.bottomAnchor.constraint(equalTo: bottomSafeMargin), - stackView.topAnchor.constraint(equalTo: topSafeMargin) + stackView.topAnchor.constraint(equalTo: topSafeMargin), + nameLabel.widthAnchor.constraint(equalToConstant: 100), + cardTypeLabel.widthAnchor.constraint(equalToConstant: 100) ]) configureStackView() @@ -45,7 +47,10 @@ class FavoriteAccountCell: AccountCell { private func configureLabels() { nameLabel.textAlignment = .center nameLabel.numberOfLines = 1 + nameLabel.minimumScaleFactor = 0.5 + cardTypeLabel.textAlignment = .center cardTypeLabel.numberOfLines = 1 + cardTypeLabel.minimumScaleFactor = 0.5 } } diff --git a/TransferList/Presentation/HomeScene/View/HomeCollectionViewDataSource.swift b/TransferList/Presentation/HomeScene/View/HomeCollectionViewDataSource.swift index 393c9e5..31e7eec 100644 --- a/TransferList/Presentation/HomeScene/View/HomeCollectionViewDataSource.swift +++ b/TransferList/Presentation/HomeScene/View/HomeCollectionViewDataSource.swift @@ -66,7 +66,7 @@ class HomeCollectionViewDataSource { } } - public func updateData(_ dataTransfer: DataTransfer) { + public func updateList(_ dataTransfer: DataTransfer) { semaphore.wait() var snapshot: DiffableSnapshot! @@ -84,10 +84,10 @@ class HomeCollectionViewDataSource { private func updateFavoriteSection(_ dataTransfer: DataTransfer) -> DiffableSnapshot { var snapshot = dataSource.snapshot() + guard !dataTransfer.list.isEmpty else { return snapshot } let items = dataTransfer.list.map { return HomeItem.favoriteBankAccount(account: $0) } - guard !items.isEmpty else { return snapshot } let newSections = [.FavoritesTitle, dataTransfer.section] let firstSection = snapshot.sectionIdentifiers.first @@ -140,13 +140,6 @@ class HomeCollectionViewDataSource { return dataSource.snapshot().sectionIdentifiers[section] } - public func sectionIdentifier(atIndexPath indexPath: IndexPath) -> HomeItem.Section? { - guard let item = dataSource.itemIdentifier(for: indexPath) else { - return nil - } - return dataSource.snapshot().sectionIdentifier(containingItem: item) - } - public func getAccount(at indexPath: IndexPath) -> PersonBankAccount? { guard let homeItem = dataSource.itemIdentifier(for: indexPath) else { return nil @@ -161,37 +154,36 @@ class HomeCollectionViewDataSource { } } - public func updateAccount(account: PersonBankAccount) { - var snapshot: DiffableSnapshot + public func updateAccountToFavorites(account: PersonBankAccount) { + var accountNeedsToRemove = account + var snapshot = updateFavoriteSection(.init(list: [account], + mode: .append, + section: .favoriteBankAcconts)) + + // all + accountNeedsToRemove.update(favoriteStatus: false) + let itemNeedsToRemove = HomeItem.personBankAccount(account: accountNeedsToRemove) + let item = HomeItem.personBankAccount(account: account) + snapshot.insertItems([item], beforeItem: itemNeedsToRemove) + snapshot.deleteItems([itemNeedsToRemove]) + + dataSource.apply(snapshot, animatingDifferences: true) + } + + public func removeAccountfromFavorites(account: PersonBankAccount) { var fakeAccount = account + var snapshot = dataSource.snapshot() + fakeAccount.update(favoriteStatus: true) - if account.isFavorite { - // favorite - snapshot = updateFavoriteSection(.init(list: [account], - mode: .append, - section: .favoriteBankAcconts)) - - // all - fakeAccount.update(favoriteStatus: false) - let fakeItem = HomeItem.personBankAccount(account: fakeAccount) - let item = HomeItem.personBankAccount(account: account) - snapshot.insertItems([item], beforeItem: fakeItem) - snapshot.deleteItems([fakeItem]) - - } else { - snapshot = dataSource.snapshot() - fakeAccount.update(favoriteStatus: true) - - let favItem = HomeItem.favoriteBankAccount(account: fakeAccount) - let fakeItem = HomeItem.personBankAccount(account: fakeAccount) - - let item = HomeItem.personBankAccount(account: account) - snapshot.insertItems([item], beforeItem: fakeItem) - snapshot.deleteItems([fakeItem, favItem]) - - if snapshot.itemIdentifiers(inSection: .favoriteBankAcconts).isEmpty { - snapshot.deleteSections([.FavoritesTitle, .favoriteBankAcconts]) - } + let favItem = HomeItem.favoriteBankAccount(account: fakeAccount) + let fakeItem = HomeItem.personBankAccount(account: fakeAccount) + + let item = HomeItem.personBankAccount(account: account) + snapshot.insertItems([item], beforeItem: fakeItem) + snapshot.deleteItems([fakeItem, favItem]) + + if snapshot.itemIdentifiers(inSection: .favoriteBankAcconts).isEmpty { + snapshot.deleteSections([.FavoritesTitle, .favoriteBankAcconts]) } dataSource.apply(snapshot, animatingDifferences: true) diff --git a/TransferList/Presentation/HomeScene/View/HomeViewController.swift b/TransferList/Presentation/HomeScene/View/HomeViewController.swift index 92064ae..a2ae0fb 100644 --- a/TransferList/Presentation/HomeScene/View/HomeViewController.swift +++ b/TransferList/Presentation/HomeScene/View/HomeViewController.swift @@ -36,16 +36,15 @@ class HomeViewController: BaseCollectionViewController { } private func configureRefresher() { - collectionView.alwaysBounceVertical = true refresher.tintColor = Theme.supplementaryBackground - refresher.addTarget(self, action: #selector(refreshData), for: .valueChanged) + refresher.addTarget(self, action: #selector(beginRefreshing), for: .valueChanged) collectionView.addSubview(refresher) } - @objc func refreshData() { + @objc private func beginRefreshing() { self.refresher.beginRefreshing() - viewModel.refreshData() + viewModel.refreshList() } private func configureDataSource() { @@ -53,14 +52,14 @@ class HomeViewController: BaseCollectionViewController { } private func observeDidChangeData() { - viewModel.dataUpdated - .sink { [weak self] data in + viewModel.accountsNeedToShow + .sink { [weak self] accounts in self?.refresher.endRefreshing() - self?.dataSource.updateData(data) + self?.dataSource.updateList(accounts) } .store(in: &subscriptions) - viewModel.changeView + viewModel.router .compactMap { $0 } .sink { [weak self] route in guard case let .detail(account) = route else { @@ -71,8 +70,17 @@ class HomeViewController: BaseCollectionViewController { .store(in: &subscriptions) viewModel.favoriteStatusUpdated + .share() + .filter { $0.isFavorite } .sink { [weak self] account in - self?.dataSource.updateAccount(account: account) + self?.dataSource.updateAccountToFavorites(account: account) + }.store(in: &subscriptions) + + viewModel.favoriteStatusUpdated + .share() + .filter { !$0.isFavorite } + .sink { [weak self] account in + self?.dataSource.removeAccountfromFavorites(account: account) }.store(in: &subscriptions) viewModel.$viewState @@ -126,10 +134,9 @@ extension HomeViewController: UICollectionViewDelegate { func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) { - guard let section = dataSource.sectionIdentifier(atIndexPath: indexPath) else { + guard let section = dataSource.sectionIdentifier(atSection: indexPath.section) else { return } - viewModel.itemDisplay(atSection: section, row: indexPath.row) + viewModel.reachedToRow(row: indexPath.row, atSection: section) } } - diff --git a/TransferList/Presentation/HomeScene/View/Main.storyboard b/TransferList/Presentation/HomeScene/View/Main.storyboard deleted file mode 100644 index cb0e3e4..0000000 --- a/TransferList/Presentation/HomeScene/View/Main.storyboard +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/TransferList/Presentation/HomeScene/ViewModel/TransferViewModel.swift b/TransferList/Presentation/HomeScene/ViewModel/TransferViewModel.swift index cb45e68..19ed333 100644 --- a/TransferList/Presentation/HomeScene/ViewModel/TransferViewModel.swift +++ b/TransferList/Presentation/HomeScene/ViewModel/TransferViewModel.swift @@ -12,9 +12,9 @@ import Domain class TransferViewModel { @Published var viewState: ViewState! - var dataUpdated = PassthroughSubject, Never>() + var accountsNeedToShow = PassthroughSubject, Never>() var errorForSavingOrRemoving = PassthroughSubject() - var changeView = PassthroughSubject() + var router = PassthroughSubject() var favoriteStatusUpdated = PassthroughSubject() private let useCase: PersonBankAccountUseCase private var subscriptions = Set() @@ -38,7 +38,7 @@ class TransferViewModel { self.viewState = viewState } - private func updateAccounts(appendAccounts accounts: [PersonBankAccount]) { + private func updateAllAccounts(appendAccounts accounts: [PersonBankAccount]) { guard !accounts.isEmpty else { paginationMode.mode = .reachedToEnd return @@ -50,7 +50,7 @@ class TransferViewModel { dataFromServer.append(contentsOf: accounts) } - dataUpdated.send(dataFromServer) + accountsNeedToShow.send(dataFromServer) } public func fetchFavoriteList() { @@ -62,7 +62,7 @@ class TransferViewModel { self.dataFromLocal = .init(list: accounts, mode: .initial, section: .favoriteBankAcconts) - self.dataUpdated.send(self.dataFromLocal) + self.accountsNeedToShow.send(self.dataFromLocal) }) .store(in: &subscriptions) } @@ -85,14 +85,14 @@ class TransferViewModel { } receiveValue: { [weak self] accounts in guard let self else { return } - self.updateAccounts(appendAccounts: accounts) + self.updateAllAccounts(appendAccounts: accounts) self.paginationMode.moveToNextOffset() self.updateViewState(newState: .result) } .store(in: &subscriptions) } - public func refreshData() { + public func refreshList() { guard viewState != .loading else { return } paginationMode.reset() @@ -100,7 +100,7 @@ class TransferViewModel { fetchTransferList() } - public func itemDisplay(atSection section: HomeItem.Section, row: Int) { + public func reachedToRow(row: Int, atSection section: HomeItem.Section) { guard viewState != .loading else { return } guard section == .personBankAccounts else { return } guard paginationMode.mode == .continues else { return } @@ -112,44 +112,35 @@ class TransferViewModel { } public func accountSelected(_ account: PersonBankAccount) { - changeView.send(.detail(account: account)) + router.send(.detail(account: account)) + } + + private func updateFavorite(publisher: AnyPublisher) { + publisher + .receive(on: DispatchQueue.main) + .sink { [weak self] completion in + guard let self else { return } + + switch completion { + case .finished: break + case .failure(let error): + let viewError = ViewState.error(message: error.errorDescription ?? "Unexpected error") + self.errorForSavingOrRemoving.send(viewError) + break + } + + } receiveValue: { [weak self] account in + self?.favoriteStatusUpdated.send(account) + }.store(in: &subscriptions) } public func removeFromFavorite(account: PersonBankAccount) { - useCase.removePersonAccountFromFavorites(account) - .receive(on: DispatchQueue.main) - .sink { [weak self] completion in - guard let self else { return } - - switch completion { - case .finished: break - case .failure(let error): - let viewError = ViewState.error(message: error.errorDescription ?? "Unexpected error") - self.errorForSavingOrRemoving.send(viewError) - break - } - - } receiveValue: { [weak self] account in - self?.favoriteStatusUpdated.send(account) - }.store(in: &subscriptions) + let publisher = useCase.removePersonAccountFromFavorites(account) + updateFavorite(publisher: publisher) } public func saveToFavorite(account: PersonBankAccount) { - useCase.savePersonAccountToFavorites(account) - .receive(on: DispatchQueue.main) - .sink { [weak self] completion in - guard let self else { return } - - switch completion { - case .finished: break - case .failure(let error): - let viewError = ViewState.error(message: error.errorDescription ?? "Unexpected error") - self.errorForSavingOrRemoving.send(viewError) - break - } - - } receiveValue: { [weak self] account in - self?.favoriteStatusUpdated.send(account) - }.store(in: &subscriptions) + let publisher = useCase.savePersonAccountToFavorites(account) + updateFavorite(publisher: publisher) } } diff --git a/TransferList/Resources/Assets.xcassets/AccentColor.colorset/Contents.json b/TransferList/Resources/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 0000000..274babb --- /dev/null +++ b/TransferList/Resources/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "colors" : [ + { + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/TransferList/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json b/TransferList/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json index 13613e3..f5086e8 100644 --- a/TransferList/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json +++ b/TransferList/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -1,6 +1,7 @@ { "images" : [ { + "filename" : "Untitled design.png", "idiom" : "universal", "platform" : "ios", "size" : "1024x1024" diff --git a/TransferList/Resources/Assets.xcassets/AppIcon.appiconset/Untitled design.png b/TransferList/Resources/Assets.xcassets/AppIcon.appiconset/Untitled design.png new file mode 100644 index 0000000000000000000000000000000000000000..95dc491c8eeb5f25dc6870c06384b93db632c6d9 GIT binary patch literal 58124 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 + var viewModel: TransferViewModel! + + override func setUp() { + cancellables = [] + viewModel = ViewModelFactory.shared.createMediaViewModel() + } + + override func tearDown() { + viewModel = nil + cancellables.removeAll() + } + + func testViewState() { + + // given + let expectation = XCTestExpectation(description: "change view state") + var newState: ViewState? + + // when + viewModel.fetchTransferList() + + viewModel.$viewState + .first() + .sink { state in + newState = state + expectation.fulfill() + } + .store(in: &cancellables) + + wait(for: [expectation], timeout: 1.0) + + // then + XCTAssertNotNil(newState) + XCTAssertEqual(newState, .loading) + } + + func testFetchTransferList() { + + // given + let expectation = XCTestExpectation(description: "fetch transfer list") + var dataTransfer: DataTransfer! + + // when + viewModel.fetchTransferList() + + viewModel.accountsNeedToShow + .sink { data in + dataTransfer = data + expectation.fulfill() + } + .store(in: &cancellables) + + wait(for: [expectation], timeout: 10.0) + + // then + XCTAssertEqual(dataTransfer.list.count, 10) + } + + func testFetchFavoriteList() { + + // given + let expectation = XCTestExpectation(description: "fetch transfer list") + var dataTransfer: DataTransfer! + + // when + viewModel.saveToFavorite(account: .init(person: Person(name: "hes", email: nil, + avatar: nil), card: .init(cardNumber: "134", cardType: nil), cardTransferCount: nil, note: nil, lastDateTransfer: nil)) + + viewModel.favoriteStatusUpdated + .sink { [weak self] _ in + self?.viewModel.fetchFavoriteList() + }.store(in: &cancellables) + + viewModel.accountsNeedToShow + .sink { data in + dataTransfer = data + expectation.fulfill() + } + .store(in: &cancellables) + + wait(for: [expectation], timeout: 10.0) + + // then + XCTAssertEqual(dataTransfer.list.first?.person?.name, "hes") + } +} diff --git a/UI/Package.swift b/UI/Package.swift index d3bec7e..16aed61 100644 --- a/UI/Package.swift +++ b/UI/Package.swift @@ -24,8 +24,5 @@ let package = Package( dependencies: [], resources: [.process("Font/Resources"), .process("Color/Resources")]), - .testTarget( - name: "UITests", - dependencies: ["UI"]), ] ) From a9b8357d4cbda5b452553ca1c35c3a25bcff1677 Mon Sep 17 00:00:00 2001 From: Hessam Mahdiabadi <67460597+iamHEssam@users.noreply.github.com> Date: Tue, 7 Nov 2023 02:32:53 +0330 Subject: [PATCH 33/34] Add Documentation - Added project documentation for improved clarity and understanding. --- Data/Diagram/1.png | Bin 0 -> 65375 bytes Data/Diagram/2.png | Bin 0 -> 97629 bytes Data/Diagram/3.png | Bin 0 -> 43516 bytes Data/Diagram/4.png | Bin 0 -> 42378 bytes Data/Diagram/5.png | Bin 0 -> 65965 bytes Data/README.md | 28 ++++++- Diagram/1.png | Bin 0 -> 87366 bytes Diagram/2.png | Bin 0 -> 39576 bytes Domain/Diagram/1.png | Bin 0 -> 42976 bytes Domain/Diagram/2.png | Bin 0 -> 38034 bytes Domain/README.md | 23 +++++- README.md | 86 ++++++++++++++++++++++ UI/Diagram/1.png | Bin 0 -> 56780 bytes UI/Diagram/2.png | Bin 0 -> 52337 bytes UI/README.md | 23 +++++- UI/Sources/UI/View/Base/BaseControl.swift | 25 ------- icon.png | Bin 0 -> 58124 bytes shot1.png | Bin 0 -> 119701 bytes shot2.png | Bin 0 -> 58164 bytes 19 files changed, 157 insertions(+), 28 deletions(-) create mode 100644 Data/Diagram/1.png create mode 100644 Data/Diagram/2.png create mode 100644 Data/Diagram/3.png create mode 100644 Data/Diagram/4.png create mode 100644 Data/Diagram/5.png create mode 100644 Diagram/1.png create mode 100644 Diagram/2.png create mode 100644 Domain/Diagram/1.png create mode 100644 Domain/Diagram/2.png create mode 100644 README.md create mode 100644 UI/Diagram/1.png create mode 100644 UI/Diagram/2.png delete mode 100644 UI/Sources/UI/View/Base/BaseControl.swift create mode 100644 icon.png create mode 100644 shot1.png create mode 100644 shot2.png diff --git a/Data/Diagram/1.png b/Data/Diagram/1.png new file mode 100644 index 0000000000000000000000000000000000000000..223010a3db1071071f7ce555165d0a851c087589 GIT binary patch literal 65375 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� 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

J z7djGxU#|3`8l5k$VPCS@-ke0eM$Uz~m5W#VS^!UqVWyK~5Zp&s4oC!(F z@1v=zHpy5LLnuCbqedu@kff?C_e36ZAlGzm)mbRk1u*EJGZ8)d7(PF1#4WTf z`Pg>!!nDYF;X=|6-i+l-yW`t~cD_5K#ht^oL!AV~fm0Khe(P=K6W^pcV;d>ZQ3LZ( z^Yr*k^A$SVxkQDBw*$6=DPXjI`ZFGvfljDcXUijQec#B{=m)sG{DgAQ&HhPV9fgZU z)Tf0SCLKAe&|(M21Y&*#b+ z{Ft9&V_FgxuUO9leSP(j<~5TSSE3XIQzno`O#-XInSQ-O`AnrASXu;%GN>qUzSf#a z#=yWyKY^%UjT)Jm7)`yO_dLR7A0l2C(Js=T9=r4cQgntNYZvVzT2o^i+#^t&l_68+ zrO+3S+~*P7Kzg+97c>(hICN#MN`n80PHgNXkX(Tf;#zt~{?Er;@6#5&xF+1cs#XHq z&U!NH9C^+A)%38!=MpQ2cT}+4Xx^7x&;VfFGixK4#7oxCd~IUD0Exu=LVF7OD5$J;;wvs&k11*6dJFt0 zIJ!UZT@6>OHY~_Q)px+{fqGKd4gEaMYp&Vh3nNrQ@0};eHy0nI2cIYl>jov)>%L*5 z`6EHSyH7Og6?FfKS)x%grM1prC*|60gPuBPeIPP4b`kbFE~r|sZc}z=$GN=MKNb^{ z2t-D?xgXhq2P^TA$K3c@(j0+jt+vzm9n+9<^Wval0z`OIJc-|WK;n3dSp4*E=1Gbb z6Dpk2#U0WzqT~9w_p$|D$G-IH{NY;Ixn9Nc5txOcNA;kwrS@m;A_qd#VvG@E!&Q5U z)th-jeNz(j6<0+DOe)^It&dT^;bgI*GpUN^efV^BBF{#u?0LR@p-`WK0qb0pc%%L6 zI)v;?(=bUu*iFG7vi4IbHBEHe_S2fHRhg(;hIP-SlSCkmw)=%3OY~XtV2(nST>1wv z5w$D)Xy%i{j?K=jML|oi=MPP;VMB|t-Nx1-rTMP1toZLHV=XS&>(-s>=c86XJ?O2e z5V*GrDk$r=>Wb33g1YIEHg!`dku5!3yz_cO5o)Tv>54^26Vtw*xUs5N% zv_aJre6)J*zRMv0)emDeI<`wTzGxeNr^m^@nK%OaThV4YtBZU>P1)kuZHF&htVkv6 zD1~6wV9O2X!Y;7GI+lI~e zl}?n^VvwVA<3W~n$goQ@LXGG8S=k%B5Wr$fiU=@3iwyiP1H^ zzJ)nCTK7#+hWjRbWinAR3KyG>x;FzJ%U`m{-*XF~j_!}hVM<5zK9uPT{yA7MnBB0i z8hthBU0)r;>D96xF@p+~YLQHq@p3kQmBe!varH2JCk+?jTNBKrj|^-dnj2Z%O}={J zjBqba?QE>FO1=tbCvzv^=^^UIXYwRnM^2xV%i^@uBDxX`6pBYGZh!nylsIp=G7?rY zY=Zb9!4lB&xhsOaV^a}p*=39C?KJ1huw1^yf)AO}dbu=IEW0Se@$G!doczbB)US7n z9%<`e7)oT(r)=b0s&t4|9y@+Oc?=cu5J2LAegs;CHTzKdK-5;}zuCDHYOF_4H&fqf zso#49{i)otR3KuuS0z>HFbWp_?QuX3IoCzjdzeYHFVe~Anos6b>J~`;v*GJelv2lA zF7Kph&90YSOj51hkR4us7ooE1?yo$WV(!CA&Yj2WpyDahPP=zMY_q_?YepoK=^fD@ ztr2}bv!FFKy~n2IZ!g8Tzj>X_fdog2@9UC&%3o_Qsd6ir=6;=9zewWh z!10T^Szxf&#NT}{gW2s3lDC+wT38!lZsI7nYc_WP8gEc+?<-4K5J3WIDKZG;^0Mm1a;0EC5fFubuuSWcG4t%MNbB5p2TW0;R@Ij zt0IN~=S!3>_ly;Z+<%jDO}5YtsOR+<$b6T)_I!VESp@Dz_}!a(7zqeQylb9Vjw3(v zLSAuAw5eFBE;=LmS%GWy)ar92!sN^RrNS-`V5@hX_I|a|OazmuYSF`F@88}i5SfKE z(myfx?#ND+JuFTPZveI?jLU(~z&&`)l8SQYKOoA6r`_Kh{u=!)f z!j*HrpF1w021HH&n8`rhUr@wv51%|NmgFAK7CRG-`kwD#@+HYv@J`xaz83l78^zI!(Q_=~vSaOqvC( zb>Vf4_h0kUCck3%5U0gkbUR}GT<=BEo6n?~_RjJ0tXpIHtb9?U5JJ@)GR1#GdTk@umm!<4ykmbDByKrmEoN*5DSi^Zmk_dO zfmQ&U2U|9U_pK~1a-o3t)vKGJnrXgA*%{6H)%eS!qG}xGGkwLi<)4a`#fMB+4(EhCjBkC1` zuJ;TAH!4Li<-z_5tp(CY&Od@xVnIY`b}6R#uyxwUnB6z^!!BM%Pvx?N$h|zbSkG3B zye-xeM;P!mp5vpRpEEiVa7ye>N!hvVYO&>yIko%78=rPI!(D_i5;?4^sJp1$=Sg(x ziY}Kk-wFv#9cOTbQ19}7Om;1mkvi#l=tS zQNdNr2Q@=t_;f6K8f3xCL}~Y@J3qJoSl&zg(xtizW=sfuYSFu~-Xxh)W7}T9CUjb3 zCp@8icErH#gBpBcAx8$rc~lc(s( zR+xja#lRtE>Jj_W}SI8ZO=u*qq46*j#5ZDr3DnFmBrd58Pj z^$P*rUZ}MIQFw-|a-sCKaUR)NXDd4JYUaFB@_d7S8)-9zn@tplr2ZMuQg9RqD3rr? zyod=AaMiVCr^*A-5m3xwf7V^ss?5U>v(|g~yBYgT`R~Z@hqYA>zAds=>hT4Fr7YX- zAse1mR$qI}Y5+2Bwc3A+Yt9bYugEI{^^%m~Nx^2*iF3240_o>VweJFYEaYyG5Bizs z$L*2eN|^TCIG0?up=mkVQgRY*O&rrgEa~xS1(o$}$q(j(jT(Xrw)S0yOB^i7>AsYT z$N-!8hI{sEJX`OkM{Iwqi$%1NPMbcg3DU9ibQr`E(aX8ny54od3vfIo@l-iXy z1x<2=JPnzCj26Q?l)}(lET;L9$=~ci=#YrGacFPA@^o)WpUxzPh+6-oxmO};%ILrHvrZ%BwJ zW>`eekOH&nR(C8Q*IO;%`DeQWK!L4NC^1GOL<_;!ihd|RMQP=y1E#NBwKrt4ZJe9j zKh|{spS0Bi)$!du7%yA%Q0`xguj8URLuH|ss}JPj(2AqEwi}4-3BBH)TK!{N%Z-B( zgwj}23wd0O+`Ky_9t4()&Bv;iCo9tQO^*G@dD6GbheEAHuMC?dFKF=zZGBA6@5d$6 zUgW9DQlo0Oeo)vYm1{Os8yMiC(eL@quj0Fz599l3P_0Uey|YDcQJRTRbjS+yVI?SI z=vf;5Jey4jg)53{u3WK;-xEKaHF$f#^()1V+@_7b4NRKnitOmMX6iF(#LR0Hd^k4U zUjmo?jWQ6VT+V>7saK_V{$y|%+)+Ein(BjG+0L$^UGTjlpzK`|^$k$kFd0$yE@vPC zLq>n9IaSUrFfLv)=HZbQ0>6(cgQ&s^MO${0nWafW_cGun1=^0j2ir`769cPzLHawE zOB$72Qrrp%)mb6)!J|>ME;!QP$;Et4`?;fXSXav2vZ$z)qPgGn?ctOVIe3Q(x*HRi zsy(uFz3OaOUAFRJPE^eF5I8WEJnlHC8zDYU!y7X_AFn#K5EP(rZei+^ncbXtOnleD zWlQKR>@fJT#r6mMH~pvpuzcL_{YbQZ;Hh2acK8n!SPe&S3Vw$zh!T`1gBTQAg>T87 zrlR&^Zfu-UsA7toBhQ~L-l;5>Ye^{J+STM5m{Yc%3$=4KLAryUn#RN_DAgwE-hHHuH zp0BE8p1ksgFD(qJq^^aT&xZE5ISHXUb`-8-U51No&S;aZDJb!l$GF2?M&gby1$|T- zw-)X94bgH`2hLu52*(^L12P@tnh|IzV&lwt=_o2#nGcn#JG(2bhqw6tWwGwnz@~Ru&I;~H^gQGaGhA$`|OgI!(h`d6_v{G;1(#wj8VEEiA5lm zdog`wwX`-zP&f7)M_niu(j{jKF;QqZD-NwxE*9OFFjQ+ zZ@pBk0`J60_N$T)-V?|hU*u3OYbxlSdW=mgc{=~WY-7V)!yagQ?Jaj!V(ChlldYf1 zmV9!(5IwAZYhfDKda(_IrQax+OK2}R&#%^RxHyy7n#IQ%+kd9C^br`BpjK}8Ubv$d zmODdg%!0>*@-*d1$bQ3G1q?#SpJ>kMr68o94JVBb#d)5?RP5>%JFv8u5G~%%KP-Y%W)dO6uw~o@d8fm=le0s zk9+9ir0p{V8ox`D&KuL36W!hs5%2^Xi?2(mHed>8gm2(l(;9THVhcQ+5wqZRaY%3TXVr;DSVh4rv?RJ3Qc(rJH;ci^X`2MxNTV{bZS?4*EjLQ9@GHR0H3Ce*nU+pFb$|cW1*64 zsJ3#W0b`uQIHgzwHQrY10Y#1A9&S6Ug07RU*d?o2vrf7hUsag;lB1MD)DJY99*LoS zfK#`MnE|i)+ivIVVx#)q98Cfg{E1(SESj$`e~J4_9Fq3vUFC6P9sA9*2=@V72=Bf0npby~Q)=!+Y=_P+e2 z*qd|Pg~o&JY|mD8e`faXywz6umU9H})8C%xrv*Wdz4b~N5_J25mgn+1Rk3?1-n=VB z9hTgmQg|2P|hI(1%LbFvcHkFdfjSVT0a<3HdR(2f>k_LC@}5>h zid$sn@b{$bp5SC}kNKuJ^Ep0vX}|iw*Bxmk{=I>4L-~+G21L?A6Vg;C&U!XM5b-Y1 z&C7sKleNq>$V2KvGt*@PZl)kbO5K{UpM`$R`eAJ?KbfKtvI~!tj(6TDV{kTL_bz<9 z&F}oEq5o1v$J^mlFOWr|gt|w?+R&@Sg(IkgMsu9m)v1vEUJ(SVZC||>Yn4J9Qp~*9 z2xo;eO#yX$d;xsuB1YlEI>?nQkPABt4H%8&7mg#-+$O4D}s;U_LA) zv{t;ODmo2Tcw7^0ol-9Z@3eMaK9EF>QD# zo){|3hN5GsH6qj`MvP9q*xAhRn6qRkYZdR>-fgtyMx!xeWX!oB{8nxo?g`3HFmKkh z;J|Uh*$DV_8l|juen>8n24R{{6vt&rrxMJ1%Zr&kZ4Cooy7i)vQjQ4jn5?r{C)kRB z{=MhTRFFWm%eS00tio}-tY+*FXD-AJ2B{WM>!Za;yZUh{ofzh-@x=DBHh*w-&`$^M z=K5pytfawEzxzR2pGP~#R{d7dYke}hsJZU&M=lJNj6djNq#iV)415O=1UNFOR~-jVFs|Z+1C!z;|oFNMX}@XYLB3TkfjOe$Z+4xuJrgg&N*Uf9B$#F zG_EY;q!I*fn=G8sR)~6CKRoAMo;Ww(kPVql`mjlvS#g(O_i=-w0}$0Vf@)}>2OC?JHxBkY`cm`w>J>-etE33U2V+W zs|*)}+2f&xLvxX8f^nzzBQn5Kt^%bHpXL;Iva{u_kb@z;*yh585(c`S&zO``r&tSg zG}Ir*!%Ybp7Lj+bPi_cS!#am$Ls%1@Kc(xQ{%{Y!#n;xhGT<@i72+Wdu{Is}-Eud3 z#b%P2cqYI!uxzUx5!5E(ww&xiQb1qgQM2cw@(?5K4_q8{Dm_F@8yLzoQEfoc@`bY_ zSunIFaZA_G#8|u^0xK2S9_yNhub2eF*qH<4*iZq-cN}5fV_ikc{&aVDnNJmt2aMjD zZFnoVN#4n?Zn7B>V!UpaoZWp+cI!(mg?g-XsC-uWy_-GD3%jP(5=~Pkj8Of(L%7+h z2ts{ID9cu>bkr8R{bkt>uWpwtH-4kdQY+I*b1&UHI`PYU{O0I*1=)FdrV!yTCv@7g z0@To)-Rrk$bKkjBKi{mi;J5l{)}4)A=kT7r(L~~8O~BC3{(%&uHU9n|O4*mZQfy%R zrZ03rsYR8JpsP=A`&^8rtJjLUVf@x$O_i{+b6H?5dd(#|x@uEONQ#uN4n`+CZ= zh94s`em6={+3&Fu3uV_zxKb;{qIfPrwBa3YST}<#(ZFUbe`nTnF*>SEv^;qw;9+(@ z@U`$ zKEn?oqJl*X?7C?oHFe1a^{S{ji#!3b1|jVRN*7|L2H0dAm0v;Jo0O`noNYV4N$)ed z{jsKU2btOEjlrr=eA#QvarY4jaL=02ZejAi2Rk8gVUayM2^!@Fro>;jwzyrxZJGM} z!yRaCF9{4@_(n`=qq~@DH9w0z>c!tKgx^CNuRyFH%%=rqk1Ymh$>c{8?E1cbWkB}3 zO|6Io#0I+e?z%~g)sUJ>W=iis^d&@u7sUj7m+a9C zxgfDWD8BU@q`x02)b;sonXcjN;LCpUa^nnPxMoEx?ZyaGXF1z+58R~Ojc9jNA>7W&4Fpe`xS+ zW*?ktEl?)4l!}%lZuuBh&`l*$P`gcQtZXv=!}l+4o8`Zinb?0Ie{MN@tkftXx-g}h zsd`|oCOR*3SX=@jq$goN*kxz3itE#h^%^Win)dkiuJy50_&xecElKxGGEsT0ir;|H zoCWb&*2G!wB_mp#Hg<=|wyGV)@RZh{PFCbBTfDTiW1Z<7Znx%@wF*7O8RB-XFT{mm z@7W}}KYsuxsBRRYfV(PCs_U$>HrZ8h_Hn|}K)r@rc4z4U3vpKl8kambXzicp#qadi zs=~ksj(_63|3L87fbZCaly|=gSq08X30%h@7{t)NqosCR>59;~;hXD!2&#B_ZFI7E zFxC&Uga*SPj7dbTs~z4Fi!IvvlW6L+;_9O9jaN#-1wJy=EeO(8w7&$!eb0|A$k;sRe zBep0?ls0n{9W$tzKD56~v8~-(>NzUt748d~#u*;^tk%YWp z-m(zT7pX-Eyk~nqw0(-2;EN$kv~E?WNX%`#abx8UK!0SsVr_NW{ne?kdOFSqx9X0D zHohyqt1ix>;sIYo*tnlNBQ@thm9xV)2sMRfLAOs+38F&n_wy=w74L@v#V2ao2cn)6 z6`f4eN7uHswcCTgexHl|(|(ah?au?4UWSJ58$M3R;{WS^pvnRK2z$YL@fLSoBZ==9 z>%Hqd_9`r+j)HXmoPKin{CgVe{&Qjk%3tT6-1Wq2NK2b~K~rW@=db_&YR<(w&rYA- zQjZE!{ng4sMYVkIk-lI2uZ^=*`+swj{gqjQTmpdx%u;uSF#JwYZ;f9)PRAK1g)exqSwo{rwso4`=8S-`cisfry_-|E*h6a4^HL1JI zcBko1(;gz^Iq`c#iW23s+*5k$G5&QM)!nG5pjopEW9fH55$%>VbNghpZSc0o@sslD zy4xqif9H0Xv4Nt4*M>>uZ&R;A177JDL^IzB^w~h7VNY}4lvN2L+P`h4B?3pv)5O3C zwZOyg&Z83|RMfKO^BNUcv4i@L+?<+%zhGn(n8{Ju?CZZ6838zXcw$8q{szZiU?>Bu zl?@vVzZl)CfR4QovHSK5#_a0>YkjoyFA%eT0RWG~djHMCzrpnvrb_{9DM;zwFGdbg z9{aiZUNfIxaAz*YV{Z#uWdFrDVGls`tXXT$<-dL8&zrWp0#;WJ^#3A1wEZkSZK_=3 z=9R2paBB)!&8DA6{9=?fS8H$im{j@WPxttzaa91sTc*B9{c8LO3?gGi@c*MjOKAG& z1Pqtrc}@#Xi_CzradGj$)g8swF?w3g#P*cz0AlAmK5eE|e9MK?R6!S?w_iB?{GCH0 zxc{2>bD@(d{fTI|A$a$$ThXRQt~k!{hXE?XU?Z=jojkVn0Hu}EZYFS<+92B?JBJnJ z{KL?89br%2E~nF5I+n$LYfBezrYJ|nQnv6>2-M!21c%6MpU(`OVvo|x-sru43X&Q*;Rsm&I}Krz05)pJt2O~1 z`CoH;900CY`Zs<-L8^^fyHXIN2=_1OWS|2&^Z&bxw%bH{_h{JP1L7DE$&@K?JBtgm zs;>)}_IL2C@1qyrbySt^zH9$NcgNY?I!WZ#X{t!I`6z?tu65hrEeqe&xfe)zrI(8@Jni6rUgFvWz4!ScrxzooB+DzS04%O>dbc#1Igc` zh_C|{(CkyXxAeigQt)eNQNhzxZftwRSjyV>GsNc|fRxIM69=hM2@4@dl86Bg+Jh)e zfHo;p@9Zy=#&Zi9s@Zm<(!TT8h3hupyQvx0zc?9iXlTIZc~hlduJGICi??EtJ;1~8 z|1<9ifIkcVd(nT#^uM48`xjFGdepxG<$u`Fzwz|n<>cSh^j|XZ-;nVCB`&q6YX93d VnJlE;(qxn#y;;w!8{{fgj$O-@e literal 0 HcmV?d00001 diff --git a/Domain/Diagram/1.png b/Domain/Diagram/1.png new file mode 100644 index 0000000000000000000000000000000000000000..d49f8efec9b4d15d3b9aeaa8a3765d76f0095317 GIT binary patch literal 42976 zcmeFZcQ~7G8$WEesx>-jON|btW`|9PYN@S=*rRF-wf6``mr;t=Zfhop6?=4{C{aXe zh1N`nJ!AduwEaHMw|)P8-#>oG`#6qpyK>*xIInYj&ht9Y`?0RJDib3IBNY`DliHnI zdQ?=j7%D273k-*VmW|6~Au1~ByN=4rx@yYGyt*E4c8)H#R8(h@yyF`+Zr(l98k)?P zqr67Vbe#G8ZT2^}D`f7lo=;vYGe_mYhrS00nWXLM~Lg?9do_HP>mgt#=p2$3d?jw^&^Nz=f`r)J`8%v-gYu7)Y;?@#FJP@wBbiB!a zrVu|-Izy`5OWxUYajSW;q*{4=Ouu+zS8B|itVehwx~e?cmt-AoVEs6g@UAB3jAuO=dbqxk-~3L|x8PfE>0a@7 zl#lEtrokpJ%x6o#vr0Q=tl99e*TI{BxcTehAy9*z&Z9Nk=bDg9dCbMy8BUARCQ=s!Qd=4tEa z_}`ISJ%29?SfCi?8?kGmSH=F*H}I%DrBznf(a+Y!_?9CKAP+Exf`quF{LlOUAK(0U z#D6_$^xr3Cq$K|RqWt%tH33>eZ&;lDfc`{93o`TIe6G0MvSMTuWz{@Du9 zS%Fbr>_2;^z=)RnkV!=arc%45WZ*|VKYBRb+-ARRc`Qfck`m)%_5=ncy2qk)&fZAj zdg0DckpUvIx~04bZ&+Q_Er{H-xVa|k)PLvE8u!XUFeae&hJANNpuLCvG+r*NO=udg zpS7wml{x0$QAkvL@LB%i`7kOP2Ht=D0&Bw!W!kRNP}8x3ss8=z1a-JQGu_{_|q|Du2Nm&_&0ee1PHf}{kw_o ze+2$T>i-e=w}||YgMaIf|EY-I%Hn@2;(sdQ51aZw74iRL6#e92U3X?+%e4!iP-j+(AREo{6teS_WqcJ^aBgbBJFTQ&6d@j$E7FH=(> z3_oI{a#9{TAZqK(dItb4GOVoNY;AbTL7;oa#M#HcyFECm+f|IM9zD%W$6BBZU?#@V zG8cB57S=Nd+X6dF+ksEZ1d`!DZw9v}XBPskoxhlZ}|FztGsJOW-9l z){`gy0;iStfxeR)HV1wF;C3o_I54%N_wHTzt2tR1yfl)qsWAM{`hSB--FN^4Drssy z{1cegL?1nV{1-+wDF?dI!0))o{Rw`-N&pn3zjp2TU(Fiq zyne3jfmtxsKf$BG9bgxDFJHd-XR|{)(2a=yVg>0h3`~E7RsQs+Pq+SR7BL38;ad!@ z;`$RqX7d763xD~N;jd=Cqpb4P|1T3Co_E3li%42u92+CA5&8^}_d&oc!54b!ecgur z-p07V>Dj>mPg^t_HhdoB*ZhK!t9Zt-iTJJ>XBw<;XW z-w2$-LNx{gAGe&Yre&6XXK3Pnd+uA=+u&_1v}$;v9S?iNc2l&?Do#GfysqRew4db1)J{=9ddZv!H@S~y*rfz6R zjQ?WorbU{pw^NLD?tU%;(Gjb-AkA61(vde8+3V&r$TxG%h&Zgg4~W__z}TFaWWI|% zZ|JLr?j1FSp|L9*nrrVC76KQ_4n}-T2S*=Fjn-UFx7s09RZQ(30$GxGS23hiXB3)0 z)9=Dqj+R1`Dkih4wdXZ<4mS5b^jfc7^RBITsf2I$x$v2L*#kCb16X@Y%;oxOGn3ej z?;juDi3=^dM*ObI-F~)4;6ZHu!FU9VOP1nZVe4+!_HFpLZn;I5z`d~pVg{56}$+&xvfpQ_^cpeVR=I`%h-dD9&h+j47@#>G%d9^ z9P_?Zn9#8bgu)})O+NdK!K6%mGrZ^DMX*#6`tnl_RFan1g{RQe+Dj+clQtB$ClmS7 z`+nTlf@_)~YRN>TDXN8CL;c6oibKf>eA$T2^8G2X5bL?(>dcrGs!d+SX3mR{?K*Y7 z!b=;o7vn0ucLNOXn2hpVC2|;*y!Sjm{8^mBn0!ZGbc<>86_$%I@anq3n=CGP_CDrM z4d>FEIC{?e)A2lFc~a&f7VdNddzRr>bbS^=;r%r!oV7^&3#!s6PY%!B>SW~n5P$egOLonp-m zjaxsSTI=54A9d;!afach(_nVE-JP+Gk1UG)9Bou|9D+-8T)vtmFv2#rYTNi=^L;dr z$zjFCWRn2L;i>9ot!@p8*StS9>kEo6yge`E@dRvqv|wo369a-aGNo9$M{>Dueb3t{ zaMzoW^`^%ln1|}2Vrdf@afN*uQ9hD+38lABoA=vwr#srT#iDsacdvD;tQbSC*847I z8u0Nbh6FW+7iZ!_pnP|2TAvl-g4{2k8W)|0JmdGDajG49+S=Eag&ow}+8h{m8!oee z>?l@`+{=*jEy*kjZ4Qx%u%{m-E;+o{&T!e7A5@c=i8_?#bh^-|*rOYJ#K1f6$(GWb z`55w8exfX$iE}a9>0BJa(IXgl?RB(*EO-C5d2oV!5N;H4 zw242~ntWY1zS+bLf)}^uM}5a)RIyt{4RZ~573}J^r9$>k1vK_G^}4@Z-Kt+~LP9-X zmS$les;o+?=rP5&>=~ubv6On5e;yJwR}9=nTg(_MBhW~@7{n*%?Yiznz^K6Q0YQ}0 z%Fk^9j%=j&s_@#7nRzMe_*LuPoxL~A-XE^ge~}|q>Yrd(H}@GN61M4O*Ffy8+0x-JuG>uLdX_BD{oGLrrP_v}KUBThn%)`8p~TOT42h+JzZQm_hSbcOraWihF&IzeLr; zK=P!Iz22}<|Kqm!9A`xI+^V3?<_O#qbC3Xq{nctuP`9#wLG1x47|^Y{<(* ziI^zDH+_2-r;mseLG(Ay6Keb?Vx;Ds#9F!$0Z8cRJQ1{kh!8?c#POI3@CJr_di3eM z5csaQeNyV2AIs_$s@;`NF%m5Fj7Q{QTf(^cTz&WIiC(B>C@ge&FP^yu@^M1IErqjp zCM1ZPoYMRd<&%*TB|1)>*2|Y-p1d~FRFM^`AzXIL`>;`8o>qmg{8IgF)`4d1;?;_k z0Q8I&TqoVjV$5f*7#o2PJP4NCe|Qqne0nvagn!tjB8D`+qXqZ8BfEd<4rn1`Y7|)G zM$+bVrZ!`^_XwhGvn4q2<97apCd+zB^Y^IxS@|=4@{Ar6UZd+c9Ao-NKXc@ou29A) z;SQ4-{n>RH&9_#Dxwz`lkih9OqCx{;{W=6Z*5KWjZYg=Ndfz8JdWTs^iY zN+@-EWt&{6;8vNXxT<|fVk~%b%yO=Qr4zI68;rpy;Uk(7VpsKbG6B_`83eK&b4|^AMbT-dI>ZbeBt}=qoNJ_WuoVS5qi*)17(W1*J z_%bIyJ!if@XQ$5YI`lkxlk>yYA+I(rABMM1yAa25U+ymg()CNbtBK7LmzTuqj++m- z32rW1!1?`A?^*n)xDuunzeL0p>1nT@Dc)Ywk@|EXJ#j2>I|=%ssNG{iJ~I^WkDd6z z!Z<0lf(yNJ2GpwYoDGcSCwO094iH~-Mm1a59B0ggWQYq9rcF=`z0F#?Tm^tUImAS> zk%BEhbvCb0r#XwLNNqCO8QkPY(#n6+9%I0z67s1t8t8U;LMDo-B(nj7}WcI%W|Y|sY{$~vQ9hqp@~&{~3i zvb88c>d?5!YwA z^y5;W>6>W!<(fK$&1Jz+#&Z=3PMxz#&-Smp1WgoGIBEL4+us@XX(mGe0QIy=jb(F< z)n+kxlPMyxxh{&Eg!{HuoBMnSBX}OyZ0S<|IAZ}Ph7A)CFH8;iwnz>nN#OcZAv-r& z&K(5oE=!JLs*5(3&mTCG{dd}eH`KUOBk2pT=o&>w6|S~RJ2ubB_cxyp*=rc(Q7D+! zC%@K{XUPI^Jlu>%Q8D?81pPTqD;JRkR^a{-^vOI(JU&agC|64Dk-IvCOr zTFp%|G$~YJ8Q9Lla5PsQJ`%Wyh7J^%e5@?y&+>b-zMOqc+ZV9=KKd&0C61@$Tl$cb zd%EFZDcZoNqHf(?h-cos4FFvtW!q!QxKn zdhfTQcQVgdLcLwnJyzN;w@qs@1~D&3(-~9SdroTPt{cNWWyN$rdtNb0h-+^S({EQP z&(w2w%%5)L(7>g89WeR&9WXQbd%okeP|l6dcJ)NPdb4`v~V3ndU;0 zb|HBs)w#rYFV;FnU*d~?gI{b#yh2G1ZZFX$2DNrxw2C~?%K@%bY zt=C3xVtqbI;Z6Or-y%}o$IoIo6_9IEd)-U$-uvYk_&q8z-c=0tMS4>qAUZ-*~UQhER#|^ChW76X&c!WaMEsR6xGJ zU~#{Dezb^59O8Dgm70=o9i2W51Tps^_7|!Z8p~TiOg1+s_Ld45eHyy&g>X->7*>)P z*QD0+*xk_~unL-lQ1f6k;e4dJS<0FqW_d2P-%e4%qEAcsNfNF`UtUCi`|e428Qu)+ zzmKgNzN`c@^HgrjE8%qSbuT84%CbmUy!Q?g(JQ9ria^|cGjxq$05zRnt6cV_A4&B! zMwOs!RIruadv{}4%on{zj}i`cL0_G?U%zPbar_p#SSM8Y`pxc~5zc+{kyJf{TBq!X znK+DdOyDRc5xUoaeZV!bym7@6fe-dpIpSgD+SDwISKTVhiPo-Dh`KDg93-1%aZcv? zpgrTz1Ze<$2j@o`HdE8O@S&;i+HvR@PQHFevS3?Fnft+{2|pnD*|q?}s(!Zj#qdJU zJdN|VR)RX4?6x8#G?#4^+K>jhR42K9#P^5~SOiRzvP=GW=u7=sMnaBLP7As(k* zhDK{LHes2?=kf~85yA5UVuk&(N&VVTu7ih?ejItbi}jm$vQb8V>K6+=&H^_z8i;iD zZAz&*G;wveX=kBgwHs7j$Cc}Jtl*M4>}5rQs|%!MwLJ^5>Xe$F<$u{f`0h)KT(IEx zVj(}n_>y;g+HOtjhP^)5Gup1k#8!Og9&b^D$EvRzpe4@v27G&ywpl~0m>wMBNhlC> zPVcwaKZasH2gNoHMYI&lKYD_kK~yS+^t`q$AR)tJq?-l58m8^mjIK9Xa7k#FW9u;y znBs%&IIdaj6E>=-9H#<7N7xsibjAy4(s`r1^<$k4Bu6uov$3jLo`s66J++*NF;48S zzsF<@1*rL@_YX)clxjo?Ha<)2{=PM$XBGNVQT{IL*@UWXJ=FWx&d@tVIi>fW^Q^6G zdJz{j)An~xTUM{I@`$CX@ZkgEPw53cLp)ZOC0MHzB%r35oI1}*>Gz;LZo3V0@q0hW zvmh(?Mnos>lW`n79*4&kq7Gr4#)87dbl_zPPUMlvxudX72~85&dn8)>!&>%*5}CKF zP|~8Oxgz!;k{rdL))l_?;8y1mwJs|!^SdOr6F}rfmxmew!>K-X1i0rtO>jfMGGDb5 zw1BgU_1#1I{n^~?eE+n82N6v~1TyMwyXE=|Bs_h)=N)SqKYQe^Ha@v$ zI9@~;iybN=*5e`d)z$9IT+xMV!gMVhsNQ2q#7}BcY0Kgr6OfRT$k>lRa$>VR_!?EN zh23GeLC3Jy zQq?o3o{JuT#?#yn64U;Et{dSb{~j|Kbs5y7=e?x`s?k@y?-Umln^H-v ziA@~f94HREkW79U z%#fd41JN*?G6zdZ5g*GoSwpU>UGtl&}o!546hsie-D$Zqe5Lty?xl11_mJWZW#hh*sL^)A^!cozO z6DEvi>bqmS)ZN~yYe|HfrE*T+&3AS;-MA`0W(i3$+{cE<$X6nrxu?wC&gn|nLc9%O z@$m-O9hy+1g6Y$O!O*TaX$CEx8K=|}n~%7Y6W66IW1biJdobxIhSeo-TNKW0)f9rs z-<{1@ozp{XR014*&1ePWb=#%HCMeL%2-pat2n-M(%AsMTGst*w+ATB>;p48S<}G{W zb2~XDQ`CG<_8Df=)r4M%QMOM_>A3}0E{>{@PBO=9eMH8BCbQ%aS6)oS4JM7l#@2Oa zp=?`H;)K?_*yOmC6E!tMWy$&PE?k1h7_NW5Nn_tt@t~hsPWa;3*!Cc^h$%LwA~vSf z0upVAUX#9J#Y}iLTM<>r(S$%nn^qUJ z*FniY{5i?~A)7YJxHLC~B-zZ#43k`pGUTYCgok%#e!^@|w-m1Ig?EOUVvfE=WqOg| zP(YViaAIuBL?eGNwo2gAgMpQg?r%@5pA4>_*gx}u?5&VK3(19$h0fPaZbv^$`>#NnF_s&kwTYc?g& z*L$sjmkqreiv(M&BaLBOA8LX^`>@wPuA%GO7;QrKkxoyEXPm@PqJu#6CQEgTe{^J_ zY1maQ$q8M}EH!TZrVeqU4VEhrY~%g%)JnoSw9yfnVP&?$L1Q~=HJ9;;kmHn0^i#!t z#xjFS@+_vL#?au)qtf)mGc+tB%Njz?&UVW-EtCzYocJQX2 z+0fZM9Vm|FV_#_B>cE_l;7zON-8!D3I$2`wA-yx^^4eJt5_FHFfT>p9vQLfW*;*J0 z#h+m?A>mITtOVmeGD#Hncx$$4n{gnZ?uDv5y_Oy96hH9qAkJekS3IH&Ucw zcu@j`#|R6Y9#P=iM+z$PYCLm-IP;wX+zC(dYDE^&tGR+%yvPoprtKfgI(}H^q<*5E zAw&T3<_te%%22H~U@0aM@qid5EOb>n#X}s|Wgk>g+z?G1BOZ~{W@L!n!1rL4z3({f z6fq-GuNPj@%1vL6IJW+>7@si_Tla#Wo-J*w-l6XbQr$~FW{3k>eXp@ZGj|Q~npJ&P z-28R!BjX(d7XEVe%Mh9r76l zshN^T`f@ZhXL9jOC_;bXNC;jgoqKDZxX8u=3;lRK${#b0$c;y1)_D0sY%N~$@A;B- zP-pb_A!upQ*O1l2kR)xKw3^t(eQsP>&jVPqEX&h0mx2tBbMkF~nL&WF=26}Ccw|0u zI}(9x+mQ9?FH({S@k(z)P3spwt4US~82nyeQWiN-z_9w_!ji| z;Itzbt@xRVhGF+oc3MSE%mb(!=T5)A4i*tRXk^70w(i6QnNsMmq(9|5@HPz!+1$Mj z$$;`DBREn^IEt7vdNX8$pMQO?V*}GLDsg?G%&%%~A2TSliS<{xj;tboB!Rn@g@9uL*~@ zl+UbRKuriU-$_boYlw>=Uoz+SA+Mv5_Ft>cO`?W&(wY}dJ2m*d*K#w*AnM%Qf_cLw zNFR-F)v1=acxf=M)NCeOc3KWQ78u%`)n*@PZ{vQ&OFG0WCMLo@LvDT4b?WuGgdt>G zW3v#(GN)vWK)QnitHsR#XIPb*@H~_!?s~?c6L3J24<<`os&kkBj3l;7)tcm}&-7n} zjrde&A`#bW)t~*~PQ?0LM}Deb4L^DriC_U z*6ZmkpD3)fWSH-j`tGiVS}EkjtThlgx9_>d(R^JhA*?yazDW7lXdueW*vl1J`0+A5 zt?@xGpZ!piE*~g(o}l!2!@8~uDQn*w=&{~W7{3-WFI`BU-x!8LFJ^I|m{aCB^8=D{w0)X7%w+%Nl-| zE2=chIDNj592^i@aQR{C@lSj+#Bt&&H(c66jRx0;7PTF{MVi=Z4ZdPRj;9g!O<$vK zCul+X>X&>D0phl-`3h=TuvpudH7}ZHW@m2nha{mRF&w9{oAh9)m3Fs=aRwr5q>&Xd zl;=fc_h!A!gZ<3V*;k1uOB6N7`3U94K^is8alPNn`r1uV0qTmCJvDlo%j?i>{r&a2 zcWXO2eLJ8=5keD7?*!!(S41DMlF7AWzz(Tfj9Z8u?~SoCyZ%P6L88I;KAO)UKHDA1 z%$>e=6*;a9A_;~$IOsXP#lJ;XgGLydXV>jRD%QuTDxmbmU)46iZeCW|3eLjvdr>@65`(`Mqm z-Ufa7s>;u288Pa|#?sVxWzQ*hZR=hLj`kQt3A@ki7@zWRE~6~~ihR}w@x-of%WyZ` z=c6~uCx3hxUx{J+GUBz`)vgG69TOqG9@4O3;>?%(`s5z^Hn9+@!brnb`H*TsaPfh5 zta}*pgo?LxKJ@jK0s{-S2SRu5CaqO;E6BCCPVKucPQ1ZIUoq+{%OU9!riPqR=5O;o zx^gVWCvc&KFqe^tS{hM$XSYC!=@1Jo8FShTE}>-yt$cabgTzwx+;*ai6W`*L`Ec5Wz1@wTWN<0ZrjeS_)Xu&IeF;g1KqJPCr{MItbLZJ_DlI~r1$LJJfp%yjwB8j zc%g8qlxVr3$M%~$sDN7{2D%5CYfN{yE_+Dz&$%4?m3-ZmuEaSzPa z6;9kl$@G1Eg)hw9Q*JXR9=1w*vhUNKx}Uzdcp8L7 zf?CxUHw_36WC?ltaDzH7mw>vuCgek1scv=RlIlTuf(6q_b&-Y8aq69x`fKIHk=5b0;QG3;KR z3Ez`-N8DMAWfrE+8d|z8#&UHc0j;=zPKojRPCxuXZcjbG?S{qrsl2bw&Zm|>!SiI9 z^{Fl;cA{!N?0d|(j5-8RMMe*O({2>GfT?s(Cn?qr`WcINEjH zAjJDvYZn`^5a{6n`SXNxweu^TA90f?guj@g6*$Ja5!8cg&eLQZ>ED<1x|8ocH}XV- zFo6@i;@2ODoxr_x%+#e<*rQUPc+m}7Y~bMAVB}U#+M!;^4mDQu2?#AsaI!4$3CAn( z@PnSIDaL>G0~ytR)ky6_8R;o9Ah+Z`MEmV*d+9NS*RU%AQJH@9p6uZX6EVb4BM_)+ zOB^7}kIiY+WhLX;>+|88E0GG=dVcU2=ttB#%|w zt0UqwX`;9-HhG4QlozMHKc7r+t&3gqsf}DKLZ0|Q%c4*tYsJ**Kx}pkd_45pBIa6m z#gN6oW}Z>*y}I`l7PN)x zscq7qwlLZYnf0q%vxmsVBBv2gYQvX`BtN64*Q3u^TX1Q#`SHULO3%d#C+B%t0&Wr< zU+yo|FP1>Kq@Foh zcGy9o8l3wa(^6(-U+#)=g)>(GKnAC+&v#i)uJ8>C4;>>-txh2oCf2RyPmOJ&RJqPa zZ7XgqeO$V>jg0o%=C!uL@Xz6ea|WY58*J*tYridsMiNLj+IgY&JEM zg|q|MjLf*ipQYvc>I7m98@V;#&&-8P?5+r*9)6YB&kPuHRJ)R{E(;me=Zkd8Dvte% zUjwf>g<{a^?FMLlK5@a?;HCWW+aQ*`Fh{m z80C{o6N~*g$w)o_(bpOY&?-o-g zd}ZHX$H!8G!tScN;>I2*+nuDR_u286GXeGMsv*=nA(3Wt1~EsxpX61Q1d{6?DhFVY zm)q1bQd&??Is;(IG%bFXwv9)3{KW=ApJ+cSZVSClUQgI8-7`s|CP6Y7VGknB$oh0#8kp)7=Ku@%I}Mh{0rKOq>? zPn*NlI8?Fms)YJHFLpUsk^msCFkPFA-OUQlppLZg8xpj-F{dDNENDKj5eLru`4)SS zM%hawIS}hzh_`vPLB#DH?T_9}cl)TO_H=d@oYVXX)$&*ZmciE$GJmlVw6TFVQ_h_d zL^G@ThvHByf+A3{Nq4;vZ*2m+Yq4?2R}qD1=uglvoPo~dRGDINZfoyM+jP@kRBuW5 zZ2C3lpiBwDCAN;CEuEjslZ?Nmq^i2vd`|LmaRL$P?yfqFIc+aC?Ud{dYiv!dideKx zh0O1c(mG?mecgVO#~k3NK}kTm2S@DFMxWX+lFobzIODosX^Ks%%V2S}A6i2dI=Gt( z?2?+M@ef9i6_VeEcNe7<-J8-;N^l+VUM=D+=}E{b4N2-iw3&~Vrr7lQAO#DCCiBMH ziosygB{ZyV+x3cCTc+mCFx@N|RKl-INQ3^yx>|X%|G>wGL7iW(6A*Bv5~b1xr}4P}!b;3r7qB6MJ$!Esn}QNB?haTF`GO&bxf zEw|?t_-)4{{`ongC;lM}M;lfYtzymPy@$OXvKqJJ^5Nyzjmac_ti+WGAS34(y@0>y z#|)L^<3N5^oqq|YOINwrYeHI4>dVxFKI4=aZgv5qc6GtQug%HHUh}y~wbM@V{T53n z8lo=IgUPt~oUm)7Pkoh>Z#1vY`stBk$d~D_xvSX)PeYe(D6*hVO|pN~9?rzVO`2eZ z&U*n=ccH0Sb1AW_W-}q?bHZr%>m4&Mx;=AU0t4!|07TewGP}!jS=g8ovINxsKfl0{ zjI8p|*;w0(zmnFT@B^uJ@*2q$0PwE|bYIg{`j_-@b=v(W=PpS!+hWMnKRQU=vms;0 zbYD<`GDeRPfEr@>Iz51x&F_RV4#@btCkEC(Rq+5wz~g1l9`Y%AZ~td59yQ%{AeHHc z?wP;F4Fdx?dgq*%&i0xB&{7gb?85{`8`=yAZhJqGR>d&^C|-sAheN6|6US> z8vlVf|IGClH9iBSA>CkW);~x9++PMb{Qni24qQ95p~;w$hV>baWgV*%}x=*xO)jx1yE`vwxAaLj_3obMaw2dmAu8cG|D3 z-dcv16QEx>er=0@GIf$1i&1F(^)E8UK<3d+fcQu6-s7M%DR@_TWMUp2SmN;76l3=* z?^0J0E{LkqS~63-k*AWKPB(kC=x0*spG0$D2e!n{+CKL$B2Q70HMIkuHeC1@{{gfY ze+p2uqO?NqU(==>`gu^YDf1g|Tl|-Ue(p-@ZD2{p-;A&Pxhr59Al)&g4}Ssm*SK95 zfb34;`Jz*QvH~!FhRjY!x98Bm#S^@UP*3fx(oFS?CJhcKC0d3UH#?DHZnczc`DMz?;4VeW z2uA|c0pDiyGIa`DH}zb7G9oF-_-m`)02$`U}f3lG3* z(@!=3WionR0F=`z?5blGI0^Sx+;>2Yg~DD_yw_S`gw%@QME?R){INhzAUv#oCx zcRr{zY?XJV%OK??!_6*)fd`LznclZH^_)cvAaVEFtG;B&;S{#lJOh_=p)epd(Y84_ zx172nPwPrjQ9KL4WpBWc1Gw@uo4dd8&)M=SX9sS&`n(^^|0ZSAHfWhG>=5J^>=_#EdfI> z-CD66-BbV@X6FL9pt>J~@wpfVzDsXV-thI%+|Yvqso>UQJDtz@*}b=gDH7zM4&*`C zeN)6Jb~SO|7;x^Cx4|fEzR^lkXuMMKu8uPE1PbzKC!M$snDnVjrSsP{hPCBfY$6P~ z9R$5IL4mQ2dkX?{K!$d;ZKkny+D(eShdaSzGuTUg#}3{Za?~`CYIodRQpQ}|#A1V5 zTpPBT)1)0e*1du#(845viVq{==vGk-XbdlSQ|CsRzK-k=(k2uZr?~yB+BW2Up4MBh zyxATKC#2rawvSs-8=hrqgn8Bbkmhv`b30bpeQmd{m_J5Q`CX!bN|~<@1Byq%G7Ocj zqeJY(p_bNA#n*;D5b|z&e%3z}(xdZYGP}2Iu`xJfIWUyN4XPWg9*aduq*GILKrUd7 zphMiYfdDNFXav0n{kF(?dMT*ZARGRy0H3=lm=6@c-YdHN_|&dOO3TkY zt3*okz`vdZ(({R@0Mcd1Kf6T*PZlgSJ7}t!*f8ZI?e!=7CpRA$fE?y3@Lx55)&pFf zYZwpT_^O(9c~4=!X-<1%IHRiibOUUyxO(iiqxfM!M;W984AMf-Ad{f-jC;tg(Nw(}q36bi4U1O6{y=4GOrtP5cXO@R%zjk1_XtV^ftPfG^fA;Tgr`CQfL z!HSu06_{oR7DaMS%>MjS730%Kf1)G@Gk8njraJedl4g8r6~Kr-9fX;o;l=)vAEPz3 zRs_llv;ae#${hssc%5x_D7S*iG!z!N+inlz;On-nJKZh`jH|1k9bE5IRoBdA{pqRL zaD)G<(=!(c#8xpc3i~pQ!h+!EK&{TxV;w($9bKlY^CA4;J3cr3@Nr@SZ|(BHr-YxN zO5J?ChjtS^05ciB7zeTi@?%6Zz{zChi=hk#VN|e8AuIm!BMb(0VHRTO?L5vw@?426 zY`97d&xSZ*_tT*Qcb;+>t}0$9q6ekI@{0Vv%% zKv%_Re_><=TZPb7jkuiL85NZ?NrGb1u3EnV&GQ|rQ|gsdRs$vu#PFfu=A*RGGgfJ? z^@YWk&##B7m(-A!eSp zWT?DKy`EPG7{K{XRBL6ah`r}eYH{dW*@vD~h9Ct4*UIuq^~+;Y(+DGAI}B=o>993L z49e4~n}c)dO?N#m4*P9g%P!??1Nu5&%TJQ$s$ydfLc&K6#%(r$y&L}WszP0&e)1>@=CD_5pLzz}2Wr1MPq^fdwr&vmZujf!D!M5S{{hwuD*?RQ-lH^WQQ&qRQ?6AjPiWZ); zI96C|FV8lHxhHDcx zdgD4fg+5epyA!%gyX3URO9$+Wqn(n&UNyzl-KmmxU%uIO97o=!g6mNTbY+2U=D5L|bg5=wDRy9&U02r2Z~h_`hkiCtDz)!UbZ>ehSicEZO@In_XK2*Vwu;*i zGQ3Ctf0{3u>~uhprx{|%p3VC-S*u-lJq6OTR$PX?s1w7S)a-z zsM-6m)1$b7Gvx@_ILgcgi|AOwZuw2+Sc zS~XK3ML1E1j`bxAb--{Yi@e?K?A#;5RSql^a5WmdsO*CSu>efa5P-<#qID6Yh~hg8 z4PcPJoRxMf8*JSe;&kh?*~FLy-OQe+#IJVDKOf@l@uESLkGjL@=j9N25?r#*Kk;l2)%UD>F!D`b)$qvJtPFJx6YdWW+J=3*SN0eC|mMJ!>43I!a{XFer>udJi zW@!qPI=LXFU#qv)oixD&oUi|<;?pa5ARz^7{3iA}$#D^88JRoHtmQ3L?X zjlIp2B!shTDbymc!lBb%>E{+PRNjXJ#ZO-W@KDA6KK!Up`TBryAGiPf6`DB{*<;}B zH2`a9xMjs(1Q^*UH?q`(mhxd5w4svhm_7upn)tBwD5QV1Kfu+6tG^(BXrO78^f=$J0MoA&t6Hc zH&u+sY)cCKG4> z3HoS>_0)MgqnaAwpyhr~uYtj}-J;__Wv;{O&q`k1eH!vzyfelewgosG0LE&-VQy1g z7tsSIo1?!7Q9wn#{%LRgV;uBdaw%Y#OTfsEQE`e#9}dos>YxJic`0@+ffU@$AXksd?wBO8TSoyK|O<>O!J!i+*VcPfYWd zJngiBaEWhTzbT+g~c_B>KM7POt2R&-^ z+knu1RW+7Ot-5=LQNP0kt9)0ziQ<7@11Gs<@0S+;pkC{D>?6I6Q_MiwUI*fW;+kQS z7$#2}KxhBtlb;6T*7(jM|2Ic_3#-0-OlfiTNdHi^Gw#xyEguCog+U?MwQ)`wTd`~l zH11qoD(K*YhHbNm%RiBcUE!_zyS#9Hr$r z5IlB2XUqurYo$2udZV`3qu;!x@OD|T`wfGu%KyA3$ZDTX)_dL|&8^D4I8t8fUQW!} z8&$1KnV`C1px~+Gnx-Xpz~qs%>$XnC-;V(nj0{9>aAVJ8SOwJJX|9cZt-*5mVHrik zgzby^zm~@vFOvPv7tkrC0IL1O9lA0Iq=NdGyz?1xMG_ake>4i+T>VxyHsD7;_2%iu z=k$%eyF380ZQ!w+0+{eiG$3Y}!`v1B3jSSfrU3=|RIg%WTL5fwLv90=4-wNw<(T;A zvLTwISpqPtpVSh8vuL*z(F|B^Naw(rJTbRsxelPN()g!iki8FJwx84f&;GLtq=w0o zci(AbtP3J68rh3W5yeXF9K6M#p_o>crQiQp|NZ8&oXj=mA zIXEwI{a3sc>}w6F@AEMP?DWRy0Ymr<&FITxKy15U)%ekgK3?5$ z8e~bi-pYOQZPfJb|5Vdoy6V^Sq-s1oW4`4%>N2`dSBVP#gHl3|N#HvVB%2DMwwj^P zhUI~JtvZYU2xqQP>4FX{FN3dbm@z^tZx;I!qzvH(2dAFX*Y}atJls09bVSOhK{p#7kwyt z`70Xs3!tf-{zlQPi7`=wGBcJ=7cE1I@pFC38~${dbsw8UbSp;yam`|-k{7%>C2wCv02aqj`!J%Y)~als78SIF5U6WV!Tw?KDH@K8Br!^IJB|Xj`(dZB`KZ6<6rWSxMN?+S>h~-*0Y!pJ00_?pO|5>Y1Q#Oz>E>bagpA zzZpHr25IAb&_ul%z%ee@*Ou=vG_wXbO6lZwkvD+| z&7eDfrt4U+R1?0_>d-%Uzyf|#Zr{Y0Br)H{GczcJY8-4hYe%B^VedU77p){wyMXp1 z-oIh@Me};5L8HP7FW`=m>D?aTnQC_yeaaX4H7idxe0sGBKCRjI@E4oC$N*>Mrif#u z17}7zVLv{p*`|bEfA-(Q6_J}@#ULF1f%AG*l@qojszjlN9B9sCXzYJ`XZW$|&>K+T zx0VzO*bV!AF$R<~ck4eJyv+(&A zF;qP-R9w>ltNb4Dia{{LaCo{)a`bboyi4d@f7#ovREgm{%**F8All!2m)$@o>ub@I zY;H&RqA7;%KOqS~%s@gC?nc`UAlmnYpCSkG{w=2GfJ1Bey(0xuqzY}tuYvup&{6%3 zU={@@sS&@l^`(t38ar`Q$Ha_(B9HHp?BxIkx{Ng3DJay>AGB7@xSx1gN7T^Ai21i1 zi${Q?nMtIT(9DdrhTz%b{P(9R-bBLktBYqJ0q?3fnO#kKbGMwA?uk&g4~F8eHE!-l zSCO5NmyTL?TPnZC*Qhoul@~XW1*>*SOC4oF%0e!VEKalFd@G077n)Zg`A@(={za?-G(u5@iA%7g=vP zmH{DMm5;a^XgAlsJnv#(*`}*2Z1tqrK-2gWX}{H`?a|ryTY$Ww0ldP8Dl3{Vww+@Y zFsB}pPg!U>Z_i+G)GY90Xo9a)6txqsD2Jyn-arrJzjCUcJSG*bwEO$e3(m;uM@W)# z8JHie>P}TIf~*Z&Qm3_E=G8T%s6%x9XBQ2&m$I-_^JUckVeh-cntq-?1yP!S2uKGN zk)qOj7m(hO-ULLNfRsoFk*YN5HH6-KCj^i#y%VGtA@l$t1OkDJpYpxC-|x9U?$3Lk z`!D7Fo}HQ9nVp^4eJ#D4bNjp~2yoc@X*({k0O+p4s_?gO#LfvmzJ1S`Wd4}856b+- zuLup`HR@5DL{o$*%l}*km}LLJW~%42lkkm&;gnB-*ht#m_k4m4n`#%`(f*I|5#2vu z&C}c;Z9UYSmnfsCQRSBCK8>*zgg(Kp{ig`(?bBzfA7YnF7T6TF*h0MO3ujK7m@>y$ zdKB#g=)%N;(L4a9vmS5vA1;{j?P-=yIw)~%%|DED@5RZP@p17X;Lz+V*JH2!cXBdOJ|F#hGvt+i|V%QwB^`RhO3 zyKeqilVJKW&-Ept^4R>Yjr(N&z-gsfI91+1QMN!3?Ue1)jMGH~xBh%#jU+)L)*72a12E^uJd&*eVG&(>OTrC$0bQ z5sdkK_C|BB#{D(kagT ztLpNAX^IZR*{r{u(gM?n28IwQ6VhQ;Y-^@2UIZ9t0 z1*@m=^rJ_>M4W z%xs0p!eWbi0!Gkvy(eBeATn&?$DJKh3%3DQr?YY+p{)!Tx@OAva@ii(I@7qMJiZyl zm9Y8>;D*Qh0NC-`^KaZ(DaYud`cX(&XH@yV^P6 z-=p%p(vI5PBd+ZXy@voEm`A>Rullm#jnxsF-enkdVkmQb$Ag(c=P|0)5-nRuGUQa* z5qWV8t#Yw&+=La6_PTUnX4`MBeGenQRm-VxdR^}w_b-IeJEyi7xnG5OeY-jL7xSra zJDYbr8}BAt@Lcgv5q)`^m_lUZbV?n^sxqIsqpBS}c-RhOYP|`di`j^MAeO^gL-*g;;%Mh=uAJ=&U;fk$fNm~6 zy)yxJ@wxD&^ILS@ zt5{5eYRm3Y1L?OHn~@JBm_1g58n@CNpY_jGwjR9ygI8mY&zx?tx*AMc>(unCP>f|v z@&>{Pb5*MJ7*ZED8q1PQnD9{w+_t#3a%sbSsvO9$IrrJCbTn~kYalstuXBV}Hk@R4 z{q#L-gI@bW&6Ih}9C7bbKGiawY0P7j*;(AP-+B`H!m6yQG5r7;E2kUN#nwqL0?PE3m=p%*w@hGp_1o z0vfw(+Q2PqY%KlFlU$t{$$%T*R&;6Ehl7S$thV(QAsttn+zCI7=nIQ>7BIU8Y5m?~ zOp+g#GE($8(Cn7#MCIgTYU(WV_O*xMSR8^yXQzOk z6<&H#=%`%sbknv&8Z&VH>13cWjM>vDsP1IG#ohJ~9#KOF$j71NUE2$UwsEJsBmtG$ z&Dza%RiAF2&+uqIl5%@Z8n5W;z(rZG*=N-FQ^MX|RUCJv(wN49KKk&gE2pPHz0?+q zTy5u8ty{Zg36YoFLcj9u94DnDHxqT$1gVs6DC}Tl{pL4w3zBbEuD666cen$z9ez0^UVYetstQIDDnrN4 z(R5*mre<8uH?13u3u=N!P>Vo+6YqkgZ>?V*n9j=*zkCM+y2oIA`WcBwmsGji-W=7d z8JeuZ_*>7K<7rM}466RXb2)7dr=?wJm)KRAxAFD!RtMlZP`G08To%-YS3YP;W9myv z{W8(0J?IlId3vXM?a6@W%V!mhi+tCEFopZu6K$;|G(6dzs3T3R-{qqki@4pEja*^51h-LC~coJ2_u$^nU42V&c;6JUF3Q7 zMxD_beJUCzuk{+cKb>Jgp= z8-1qSOWwR#)xGx2?A32=MJA)X`WATY&@(~9>G$){ATtLmA{5w|g$xe5O(Jn-#6DXG1+_%6{ z5)i0Fw9VwdUvt!et|Cp;gHUe;FyWQ zOAB`ITK>V1XkR&s7fD(cema2Wx9Iq?{k`64CtrxtC%4pTd}`(nwJFcev7u1j)z_Qn zRS+GFHQiVlGc~|DTL7wgghjy;x6dnO&ay$D@+Qfb*2`S8K-^Qpq#pg6Q;pZFV9n=n zMpS!>q$JhHx+euVA4vPbGJTzAKQx5dOYi24>MSoS=-sA9YCL=91s}6Ox9j0ka6TSM zN`z8Dy5kF$WDs2YE1TIH>zgSS8Zpu3-pJ3&{jF!g*E{D1;Vxo#yInH{K{2e1x++A) z9$5tmV%s{c4c||HpR`}X$t;}Q0|%EUnv8Z>$2R6_tP@uCX7Xpa?6BK;1_Jz6Vt3+b zXF@;C1^7<6(z5}EbJia3cnzitN5$Sa_=BI>Eum`&l>1AsLo-@=Oat`_G$b2QQ^60U zNlP(T=f2R}s%GMo%HGr7)bXR@2OEH^R~F1Gs5%K|vG4?)u*kv-V9CL zjZGc@+ln5@yqtec9^^Y3I8j@z1ya~dc>as3-_!;vxkC9>UR9hVTAgMOrY`_<`j z9fWyk&~t2BF475tc(G&~o=>L_XbIh+LmPO{9v5ZJwxV672C6u~@3%cQQ3}%6=hj=f z4K9FdBr2x8ehd&jE*ZNx)0tCgwv)foiD|2A{dn`R&*D=r)u%e>BXu@lcZ$!-Z6oD7 zalviV=Bz02%9N<_CdDpYzPn0|eC3AO(3AxD#&9u~85qld#iZTe5>N$j8W3}qm8yq( z+}p{@Y2{}7HP*hweBN@i>ack%Ew*{^+Vp|EQ@v`W+WjIs% z{96!+#$oo`}WoP12#svG4w#@rnW&56HyoUS=Q^iQoQ~l=xrQiZJJ}Cov|cD zbYY>mhg#n3mR^Aqx64qK4Eyt)RIjev$?jv)9epEFqv0DdqR$BVYPS-80X>)PIjNLZ zlrY{M7>D{1y3Nk_=vSf6TkHM>kHkr{W;hJIs&kn=8LL{vcD;^!sSk$h#wr6a1}C?_ zi@~~tdiJIpT@D*?yJDSE3oAPwzl|!IAhQ?qnk7R`C^FiB*M6!PqXL)UDuExVZwTz# zMPkzpW_OtRNuYiym$CC^*WcOqX!POGaBn!!m8bFo8~m{CUYL<>t=HG!N8o!?JOtJm zDbMKK_#ZSV*F_aTC>lJn1Y>cp?n~?i$)PR73V*T9tc|e+=oZkIeLoE@i|O6n%~Wq= z0B!cS$K;4$=5HgYB$No1fqgbku`w1iFCwA=y5HN|?L>)vc`7kWmVwiA6C+ z?T~T0McePnU~HfH>~!lH7=F>VV%q~HT_U~;KrJPZV%DuCvQVlwZQ@G{fFj3acCDo) z-_NAVk|brHEc7SQ4M4Xt7oDmO*U5(GjOWF9d8P+~ax2uvO^11u5k2<4fj>&K<&>d- zrPVzg8GRq9OV5pKA8lIb1EVR&)XG;kAElS7dXx)%j5?&`DK zyOzc<5QMXGUcD$bjVG?p0?r64O*6~%AoJaR9R3uz*Vnx<=G&TcXtR#LDHbrzn;%nT z>Qslke<~1&^)PE4Oz3SN#`u^GT|TjVokwM(<+3`rDtte(GO``R;{)&oo%GE;q&RMl zB_j%FT+=mjX5Z3OA|SlWoH>_7nAx6C7faw;l{p1qwG$r-HfMi04skW5*qX2qUGf`x zsq7wceyvD`JpJ)V!)Gp$N~C}4o&W5DjXnaCn&dIO3(gClCTgETjjqup0^pUKjO#)5 zG4zs0UlRgAR7IO&76KJpEk7(6Q`#*eQl=O{s_i5055K7hZ6vl&81Q^d2Q?GzyRl+; znAY)+zp`b1cZ}a%+xcO{Ldj5E=GnF^qc^a@W-`Nnefmn+$7hg%Eh)_OYAkRT{HT9w zTlO*o=-H_12L>lsL0?Z(6_>oxqMq_AX@lu%W>Denyp_5f=676#?CvyU5o?vHZ%d|? zKj&ZG zwCLQJp2@xG*hRu+Xk7j*&UZZCx$n*$*3cSh6As}9dIP#zh3g^wK5=n9>x;1Zm@UlVYv zPG1|cX1NVeiG%}&;3{MRfSBndw@vLspWIQ@e(Q(R2k?u;782aIVPuQY%Ith?xtzE$o`u_+HZ zQzxPUnQtOr0BarQ3W_EGa?loV{HzJIU8_2WbbS{L`j%29i-R1@BF%&!;g|e@nUt_c z!bYxM-UU!Svy+}~=t#VAlx&{$H<{(7(9gH#^zW!GfznJK7r$++%qM-jfuA`DZ@HE+ z36%k0uJ_tHcT+h7+H_}qc8wJz+Lom=pK}DZBYLfKj{ zuI)=z)UBOMGQCY`n?>ahBLv5oPjwD9)giBB)R6-{&v2!SeSLUJ#a|m;MX=t&!F81s* zM_G@SxPl(#UdCyUs-`CL=}Vx;_u^7n_8grZgT*>vmfG$!G5;VvrVX|g%a+o+wRKJE zFP@gDD1r01M~ZZ&^iJwgi?a(sOM3-YP3H;2x^1>jk~PH23vTr(9}3IXxBE@?v}Gqf zm+lqka{<@c5_Vj7;65U84fm2{VBnINlpLAukd2tKiC=MNH`?taoU|h<^j;0W&kI#F zn`e%dGbanEjzyB({=h1GX`L87+j(m?W1xpiAD;!Wz2hMwQN|olwSCvih8) zwWm!6=axHsYtv;tvJ~CvFjkyBF57t%pUauxIvET(?Uov;VxIR9ahE=#2ZaDk_;6&!>AL z(`}kp;<;nOii`>+(-tH6Q_B51^IEX*!|pc=H6`(llGjV5dwR+M2DPv?b&SC)SM;l} zld}0IrJPj=?5w=GAtH~m_UZTXi?I_sfSpR_h3%~+E&Gw{poKM|MKHxEg1kMXus^8- zW@j(rVX>#u-eVOdBi`>;EM^^DHF@cxuI?`x^El-RMoPMBJ;w5!l;Dm_h+;S%qi;d{ ze4>g%?a9Qi&NpUn@C)a^eptuJ#?AE5xwK|YBH;KQk>I@e=CxMPw@(q^3IjG-*AkG1 zjGhIdxLB422(Y?`TfCd>gU%76$(ag2B`bFxB|FY=Wo3Ls^c$JSput44Vhe9`#IvU> z+!gk*%HK&wayE0eP51IV#b}lKD}lkfG*!1X4qTCM41$WdR`D-G1=>qy6E=k<0!fqy zQ|5Etu_ob_ltx^aM1Ro`TVi-_7!$0nS21}V1v)B9DazKF>7EwSzcgzgSf6~4IWKck zpPkyPegT~GiD$lvV86LpS#H5M^VJK*{KhTJx2nFoU@Q(w;A7->a;jjN8e;BKc`jFS zD%+nsYKPk+t9|d?@A&)9xP;^chMNz#at{RZJrrK`$|}z9Olyyy;7@V1J<=^RY+-kj zz5m?D3f+he-rS4BRK;|)In|Wfe8kAzFXWz(89g4q zk|q%|cFkOzb~Z}#%ts;Dg{IV5>&p}E2Zya>l$445bhZlj9Q=#&-o1WP$dZ}JAmJMo zX1$HrpO&N>60?fQixeXXcOhX3|L)(YpkmoR>?y>`mbNL1q_8Et*$Q!NH8>0NQgq1D z;v`Vb)##1|pPqj7;5E*YH6m{pXiC22&goj|Dm_mOsa;}GpZhg6)^io&0ecf@*{N%P1-^aX{hUCfE-(i`3c_CI-CC*{fqo6lu+Uqe3_? zvVQXCsk=Bn4q9QdpCJ_-y8TSjFG>j2%k4c7gfr&r>#nA4`CB4%f*dk>!_oB`hS$eU zKq`Vm5WE?{?$N!o*XlZO;ro2*OCP;MryHGF3$Yl&}5jS7IZ- z@6I!Q$!Ua%yz(`BpY_x-cUlt7+Gtwp$idSa#Lio&FiePH@gHZ)b1FKN7CF5=-+ZXF zfu^^5^AakYOP0Y{zBN=&lxKTx|AV5146X<~2P7E-%Y z%F?o}nIGKlO8F|N60B8-gJ1Y*^Gf9&=`vux7pB0p>#M=;Zg9%aD5d=)kk6w8$difd{+7n=Vr?#Jq>uv|Fb zYTT3)&lVO%5FnD^{H<7R3w&~@wLIw}zeXQaKQXMdvFY29>EE9QrI&u8Kf3g06Y zfA*L%r5apuZ`gQQ(-4PP@=F&RXo(4$zX*}7BzfAO#T<6q-R30JvZfIB8ehNdBP4N1 z_L&!sR$)un(UYzQ{?m19?atEs%LxkHeIis*2wl5~VlO?rTPrk{guhD0FWPv{@+)NX zA||BR#v;P_8E^egh@-vN!HIcY)=_~b%`@ot%LCiJG4Bou;FOBFeUH?fh_1e5^f5K| z_{AQZ8i)=dq#S#)&T18-8&kX0Vs<>R;kPd1{Y%xthX-22)FCMwpA2ZGNfUM9tg^1W zW7C;g!#VT#I~IiTn9iU@R15_AS_>1sPf1F5uBg~gSVnnoms22Hlf>nz!ksXFSy(^A zPJalrN=%Ds=4?2BO_nf+;r{M(WZU2?Hsh#N^g>~Khk)$HN1-*5+!sbNAzDqG4N`8S z7;TqU1_oFY;sy;5zo0K5FH$4wqssZLw=GdTG!PpHGI{a=-Xx8l@R_%A2AC&mEPD<{ z3v5SZF+)+FL3{ju<#r0h>cxct{grQej80fjI2d=226C=Baoz7aciaYde&g(&8zlj`JGDzT>BzvO+x z)}pki?b*<|32iq&PtWto9_X{f{+%$JBaad z@&Hjv&8f^s*NDAa!#ZNCRfWbpBcZZ?EA3GqHAW|1PVOXjGl% zsQaERNb01sSvck>a3w1!4z_#$5eYiDKg_y_$mS+^ZS^(TfDkQa8x$&svbV{OxYGc> zeMa4-eV#kc;vOS%@qT=*wTtkklwd>iu~^w2*QqegD1p;UpAWI7#`-CI2OEA?4A)vT zDK{(+D>r{lfOux>GzaQC8bc6nOgBuAV6p1gXP+rzukj}eOFC>h6BXSG;IC3DA}x6D z>oV$^h9ju^{m$AT#KKMOAe)i*x;Q!oH17fqsRlPnPb?TQaGQ(~AM5 z0wULum=W{<`v~y2UG2M)hT!UMPF~L~b6y5T1-nTP}2R z3@-^ZBIveWdy(cP2v+%X(XfQO_xZRieibN|r5%nYf;!qSf**Xroeb3g*;-CNDtP|g z+fNr%(mZ`y94q+ls!VlTQ_^K>MVs#9qtjmJLWcL#o0Sp?pvzHl89tYK>TvSJ*wPQ< zLE|`UaW=2dI1>X6#=Xe2!Xk{7lnd7UYe;br8#-F0X>zZB<3(C;66jwCJOGJ+O2^Lt zHeXPocLq3D{K9;kus4F333c__;UYPr?TaJ-p7G)(@Z7T2R11T=Ue#kw>Vk0*a09AE3WI9haz zwt;{Pp=*r1Xk!>3|6l}5dy!%~h{#rtTH&+nY$4w;JSrF2+rJB-xm6w?jWaAjeV5ov zSXb-kSN0(%C4`9ogS?&06-6xsgOqoe4IdOW?Z_^k>*{tt|GE#goaK5CrYO89lGVjO ztF0YVG@(XGI*e$ss~Z>Ht>-xvS3s6Rq!hS)#nU^Wjr)7Xf$}$A>b z?gl#Cq{3F{ck&X7-kBuyy=Q_4M|%4$X%@DEqs|#2PQ{ zI^(s&rK!VRsL#Sh=*Kg4Nl!6yzMG513zU#F^Le2&KU;XSaPa|_pRDuPRGG|(AC#) z*^FS>r6Ewupsp;f{s7;*O|Qf{I^!5my4Nv*UeOlxDuzfOs7K5tkhDYb>P1;NGT`DK z(l7vImE3VW5HVQQqtYvw3H+!OWeY(^aTOeKp+xg8GC;Now=jnpas$>28I<$WQcu3R zL&Sa}7Ow|RX&J_J$r*p$pd8QX@5B|S+V)RJiH#8Dg*DtKaP7GWdkpl~fwFAP-}8vz zl%O{m;E8Xk9CtR@5M_D4RasW!eXTmD0v?*R>_P1*9k)wqo2YH#( zBMft2xyjh=wis>41eX1-_JNk3#vm@KH@?IqbP-w%WeRWY@L9d;Ww|;doEYD_%JaF@ zV<|%}Ui+82Zf0_jIki31{LODI^<&Z0igPBmpCL@Zv^Hm0U>gtY`7&@X&&=P=KT8-T z3aiN!58M^`#?I8h+0sm?06QR8sH(Gds{l|&0(cvh)0jD?Ag4U7d`RRcJtL`Pw+L#{JzM#8Io zUeuQmImiZkj#!ErtO_+l=qdlY*o*W0PsJ zK4L*eET2uFVC{YRD*&9kPO~GP9cL8eFRLq0!P6`({J;`zRQGIw+MWn#k56<|GREzt z2HuAtj-oq#PqnE;;@l?MH|hmT07|MlHHQ-%1o}{;c2{bRu53$J_sbbFrM8Qo-CvAS}?m%alsO zNmQ&))vV2R?-QqPbSD_9L2EYMU@F+Sg|T#^`t3ARkY1F49;Lgp@_^)%n0GUo#*4<6 zrHIA=_!UE6dMx;(mgI7Wtx}-06iV1;K1oiDu`u>jiAXGyW5-5mN%{2`&x1QP?cE(; zeZCg8#wO;JFViqGz-<|+(!pbvv6eg@HjOtx``K~+7{(?hzV*?rXTP3xlDc@V=)`>Y z-2CvMnHRm>{&s}n>q@L=EipMW#G))e_M}p*<7V_U*CLXGCQ7HKQUR#n*K(RyUeTHP zvr_S$`1sVmhGl^Cp*R#?GrGc@!L#Kia4F8BR!?+5=u2JaMeD>M*5^1R`x&`7b*155 zEjh_=b?1;vjbxvtKeM}%btuH?o12dT^bSw0-5A(aJjuM{lNsZedN9)jV~)4aVpGtJ>j*?dA~kUl*bIYk=U)M z-J7MZ;$}Fgb+?olBE$|_B9L~5`Ayqi>BgZr18FSZ6Fe8z??m)44K^HCxU=lGuw4Mz z??mON^gemcLBj=sXhtQCmOYWDs5bPQcZFQex8zj^tGOw7Limg=b5p-KD368uv; z1czGImp8ySu!n%BPoHbC;RVLr#dUvbSu^?}%43{mmy2NgzV4(!Xwd<1iefTNG-=eH z*`!d>qlgromOOC(msjdA;e0E61*{vB!%;QIKp<<;IHvUkwuU znqQvgQ)b;S8a<0!rg%|8xOw8Cm(u(mn_>puX}US){l1Y?k#-u58x>P6c6o--Y^Zys zt*iEFwpo0nCr4e`$vp8LmSm^Tg?Od{7JPGYsqDwcX`*=4tSEMiiEcTc^LG{9XvhOVUd||f2{zsk2QmS+F;mZzSgKeHHIYbem?(kjJp4twda#!_e3MUy)-^RS?j^#**i9u1VBOt4@sfXapfZN|GRQl4Tk*%bzw9cf^>zWw=Ye)TDecd{jwv zb(bON)-9GpW%*Zcd@N#p&Y#y%*;tTY#nx~6AdlNUC37qNCv@LmR&iEaKL5ovy;f3! zy@$usKm03a9uvmzR8y}QkqI5T=MQp{FABN#-xW1%%@z-vVEjc}G&`Y|z-L*y$ynoW zAhv=Qk04#~Ox-cTgTkIVU26dEw*^tP-gt}Pw7$I!Xp3~;nk{@XqTWy=$=#3ft%|aJ z2rJF_dHecx4HEY*1y$_bP3#6({4#J2pqH2}aVYPWKj6h>psiX&;Jb3I@c0qzg=Vk7 zzoWm+G#OeJIM6BI<22Wy(>?oCCR;SRF2cs)^<3MTcX7wVyOTh7H$L)P!3n4XaTS$3 zRZSseOp+u~G)6MIk%8{X03u%gQWaIC<@Xo+%rH?T_cP{sAlrwnV_spKU1nb)gU)7E z>(vyi{8oB;ZZa08Jc>#IE)ONmuNc}uK7DH#e?css+aZvbo2)x4;?7}k(NXf;E(}?7 zu0m4N`LS3wU~)q-Sk#6Oslv=~{#xezf}ijM~Z4;T32$2%0RJ)Izo?V;y^PR%jTP61QK10&m?3XSk5B z>D023)*gJZXPTu7i$@luJO;88$F3IiK6?M{7Tn70Ym%cQ`^iX6=%8lrx+1&l4kLU@ zsu?x?4V+eV{nfp&vFK`4U;3zoq@62@54}_NBqF}9JtD)I0kta)`pSeWn`FapT5m*n*3*{R)oskowBu*ZaKQukM!C}g$@Np3uFuZ zs$Exdky8#<1@%Yld&-~hB_1!r&Yd~oX`{Ad;XBsykb;9H^^T8nMsmSYq1Jjd5^0l< zMfwC1ICp;Z+fM-`1``C`X=uan!?e#hrU&lD+7zX>1E1t&amQ4aVaOxr+65a) ztqxzJc}`S$ffeFW=5*S=`>!?3a><@vVRO{oUfzN*+0Eg>`|MR4oR8RoA}buoO* zO|`}_Unq-VCTU(GrUqNu(hWl0d2A|jxu%w3N7kr&c{W#h&n&WK@U+4o%9Kee_#s{F zqOOLW#)l5hh+6f&F)X8pG+nWz7eE8=d3ppcQxArtQjy~9bx?V4+cX>V3qR}agc8J- zYib8ql)>5Q`|shes*Cz(-`5-L{O~gV5U#>>NhdzXGYu4&o3Ql7BL?s)PAPAY#BquH ztv<>b{rJJ5o(>ZXK5M6WTmD5ONLw=z|A5Jd^5Er|T2|}zo2sQ*lxh=TBcYi)E3>t0 zN>_29_|~x8mIbvey-`lG_Fx{7f>oH>M4HZ5S|g1+LQ|VwK5@TLQF`SiPdRAHmQ*vb zE4e3ZY?3}-g6apAo>1~r%}8km-A$+dlr}zxutMH-{3WP}A%RPlrB0?6yq&xG7?N+w z3>14@E{VP+*C>AH#F*0mp?#3ue)rlVlY6Gvx}5}Dgy?GwbN6R&3@Cmsl>2CMJFD>uq{X@Y zX16uiHTf>x#hPR~kzV@X^Q@JW@CU)UGC_7? zw%@>$G{hr!#(kqS{?MeQv`AAJM_%TXdhZ?wgD87}%SBiGFq zULFGB-0tdW)TS&YAHi*W^I*}=`|oTP6Os?l;VA3hmuy`*5#tYQ9Ri|jyWf_Ot_Mg4 z^3yeFh#;mL!X?id4dph{8}o?#ANb=P@MwJD+_rylOOaNC5IVgi{!t*ndOPlei?`yv z9*F4amw9}v)3&QwlcIPrp8dJt%=Q>36JN#xCWMPhs*As8xn?jw&>k1iL&ef|7K!mW zyJh=EFqB;DbXlNSB#XFUQ?v;AOHs)6!*nOnNoS&1?%8<9oJ#4QDh&o8US0y}C_#?h z6Unw%-(O?4=~}re`*PhS{+ay3dhL4$t8B9FM=o8itBeO|!%wuOUzWNBa2amveLRUP z678ftsjv*ca=14*@oA>31P`P=Y>4%*8Q{+GdlB0s%_PV0@Sn;$Cr9lnsC zLuXjaU)%wXn2iHm?rI0;))hmc>| z-LkI2l&{{ERRjh8m98U>Clnh|eO?Q)8>6M|v}do`#uX3sH{+_un6B$~(>Jb0*>U@n zsmy&8Xo|KtklL$0jD7l`$Zv58IpyqlOF3FqRV(&db%*00$(fRod0E0pU`+H~;+)&( z6I!W-`g%Zcas~e!a}!b78&JJ<;j+u2ILVPw8HkLlJwP zV%&*~c|=5a8S(SLdLoU7nasH?r8r|hUzg>>$QzM5h7!YB(?#*x+0-&gPbg9<UX;kDaz|3Uq<`JbV|DqBT9IJH6*BL=GKxUJDm9uHe^t*Gg80%f8-Bq)5Tqabe9SohCP2I#8{Zs2_j_UB>{ zSnr$AEGY%?e%LPWH<^{n@{Tg3`Cb5sQ!y)=r&h1lIZsuLCf#38OAO4wY7@lN*lgVJ zopc$Q^4jjVHVBB?1{;39Yimdi>A#wV?LZOi!pm&ChGu3+X+^W*NZ)D4a}EFQR*egT zow13VEz@0blxdM}*cgC3t!5bKwV2oFjeSVb83&c1OE_kff2*{?`y~q9WW#+XaR|G9 zulOk+}|>L&D7-C^qO!8DQ|=NQ0?BX3p;w)B)=n*Vt&O|5++KlaHV6H z;u0}F2klL)vFUpV?`=3X&yvUMql6DzV1Coma@??yTSS=YMf7Fxix9^4@)XOS zJAlfJ0xe*^7Bzmq1W(6)cM!#W(tPe{_uFM?UV2oNz{rJMIFKcCZRbc{_^sZ$skZ3U z0jT~$Dq+13M<-#?u^`TVAN|GWv6Zv9Qs@dlTf|u<_&4BU5;c;HP8~S)TEp7@8I>1M^t^ zovnx%Q$a6T`l-t!wctwxsU&|cl|eyw%jphO;j$0$Xj@5bCv^`t;J)%Oe%$Hq1H0!b zO9?00(dF37+m(IhWXk3>PA7vqLnqH%F^!wKil!KKGSe~)ji}Floq20BTo+^rK{T>4 zaZqi&o4)@_L3xW34RDq*6mZ8+4g7KSD&&-a45Rdda-3Ra)sya>zPLutWADHZ%r$B> zPNNs?0>xMA+uVa9%MzSpnIE~_RR`F{G>SeyiGHFIY!*GEcH2eMV*0DZnL@1AvY0`T zc8=HyUc&EqdxUcMIX<~hNGDF29tqRM3)>$!Ufjq4AKWLpq{ z{9g!9i^YV#7UE5m;2Kb~lSb1zB2=#Z@s@J_+c!vWxhsWK0}vY^@b_BoDyVC5MbG5U zxS^kW#*Hewik^c~tdG2RRwM-G$8Ih_=h5{pnU*vp9@gLy6|xz?C($awPYP#oKWOkH^*es@-E}!$1x@T(C>XMqzS$4?a#8x zh|1!jcc4ef&pelvy?%VYJmx|`%y{2&8IzP)pVEXsaL+1fO5`7$R9t6<13KEb*gCqi zwh0FBD^l3M_vL{qYo7&*DpaMeC@gIly?q6I@8RIUiJNr{9^}Ms5egqB1O49Q?vsFJ zI>;L7;D1~{@-wr;uT{^JN+8P$@+^o2!y1P3Mo&f0R&q(w20gP@q<;;yg~?4mTc`XL zB5_yB4jg$Fsc_fGa@`WG}1QjxOGCFlO zeg~6yzh}l6VID33(p6feE~XnlA>=WpMAnSntE^fcv7XT-eT=HHT+jN<$J)-rOMCG;Rll%~k4eEg?Dj0K2-P|Yg6+3YKB31tzF5?n) zQZflBtb~%&nKfDEwjIWJ>`r&K4^PY%uHI@Fh%v|sgx@v80O6DE645wkqPJ9AV80w=suR!C_|1I~CBn==jXr z&xi6M`1bL!s8Dk$B*XNpWwYH!Fa*=dvekK4W{Hk2bQAGWGZ(josV&y$^YV#FXS6TZ zRKWzO^!nIlLb{Hf-liXul4P_D(%dBh5Np&E*5e4K?l5by1%X}q{uVYdQSV3a4hoFaXsZpF4VFc`@OV#j%BFZj!n3iaY`G|S z_~pe)ljP=EZxXE19I{~p<(9f>xd^IYRW?1E(&|IpX+eC(d-^CSh|psrP2;eYZPtM1 zoc!#GBm2u2wffW#El({S5^vba%8&gh9l|@_Q}iL$;JZ{0zGL62uENvk@{&UTZu2kL zcUP9deenIq5#G`FI#z}_La!eFuHY#CNhGuNYxmdKzy36XL--;7b06ZFeR}d=-!h4C zx_%Zt)OuVV+%GLQ0XsH%MZrAmKSo7oqyiTe2F{E=%@T)sf)Al+h6bg zd1y`mCmN`7C`c<20EyTZ%Wg1hA`&&k(w=%fY&ZEL_pN+)-ht+@N zS9+U)Cy>>oyyE*WS6JcxmRI9GR^G2xdaU;w=vf_?ZfqeR-p2axv;VfkMqnoa zm*-7W{+q-gZ*Y|4QrAmmdWgqnmP- z&2Gn@0jn|UY>qyEGapoO|GajH8GOFzk8<8zwmmKkT+`MxlvuC2S*knVma6-!^$*{F z$T43x(5oFpDm%@3wFlNT|9(Yg?6(Q>?&;%q`0}qJ_N9Y{n9pX2uQ~pqK0)vS`?y`r zc_8!6LGReo_3w$SsjGh^jFDdz&qB=hVh_T(M!Q0UM_LGkX6}6LH5o?6|oO_324_{)yQTEB_CT z`yV^2|8LcV?IjJ$gtWx}sPrE>oc@^0Gk^HY|EhBFSJ+-+`!=Aa@{b+-JBoe?VeP>s zp&ga{Uugj!VS9<9_uaGqHsb#O=>0#8-v0-?CB+%Nl_I^r7TLdej{e{5t$9B-uy?%< z)NcD6B^4=*2~!M&ukTfPUm5v%fQ&duYbJvyhv`<-z9Kly&E2g+F2ZK{mV3eEI&AJELv>;V{`QW zQcFAZz4liB+W0@l`?NY1>+Dc9Z~UMAH=o9ibx_gk0=)n24@IoAyEH77O86f`FVk|S z0HfHgaMlcTi8snXvubrh=X-(!2A1D}1-_XVFy}3{@by8L_%;z}mff^f=T*=%tF$UG z=LODDQ$v^d?Ey4P-ur4gIDn938+$<+U&Bv$GI}nq1(mh^OJ5m-t7atG1E7j9Uu1bF zhJ+o+tm8pnXCnCm%uHAe3`+B^%SSLIKcg@0Dy?rVdRsT#f9p-zFTDzw>$J+B?5>?tPi~|3|yn{U6`g*?0H9GX~e12iQ0- z)aOT;W!cpK`fj&x$CHEn_e$h^{UO1;!IWwK-!pr=&)@r9zrF1L=Ay^vYoA^2uCD)| zoc^@1)(=t|Co+Axf8y`Q`^%nydsDN$bAxvp$)YER2?rcl=6tpZNSq;xE+qk~FK0YW zT89xL3P67|i?&6=ngg(6x6u$7RQ-{9&%Dsn1Dn!&}-+Rt=oqynSUD$S6dq2;!_FDJ4?=?QFD$7xjF_IAw5Kzd!l2s=l zxZF=baA}_O3a|(JOhpg)L(N)7Mpa%$hE3HGYGG|>PC#%g)+GY@`nlSzHorKIOqsn) z6xS*5yttY1qFnS9^_{rAQp4ix0Mwi(uYMAqJc%*mj)QGy{g!5X9v zZ{=!}(=;m;Rq#sv?+@9Uy;m2>v#*EqyN`+pBa3t<_a1f7vM33_9UdU=U2m{l$(vp% zS=p#Kjl-YXL91i7Zqz=ht_^M#cNA^2WBG<37$&=`0 z$l_g0`qL(p(x#e!{ z(I9j5{&L+(NkpJOb zDKa)THVH>F3o&)sm;bsP_)GGxm9w*hn1Fzrn;XB|V}7WkrGTKQsHnihM*@!?@d0P> zIeFMSzj5cYcVhp`$iMB#nmd^~T01yfL+#lv?7n#mb#a!wd-vi-|M~jsInCXz|9dBU zr+*C#7@)w#5dlH|hXVhx4O}X5u~$sh+TGkvPu3a&Ob>7msV7e#N&Gqg|8?ZQcl_Ix zy8pdWR7B+OSN`qDKd;nsGIx}LLV#O3OZ|6c{&n%+5B}>y34x1||7|Azn&v-yfq9l9 zlMwjNnn{tRafC|{5P%5eWuIxfU&2fg`_nBQw{Hh;+DB}v%fA4DXfM}Ic(vMkZA0CR z>+0&n9}-+89dsY^bc{YtftHG5z3o^$R@n%jX1_h^Rq- z`w<{XMmxDctLRTaNXqtqexwpSd%{Kd&%JkuNi$@g3o`t3KT&_m<$o9;eNW5wiSlZz z*+2JF%Q{j1-+Pg=QLFp2iQS`(zVm;cfs_qI-6Q&sUH+g~mjYKKR24t|^O>JLS^4KK z!v8(+zo!3xGyHEq`kzbu&n5m5lm6!t|8t4|xdb8U|5Ee6fyw_jmLLmG3G4g=pd8iG zUv1N9*J~ab7+el{Nf6+E)o#4HSGWkwT-;iE`vPSJ+`GZ{NxAHD+wxt1kPX?8)j%(b zd6Y}YEe!dbt(7R7g2C!LNqzELuhz{!cYRL>;3eKxXTT9bETkvf(?JN2(ZzyMTaASAnHw{P$r0jpqJ`5&r)$!iPJ5(DN(h0Js)h7bfOXpu0Vc2Vr1Cgq@!4P;Mlh+soDvy7C_{zUa<9|6n&&>w++u zd!8)mg@8;}3x?TtPiJ^CyCziHj`r?Drce#&nVD(#-5v~Ilae9Q(*@m+tm89om^`Ms z6|r%YcW8q0S+bi$G^i)lk6@sfQ#0>3y9OnGaOk;Vpc5WJX5Fd!jbEP^2!W?%x z5k7cVCaJgY`CJ(8XLb{Rsp*dSLdWBtct264mFus7X~qw7+3bcK5&@6&$|hjBCwaoJ zxcUc+@9Lf6d%}5cobkd9ntAH3z2lY>u|D|a0Y*o+(iaAu$8$(e4_SPpOb)kkhKR`l=T+1(4h} z5$pZ+R1N1#^Oxg`0xw=~-tFCs;^Qi(!)D`|IWki3V)8wm?x<~yL}AQvc@lqBVY$9Y+Mfa_Gal5t znKaP#3Hbt8*eC^)vy-F!-z`*N!_hU}t~fpL zYd|s9tS?EZtKnVq5|#7`b)vG$(0;9Hd)TzsLVLIfu`Qp0%l0GlUkPzXUB!*4^G)Qa z=DJT9`8-bVXlDr$VryA%w*3}wyQ+%E?DiqU>Q9LCA#k{QmGxj7<4`fw6KT>+m@Md& z?X%TPB5Z-t^-~vUYQQZg7g`kRXCtNub5suC{Q0JpcljfXSC=)sX5)=~$43hEZX^nn zbBViRO7aG?U-%e2p;m+sBEB2=qlSn_$clKi3#=v(kX?il$2b&u>Z+ONm#z%ogLa+`$UcB;7p}V)aE^vcpE`?-=2DQ>11la3^Jrs;bknX@ZYipp``BSCnWy&s zqa{5q+v}Y(b~@D!gFmyaY?fLnC@(0TC>GnSzi(JuQD{&zFi{mQef0C}aDmEC9b5Wt zq0JS=ouiBN#3^cJ#C}T;Lvt#nSV57yVM>XQI3D>Zhv(hg`av!*Rx;PZ-W4?kshXU3 zNy!l@Zdhh49+ZHY>YUD;>s`|EIc=emuGr@v1VLt8lzZtgAQQ5(|+ zfeunAf!1KH7&3uyO+Z&*Mkegbfk@*XeSb_lB4a4`jSRN`T<%$HoM8)&=5&=kT=z2# z$4Pj>Cvt5~rDJ!Uo%{`t31UM9GGA=%uCl=Ia79e2mHw&A`cUVzYrwi~apR^>0Z%mv zt9QwPgzKs2V48}SE55q7wu~&3Zne@ek-WXy=KYCbU zCv^GgQD(H_Mq!YA;L`nytjHK4oK@at2pVM~!`!ToBrQu?5F#OFBlS zAM87LrIj4A3K%K{4y23M6at2MU0nzBiez=NHWN8w_okf=rXmUS2PKckOoiRIW^?su zf3v@|nLfi;H`pN5icrwf6Id(gYI|h-8I% zPT`ymw6ZKnQ6wPV7w*>1mCtiLu6J|r?w_PbO`CpCEVtPSm<_hi#9?C$Plxltqxso} zWoDfn(~7AQ<6hI>WJts-Ec-g}PAk1a#1W?Lq2-7oeH?KS3ZZZ-mKK!f2`!PGNZW2t z^DS#nbN^9Mv{N*s(UrFZ*T>6Wnu;vS)X54VsZlqNb?9>nsE=xUsohzS)>gMZUN!SB zSfsZUe)qtI;~QB_x^&46oYukftVFd z3JA}t$hf(FM+aWSGpQd;Xrm>rvxRk27%l{hc+F^u_uZ#(WVj+w3tvL{QAlS+`EU?t z!f#6Zw0)hj(6HXRd@!{#OuHrReHto)K|>q1jbF0FUcIX!?KA&zjb~k942-avLuRS3 z9~e|RN|%gy7B}vrKIL<+j~1sPH`}s|Ds5sb9d@~Q=gI{dwgTU3WyR&CY4V+C#T)IQ zBD-YU_x1)=sx0019ht*T*Nb`U!W&P|>Lju7Ky>x}t%JwZ&Xjo;fnjOA-v*T>htD>S zDO3l}Zo2{4&*}90SAu`#r#ArU)}kQD3}mZ_SwbBHSG|wmYS#^YuW@2$1w%2nu%wrl z_Ga(M)E^8L)u=E1a*fQVEX-`mkIc`w%_Pg)q)AZ7GuZ6fMJCJi#A>!DKdLj|uuh9O z;I!ck<<)o2rTe_dAG7JT`S~m4B#W0rn@NYbO(E1E)}T?pT)L4Z&1bXb)f$H0*w=d4 zP-|yUMZ70jHme_A22(T1G|`>7S>RZds7YZMFeYbz$S%!Itvzf*Z2n6(cQsI3+JEGU zR*Ke3`Dbgeq9@}jRJC{7XuIfCj}_W)`#29xIC`}Z*D!FH3m;mye54Q_suV3= zvSB@ZR$+7Z{;H0AsXC-exiaKn5L-00%U<+;LS?T^Pmde>IVQfH^og~!s8ZCK?a8>fQl zqHq^v5I!%Ssqs)%XZ<9fyq8X~&zbonciv;*MNWCb4QH&J))_XJ{-kZ4p-^o)anPns zcMxBAbjl|BolPI6VGSdrt_(Y`+fmS1s~Gv-TYduUb)CYX9^#+n#W5xGRQI-Ny67`p zYF>;#JH~PkK7%3i3X9b9Kopn!lD@KNy%7JdIZlj)+he)R0}o+!c?!t1q2&px3^cZT za!VTj)5S4P3(lJBSafUq`#8A z;b;W>U7?6B#nlPsfLw*2!f)_oJr9_xpxtWAu0)T#KxUfUSPgdv1XGrPzpCZu# zCjj#NQeV8@PsTE=mV{EaqyyP-QsV@X(@780(+r@>a3 zxZm_r(*G6S7D4_|tGCky$uGwGiICpd)7m+9_?ob~R%j5!+V5y7{#y3&3LkMfyIkn6 zz1^=;zqekQ8VHQq80V*^(?#&)DIh%Sw7GZpL7f{TFr*(zyq2%!>`G%*H$_eiSf1IM zIQrwV&8h+<=vfY2EdQR*2xi$n(XLFk2m6mIrlnq(!zK|DUs<9I5oAPE*RXV7j`^|O6u0y z2k-(O4%xmvdNpyzwoL4nhIL+`mvr7DN`-84xd#4Q4|jh#+wQ8);kd(5$Z6a;$ zHJts_NFHWuEn$hXFBJT!rN7BVQJNKXFeco~7_G|@U#MS+Dl|oOi_!1KC&Jp_v;=!? zw4_aoB1)yPT171a(l?$xd-u?1({pe{7uDRzt&uIu*?+cKHREd}bZ#Q2&sYVP`IL9y zu#qel;ne{n*Eu_AoURA3clZMtmE+ns{X;F)s3=~7ja5$%zgFDH#=(17v?;th&IGr+ zSybgj(UP^_%~hRRE-*RXY&i50(@HMQ{?qt93Y(wjpTzLfwR%ORh5fI>h2g3y4J?uj zdjTK0dD7EgHwQ`Ij%|CO9g*E=A~r)ooJli=$=sZ(^JT)levSldRa|MK5Ul%&<%t`&SuKT)6hkIwE z2vVCCllP5hj;umpO4K0Xk?51j=(8A)^!+IXe9gO>8Q%j#rWH?p)+l<-~o%^RwxP2BMD92@>5{s zeC_vdAV;c7!~F8I^#ub%dtFta_n?NRee6yCTesrxym`3S(x%c~7#A*)@HEZ04A;_e z4Ii`Ato*wl z;A42Nr^P&rg#tVF@YOv1JgvQJf?D9+dIiQnCD=^lALL0r1`aT6Z1bwSw=8!-+H`1K z!X@3taEs@Mr3Er&tGDeMfc6DOovPr+Htu(ckv3HI?%QvfR^U5u$=zCzz&N9DN3o|k z1XVFRf45I4Ja8|_Fxf(yK<8l&Q12>qC!bGPQPAhhXkAEv|O+m@e8R9BZ*ZX_uT@t({|F}xQV)%M|Bg=We zaViUa?Q}^O7BlRvo?eSHsPgp#2XUa_War)GeW<*gR7Sn8DARnW$I?Dng@VTlDBsYk zsm|Cfy!>#lmd`Q2h;OAQhmOk{K#U|Q)WlX$48rj3{J+mOs%GjB;slKC<7>lulqKef zun9Jv#0xw%MjNP-{FX|p$!e4@ZX3g*Q79|fIWwzJrFGY+*hms95t9|@7Mt5O!}{Y_ zu|@IzZbK=mtDO@kvFRt(IqbO=9rt~DVOY?BMC4|Tw0%{tE$Ss+LE;Z`et-S`A93{! zry1i#DG@MvBext%Z|i2jieC&HwA(!vs;SDj7FQ7Ug7|&&K-V?St`V>ex*%$)q)XGw zMk%d-tan`h9lv71wJXF9&4_W7b`7L6-EG@o?7aavb6+V@;LU-IsSWSywdgm|Q>IBw zD{r(NQ1lyaV?GD*E|}2bi65Qc?e_fLPOIEyFI?u;<4Xz|gBbtvx(irS;IFXy<4RrW zuEoB7*0*EwWZKMQj?gzNo%w5z$S^^dT#O)c_61zueY$KU$3<1jycC@lB)*O|m{s1E zlKEp!`VvYuXGYL6{QBRe<4Z)2_W@Ey=BdS>v;KSNl{BEw?ujpB1pkUseWqQvkCKViU^S|6xZI z(3^Yj+%EsCnEnH6E`DUD0cMVwo%V12!%i@eL`C153jh6{!1C=~u(pk+y)1trqyN}h zR0XQ@V2AF1$j%YIfSEP7?s3z9*ttzc+dJp|*Xa@Dgq8ZYO~4|M?hhR0uZXBW1%tlb zeX&q_D=y$qLjMUEk@wyja|TvVGT^cbk_YGdMe;e@2O<3H?hT`Y~-UtITp4+T^JE3Dkr(yRQ> zrTN>m{OuMIaex_XkFjymfl$A{PVrI3(VRLq2+&&?yp`4{IISW#XJGbL=X@zb;VY`q(FQ5 z#WGe_9$hU_vIDv;FnZ||n)2W(`_oh|3$lwx4~V(&$r_nolz03=cgbjZG&>NG ziJO(yR8wwsvD_LcVY@M_7R$mf$6x6I+X;lkWC@kfszyVH!|w=(xwpxWTxyZ0XIua~ zo%D0k1VMH&r)-nawuB&^K_R0>Jg#M6Q^J_|x!4yPsd=jrgLDaqHDzODNQs;B0jzT~9Uq zk#^6nU$MO7aXnzW;q~E2J~g3@^AtY>pHbORwsP{D!R)>Y!Xi@J z;LRqtY(Z15LlqBMKun2p=l+qP-mG;Av_*V?(#(QY!48@_~cX9G<2rCN;rlH4`5MOLi-(={HTO|H3~^_Lvpm;6T%)v^)mR;k>m6&0Gcg!#qWqwW&J#z@T<=J!~|KZRA*o zyShv?tSfE4+s!mc+AtdZ@x6ORfK$)2Fd?p8BHGbQcbNO3UDYe4ov%%SUmBJEj>y*P zTGp=B~}yb7;n`vumo3adW@HL%?n+)Cuo`+@NJ~1Eih$7^j4~k zMKHf<1|tH)%vaZSo>#Pdq{L643A$(YNLW2kevG5-XDWu)VBvxg^dr4ngrq-JW+Os2 zXV4!)lOJ{#Rj+gM>L9)f*$*`V+-p6Uz^66qd@u5$`T8}1@Ae~@8iaXQ9MVXH{7<|d z^8#KIq=?y7VAkIgF8zwb!QbW&7Bf7yoG6)NXZI>~oe~4rIL1=AVDtEP_ZZ4E2vlo2C5B#|e}gnS{gZ2W}c2)To@MiFwuCC@z;;kTL}LsT^)ZuTVW=Uf)kZ4M;H z^tee?KpXIP9zmXsw*S}%v64qpxd&dnv=L~)scV$G$pHWCCn~C+e=c5PDh@3NDo`t9 zA4xWzPe%3bd6FlGPM;CucEAgr8QFw}`pj-Xw&z<7J{tRoq>NT^2|!SOmCr8PRmQhBPC zuZhTd9se#gM177J7)!|kFcvRp2MsV5R^l(T+!)l=&GoN27Cr0xzkSXpU-9deb!XSE zk8!+?`$U!ze2qCW9NY~Df>8jHUiI;fQ|`PQKgsBRz2K`bX%5_PI=6R`K_@D?DQRn} zORmOC+Xav}$p0CV7m$IGZob_>-1B&luH5+K%w_?`(PP@CRAOoDE?Gv$1M}F5w5&&T zH@{0}zp?d4>k+(!TQ5{>$z4Rfmfr4uZPacKPyC+RBp1p^PbWK?tJd=?h9C0SvIo&) zU*PqJ$pSqE9K=Cc@x#S!RC87DhflAi(*CYK|#mv5}twu|Z_TSzw;!L6Lp^dW#((8f4q9JB)UYbEWw)r@UYJ zGav>az+3wN00RyoO$c}O8MrFv1vyzCEi`=*axH zaxrhzgp76ie$9LRT*jWrAQ5}bnYzt5ZVj=+QhH}rue~{8(>A+e*S=aD`n%N1#TrEv z0c*78xi}6b+EGi_%!?Z7zzOFMESuzQXDcOd`0qpP5WGHTCtXm3;_}Ck{S*&1FnliO z)nC&tP-4Ank^I#9%Rzkq0FUNP7j#1}d~8~9Rr6OQ`qP(#2|=>4Ol)Pp~B03=c6 zc=jIOyFm5`cE-MK-`g}F&ey^zJbm)u^}|ovu|K-bvDrjp>cW5YL6f5$I@hxgI-W|l zXWWJMCO}O861di1Sgw_?-I`sa*w?9%o!Hj!M|{Y;zzXYf38yk_RK!EmMYVN_110L~ z9m{xDztWoBo3aR#9#o~U_0ALg@dOrGs$}{)k^RQbg(HC2?hwV)h_>K13mY%ZoYzkX z59b>7c(M!(hegx;3q=lR4UW|z4Z{)eKAU?jx)Zsj4*`&YCFaeGtMYL~$c-sVGLfc)BgY;?w2 z9OL3nMKxD3DjcrbvC>zrLTqq z%LW<%q;syRJElR`JA5wr-KU+pb(AMp6@)q2?RAEAVM;u9>CMKj_qbj5-Q!xh{ug>l zZZ!EOdDt;%Bz?|GV~TJ!|IDj2zg4rBQw3(Pk*#>(Yph*#w_|zl89~5LK#)|P zG;N8y6OluRN7%ekN_ygqv^XD3J%Sxbm!|oiNtRK_1c#S-?A}CGFg%7Vv?)a%c+eOJ zSdgSyC5sem4MQroL+C>$mbMQ5KzH9;>)w zbr5Uz5~{>~W`xCds|b`&e>(lBXd~pDp%@}^IUzF=Z&FC$3bRXU$oGdd)ejy+# zO2wpezEC_*^i=XlZ18A#q$*b%%|Nf(R41O zb^j=S#xprzO8i$WU-?A#j0@UDJ45zeve;Cp&c;Xe6WqZagBxxd^T50LDIP#B_4o8B z36JhO{E~0iZ{LR$X!ooaeKCEeL1J9oh8K}+@lS>Gi=6c}Z=TYud8{-E6%K8ayl6TbwBld z@~*{>xgSkE=%Bwo)UCqkTMAGah~Jf6VLh_@Idc~;4=FE*npykH8Z`hKcb2+5hD(`7 zifvhID0NQQ6q2<%h@r5ef>Y1h*4<0X-Y| zkHRPh^|$19Vr}1&or$n34j)ZnDKJt~*!TpPr{-c8eRzg=|*~1c<4e%;NW$ zL~OdBVpX8)wQHVtL%fT)Bn?78XsAf_iqj8~ALjNi+}$Yo&bfGz2dJO>3-{lNNFWM0 zp&iT7rl^}s;#J(>jU6d8hK|lSSMeDlB&0<`Tvj4M{TVMXdF`7{kkdGi4OsAr(2pma zB3CaFJ)*y_kzK*;wl_C|{>@@ELv<1NC{E^9x-Dm;W9aYeAPR(B*i~1HKih%}2QYFh ze*89#2Q$U7Jqdzc6wQ^K>pp(~Xesc{mfo#@$;L`F1a|%Y5oZ|8jWfKuKvOJ+Xk=&& zp|2`emhR_$qm8Q|CZ|`U>uHy7ZXd{cJ&vkGXY3b5q4z><^3?9tgVALj`J6`DKN|eQs0uPquv`l5lSc&b?^e}O9dY;9Ps3gc& zy^Z{>Paw~WVr=D|W%2GS5X^hnx#hKxD>H0WC98)@dcPpgFh4Cx2x3R~D;_8I?AsSa zagDd<}mzDvkV#{W+nI zAO(05aJp(1j}W$FBeukwXy8S9MAtV;Z7N=^vP|1P&*FaJg@0__f2A z4GZx)5cejMH%(b!W3=*8$$Mfp+YS$qKqbD8o zebuouB+gcrXu}x}CSkk1nPuRmQ&;t$uF=>^FMI95m5%5x1PdL&eT3}Cn&KXSEe@o% zWX&#*)Y9a7v3mco=u3Sq$8kM&&qqD;)f@5Z*IYnVWv9usLdB55STX=`(-j`&p=nRY@m*FeS__yjukr4zd;q59R7`qX+^}5) znS9k|_0p(581x7zYPfd$O(%9W)9uC|Av#Z~*X4#(NL=kKbJ9HPMK%{>tOp^OL-{kg zNVz5b=mBuLGthHn)fcq!O2jp<_q&df-zZbq1EkiN7txNf$Erx zDvwZ59N{tY9IGV)F1H9Rtg+QG%-2@ZDYqJx46@Lsn&oLuU9-u3IPg3!#rqTJ`NiYx z&AnOJ(Ex2EdhM^)mP?J1v;}ViI>#Pkh?;Cj!FH9I83{Qm%c>A}5dA_Tpy}ZD=Ebu$L~SvUd<-D*#gy zJD+@9U^D#7$OS8}kv%>-L%9e4Wch>-p#4GfWWPDZ-i1?utzcK|V}^EX+c-J0g8ju< z8AWZrD!DE64n#wDZtnuwEGfz8_MA=F?PZ$?0BDC!??kU`ah$|a9^Y|jkdkQ%L#dk$b2+H|+gpA!6bS}deba*ao)?%^CHEkw3_JAh^& zTY5uZh-SMPACW#x$R8rBo;hFHrFo5a;&7Dyh=4{rx>#?I&{^ z@{KCHmj%X#W$Y6NvXo!}O0EmraIshx(;JtZ3rLF}(^&P_e}*~EmyS$U27zmx6DeGW z5kOHCF-f?7OQE^^BM0sIf~eqOX)W z5)H@#na0{NUBg8r1gI30lAlyiZX6t-=!g%>gP4*%kW4w-!D+sgR8nU@T-KjRz~QbA z`l;;H+Uc(%?`nVZuE|Ag11VFmGErw@W%lXZoA^%WJZ@D05)^lSO8Qb@_rvI}oi zper~E_M#U*?l9V1HZPrW!LrxXzr2}-A&lkKDa&E48)fmB7iAK&Gb_VVPOwtv&MIW| zJ;f2BQAY$`tNoUbZ*%fK6jiz2A#`cD0(b(ip`GGmZ0iU@$u?QoCtGAMJJ8;IKLRK` zd-W!P*!{pG5a0EJqW2~f<{h57rY5{ z4P?_@@|Rs(IeZG7*VKjW4)5bn@}cZ$+d$OCrlJ%RSavaYyV|6{eE0fm(O?k`*kQ9}kmAq3PQidL5Sc#hn;?RIm88}J;EehZS>WGUws5b*h&n(FI zD2U*L#=RM$p`Wk(jQ8-p`Gq+!P0ybApm*Dz+0=2N9T-wCTY>eip+L}j$; zO3rZ--U-QsbcV^W(*uZgFpFb}PE@`1;Bv?MuXx@S&q1U0Q-b=lWfEZ^$8}grJYy3f z2H+za7QefUC5scWpIlW)mqXc%B4XczbOYvFL%?`fya$7S$W4K(;!J}ar66=%Pa$^c zToBj!jm@Hlx0Le^P)v}09S##q7`kSUMigp~;!dUtZ7tE0c|kb51sen(^h!d`gbG-s z>C4ot?Z$s1_{@|@a@(vX&^1{pdAR!6X!!eKaVW=KYUT8L^aD)7G_qb1wlRU2$nq%; zUzd0=sh$9En*)ZR7AoA)XrlIaPoYuMa{@1HOWy$O{i%w{rKxD3`ZcfeDq$)*E#@<* z?f}4z$--m=_*zbE6G@~}7d^mHc)w9OjlIclFa~ryn)W0K1O0l^THIvW<$X^(E&39n z(VQwm3RZ!SB>JcTCX)yCood=#e9~{`{4m6Aq0Vs$elkWo@)^)%+0tj4ObxSB6f(3b zli!0LT?OjVG5)hYkC9))1puP^I@)z`nMxY+y**4Nd&&fSy+aGQy}^=F--iQC|8TE3 z{)q-t3dH^}Jo0;c&GhRud6jGXV%9`M1tzN{jfPZM+bE0Van%cs7=RhC)BVxj1x4st zmy0|DgdY)#(Ulxwd=;Y1zI(mDC{v$#Ba-@+2yhE$@%eYC8TBj$eJ7n?lLgl7&=Yft z@3T1{Db_t83S7!bHX1oSB}&O|l`a=RJm7@pKH70ur~yr16ui-sT(vlAQDXE*X(GNC zZ|vA`y5DZRf6yUljX1#A!><~Qt=tyR^rA0j#@UU^_?!nwd%&8qQNCr;q-LBT>||o+ zmTxv;)s%OoknKRn5cwK_J?ncl0-sf+k{DaovPppe8bTrVfi*H*Vkk^vlHy)v zjD%aN(*Si-dg*&W{U`HU*a!zGwa+z`jB&~L2svKIlmP9?V=g*|%fw7jB)-(vvQ|(Y zk=i56ra#-NGhL=4eU939V*a@~TAP*cqx-~$aQNkeB@|dgfw}cZ2rUf|v_4Q;NVsKr z*OZM+x`btT??&iJ#n$X@DU7da}uVI(Uv>E*F%6E77$aKQ>?jj)NB6+OSe2xl5 zdffxzA@QTuS0d0}2s62%-9bk}RBh>hIj*MB=Y<1NzoP1M0G?kD}~ zSVQRPjGsUmK$UvQ$c7zyRfuQ{wODbSm70>b02)7YFE=FH2H*P>vV?Gz zRYL=So(VCL#nAz)4;+#_Wk8hGp9P_<{yfl#sJ z_&`D?1Bz6jE%=v^mtI1kS37^J2Ix}j(F$yiBKSqx-R&52z0Yjv$`UKxFxE=$_3^qe z^bvlx2xbuam3bPA+Z8}Im*l7^)W0$Vq)x7#{_!q|23|$WkYYb<3g6LE;L>Fw+~xv* z;yOtrqP<(6o6?Ll;3#L0fD#%~u3N<$?Lol^yAQ~NIm@Ea!#61tN3KtF0rk^N4#aLW zxhb|$poXkP?yZCOyP!ekkHrV?MpO`L!8ObFAqV9MJl2*<`YZ)d?77PXS`94Co4v+5 zNPwVw31G@@%(DHoy+Kx+g1Ib)a9KF2+-uv**DMW`JQ*t&w)>guUKqH<7EwY75XX;( zD-P|O!U0Zx-=25v{ID{9i5Z28KRuqPWA#qzHv=#=igeNkkJAQd zSiI?$DwBj+^+k~i*@rPJc?Ud?g%8!UZ;M3pUE`PyTxBZWu+=gwn!Z13-AQlkV`(~7 z!UL|NQGLH-nvqHK+r2MYc!M#>V7Qf2CGn-4q`V95I3P%F5$}N|7mKeWT3n zVvvvL*TYFOv-~}GinI&A;D8txCN{4Mu68KRzo~3YXzlUn-mJ0)4a}c}BVUO}J+q|J zuD=^qIX*gcwu`7^`3f)7FS64ES9-c=hs-`EiqZ!`j>4t)Ux{xfuwz`^&iYb>xbhBy zLsbkfg~}C0QpWLvZwmc*w!SIob)nn-GzKLu!@mgvB^97VXqgey@x)XCI!X=75_}iC zO%za1lWtmC9~IW(ne@coM8t4(RCCET7EPdNx@qlzH^E;gTzv{E|MZ?NS3j%F@SQcQ zM!WlEzr*pH)dtoygr9j-8@xrmwx+=hTw-cesx%Ot$h$8{X`@!%OY^qrRQslmd%~4g z(!6Sgpd&wh&vyliHKao2m7cQ|153TDAeM|)<6@^Xqy(3Uw2V6~PgI@y?R_LnkTShF ztX*#XYq3+n0ma>ZA=Yg)1gBO2;@G`&%2E=5mTY1n3KPr7L1QyvQ(or_&Se!Oyi&>n z0euZ8BLK#Mzzo|nf>}pe(3+Y`4DzIl9{{Sy=zg$4Fx;lfwmi*E(5l>+SHx)7t`65r za@PquS=}#nco@=Qo5~hpPgsoHZlJrb+cZ)wn0_G{fW%0d)P`|j+aOE!Ok@h#84+sN>sK+oUNyv14{^Qc2G2Z>VTEq%*57xw5*48Mhg#DyU zU*xR6>)kljFLO>@I}trgU@vrB`eFpBm^9+*l4DCGiYd)ZO15ETR$PJkz+n!PYKS*2 zFTo`y-!@2nJDiC20hQNN;F6PA-N)}dHwNoUP;NGM6I6!QyYD}1kfu9*>GI}gcUZRO zLIEsrh8T@}BFt1y-N*#sSf||^0k-q|lY2|yuA7^)^+)7(xFn$>(bvRGf{u!s!5KAm z7I9&q9kQ7FYLog;pf++W(}R?o1D*BPxak$60o9)X>C`SG$kcT|y)?y;Dkul$ozi1m z-NE9ymuT1BlS!Hx?vD~Vop52?K_z3sK;FzH`gQl;{|g|iFRVNVnEeZ(i&`WAP{hX6 z_#?C%pD%DKewlF8Q}rYVszIu7zolQXm?-kT@;H7SyZKD+{T?^z#W|E79bqSX`am2& z|8)8u;Zz7$7e(#txB+8;#j9KoeSeq%ZHYFMxdHjh$d3H&n|Oxe>toRb&-PN^&mVex zo^P#(>xN6?GAPb$-EYTtXHdW53t*>`{)v-n?3wn&E)1ar_pbm^=To%*Bc^yhbc>Z5i_Y&6&2#)Nur{s3ZYJ9;uD-MXl%}<< z|Dfv`TOrZMbID&6T;OI;)_1us;)iS^&dcr#`Y`RBCZi3zW@J)wVmV*aZ`yHA(~nPR zRk^&rUWR=nk!p3VsYVYi18B0q69?x;SYniY$rWM3EkGxc^}2T?AVi4X&@D4dlmx)O z>q6mqxf;KW&0GeDD45zQD~n*b#%ZmDH@^DiY@793*-{-b@l>sASs=07l4)*vP-{s1 z^1#hfT_PHt^k=8F7h-TEg{Jb>R->Gp5n4Xy@&tJMZR=gEQli+@axa+LqvytjOkzlc zu%EJFt&Wr^s;&s%xBx6QkNFKmOTdk^Tpe`eR2)b^h8No*cBFlfBT`ofF(~Gw zxK~V_Z)pIjLmSE}?rOCV8nBKnQP6uEvjj{i1US?D zj!2MWbxGK0H0A{mrPvn6HkEYM%jKB6eL|zJ;Vt9au=k(>0vUtWFN?D-$*156oQ|=5 z)f6sWDfLkg_&Gp?7N~xE9+?G51yjP1>DwNKT#SwU2}9qSf$oMt==N=(??E+h7wI-- z7A|=dNWmcXW1{iy3o`KBkGh>b1a#(2vM}Te>R`UeRLX^Do{M;vC-lyph}=J|75T?T zZ?S%RdLJcQIM-dv4FT8pq7ai&NL^@+;|vEyw^3krLhyj*WR3wC@(O7Zs@JKZmalhZ zFJe?vfiNA?({)!N_MAni4LmPQ{{($y=Dh3v(|ze(RyS4idz5lPFYeX)i#4xJ=6%P% z;j!hBS5vnxJD2=z+BOppQ5#exgssXYZA`2_3iLfba?_CWxJTqD13F*?+7v%E`g=B< zFI6>bSJ^{~vnNl8$swDQN885NUn}YZ2<+)?G2+GxIarybVz%P7tpvhAN; z0aB<)r?FMoc0a|gvR^ZKb+=Ev<;nRkt^9=wp$At2e%@52#FCAcV=knXfhCOH#<*q5 zV$w^yQuCs6sXywie7BD z<*_DK-!SJGT33xEA#1bX8u%>G3qS$1HQb5VBV7M*hQ>BjQ7{Qx*c#i6z&`TK0qg_Iu>f3>q6ooO59Zb@x%8z42oeJNz9M{y{ zjSC|n%Acl5Q&#FH7GNl~LcHO+x2hmc&V^JO>J6i=HIg%7eVvn5-EkgppvUG9N24dL4T-}QQ?gNJ=@q6j0uwVWYX zNlqCp9RGY+ci^Q-^N$zW2s?&R{#soW=CSw}kS}S0J`#nNt?qh8qWghtY1j0Iu4Nz~ zb+;dZh6<747r9P5TX9X2-(#v4w~u1Njssm5`%n39utj_!TpvDL{Z3iVCdBxxx3T8^0+f))#9P#axSyldRkBl4Meo#u1=!vmb zc+OTuBwQodsZ(HJeyubS{Nn+AfFU8%)Byz0ZH4VmWG5=DcZ;ap2D!lb*$=DIxnUl>D0i4PHgOVKV#A@jRWO!XDk>4s!Ur2G(O?{mV z=$|HUcO6{rG3p(9|2Z+f-~y5|^}WL-Ro0XcKcER%yspYtNK_KGHi`RKu^r-)C1h=^!Up# z#uWul?O;?)L;QKW81wIGsndC;I_x(tnVuHeHNJG)Sy+{!C5fBV@0VY1o7#>Rh4|-c zlupaBSlFoFoN%5!w&kx9E*jLpac>Wm3&<_c0qU_Cf4U9IGQ~A;RL|ja6o*{_I^0}t zIa*FittX=n+BiK@Lm0?gj2ynnr%!YAl`D?}_#CnK(^MGcNe=uXge|q8^f(ARIntvV zXgI!1K>e=C7g1Q+4n7A7amOgc^Ozq@z6+{^))|{M4uAJXYxf|HqS>LfTmWt8$U%!A z16s1n!=;WM9bWId-l5q<6*kPi<>NMmfq~C{{z{R?WttWOOzZ z>joN1^3tb`94MXiO$HY8ris?ktF^X8TbnOVME7l{25Mb478}1xtS1!<4~k4Wh8OCV zKH8B|QC9&Lgf%P=^;*T*SaIoAG?2kFGwy0y{*fE0)(%#Mm!O2r}@n%v^~{q~g5B#48A`h+P_;39awDL9~Cb#QxM1KcA1S z?|c$7ytZl3#dA>=ZMv?Y=CfWS)mIC$mmUM{pN6yX#w2nmN$dptL#6$=#H0R8%oDZ! zFFaou<#&$1@aZje>JuAI_1dNY_e%QyqKAhi_GvPR*cSBL*tbxA%5gYpN}7 zhJtpkUXb=f`=Y{m3Pa&RzTrN}qont~`lBB6Mq5rGHjMCA#3IDxFVE{)M#__MVik2$ zjtl1=GHmv)&2AP-w`eTd$0FX}I6N%(74~a>jx`t*+WooUCHDwYQM!I@?UPY(wHlQt zN@?_TR3YxZHIs&<8 zY8d(MMUSnk>FtqI@B!-em3cv_1)!@V!rrjnM)SqGckI=ELNc;O&k11#G$s1gv;LWu0E7TV*f0XqaT%H|TXb|4YqUBWM)9J*_4)O4E`VjgDX;*azf~FD zINUA!Nqa+;OO)qXqL6Koj*ob&YxtD>yGytRv03~xZGe!^H!cnvF3_8DSsp@>7v$^Y zGjj7yHuwaeE_vFXt_~Kf8@!+D;=5E?j*)hV7>4V$@X~37PyK2duW}*JpGQsLWp-CT zp2g2x0XIUgERJNC7!VCSH#z*IwqJ$rR^jNeQFs@Dp2$^*RX{X$Rj5;FG%iOLVW}ie zXtinv=L;T&6hY%S#bG*id9xm&Oh4dV&+2s4dh#JAlBD-SntQ-x7ThW-BEEbH1}V|L=3}kB=YgSs5#tbFI1FG3Fd&j`89?hE1~)W%oOEEOpgrc2b|D z2?AT_Cm(pmFf?~MnK~AA@@q-)S(1Q$wy)bPBf3(R36L($LKz_CLR#>t#fqdw5m1f# z^aJIBqs2}&D)aI2w|9VTD?p`xLnu8+ZZAbH@<@t3@rDYI>o50t=)>dMtSES}x@DhpJTl|8m|E@zoG*{`!&cF<~Ox`!=`ev0z zp@fL}b+s07XXtbL3ZL>-B>~C3+2G21mM;O9_OBg#cdKnCJVJzK{B7D* z^0QlnTl)B+PCI)o){cR<4yZutn5tlKB#{4vKc)C*QUub|Z)!k;_8Pb1*b@Hg`pL*! z=N`BeH14xyh=;}|{*^Wl4(P0_&4yT_7X*P^!`2-6@(Y~tR-Y@1x$A(;CV+(C&2Qon zAST6i=DQkwr#N3!U0-tS+w1o!*A47=g47tCiMQ#U^imY>&VaPp(&v=Am=++jE>4xB zX;;t_%hvd5SBqQ$oa1g7Z`t6VzLA7MiCkr0ezlI4+0M#pGLk|)U?I64oyE}G{ubUs_#z7Q{)Vqn;A{|Mh3 zS=}{VlJJGA-ICZ+q=;AC?m7b<%7IvA$U3F->jp!)Y12ptU@t4fNMH=uw^n<9*u04N zQ)0;L3>ao;67bUE!PK2Pq%+_kCL3l5jt*CKoFnYKZMs|vE;slbL^*)aNqbjEYHe}h zI?9q0t<=x05xIY|0X(IWp*%SoX0A78VddV7Z@1Vj2%h~()UUoS8TsSY`w$^-V!OJ# zrSV(#X#RS!=Wr|8uQIJJ^h;~s;%=vT-TH0I3LCrNi5Z>t55CO@D) z@Zg*2%BxmUbH}=0t;#Rhc4QTVz;l}z9@!muN#fUdd4ui|@t0Rpx9n6H!9Z#zw|N!R z-+g!~1nMZu+upzv;3b`^7B8%FdUD$nVx6aAq@*af+=r?N+PVz1>9J<{amEt?B~UX} z(>9kCIKY=aQwEFf`mZX!8IF<8(rAW;u(#_+T!ueIajfG7pTLZVv5*?EHO@{fng}@iou?Nd9&925?|vHpY4X703CXUebVs7#IDfzk-8*1&scE&;eW$ zUC8p^H2}b_(SJ7=X$a))$mLD^RZ{v7@qW%PfILS%1W4NbMW9shM4e;Q8A~?iUxXTTrmgWU{(P6 zxHAhX+-I*pKYroXjqpR|3Ae%z1cw&_`+-5uPi_B-xlD5g(0WU3e#HM$U{QMBvYs*LZmEAz{10GMTf3Wapy3=h5eBhJwqARUtR>@kqRdeATo zQ0nO7rzv;0$wd*n_(cx1Lg3;^U%G$JKwPF%M+$_YbA`<&K)0sP0a0Q*%#t%O z_b!nj)H1*=2qEXyjnU!IZEmAkrupTRv_( zA|n(?M%nmv&hc5O_gUH!jyAEMn$?RXnfv$-mOFKLti+2bgm#{10z56AlwrgQ$WvcN zh8#8LMHMXwuL}~S=ISNfIn=k!A@QP{mV0qDOC5su#Z1&bUiK+`)-G;5Fketn#OC*@O%nTh%kH}!hq&@4(orzSx0 z*>utNP-Utec#H-Pp$;CsQ65e)u(7;o_pe zN4pZ|&H)5uDpkF);WejJ8cG8I;v9wW?EnfLzWW=mu;|)Ybg2Mx*!0PfIR<@$;3daO zzLy89l8aTFJWTOtZw1W&@&^PI6sgM7i)p-Df7$1RN1^GLb^PO~rw5=P_z!@QRB?iS%UFN*a5$!*UTYDxeNyj7aqT%uf@2pk6#`S8m2S4#dx^McD>8XC7rN6sZ<(H>CR%R<00($z3V&s1id9in;t`RAGAE z!5X(AiPd38?P%)o;Ju-N1m*Pr#wyfwJgmW876>#bNdm6R>#74R*Qu4SwjnAmQB^DE zQx91U29Qj zKMD$)7l9BQI0MT|ZL8YhYO7zJ+U_#H3O%ZlZ+nhzJ*En8HKSM&w8A6(@WXgVWJDM@ zsy_(arfTC?z7sxv(|v!qiMdmLys8Wi{aj*&^rLkCi9j|bnjw9sOA~Q8 zCLg=aV?BwV=?q$`sZfy#?DJmKKe&tG>8;t6hE zwpr4XMccPJmZpHnPW;TFRzq;~_B+Z-rwe7pA@LHezKt-Ew>_Io)N? z`#`GFl&bOFM1`$bo3Vh3q>m?AIj$F7W2^h+YTEpM$T)*$Z_W0a2eUfnLQ6id+o=qY z9zzLj(#taHN|$e-TQkhc==02MH#l0bG=OnsTU|^f=0(vR%I2mX!?&h3{nOLtn00b_ ziX-^f3AJS{CZ!a6nYLvT;A!f=pA|HZRw8nd+;}n`nkKDqP+xi?pP70hhN2$|1cMfR zN{2L*bDTeryuZ|eJpDSl=b#SZ2YzkvZs*LVA(A}2) z(mZq{m{Ox>Q85H?7Mx&FpJV*(lh}_23;h1(<9n^kCwUB&D%BsZ(o1l*t`oLoK2kNKEH0DyW zh2A6lnXn;s7avSRc-FVu0q!YsfviB>(lF>+vB2?)4crtW8 z@0{bBUtm;+%Fn>p!-Oi|cb8Mr%RQtVEC>6l^4}3VT>#F zv2}6VOV+HnftSM9%3A8jJa!w#b5!Je9d8%`R8)dtn-d)fz9DicueSpF(7Of7BnFkFU|7VtTlr$?0>a zKN%n+r?R32!9OX_B{nKbK*bU>KtOkf`14@F08at(=3~_xN4q=d^?&rDR;R5T)4D~l zQr58VMupXPV3@Ba@4^{GMYo(p<*(qtgjw?7T+5Dpa05M}KJdh~1o;rpVH9|(OOfD| z0$K?CT95&MWE#i(TGw3s^qgi@F!nJHO_ohcJe1&d0~F2*WNuEyUcuomP+w~kK4-`f zzt5}Ykc%GmA5T!37+lXvjNm})Dz_64ZR#nm;n42R9$H^AIy9enJ+BK|TB!23ILWJq zt-MZ5rG%Dr-qtK^YJCJh-#(7}m=6ztsdsZZabHLrjDC;rlQ4Ue7{Y-b&V+O;KjaTe zDIOL8*fX+`W@WQ6p_bV8!0|%EGhB&{xrSa&vIpfnV$@de(=N=J6lfXqNjBy>-+&$| zbF%^kPAApD9Lr{1eb|c{IQfm^!AoXZ1-Y~j$neJ882`X<%#ekHCH6cw`lVjvj4l;l zXxzPX?4cCR(~6^*L)J;(Fz6L0G{T5ozp!J?;BI6;IrF^uv}xcYKErL$@nBd5X#(%# zxJ3Q*wAhz|XE!owklUm_YH+K`J1#cl7jMx0Si!oX01Km+En_$PgEsX%Csl<4;uxk3 zYjpCpmt7{?QYtM~-Wv0{2|G3Qf>`QczsGhQ_oF30aaV;O3mLSJiUJ8ftebc(QioY%nqR#KL;=@EUy%E9lC zo_TWMxsCYq2Zh$o;^(#8FCb`FQ*I71u)81A?`pEk_E(DbG8~j?jN13l7lSq3_TQ8l zd>n)1YqVcZ)eC|YKC%zL%vpMct+P55>$Vuggws=%I2yGq8xpqlP%EXiwpu_F8dhzj zl@oy zx>c#mGeerwV=Anf+Y*1gJ^oq#qnn}Hj2DNTiuby*xHo6O#i-fnd*^{Ga>P@?Q$_wF zN?1(<@-bSFIU7leRgZWQ%X$=idht;2!rFZ-fwLF$d{VvWnQ7J2om@l3Kx=-{Lg!qL z1OO)V1?XyID#d6~-2+I_ebnL|u}zC$b(~TAmF36>D|lQjU*VdlJb$P+T@)B)^$iA+ zFE?KQ`O^c>8%il29*^TOa%e9}*DRnZ8l`US1^+}7ZOw!xo+A%@or(8$vfaFmCK1d` z3x1%_DGvr(W)&W%VuYEESA1?68vThSXgYG&rE)Fv*d%$SoHo(#x*oQ(vgj zA>{r@9AQc{XtZ)IzblMt$u3gWl{2_KJASL2QEJyN`~esmglzpfb2{bgA%=Qw$xcX? z&+ST|#HT`PpAvJvNMxj0oE|=>-RQNyd1h7@Yq87i|p}@!~oykyKSSJ=HXBk?hhUXo=v2uk*H65shj(PW*a-EXQ z^KM!%l(;6XSje0VbKjH_NoxKWEHcq9z$41Fe2CV$%#ERG;-Fu*gMHMu9}dSpzSsCs z6TbU(EGX&G!34}~nML`T=i)VKe_O%ATVmECe);avMY-fycOq(h_cKM^K{7ClOYU|O zI3$hV?Pf*psr@i`x>cUqg3>*{SZM!jk-{vwb8ctF`?ZDq1Leg=O0idRbZt>uBUvQL zYfe zWuE`wnK)%0MN14s1HekKdsbPU_d3tuWa?wpwDANIO99#MS`Ei6$OV2m<{3V(jg zGf0GZm`0!AK@}0UqvroKcR2t(QkfY*FMa>iQV%uMcnE`K?{S$gY-;D-vB|@D5q5Idi~ZxWk*CjytV6*OpV4SMlB*cHMPEr} zaGrCODFv+A zLkpt>;ylf*XIP5K(zrsH$@Z}6?adk4N|)i}axqrE>q zlM+moa!DL-n3+BEj9@umljvDbA<{@A&Y>6bqAeTP`38hqg7euh8k1Dhr!EIpM;K~a zptqbmZA_7U{R^Dk%IOgcf*u9mQrxE*DQb8U(`-H-6451xVqhzvTXXUWlm<-Y%+=Cq z#kl6TXU5?X(@8DKhFq+wyt{QL^xEWQoupmYIi?A19%!b4{CJ~H)$_f-Xns+GS)SPZx>JZ5!My-VHm;vxEa&7! zO7bo*t;>^P6OXVC)LHqjMj9qlCWvdT>X#51LXs`=#(dC(+3Z>7K*u%2+N>a=vlQ3k z3l>Yt6t{CxO$(le$7pmb^we}mC?>Ps+L^X9Je5_On%r!z!dq0FzMLv- zTeAPIep9DOlGoypbhVy%&#(E2B&NU7JQW1d9b{}w29mk@#C>py?|)|K??;^-H+z{7 zIXh*3bakC|W@I25n;#+ZiW>TZ4m#Kx`*LpA%&qK{mRR1et>#ldhlN#W0uqr6wY-_@u?=W1c6 zYfET#$8VZBXvnhG7J@(6Cw{eBoLC9X?G%Vx!J!(5>g`h6a>FW2y(-sL;%&P-4=iuU z(mlPD^z5ct7hTkcufu6*?;}uIsH9S+Qef$TO`YbtFcZNZj|%dy|^#_jTwAI-s*{#01i z69iNj5>ZSW!r4c=EyGrQO))Y~z3H;jSeTIpW2{83J120fu+){eOCjD3RSk6sb+>=; z+CA_3r+fL8tHaGObZ33}9f^U{z?&SB|EQDZC@kJ+A2VC3U+hx-kRMqN3)^s?R#Xto z!IVvk?(&m^O-0-5jpaW|8kkm}Kh&qp{&3s4-MijcHq1Ut*_K^OR;LAyTMmsFQ`S@%`@G;0b8^ir2q0KJWun}}q z@j%-V53{c2CCCyPlDV^ zZ|_n}@~b*(VY{ecFy(Hzy5S7gk z>3`FsswHhd6PqX~yRDRebq)0fcSI0>2kdNOXw^iMthha_mfD_mW_#fH z?4c~?*hf6UhTu--KXhX2IuX&bKcIOox6ab`ko(as=U0CQ@ozERSJ{2pe@r49Wd&TPHe<+o)ST|4X6EHlL*y;T`B8Bts+DiQVwB*q&)o_qrnE zRrM=i+VMAu42mVtI;WmF=YOIHlJLoXs$cKMGF3YBUi zhxBU_95q!y-t``A*mR3#wM_@ud-q5sSZYf$*2cgJy91*R^2I6}Z(W~?89-c%wcJAX zyV*x{pdJ>yH_dvBF$~=vfI~g1#(v8=&t1`Nxq_XsC{EGinP+b^yS}l8;NmEp0UO!QqwEYa#bDI>A?bXm`*gop#X8SQ+q`2@ol3e zLqr9)V<2i{J*_8f2B(%R%p(s^GL}5|XKv;AZ)ZoWChuXs(%u+KJI_soWChf`0z-f> z%|0(lB)20BEzQkfzc241!P#sW*@t@rj0uezQ!6US|6t&t@WzWFHucGEA8e^c?y<`; z#$|Dbe0n$ak*tl5A42giFhMwNVMg=?oq{i-h@mM+&!&dy z(aQH1AFrBni}4+TDJwzIJNFi@Ovsk%+RACzP#vo3K!P<%`%uO)3H3>WeDZlo*Uz5aqr0e)3Z@NmfZ0>S}}38r_SJRAcWO%QD$l21Rk;*bl}gG zV`C|fq4UdiA`#tg;4y4b_@d3KF8YQhg7cRiDq{NKmtDkf_(oPj_T{wtjT|Sh*J`^c zDMjao3tF=@HQz5rZJM6n2B8XU)g*vVC5`iU+HxVNw7G-!3p-GrCHvfH3pO}BE|xfZ zuLc{tK|}8Zfhu6;mbvi?4s{U)hGWbP*)m%raoY7$It3nm8ZHx(A`b*jV$xBM{bFhe z*OJJ==oH-B4!_tfS}AmWxqa1kmli0I$-5b0C|JEH&zc9T+k6qz*Kd1!ak(_FpOL1DsWKeqK7`# z%kK_()A=ETK_91bPR*NcJ9camosO<7ZOGdBN_mLTr^{@>GR$BHz8AZ}d6ZVKT$OBX zjA{isAL0%@Y;rA4o``bSe_VWaWB~&1`Yn62%Sesbnq^_D>DF!}Cv~a96n0fyK7)^+ zJ~)|{NMGxi7Ttw7UD!30if|tFa@IF#q^-)npZjud%7(B;a^u2NBb4DsRQv~al4X$< z;m*&ZMr?acJ_fBmk-+rpr_9<`7YY>hVX&=aPg2h_QSgoh$D17_q3u^Qp@a-e#&)*D z@H?DhOMgDvqJpQ2-KOm&PRX*Xx`pCq%SCBo=i84l`5coh^VV{~R9>qvBdZlO4~S8t zMLm856mR++jpRh7rCh<)e;oeafBG7)0(kpQv!pk$;M($ZTBIM+|K%cz)N`V}70dKl zl+v*L2^#Jqop zCNOO!ocfz?m<+a=>8@V=j5lJn%N~VLb<--h$cbVX)pO?gQYpHjd7^nMCB`v)nGrNoylbo!1q6Jj+WHzQ~P`jpVDd22IK z+w_zyQ?E|&pjE~x``KtsNvE0apdFp&>fuBrKX}KW`9*!+nd@@y;N$kEv_zCjE3m_X z{SDV+RpN%tgiq^*LCo4@1%-%$7Tl4jw~pqvZGM-!7t5v+rQguf=p)rDI})}!Qm0 zik~{@S&7H6iE!e(U3dNW&PIh7$!?|%=n`B5@BQ!b$-g&1$u`vqy3OKAHwrzrV1Ayi zW*k_sIM_waX0qOi4t4f~nu_xbL!LyNN#y=;*E97r#{sQNb#QiM7N;tXP(4w73A~l&)_=} z%oz;z>9o=JF;?4=vhRV3OzQGhV`Z#pYv@$VsUe{|=)|3nw8LWO=wR{v1A|CeI)=ck zlZ?A#VVYHz3cB<@clUvWb^j|Y>Anksj$Hj(EFSyDfUEmU)6KJ8OcbBf*{*=cZe|$_ zf5XBqV||_&tNI0t3{ZxjTp_RFQt&op_h_z5lSv}-lbun0yng0V{-KY8L&Hco1SBDr zu*x(zzAcn;HVZ6X#g+lj8`LwK&@I03#6Ss;lHekEf?e^d)Jc;)b;ZnRmQOQ^DXCyT@-R{4P z9t{uM5jbL9Dz5!UzZ=T2pI_f(@GeK!u}{xuFN}1v3tlPk+SB`m5=jP%NmSzde8m*O znj>-UTkgZ5%K3O%H443p)RC#6xz(&F2r(QjajID2_pbMyN>Au9E8Owd+@EqXfruJyLTB<))>LN=MqE&GJQVOm=$WSs!dhoR|@9sOY}OD)+XE2t5z}CJI(s=_C7!xUS0vpdTjTyAwbW|j9X!S zMXb#}(6It29z$M3{Nd_pWcB7udO~)8(xs`_39G#{G!#>81Re=Jet5w;YJ(ntKvHH{ z0d)QL;|$Ft>59TYLw7sdAN>MXrb_x3GNq3d3K+E07vkfyD;x`1-LW@_JwgxARrz&B zf{>L@tL&1(O|l*I*dc>`pDbqs@=D1mw9c*_&18HH=egMHEpTa_!u3vTM3}d&g`aPd zrDR;zQBRF@#qK4m_NUN=k#4f8ijAcg(kdk?G*ly(X@b@(n7js-da5FKZQD|shWrNJZsDAL; zP8NNqIlxhWpQD-R8K(8T8*j=ENmeeT#P4Gp=Ox$uMNhvisDKzCVPc=#-Py}rMd)bd zXjdm=nS8o|Mn~_fN`+igMF+=$a9?}WAiH^?3JrA(4|knc{se?|jHOMKTWL~^Ph(d7 z?w7U@`R3;A*>avVVKMDL1s|^3P{9#a$R^YwQO%l0s|^HIn`$xT!mP$cdYIWZXmy*t zF3dYd-}DPNqD8CKDBwCjyzNwK`<-V#HncWbjKp6%oyR5B^TrrAWWVc2(=7Nsfaj)n z=OpmuJ3`wbX;)+)z1XTj&tS2C<2^WS~8)!O*_*2$h zzI%yG&}*d`l_ch4YKypCK2VNmChv3^Jw_M+*quW8>e4S+@x>&*&ZEg71`1LrW6Tbp zgj*%gR*9iTdKx3wog8Iz#kF%yK_)49`z9b7#h4Fs?61FMHcCb#t}A*Q29ioUrWpwk zdP(Bb-Nt^1Jh8@1p{rq6sJ%*#HmmsQEHM#I|61@Nt(#Q`^~QLsAr-K{w!z4ODzyk3 z*RT3uG2*0uY-_kEBX-Bj%=r00Px2*YaXAr|P1%KlL~oE|)Gk?q5%q!Cy=ADZPDDLT zTeWC6^2}@5HLjuLB;>?A%~)Z~k_$f=aQSAzSzr6_z%OOPC0De&O}cMO*x_Htct|>B zlVw`sFZn3fxHfj*%->1eNyHKonf*sQ7Uz8RNRmhN^ez(5(ZQ0KdQ z;dpdcRWVdU+AiYc5A1c?m<0h!Zg^335kUpQy4Ve;JomiFF6`94ddU8q$}9JE2R} zklmS3B~`wLV3~D0gOVVPG4__-YaX&s7uDON3t$GXaJ-?mSub{i7D0(E9nGS3Q8m~E ze|9w(?@}y4b9iqaK|N8v*g-23coPF+K{Nk;De3SEV$sK@pm^+Yg^`A{dR-FM_ zn0Bog_;;IsoqXfoe|t@0&@E za$hotWU9}NO?=K|<92TOLaVxN5JV0W!NXW&uK8Z znqKxmo;V(A=*nqe(RUZo)kbpfPmkzD0?f`sKEv7l?#^wwrCsqpmRI(mj}1VF1@qSh zN@D+kRRiwBUsC?8xbP1V=ixOm;Wt!Trs|WuF#8LVS2KtHTOt02X_;gjNL57rPsEMRd>OiU5jf@WbZgp1!tEpVVOlcMIIy^SIZ=h2MZqb-V59 zs~7%47>)I(zS*nq0NKFW|Bay?ACIR9)ZoK=psmZfwD3M(8sz2o%Nz{xEnU3rcoePP zPstDGU?=nZZPg!2lwQRXhfZ9y&R{wGipdID{><#)9;ZPzvL~v0!u+`GKnX_4+BA)`PUW>6V^N#eFseK;O?qtRI`0aZic2`P9 z@C11!k1M&d6@6H3W3nTf4i9QWFH-e4=*Xt%Xhy@tmgHzq4}Zg4yE_Ehrvkfe$&YVA>D}-4 z0wMzdM2#FZWG^6G0YLNzSnjp-BtX|1V7@H|d+={?6wtN&ipzVzws9- z+XA|F3&y*rug{8ru6etRt(^KN{=fGF_|Ka!xxc5c20+&!s#7s3d+?up7SJ^#m%DrV znll1)jldUNzvpqkRRX%^sv^0kFD-A5L%|C#uGSm3rA;sL8Ti>JGRe75vBY6-1RtY4yXrKVQdKIv%X7FpOKF{W1-!4a* z>`n`L3SUGqjnB(*QfrqgwB^%R%4&wKg=g2Psx;fFDL&qy8)xcbO2Kv#^Ay=Q>F-vZ!pOVfRiHPq4t-cXEjwYJC}3*`z(U7^E! z%~lM6908a|wEmvAIRHopc1rfn?*hOpR#h22k+kQ=@&ReVmQBVUp~|U~I>7Il!GCP*ei+;eGW41N literal 0 HcmV?d00001 diff --git a/Domain/README.md b/Domain/README.md index eb40e6c..422963c 100644 --- a/Domain/README.md +++ b/Domain/README.md @@ -1,3 +1,24 @@ # Domain -A description of this package. +## Description +In this layer, we place our **business logic**, and it acts as an interface between the **"Presentation"** and **"Data"** layers. It consists of three main components: **Entities**, **Use Cases**, and **Repository Protocol**. + +In summary, the **"Domain"** module is where your application's business logic is defined and serves as a bridge between the **"Presentation"** and **"Data"** layers. It includes entities that represent your data, use cases that define your application's operations, and a repository protocol for data access. + +## Targets +In the **"Domain"** module that we've created, there are the following targets: + +- **"Entities"**: These are the core data structures that represent the fundamental concepts of your application. They encapsulate the most critical business rules and data. + +- **"Use Cases"**: These are the application's core business logic components. They define the specific operations or use cases your application can perform. + +- **"Repository Protocol"**: This protocol defines the contract for data access. It specifies the methods that must be implemented to interact with data sources, such as databases or network services. + +- **"Error"**: represent and handle errors that can occur during operations involving fetching lists. + +- **"Extension"**: In the "Extension" section, two extensions have been added to convert between Combine and async/await. These extensions allow for seamless communication between Combine and async/await by adding functionality to AnyPublisher. + + +## Diagrams +Domain Digram +Domain Digram \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..84f1032 --- /dev/null +++ b/README.md @@ -0,0 +1,86 @@ +# Transfer List Logo + + +## Description +This application is implemented using the **MVVM (Model-View-ViewModel)** pattern along with the **Clean Architecture**. It is structured into three separate modules: Data, Domain, and MediaListUIKit. These modules are organized in a Monorepo setup, managed using Swift Package Manager, and all the modules are kept within a single package. + +## The tech stack used in this project 🛠 + +- UIKit +- MVVM + clean architecture +- Unit Test + MockURL +- async / await (Structured concurrency) +- Combine +- Http client (Alamofire) +- Image Cacher (Kingfisher) + +## Tools +- Xcode 14.3.1 +- Swift 5.8.1 + +## Screenshots 🌃 +List | Detail +:-------------------------:|:-------------------------: +list|detail + +## MonoRepo +In a **Monorepo** setup, multiple related projects are stored in a **single repository**, making it easier to manage and share code between them. +
+[monorepo.tools](https://monorepo.tools) + +## Modules +- **Data Module**: Contains implementations related to repository, network, and local storage. +- **Domain Module**: Consists of repository protocols, use cases, and entities. +- **MediaListUIKit Module**: Contains Colors, Fonts, and views. + +For more detailed information about each module, you can refer to the following links: +
+
+[Data](Data/README.md) +
+
+[Domain](Domain/README.md) +
+
+[UI](MediaListUIKit/README.md) + +## Clean Architecture + MVVM + +- **Data Layer:** This layer includes repository implementations, network-related components, and local storage handling. + +- **Domain Layer:** Here, you'll find repository protocol, use case (interactors), and entities that represent the core business logic and data structures. + +- **Presentation Layer:** This layer is divided into view models (ViewModels) and views (Views) responsible for presenting the user interface and handling the user interactions. + + +## Presentation Layer +It's important to note that the **Presentation layer** is part of the **main app** and **is not organized as a separate module**. + +
+In the Presentation section, the following key components are present: + +1. **SceneDelegate:** This class manages the application's lifecycle. It begins by registering the necessary fonts. It also creates the container required for Dependency Injection, which is utilized by the `ViewModelFactory`. + +2. **DIContainer (Dependency Injection Container):** This protocol is responsible for creating the desired use cases. It should be passed to view models that need these use cases. + + By implementing `DIContainerImpl`, we fulfill the DIContainer protocol, and this is where everything needed to construct use cases is assembled. + +3. **ViewModelFactory:** The purpose of this class is to create view models. It handles the creation of view models that may require specific use cases. In this scenario, views don't directly get involved in the construction of view models; instead, the ViewModelFactory takes care of it. + +## Diagrams +App Digram +Presentation Digram + +## Roadmap + +- [ ] Test + - [ ] UITest cases. + - [ ] Test plan. + +### Contributing 🤝 + +Contributions, issues, and feature requests are welcome! Feel free to fork the repository and submit a pull request with your changes. + +## License + +Please check [LICENSE](LICENSE) for details. \ No newline at end of file diff --git a/UI/Diagram/1.png b/UI/Diagram/1.png new file mode 100644 index 0000000000000000000000000000000000000000..ad76bafe739a78ad71f969209546456178f54ab1 GIT binary patch literal 56780 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 literal 0 HcmV?d00001 diff --git a/UI/README.md b/UI/README.md index 096aa1d..fb37601 100644 --- a/UI/README.md +++ b/UI/README.md @@ -1,3 +1,24 @@ # UI -A description of this package. + +## Description +In the **"UI"** section, you'll find everything related to the user interface (UI) needs of the application. It includes the following targets: + +1. **Color:** + - In this section, colors required for the app are created using the `Theme` class. + +2. **Font:** + - This section provides everything needed to create and use fonts, including two parts: + - **Font:** This class is responsible for registering fonts required in the main app. It must be invoked at the beginning of the app as `MediaListFont.registerFonts()`. + - **Raleway:** An enum that creates fonts with specific weights, including regular, semiBold, and extraBold. It is used to retrieve the Raleway font. You can obtain fonts based on text styles: + - `func customFont(basedOnTextStyle textStyle: UIFont.TextStyle) -> UIFont` + +3. **View:** + - In this section, essential UI components are created, which include the following: + - **Base:** In this section, you'll find everything the program needs to create subClasses. + - **CollectionView:** This section contains everything required when using UICollectionView. + - **Label:** In this section, three customized UILabels are available. + +## Diagrams +UI +UI \ No newline at end of file diff --git a/UI/Sources/UI/View/Base/BaseControl.swift b/UI/Sources/UI/View/Base/BaseControl.swift deleted file mode 100644 index 41de0bf..0000000 --- a/UI/Sources/UI/View/Base/BaseControl.swift +++ /dev/null @@ -1,25 +0,0 @@ -// -// BaseControl.swift -// -// -// Created by Hessam Mahdiabadi on 11/6/23. -// - -import UIKit - -open class BaseControl: UIControl { - - public required init?(coder: NSCoder) { - super.init(coder: coder) - - setupViews() - } - - public override init(frame: CGRect) { - super.init(frame: frame) - - setupViews() - } - - open func setupViews() {} -} diff --git a/icon.png b/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..95dc491c8eeb5f25dc6870c06384b93db632c6d9 GIT binary patch literal 58124 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 T@#awX6y>_1rKed8y@&n}Vh&d> literal 0 HcmV?d00001 diff --git a/shot2.png b/shot2.png new file mode 100644 index 0000000000000000000000000000000000000000..2e913dc94807862acdad89711c62463df1de3701 GIT binary patch literal 58164 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

^e*(aBB3Bug>-b6JnNw{ab+u#P#7j^^Lt1>$eqK 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 Date: Tue, 7 Nov 2023 02:36:03 +0330 Subject: [PATCH 34/34] Create LICENSE --- LICENSE | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..87946e5 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023 Hessam Mahdiabadi + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE.

y>MrpGiGl(P8kEu?@ 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 literal 0 HcmV?d00001 diff --git a/Data/Diagram/3.png b/Data/Diagram/3.png new file mode 100644 index 0000000000000000000000000000000000000000..cdc728293c9579de02de55fa1e40b00b2336b0c4 GIT binary patch literal 43516 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 literal 0 HcmV?d00001 diff --git a/Data/Diagram/4.png b/Data/Diagram/4.png new file mode 100644 index 0000000000000000000000000000000000000000..589854360dfc94102081e04d3ceba2b2926a1e45 GIT binary patch literal 42378 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 literal 0 HcmV?d00001 diff --git a/Data/Diagram/5.png b/Data/Diagram/5.png new file mode 100644 index 0000000000000000000000000000000000000000..7a8a5f8699eac91f94ccae32c719329b7427bf90 GIT binary patch literal 65965 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 z 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 literal 0 HcmV?d00001 diff --git a/Data/README.md b/Data/README.md index 9f2dd4d..29fd5ed 100644 --- a/Data/README.md +++ b/Data/README.md @@ -1,3 +1,29 @@ # Data -A description of this package. +## Description +In Clean Architecture, the "Data" module plays a crucial role and is divided into two main parts: "Network" and "LocalStorage." This module allows the application to communicate with external resources and store the desired data in local files. + +"Network" Section: In this section, the application has the capability to communicate with external resources such as servers and web services. These communications are typically used to retrieve real-time data from external sources. +"LocalStorage" Section: This section enables the application to store data in local files or local databases. This is usually done to retain data that the application may need for future use. +In this way, the "Data" module provides the application with the ability to manage and access the required data in two parts, "Network" and "LocalStorage," allowing it to establish communication with external sources and store local data. + +## Targets +In the **"Data"** module that we've created, there are the following targets: + +- **Common**: This section contains items that are needed across all other sections. + +- **Local**: In this section, the program fulfills all its requirements for storing and retrieving images from the device's memory. + +- **Http**: In this section, the program manages requests to the server. + +- **Repositories**: In this section, protocols needed by the "Domain" module are implemented. + +## Targets +In this module, only the **"Alamofire"** library has been used for the "Network" target. + +## Diagrams +Data Digram +Data Digram +Data Digram +Data Digram +Data Digram \ No newline at end of file diff --git a/Diagram/1.png b/Diagram/1.png new file mode 100644 index 0000000000000000000000000000000000000000..b13e5a32cde1a9285d4a16bbeb35383af918a6ed GIT binary patch literal 87366 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%0DC+B+JrR%ohtHrOuO#j+34dB;)wzc;i`gEee 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%0Aqm_ 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≪PH>_*QZq#|eC6H5X-E6pL_txIbF0E>L+m1~ zh_Jc2InM^o5!eQM0=bbuFYk+;K?s-#fqJ!TwTHlQqzhwU85XCMAP^o5XT|0VP$&2c z9n75{By&G_PU3txt6J%3&0CF0q^MXl$Y376Lk=_$LLNnvGYLJ7CN;l<`Cn zPq*BBVAU4Em=C$_c7dJpbn4xoRXVOdMgC`@VQDDP!xeGn@wB`UtA`yHA#p4Pfr!P< z^F$#?yL~ih$jNbARWe8MDYYgiSGi74PvB; zG_ida9eRy{KPqcEkTL6hTjnm;hcTf+{QrK~%L_IOzXYWeT2V&xO7iu?fw(uf1(BJ{NC!{r5-kn#CXd*iWP4b#*_RaGN&IQ6|q zUv1QvXSLk_lcpu1v%Gau=pDSY1292-Nfz?&U)p13Lfs;n^~O7R_q8(>Qvy6Tru+~7 z*$;|I6ef(j6}>n7$W%T@{`et10xEo`c?W1(MK2O%&enJbGKuM~Zr7{>9&n9`;qu`r z=wRTe;b21$pTS?bWnVK?GEJ!A_8}_R-nY*^Ryk_ki9T$W{B2bPEwJwO%&TXr)k1T8 zKM}FNDPPa2v<5L)c}@Jp*LR9{`az*HYv7~U@B>_aBLMdfvpW!A7Ayr-$~9r}hqLAn zdMz63oqz<8BmqBX&M` z6dBCBE`AOm*Qw7qaU73h5dd>TlbN|C)PA_7GO?Twou&}b@@f+Wf1vc|>e-f_pQ@6a z?TB0UrhVMyS)$1#zrj{)@C}oTq1W8>q(igR+_2cYoUO!m!e)EEqwq0vt(BhpS$Ugq z>Dt(8Q0eHc)=r-wegkeH+@L;swV{dgE#gw`1}VZKco&ZI#e;bXdSiC|^*~7O#?S@o z6_`1cCctT!)F$E}@1fdhkX1Ul|{!H@au<3qM^d#o=wdx$k<@;jL zft>h1PoN9?^y!`(tr_M1&nEK9r)jgFyl-2mi2Vzc*I_Z}77Yp%gQ-&$^XpZI5$UGu zY!AeS!r26BKdTGCPF3nvV^nk6!CT_8ZNht6)RP53tD_9dr{2&9qJzNEg;u_pA^Y1* zQ9MG{DzU;?O|=>-SUYT<-2Rnj8vnTZ%Q$hNX?p3mur~N2mnmjZ4R`{d#S;4YY)E{zv-D7N8pD;FQmPbg`b=*tzq^L6G#8K6-=;A zHTx+JeMD{^h!=*kOV1l{7Khl1+?zg-u9dGR-gKpeQ|AxM@%v9cywq07XI|ValCPtE zE|xmEvhH0p+v?_2gEes1h|ur!XsKY;W)4nBcV3VpwHiFR zortR|4d-k>bDoxQ{7#!XjNjnr+uyeO7MW-&J?$7{0I5PLI`(yRfbC(GTnMTb#R~5u}T`Nmy(V7STkWT=BiYdxSehL!G+soA*c3SdZPXx zNV7!SV|<6@%&7S;%_Id9Dyyc`LOwOpwn#*Xa)RM8XN1b5CesAnnX53j^}<|gnOC``7GuL?E>`L_5T