Skip to content

Commit d9dd032

Browse files
authored
Merge pull request #105 from boostcampwm-2022/feature/SignInSignUpAction
Feature/sign in sign up action
2 parents aa1582e + bbbdb99 commit d9dd032

File tree

6 files changed

+123
-55
lines changed

6 files changed

+123
-55
lines changed

DailyQuest/DailyQuest.xcodeproj/project.pbxproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454
3449AD5D2922197000B87619 /* User.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3449AD5C2922197000B87619 /* User.swift */; };
5555
3449AD6029222B3900B87619 /* UserInfoCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3449AD5F29222B3900B87619 /* UserInfoCell.swift */; };
5656
344A459A293DC495007A3D37 /* EnrollUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 344A4599293DC495007A3D37 /* EnrollUseCase.swift */; };
57+
34517FCC2940A92100AB77E9 /* Alertable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34517FCB2940A92100AB77E9 /* Alertable.swift */; };
5758
345687F42937329E00CA51E3 /* EnrollViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 345687F32937329E00CA51E3 /* EnrollViewController.swift */; };
5859
345687F62937430200CA51E3 /* PlanDatePickerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 345687F52937430200CA51E3 /* PlanDatePickerView.swift */; };
5960
345687F829374D2500CA51E3 /* DayNamePickerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 345687F729374D2500CA51E3 /* DayNamePickerView.swift */; };
@@ -273,6 +274,7 @@
273274
3449AD5C2922197000B87619 /* User.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = User.swift; sourceTree = "<group>"; };
274275
3449AD5F29222B3900B87619 /* UserInfoCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserInfoCell.swift; sourceTree = "<group>"; };
275276
344A4599293DC495007A3D37 /* EnrollUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EnrollUseCase.swift; sourceTree = "<group>"; };
277+
34517FCB2940A92100AB77E9 /* Alertable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Alertable.swift; sourceTree = "<group>"; };
276278
345687F32937329E00CA51E3 /* EnrollViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EnrollViewController.swift; sourceTree = "<group>"; };
277279
345687F52937430200CA51E3 /* PlanDatePickerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlanDatePickerView.swift; sourceTree = "<group>"; };
278280
345687F729374D2500CA51E3 /* DayNamePickerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DayNamePickerView.swift; sourceTree = "<group>"; };
@@ -657,6 +659,7 @@
657659
A50F9A3829266FD8005C00FE /* Date+.swift */,
658660
9BED4DE9293FA92900C60631 /* UIImageView+.swift */,
659661
3436FCF9293F2654003575C3 /* Notification+.swift */,
662+
34517FCB2940A92100AB77E9 /* Alertable.swift */,
660663
);
661664
path = Utils;
662665
sourceTree = "<group>";
@@ -1335,6 +1338,7 @@
13351338
347D258B292C60F40038FCA2 /* StatusView.swift in Sources */,
13361339
9BED4DE8293FA01400C60631 /* ProfileViewModel.swift in Sources */,
13371340
34642AB62925D9E40052FA0E /* UserInfoView.swift in Sources */,
1341+
34517FCC2940A92100AB77E9 /* Alertable.swift in Sources */,
13381342
349955292923600A007AB99E /* BrowseViewController.swift in Sources */,
13391343
34113BE82934917500AB4919 /* LoginViewModel.swift in Sources */,
13401344
34EE6EB72924C674005AF583 /* QuestView.swift in Sources */,

DailyQuest/DailyQuest/Infrastructure/FirebaseService/FirebaseService.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ extension FirebaseService {
8181
if let error = error { throw error }
8282
guard let authResult = authResult else { throw NetworkServiceError.noAuthError }
8383
try self.createUser(uuid: authResult.user.uid, userDto: userDto)
84+
self.uid.accept(self.auth.currentUser?.uid)
8485
single(.success(true))
8586
} catch let error {
8687
single(.failure(error))

DailyQuest/DailyQuest/Presentation/Settings/Flow/SettingsCoordinator.swift

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,21 +44,33 @@ final class DefaultSettingsCoordinator: SettingsCoordinator {
4444

4545
func showLoginFlow() {
4646
let loginViewController = settingsSceneDIContainer.makeLoginViewController()
47+
navigationController.pushViewController(loginViewController, animated: true)
48+
4749
loginViewController
4850
.itemDidClick
4951
.bind(onNext: { [weak self] event in
5052
switch event {
5153
case .showSignUpFlow:
5254
self?.showSignUpFlow()
55+
case .back:
56+
self?.navigationController.popViewController(animated: true)
5357
}
5458
})
5559
.disposed(by: disposableBag)
56-
57-
navigationController.pushViewController(loginViewController, animated: true)
5860
}
5961

6062
func showSignUpFlow() {
6163
let signUpViewController = settingsSceneDIContainer.makeSignUpViewController()
6264
navigationController.pushViewController(signUpViewController, animated: true)
65+
66+
signUpViewController
67+
.itemDidClick
68+
.bind(onNext: { [weak self] event in
69+
switch event {
70+
case .back:
71+
self?.navigationController.popToRootViewController(animated: true)
72+
}
73+
})
74+
.disposed(by: disposableBag)
6375
}
6476
}

DailyQuest/DailyQuest/Presentation/Settings/ViewController/LoginViewController.swift

Lines changed: 34 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -14,83 +14,84 @@ import SnapKit
1414
final class LoginViewController: UIViewController {
1515
enum Event {
1616
case showSignUpFlow
17+
case back
1718
}
18-
19+
1920
private var viewModel: LoginViewModel!
2021
private var disposableBag = DisposeBag()
21-
22+
2223
var itemDidClick = PublishSubject<Event>()
23-
24+
2425
private lazy var container: UIStackView = {
2526
let container = UIStackView()
2627
container.axis = .vertical
2728
container.spacing = 10
28-
29+
2930
return container
3031
}()
31-
32+
3233
private lazy var emailField: TextFieldForm = {
3334
let emailField = TextFieldForm()
3435
emailField.placeholder = "email"
3536
emailField.autocapitalizationType = .none
3637
return emailField
3738
}()
38-
39+
3940
private lazy var passwordField: TextFieldForm = {
4041
let passwordField = TextFieldForm()
4142
passwordField.placeholder = "password"
4243
passwordField.isSecureTextEntry = true
4344
return passwordField
4445
}()
45-
46+
4647
private lazy var submitButton: UIButton = {
4748
var config = UIButton.Configuration.filled()
4849
config.baseBackgroundColor = .maxYellow
4950
config.title = "로그인"
5051
emailField.autocapitalizationType = .none
5152
return UIButton(configuration: config)
5253
}()
53-
54+
5455
private lazy var signUpButton: UIButton = {
5556
var config = UIButton.Configuration.plain()
5657
config.baseForegroundColor = .gray
5758
config.title = "회원가입"
5859
config.buttonSize = .small
5960
return UIButton(configuration: config)
6061
}()
61-
62+
6263
// MARK: Life Cycle
6364
static func create(with viewModel: LoginViewModel) -> LoginViewController {
6465
let vc = LoginViewController()
6566
vc.setup(with: viewModel)
66-
67+
6768
return vc
6869
}
69-
70+
7071
override func viewDidLoad() {
7172
super.viewDidLoad()
72-
73+
7374
configureUI()
74-
75+
7576
bind()
7677
}
77-
78+
7879
private func configureUI() {
7980
view.backgroundColor = .white
80-
81+
8182
container.addArrangedSubview(emailField)
8283
container.addArrangedSubview(passwordField)
8384
container.addArrangedSubview(submitButton)
8485
container.addArrangedSubview(signUpButton)
85-
86+
8687
view.addSubview(container)
87-
88+
8889
container.snp.makeConstraints { make in
8990
make.center.equalToSuperview()
9091
make.width.equalToSuperview().multipliedBy(0.8)
9192
}
9293
}
93-
94+
9495
private func setup(with authViewModel: LoginViewModel) {
9596
viewModel = authViewModel
9697
}
@@ -102,25 +103,33 @@ extension LoginViewController {
102103
guard let self = self else { return }
103104
self.itemDidClick.onNext(.showSignUpFlow)
104105
}).disposed(by: disposableBag)
105-
106+
106107
let input = LoginViewModel.Input(
107108
emailFieldDidEditEvent: emailField.rx.text.orEmpty.asObservable(),
108109
passwordFieldDidEditEvent: passwordField.rx.text.orEmpty.asObservable(),
109110
submitButtonDidTapEvent: submitButton.rx.tap.asObservable()
110111
)
111-
112+
112113
let output = viewModel.transform(input: input, disposeBag: disposableBag)
113-
114+
114115
output
115116
.buttonEnabled
116117
.drive(submitButton.rx.isEnabled)
117118
.disposed(by: disposableBag)
118-
119+
119120
output
120121
.loginResult
121-
.subscribe(onNext: { result in
122-
print("login result is :::: ", result)
123-
})
122+
.bind(onNext: analyse(result:))
124123
.disposed(by: disposableBag)
125124
}
126125
}
126+
127+
extension LoginViewController: Alertable {
128+
private func analyse(result: Bool) {
129+
if result {
130+
itemDidClick.onNext(.back)
131+
} else {
132+
showAlert(title: "로그인 실패", message: "이메일과 비밀번호를 확인해주세요.")
133+
}
134+
}
135+
}

DailyQuest/DailyQuest/Presentation/Settings/ViewController/SignUpViewController.swift

Lines changed: 42 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -12,89 +12,95 @@ import RxCocoa
1212
import SnapKit
1313

1414
final class SignUpViewController: UIViewController {
15+
enum Event {
16+
case back
17+
}
18+
1519
private var viewModel: SignUpViewModel!
1620
private var disposableBag = DisposeBag()
17-
21+
22+
var itemDidClick = PublishSubject<Event>()
23+
1824
private lazy var container: UIStackView = {
1925
let container = UIStackView()
2026
container.axis = .vertical
2127
container.spacing = 10
22-
28+
2329
return container
2430
}()
25-
31+
2632
private lazy var emailField: TextFieldForm = {
2733
let emailField = TextFieldForm()
2834
emailField.placeholder = "email"
2935
emailField.autocapitalizationType = .none
30-
36+
3137
return emailField
3238
}()
33-
39+
3440
private lazy var passwordField: TextFieldForm = {
3541
let passwordField = TextFieldForm()
3642
passwordField.placeholder = "password (6글자 이상)"
3743
passwordField.isSecureTextEntry = true
3844

3945
return passwordField
4046
}()
41-
47+
4248
private lazy var passwordConfirmField: TextFieldForm = {
4349
let passwordConfirmField = TextFieldForm()
4450
passwordConfirmField.placeholder = "password 확인"
4551
passwordConfirmField.isSecureTextEntry = true
4652
return passwordConfirmField
4753
}()
48-
54+
4955
private lazy var nickNameField: TextFieldForm = {
5056
let nickNameField = TextFieldForm()
5157
nickNameField.placeholder = "닉네임"
5258
emailField.autocapitalizationType = .none
5359
return nickNameField
5460
}()
55-
61+
5662
private lazy var submitButton: UIButton = {
5763
var config = UIButton.Configuration.filled()
5864
config.baseBackgroundColor = .maxYellow
5965
config.title = "회원가입"
60-
66+
6167
return UIButton(configuration: config)
6268
}()
63-
69+
6470
// MARK: Life Cycle
6571
static func create(with viewModel: SignUpViewModel) -> SignUpViewController {
6672
let vc = SignUpViewController()
6773
vc.setup(with: viewModel)
6874
return vc
6975
}
70-
76+
7177
override func viewDidLoad() {
7278
super.viewDidLoad()
73-
79+
7480
configureUI()
75-
81+
7682
bind()
7783
}
78-
84+
7985
private func configureUI() {
8086
view.backgroundColor = .white
81-
87+
8288
[emailField,
83-
passwordField,
84-
passwordConfirmField,
85-
nickNameField,
86-
submitButton].forEach { field in
89+
passwordField,
90+
passwordConfirmField,
91+
nickNameField,
92+
submitButton].forEach { field in
8793
container.addArrangedSubview(field)
8894
}
89-
95+
9096
view.addSubview(container)
91-
97+
9298
container.snp.makeConstraints { make in
9399
make.center.equalToSuperview()
94100
make.width.equalToSuperview().multipliedBy(0.8)
95101
}
96102
}
97-
103+
98104
private func setup(with authViewModel: SignUpViewModel) {
99105
viewModel = authViewModel
100106
}
@@ -109,19 +115,27 @@ extension SignUpViewController {
109115
nickNameFieldDidEditEvent: nickNameField.rx.text.orEmpty.asObservable(),
110116
submitButtonDidTapEvent: submitButton.rx.tap.asObservable()
111117
)
112-
118+
113119
let output = viewModel.transform(input: input, disposeBag: disposableBag)
114-
120+
115121
output
116122
.buttonEnabled
117123
.drive(submitButton.rx.isEnabled)
118124
.disposed(by: disposableBag)
119-
125+
120126
output
121127
.signUpResult
122-
.subscribe(onNext: { result in
123-
print("SignUp result is :::: ", result)
124-
})
128+
.bind(onNext: analyse(result:))
125129
.disposed(by: disposableBag)
126130
}
127131
}
132+
133+
extension SignUpViewController: Alertable {
134+
private func analyse(result: Bool) {
135+
if result {
136+
itemDidClick.onNext(.back)
137+
} else {
138+
showAlert(title: "회원가입 실패", message: "중복되는 아이디입니다.")
139+
}
140+
}
141+
}

0 commit comments

Comments
 (0)