Skip to content

Commit 9aa19ff

Browse files
committed
[feat] toggle event
1 parent ff9ec84 commit 9aa19ff

File tree

3 files changed

+62
-4
lines changed

3 files changed

+62
-4
lines changed

DailyQuest/DailyQuest/Presentation/Settings/View/ToggleField/ToggleCell.swift

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,9 @@ import RxCocoa
1111

1212
final class ToggleCell: UITableViewCell {
1313
static let reuseIdentifier = "ToggleCell"
14+
private var viewModel: ToggleItemViewModel!
1415

15-
var toggleResult = PublishSubject<Bool>()
16+
var toggleItemDidClicked = PublishSubject<Bool>()
1617
private var disposableBag = DisposeBag()
1718

1819
private let padding = 20
@@ -72,11 +73,40 @@ final class ToggleCell: UITableViewCell {
7273
func setup(with viewModel: ToggleItemViewModel) {
7374
icon.image = UIImage(systemName: viewModel.imageName)
7475
title.text = viewModel.title
76+
self.viewModel = viewModel
77+
bind()
7578
}
7679

7780
func bind() {
78-
toggle.rx.isOn
79-
.bind(onNext: {self.toggleResult.onNext($0)})
81+
toggle.rx.tapGesture()
82+
.when(.ended)
83+
.do(onNext: { _ in
84+
print(self.toggle.isOn)
85+
})
86+
.bind(onNext: {_ in
87+
self.toggleItemDidClicked.onNext(!self.toggle.isOn)
88+
})
89+
.disposed(by: disposableBag)
90+
91+
let output = viewModel.transform(input: ToggleItemViewModel.Input(
92+
toggleItemDidClicked: toggleItemDidClicked
93+
))
94+
95+
output.toggleItemResult
96+
.subscribe(onNext: { isOn in
97+
guard let isOn = isOn else {
98+
self.toggle.isOn = false
99+
self.toggle.isEnabled = false
100+
return
101+
}
102+
103+
if !self.toggle.isEnabled {
104+
self.toggle.isEnabled = true
105+
}
106+
DispatchQueue.main.async {
107+
self.toggle.isOn = isOn
108+
}
109+
})
80110
.disposed(by: disposableBag)
81111
}
82112
}

DailyQuest/DailyQuest/Presentation/Settings/View/ToggleField/ToggleItemViewModel.swift

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,34 @@
66
//
77

88
import Foundation
9+
import RxSwift
910

1011
struct ToggleItemViewModel {
1112
let title: String
1213
let imageName: String
14+
let settingsUseCase: SettingsUseCase!
15+
16+
struct Input {
17+
let toggleItemDidClicked: Observable<Bool>
18+
}
19+
20+
struct Output {
21+
let toggleItemResult: Observable<Bool?>
22+
}
23+
24+
func transform(input: Input) -> Output {
25+
let fetchAllow = settingsUseCase.isLoggedIn()
26+
.flatMap { _ in settingsUseCase.fetchAllow() }
27+
.asObservable()
28+
29+
let changeAllow = input.toggleItemDidClicked
30+
.flatMap { isOn in
31+
settingsUseCase.updateAllow(allow: isOn).asObservable()
32+
.map { result in result ? isOn : nil }
33+
}
34+
35+
let toggleItemResult = Observable.merge(fetchAllow, changeAllow)
36+
37+
return Output(toggleItemResult: toggleItemResult)
38+
}
1339
}

DailyQuest/DailyQuest/Presentation/Settings/ViewModel/SettingsViewModel.swift

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,9 @@ final class SettingsViewModel {
1919
init(settingsUseCase: SettingsUseCase) {
2020
self.settingsUseCase = settingsUseCase
2121

22-
let toggleField = ToggleField(viewModel: .init(title: "둘러보기 허용", imageName: "person.crop.circle.badge.checkmark"))
22+
let toggleField = ToggleField(viewModel: .init(title: "둘러보기 허용",
23+
imageName: "person.crop.circle.badge.checkmark",
24+
settingsUseCase: settingsUseCase))
2325
let plainField = PlainField(viewModel: .init(title: "앱 버전", info: "1.1", imageName: "exclamationmark.transmission"))
2426
self.navigateField = NavigateField(viewModel: .init(title: "로그인", imageName: "person.circle.fill", viewType: .login))
2527

0 commit comments

Comments
 (0)