From 93b98fa4f7e389405b83c99ca546b663fbe21877 Mon Sep 17 00:00:00 2001 From: Dariusz Rybicki <dariusz@elixxir.io> Date: Thu, 29 Sep 2022 10:57:03 +0200 Subject: [PATCH] Present Backup from Home --- Examples/xx-messenger/Package.swift | 2 ++ .../AppFeature/AppEnvironment+Live.swift | 4 +++ .../Sources/HomeFeature/HomeFeature.swift | 34 ++++++++++++++++--- .../Sources/HomeFeature/HomeView.swift | 21 ++++++++++++ .../HomeFeatureTests/HomeFeatureTests.swift | 27 +++++++++++++++ 5 files changed, 84 insertions(+), 4 deletions(-) diff --git a/Examples/xx-messenger/Package.swift b/Examples/xx-messenger/Package.swift index c1294b27..8fa55d88 100644 --- a/Examples/xx-messenger/Package.swift +++ b/Examples/xx-messenger/Package.swift @@ -84,6 +84,7 @@ let package = Package( name: "AppFeature", dependencies: [ .target(name: "AppCore"), + .target(name: "BackupFeature"), .target(name: "ChatFeature"), .target(name: "CheckContactAuthFeature"), .target(name: "ConfirmRequestFeature"), @@ -231,6 +232,7 @@ let package = Package( name: "HomeFeature", dependencies: [ .target(name: "AppCore"), + .target(name: "BackupFeature"), .target(name: "ContactsFeature"), .target(name: "RegisterFeature"), .target(name: "UserSearchFeature"), diff --git a/Examples/xx-messenger/Sources/AppFeature/AppEnvironment+Live.swift b/Examples/xx-messenger/Sources/AppFeature/AppEnvironment+Live.swift index 24e5bd89..0ed4d6b5 100644 --- a/Examples/xx-messenger/Sources/AppFeature/AppEnvironment+Live.swift +++ b/Examples/xx-messenger/Sources/AppFeature/AppEnvironment+Live.swift @@ -1,4 +1,5 @@ import AppCore +import BackupFeature import ChatFeature import CheckContactAuthFeature import ConfirmRequestFeature @@ -149,6 +150,9 @@ extension AppEnvironment { bgQueue: bgQueue, contact: { contactEnvironment } ) + }, + backup: { + BackupEnvironment() } ) } diff --git a/Examples/xx-messenger/Sources/HomeFeature/HomeFeature.swift b/Examples/xx-messenger/Sources/HomeFeature/HomeFeature.swift index 068cdb4d..e576e6f1 100644 --- a/Examples/xx-messenger/Sources/HomeFeature/HomeFeature.swift +++ b/Examples/xx-messenger/Sources/HomeFeature/HomeFeature.swift @@ -1,4 +1,5 @@ import AppCore +import BackupFeature import Combine import ComposableArchitecture import ComposablePresentation @@ -20,7 +21,8 @@ public struct HomeState: Equatable { alert: AlertState<HomeAction>? = nil, register: RegisterState? = nil, contacts: ContactsState? = nil, - userSearch: UserSearchState? = nil + userSearch: UserSearchState? = nil, + backup: BackupState? = nil ) { self.failure = failure self.isNetworkHealthy = isNetworkHealthy @@ -29,6 +31,7 @@ public struct HomeState: Equatable { self.register = register self.contacts = contacts self.userSearch = userSearch + self.backup = backup } public var failure: String? @@ -39,6 +42,7 @@ public struct HomeState: Equatable { public var register: RegisterState? public var contacts: ContactsState? public var userSearch: UserSearchState? + public var backup: BackupState? } public enum HomeAction: Equatable { @@ -72,9 +76,12 @@ public enum HomeAction: Equatable { case didDismissUserSearch case contactsButtonTapped case didDismissContacts + case backupButtonTapped + case didDismissBackup case register(RegisterAction) case contacts(ContactsAction) case userSearch(UserSearchAction) + case backup(BackupAction) } public struct HomeEnvironment { @@ -85,7 +92,8 @@ public struct HomeEnvironment { bgQueue: AnySchedulerOf<DispatchQueue>, register: @escaping () -> RegisterEnvironment, contacts: @escaping () -> ContactsEnvironment, - userSearch: @escaping () -> UserSearchEnvironment + userSearch: @escaping () -> UserSearchEnvironment, + backup: @escaping () -> BackupEnvironment ) { self.messenger = messenger self.dbManager = dbManager @@ -94,6 +102,7 @@ public struct HomeEnvironment { self.register = register self.contacts = contacts self.userSearch = userSearch + self.backup = backup } public var messenger: Messenger @@ -103,6 +112,7 @@ public struct HomeEnvironment { public var register: () -> RegisterEnvironment public var contacts: () -> ContactsEnvironment public var userSearch: () -> UserSearchEnvironment + public var backup: () -> BackupEnvironment } extension HomeEnvironment { @@ -113,7 +123,8 @@ extension HomeEnvironment { bgQueue: .unimplemented, register: { .unimplemented }, contacts: { .unimplemented }, - userSearch: { .unimplemented } + userSearch: { .unimplemented }, + backup: { .unimplemented } ) } @@ -267,7 +278,15 @@ public let homeReducer = Reducer<HomeState, HomeAction, HomeEnvironment> state.register = nil return Effect(value: .messenger(.start)) - case .register(_), .contacts(_), .userSearch(_): + case .backupButtonTapped: + state.backup = BackupState() + return .none + + case .didDismissBackup: + state.backup = nil + return .none + + case .register(_), .contacts(_), .userSearch(_), .backup(_): return .none } } @@ -292,3 +311,10 @@ public let homeReducer = Reducer<HomeState, HomeAction, HomeEnvironment> action: /HomeAction.userSearch, environment: { $0.userSearch() } ) +.presenting( + backupReducer, + state: .keyPath(\.backup), + id: .notNil(), + action: /HomeAction.backup, + environment: { $0.backup() } +) diff --git a/Examples/xx-messenger/Sources/HomeFeature/HomeView.swift b/Examples/xx-messenger/Sources/HomeFeature/HomeView.swift index 03907b18..95bde09c 100644 --- a/Examples/xx-messenger/Sources/HomeFeature/HomeView.swift +++ b/Examples/xx-messenger/Sources/HomeFeature/HomeView.swift @@ -1,3 +1,4 @@ +import BackupFeature import ComposableArchitecture import ComposablePresentation import ContactsFeature @@ -111,6 +112,16 @@ public struct HomeView: View { } Section { + Button { + viewStore.send(.backupButtonTapped) + } label: { + HStack { + Text("Backup") + Spacer() + Image(systemName: "chevron.forward") + } + } + Button(role: .destructive) { viewStore.send(.deleteAccount(.buttonTapped)) } label: { @@ -152,6 +163,16 @@ public struct HomeView: View { }, destination: UserSearchView.init(store:) )) + .background(NavigationLinkWithStore( + store.scope( + state: \.backup, + action: HomeAction.backup + ), + onDeactivate: { + viewStore.send(.didDismissBackup) + }, + destination: BackupView.init(store:) + )) } .navigationViewStyle(.stack) .task { viewStore.send(.messenger(.start)) } diff --git a/Examples/xx-messenger/Tests/HomeFeatureTests/HomeFeatureTests.swift b/Examples/xx-messenger/Tests/HomeFeatureTests/HomeFeatureTests.swift index b172793c..cb9ee3b6 100644 --- a/Examples/xx-messenger/Tests/HomeFeatureTests/HomeFeatureTests.swift +++ b/Examples/xx-messenger/Tests/HomeFeatureTests/HomeFeatureTests.swift @@ -1,4 +1,5 @@ import AppCore +import BackupFeature import ComposableArchitecture import ContactsFeature import CustomDump @@ -504,4 +505,30 @@ final class HomeFeatureTests: XCTestCase { $0.contacts = nil } } + + func testBackupButtonTapped() { + let store = TestStore( + initialState: HomeState(), + reducer: homeReducer, + environment: .unimplemented + ) + + store.send(.backupButtonTapped) { + $0.backup = BackupState() + } + } + + func testDidDismissBackup() { + let store = TestStore( + initialState: HomeState( + backup: BackupState() + ), + reducer: homeReducer, + environment: .unimplemented + ) + + store.send(.didDismissBackup) { + $0.backup = nil + } + } } -- GitLab