Skip to content

Commit 8ddb7d1

Browse files
committed
fixed eventForm navigation Issue and send empty phone when login issue
+ HttpError description make public
1 parent 6c59c15 commit 8ddb7d1

File tree

11 files changed

+182
-101
lines changed

11 files changed

+182
-101
lines changed

Addame/Modules/Views/AuthenticationCore/Package.swift

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,15 @@ let package = Package(
2525
.package(path: "\(Path.Container.core)/Common"),
2626
.package(path: "\(Path.Container.core)/PhoneNumberCommon"),
2727
.package(path: "\(Path.Container.domains)/AddaMeModels"),
28-
.package(path: "\(Path.Container.services)/AuthClient")
28+
.package(path: "\(Path.Container.services)/AuthClient"),
29+
.package(path: "\(Path.Container.core)/KeychainService"),
2930
],
3031
targets: [
3132
.target(
3233
name: "AuthenticationCore",
3334
dependencies: [
3435
"Common", "PhoneNumberCommon", "AddaMeModels", "AuthClient",
36+
"KeychainService",
3537
.product(name: "AuthClientLive", package: "AuthClient"),
3638
]),
3739
.testTarget(

Addame/Modules/Views/AuthenticationCore/Sources/AuthenticationCore/AuthenticationCore.swift

Lines changed: 16 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import PhoneNumberKit
77
import AddaMeModels
88
import AuthClient
99
import AuthClientLive
10+
import KeychainService
1011

1112
struct AuthenticationCore {}
1213

@@ -24,7 +25,6 @@ public struct LoginState: Equatable {
2425
public var isLoginRequestInFlight = false
2526
@AppStorage("isAuthorized") public var isAuthorized: Bool = false
2627
@AppStorage("isUserFirstNameEmpty") public var isUserFirstNameEmpty: Bool = true
27-
public var isValidPhoneNumber: Bool = false
2828
public var showTermsSheet: Bool = false
2929
public var showPrivacySheet: Bool = false
3030
}
@@ -33,8 +33,7 @@ public enum LoginAction: Equatable {
3333
case alertDismissed
3434
case showTermsSheet
3535
case showPrivacySheet
36-
case sendPhoneNumberButtonTapped
37-
case loginRequest(String)
36+
case sendPhoneNumberButtonTapped(String)
3837
case verificationRequest(String)
3938
case loninResponse(Result<AuthResponse, HTTPError>)
4039
case verificationResponse(Result<LoginRes, HTTPError>)
@@ -58,20 +57,21 @@ public let loginReducer = Reducer<LoginState, LoginAction, AuthenticationEnviron
5857
case .alertDismissed:
5958
state.alert = nil
6059
return .none
61-
case .sendPhoneNumberButtonTapped:
60+
case .sendPhoneNumberButtonTapped(let phoneNumber):
6261
state.isLoginRequestInFlight = true
6362

63+
let phoneNumberKit = PhoneNumberKit()
64+
let parseNumber = try? phoneNumberKit.parse(phoneNumber)
65+
let e164PhoneNumber = phoneNumberKit.format(parseNumber!, toType: .e164)
66+
67+
state.authResponse.phoneNumber = e164PhoneNumber
68+
6469
return environment.authClient
6570
.login(state.authResponse)
6671
.receive(on: environment.mainQueue)
6772
.catchToEffect()
6873
.map(LoginAction.loninResponse)
6974

70-
case let .loginRequest(phoneNumber):
71-
state.authResponse.phoneNumber = phoneNumber
72-
73-
return .none
74-
7575
case let .verificationRequest(code):
7676
if code.count == 6 {
7777
state.isLoginRequestInFlight = true
@@ -95,19 +95,22 @@ public let loginReducer = Reducer<LoginState, LoginAction, AuthenticationEnviron
9595
case .loninResponse(.failure(let error)):
9696
state.isLoginRequestInFlight = false
9797
state.isValidationCodeIsSend = false
98-
state.alert = .init(title: TextState(error.localizedDescription))
98+
state.alert = .init(title: TextState(error.description))
9999

100100
return .none
101101

102102
case .verificationResponse(.success(let loginRes)):
103+
103104
state.isLoginRequestInFlight = false
104105
state.isAuthorized = true
105106
state.isUserFirstNameEmpty = loginRes.user.firstName == nil ? false : true
106-
// saveCurrentUserAndToken(loginRes)
107+
108+
KeychainService.save(codable: loginRes.user, for: .user)
109+
KeychainService.save(codable: loginRes.access, for: .token)
107110
return .none
108111

109112
case .verificationResponse(.failure(let error)):
110-
state.alert = .init(title: TextState(error.localizedDescription))
113+
state.alert = .init(title: TextState(error.description))
111114
state.isLoginRequestInFlight = false
112115

113116
return .none
@@ -119,12 +122,7 @@ public let loginReducer = Reducer<LoginState, LoginAction, AuthenticationEnviron
119122
case .showPrivacySheet:
120123
state.showPrivacySheet = true
121124
return .none
122-
125+
123126
}
124127

125128
}
126-
127-
//private func saveCurrentUserAndToken(_ res: LoginRes) {
128-
// KeychainService.save(codable: res.user, for: .user)
129-
// KeychainService.save(codable: res.access, for: .token)
130-
//}

Addame/Modules/Views/AuthenticationCore/Sources/AuthenticationCore/AuthenticationView.swift

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77

88
import SwiftUI
99
import ComposableArchitecture
10-
import Common
1110
import PhoneNumberKit
1211
import AddaMeModels
1312
import AuthClient
@@ -37,7 +36,7 @@ public struct PhoneNumberTextFieldView: UIViewRepresentable, Equatable {
3736
return phoneTextField
3837
}
3938

40-
func getCurrentText() {
39+
public func getCurrentText() {
4140
self.phoneNumber = phoneTextField.text!
4241
}
4342

@@ -63,6 +62,7 @@ public struct AuthenticationView: View {
6362
private var baseURL: URL { URL(string: "http://0.0.0.0:8080/v1/")! }
6463
@State private var phoneField: PhoneNumberTextFieldView?
6564
@State private var isValidPhoneNumber: Bool = false
65+
@State private var phoneNumber: String = String.empty
6666

6767
let store: Store<LoginState, LoginAction>
6868

@@ -78,7 +78,8 @@ public struct AuthenticationView: View {
7878
.padding(.leading)
7979

8080
Button(action: {
81-
viewStore.send(.sendPhoneNumberButtonTapped)
81+
self.phoneField?.getCurrentText()
82+
viewStore.send(.sendPhoneNumberButtonTapped(self.phoneNumber))
8283
}, label: {
8384
Text("GO")
8485
.font(.headline)
@@ -99,7 +100,7 @@ public struct AuthenticationView: View {
99100
)
100101
.onAppear {
101102
self.phoneField = PhoneNumberTextFieldView(
102-
phoneNumber: viewStore.binding(get: { $0.authResponse!.phoneNumber }, send: ViewAction.loginRequest ),
103+
phoneNumber: self.$phoneNumber,
103104
isValid: $isValidPhoneNumber
104105
)
105106
}
@@ -265,7 +266,6 @@ extension AuthenticationView {
265266
public var isValidationCodeIsSend = false
266267
public var isLoginRequestInFlight = false
267268
public var isAuthorized: Bool = false
268-
public var isValidPhoneNumber: Bool = false
269269
public var showTermsSheet: Bool = false
270270
public var showPrivacySheet: Bool = false
271271
}
@@ -274,8 +274,7 @@ extension AuthenticationView {
274274
case alertDismissed
275275
case showTermsSheet
276276
case showPrivacySheet
277-
case sendPhoneNumberButtonTapped
278-
case loginRequest(String)
277+
case sendPhoneNumberButtonTapped(String)
279278
case verificationRequest(String)
280279
}
281280
}
@@ -289,7 +288,6 @@ extension LoginState {
289288
isValidationCodeIsSend: self.isValidationCodeIsSend,
290289
isLoginRequestInFlight: self.isLoginRequestInFlight,
291290
isAuthorized: self.isAuthorized,
292-
isValidPhoneNumber: self.isValidPhoneNumber,
293291
showTermsSheet: self.showTermsSheet,
294292
showPrivacySheet: self.showPrivacySheet
295293
)
@@ -301,10 +299,8 @@ extension LoginAction {
301299
switch localAction {
302300
case .alertDismissed:
303301
return .alertDismissed
304-
case .sendPhoneNumberButtonTapped:
305-
return .sendPhoneNumberButtonTapped
306-
case .loginRequest(let authResponse):
307-
return .loginRequest(authResponse)
302+
case .sendPhoneNumberButtonTapped(let phoneNumber):
303+
return .sendPhoneNumberButtonTapped(phoneNumber)
308304
case .verificationRequest(let authResponse):
309305
return .verificationRequest(authResponse)
310306
case .showTermsSheet:

Addame/Modules/Views/EventView/Sources/EventView/EventReducer.swift

Lines changed: 7 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,7 @@ struct Foo {
1616
public static var isAuthorized: Bool = false
1717
}
1818

19-
public let eventReducer = Reducer<EventsState, EventsAction, EventsEnvironment>.combine(
20-
eventFormReducer.optional().pullback(
21-
state: \.eventFormState,
22-
action: /EventsAction.eventForm,
23-
environment: { _ in () }
24-
),
25-
Reducer { state, action, environment in
19+
public let eventReducer = Reducer<EventsState, EventsAction, EventsEnvironment> { state, action, environment in
2620
struct LocationManagerId: Hashable {}
2721

2822
func fetchMoreEventIfNeeded() -> Effect<EventsAction, Never> {
@@ -69,17 +63,7 @@ public let eventReducer = Reducer<EventsState, EventsAction, EventsEnvironment>.
6963
switch action {
7064

7165
case let .presentEventForm(present):
72-
73-
return .none
74-
case .eventForm(.didDisappear):
75-
if state.isPresentingEventForm == false, let eventform = state.eventFormState {
76-
state.eventFormState = nil
77-
return cancelEventFormReducerEffects(state: eventform)
78-
}
79-
return .none
80-
81-
case .eventForm(.didAppear):
82-
66+
state.eventFormState = present ? EventFormState() : nil
8367
return .none
8468

8569
case .dismissEvent:
@@ -97,15 +81,6 @@ public let eventReducer = Reducer<EventsState, EventsAction, EventsEnvironment>.
9781
.requestWhenInUseAuthorization(id: LocationManagerId())
9882
.fireAndForget()
9983
)
100-
101-
case .isPresentingEventForm:
102-
state.isPresentingEventForm = true
103-
104-
if state.isPresentingEventForm {
105-
state.eventFormState = EventFormState()
106-
}
107-
108-
return .none
10984

11085
case .alertDismissed:
11186
state.alert = nil
@@ -143,7 +118,7 @@ public let eventReducer = Reducer<EventsState, EventsAction, EventsEnvironment>.
143118

144119
case .eventsResponse(.failure(let error)):
145120
state.isLoadingPage = false
146-
state.alert = .init(title: TextState(error.localizedDescription))
121+
state.alert = .init(title: TextState(error.description))
147122

148123
return .none
149124

@@ -313,6 +288,9 @@ public let eventReducer = Reducer<EventsState, EventsAction, EventsEnvironment>.
313288
state.eventDetails = nil
314289
return .none
315290

291+
case .eventForm(_):
292+
293+
return .none
316294
}
317295
}
318-
)
296+

Addame/Modules/Views/EventView/Sources/EventView/EventView.swift

Lines changed: 14 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import SwiftUIExtension
1111
extension EventView {
1212
public struct ViewState: Equatable {
1313
public var alert: AlertState<EventsAction>?
14-
public var isPresentingEventForm: Bool
1514
public var isConnected = true
1615
public var isLocationAuthorized = false
1716
public var waitingForUpdateLocation = true
@@ -21,12 +20,13 @@ extension EventView {
2120
public var myEvents: [EventResponse.Item] = []
2221
public var eventDetails: EventResponse.Item?
2322
public var isLoadingPage = false
23+
24+
public var eventFormState: EventFormState?
2425
}
2526

2627
public enum ViewAction: Equatable {
2728
case alertDismissed
2829
case dismissEventDetails
29-
case isPresentingEventForm
3030
case presentEventForm(Bool)
3131
case eventForm(EventFormAction)
3232
case event(index: Int, action: EventAction)
@@ -132,41 +132,29 @@ public struct EventView: View {
132132
}
133133
.navigationBarTitleDisplayMode(.automatic)
134134
.toolbar {
135-
136135
ToolbarItem(placement: ToolbarItemPlacement.navigationBarTrailing) {
137136
return Button(action: {
138-
viewStore.send(.isPresentingEventForm)
137+
viewStore.send(.presentEventForm(true))
139138
}) {
140139
Image(systemName: "plus.circle")
141140
.font(.title)
142141
.foregroundColor(viewStore.state.isLocationAuthorized ? Color.black : Color.gray)
143142
}
144-
.disabled(!viewStore.state.isLocationAuthorized)
145-
.background(
146-
NavigationLink(
147-
destination: IfLetStore(
148-
store.scope(
149-
state: \.eventFormState,
150-
action: EventsAction.eventForm
151-
),
152-
then: EventFormView.init(store:),
153-
else: Text("Loading search results...")
154-
),
155-
isActive: viewStore.binding(
156-
get: \.isPresentingEventForm,
157-
send: ViewAction.presentEventForm
158-
),
159-
label: {
160-
Text("Event From").padding()
161-
}
162-
)
163-
)
164143
}
165144
}
166145
.navigationTitle("Events")
167146
.alert(self.store.scope(state: { $0.alert }), dismiss: .alertDismissed)
168-
169147
}
148+
.navigate(
149+
using: store.scope(
150+
state: \.eventFormState,
151+
action: EventsAction.eventForm
152+
),
153+
destination: EventFormView.init(store:),
154+
onDismiss: {
155+
ViewStore(store.stateless).send(.presentEventForm(false))
156+
}
157+
)
170158
}
171159

172160
}
@@ -191,7 +179,7 @@ struct EventView_Previews: PreviewProvider {
191179
NavigationView {
192180
EventView(store: store)
193181
// .redacted(reason: .placeholder)
194-
.redacted(reason: EventsState.events.isLoadingPage ? .placeholder : [])
182+
// .redacted(reason: EventsState.events.isLoadingPage ? .placeholder : [])
195183
.environment(\.colorScheme, .dark)
196184
}
197185
}

Addame/Modules/Views/EventView/Sources/EventView/EventsAction.swift

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public enum EventsAction: Equatable {
1616

1717
case alertDismissed
1818
case dismissEventDetails
19-
case isPresentingEventForm
19+
// case isPresentingEventForm
2020
case presentEventForm(Bool)
2121
case eventForm(EventFormAction)
2222

@@ -47,8 +47,7 @@ extension EventsAction {
4747
return .alertDismissed
4848
case .dismissEventDetails:
4949
return .dismissEventDetails
50-
case .isPresentingEventForm:
51-
return .isPresentingEventForm
50+
5251
case .presentEventForm(let bool):
5352
return .presentEventForm(bool)
5453
case .eventForm(let eventFormAction):

0 commit comments

Comments
 (0)