Skip to content

Commit ae9ebdc

Browse files
committed
๐Ÿ› ๏ธ :: ์•Œ๋ฆผ ์„ค์ • ๋กœ์ง ์ˆ˜์ • ๋ฐ API ์—ฐ๋™
1 parent 5f80399 commit ae9ebdc

File tree

4 files changed

+184
-84
lines changed

4 files changed

+184
-84
lines changed

โ€ŽProjects/Presentation/Sources/DI/PresentationAssembly.swiftโ€Ž

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -168,8 +168,7 @@ public final class PresentationAssembly: Assembly {
168168
NotificationSettingViewModel(
169169
subscribeNotificationUseCase: resolver.resolve(SubscribeNotificationUseCase.self)!,
170170
subscribeAllNotificationUseCase: resolver.resolve(SubscribeAllNotificationUseCase.self)!,
171-
unsubscribeNotificationUseCase: resolver.resolve(UnsubscribeNotificationUseCase.self)!,
172-
unsubscribeAllNotificationUseCase: resolver.resolve(UnsubscribeAllNotificationUseCase.self)!
171+
fetchSubscribeStateUseCase: resolver.resolve(FetchSubscribeStateUseCase.self)!
173172
)
174173
}
175174

โ€ŽProjects/Presentation/Sources/NotificationSetting/Component/NotificationSectionView.swiftโ€Ž

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,12 @@ import DesignSystem
88

99
public final class NotificationSectionView: BaseView {
1010
public var disposeBag = DisposeBag()
11-
public let switchButtonIsToggle = PublishRelay<Bool>()
11+
public var switchIsOn: Bool {
12+
return notificationSwitchButton.isOn
13+
}
14+
public var clickSwitchButton: ControlProperty<Bool> {
15+
return notificationSwitchButton.rx.isOn
16+
}
1217

1318
private let notificationTitleLabel = UILabel().then {
1419
$0.setJobisText(
@@ -17,7 +22,7 @@ public final class NotificationSectionView: BaseView {
1722
color: .GrayScale.gray70
1823
)
1924
}
20-
private lazy var notificationSwitchButton = UISwitch().then {
25+
public lazy var notificationSwitchButton = UISwitch().then {
2126
$0.onTintColor = .Primary.blue30
2227
$0.thumbTintColor = .GrayScale.gray50
2328
}
@@ -41,22 +46,16 @@ public final class NotificationSectionView: BaseView {
4146
}
4247
}
4348

44-
public override func configureView() {
45-
self.notificationSwitchButton.rx.tapGesture()
46-
.subscribe(onNext: { _ in
47-
self.notificationSwitchButton.isOn.toggle()
48-
if self.notificationSwitchButton.isOn {
49-
self.notificationSwitchButton.thumbTintColor = .white
50-
self.switchButtonIsToggle.accept(true)
51-
} else {
52-
self.notificationSwitchButton.thumbTintColor = nil
53-
self.switchButtonIsToggle.accept(false)
54-
}
55-
})
56-
.disposed(by: disposeBag)
57-
}
49+
public override func configureView() {}
5850

5951
func setTitleLabel(text: String) {
6052
self.notificationTitleLabel.text = text
6153
}
54+
55+
public func setup(
56+
isOn: Bool
57+
) {
58+
self.notificationSwitchButton.setOn(isOn, animated: true)
59+
self.notificationSwitchButton.thumbTintColor = .white
60+
}
6261
}

โ€ŽProjects/Presentation/Sources/NotificationSetting/NotificationSettingViewController.swiftโ€Ž

Lines changed: 73 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,12 @@ import Core
77
import DesignSystem
88

99
public final class NotificationSettingViewController: BaseViewController<NotificationSettingViewModel> {
10+
private lazy var switchViewArray = [
11+
noticeSwitchView,
12+
applicationSwitchView,
13+
recruitmentSwitchView
14+
]
15+
1016
private let titleLabel = UILabel().then {
1117
$0.setJobisText(
1218
"์•Œ๋ฆผ ์„ค์ •",
@@ -88,25 +94,82 @@ public final class NotificationSettingViewController: BaseViewController<Notific
8894

8995
public override func bind() {
9096
let input = NotificationSettingViewModel.Input(
91-
allSwitchButtonIsTrue: allNotificationSwitchView.switchButtonIsToggle,
92-
noticeSwitchButtonIsTrue: noticeSwitchView.switchButtonIsToggle,
93-
applicationSwitchButtonIsTrue: applicationSwitchView.switchButtonIsToggle,
94-
recruitmentSwitchButtonIsTrue: recruitmentSwitchView.switchButtonIsToggle
97+
viewAppear: self.viewWillAppearPublisher
98+
, allSwitchButtonDidTap: allNotificationSwitchView.clickSwitchButton,
99+
noticeSwitchButtonDidTap: noticeSwitchView.clickSwitchButton,
100+
applicationSwitchButtonDidTap: applicationSwitchView.clickSwitchButton,
101+
recruitmentSwitchButtonDidTap: recruitmentSwitchView.clickSwitchButton
95102
)
96103

97-
let _ = viewModel.transform(input)
104+
let output = viewModel.transform(input)
105+
106+
output.subscribeNoticeState.asObservable()
107+
.bind(onNext: {
108+
self.noticeSwitchView.setup(isOn: $0.isSubscribed)
109+
})
110+
.disposed(by: disposeBag)
111+
112+
output.subscribeApplicationState.asObservable()
113+
.bind(onNext: {
114+
self.applicationSwitchView.setup(isOn: $0.isSubscribed)
115+
})
116+
.disposed(by: disposeBag)
117+
118+
output.subscribeRecruitmentState.asObservable()
119+
.bind(onNext: {
120+
self.recruitmentSwitchView.setup(isOn: $0.isSubscribed)
121+
})
122+
.disposed(by: disposeBag)
123+
124+
output.allSubscribeState.asObservable()
125+
.bind(onNext: {
126+
self.allNotificationSwitchView.setup(isOn: $0)
127+
})
128+
.disposed(by: disposeBag)
98129
}
99130

100131
public override func configureViewController() {
101-
// viewWillDisappearPublisher.asObservable()
102-
// .bind {
103-
// self.setSmallTitle(title: "")
104-
// }
105-
// .disposed(by: disposeBag)
132+
allNotificationSwitchView.clickSwitchButton
133+
.asObservable()
134+
.bind(onNext: { [weak self] isOn in
135+
self?.switchViewArray.forEach {
136+
$0.setup(isOn: isOn)
137+
}
138+
}).disposed(by: disposeBag)
139+
140+
noticeSwitchView.clickSwitchButton
141+
.asObservable()
142+
.bind(onNext: { [weak self] _ in
143+
self?.toggleButton()
144+
}).disposed(by: disposeBag)
145+
146+
applicationSwitchView.clickSwitchButton
147+
.asObservable()
148+
.bind(onNext: { [weak self] _ in
149+
self?.toggleButton()
150+
}).disposed(by: disposeBag)
151+
152+
recruitmentSwitchView.clickSwitchButton
153+
.asObservable()
154+
.bind(onNext: { [weak self] _ in
155+
self?.toggleButton()
156+
}).disposed(by: disposeBag)
106157
}
107158

108159
public override func configureNavigation() {
109160
self.navigationController?.navigationBar.prefersLargeTitles = false
110161
self.hideTabbar()
111162
}
163+
164+
private func toggleButton() {
165+
if (
166+
noticeSwitchView.switchIsOn &&
167+
applicationSwitchView.switchIsOn &&
168+
recruitmentSwitchView.switchIsOn
169+
) == true {
170+
self.allNotificationSwitchView.setup(isOn: true)
171+
} else {
172+
self.allNotificationSwitchView.setup(isOn: false)
173+
}
174+
}
112175
}

โ€ŽProjects/Presentation/Sources/NotificationSetting/NotificationSettingViewModel.swiftโ€Ž

Lines changed: 95 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -11,93 +11,132 @@ public final class NotificationSettingViewModel: BaseViewModel, Stepper {
1111
private let disposeBag = DisposeBag()
1212
private let subscribeNotificationUseCase: SubscribeNotificationUseCase
1313
private let subscribeAllNotificationUseCase: SubscribeAllNotificationUseCase
14-
private let unsubscribeNotificationUseCase: UnsubscribeNotificationUseCase
15-
private let unsubscribeAllNotificationUseCase: UnsubscribeAllNotificationUseCase
14+
private let fetchSubscribeStateUseCase: FetchSubscribeStateUseCase
1615

1716
init(
1817
subscribeNotificationUseCase: SubscribeNotificationUseCase,
1918
subscribeAllNotificationUseCase: SubscribeAllNotificationUseCase,
20-
unsubscribeNotificationUseCase: UnsubscribeNotificationUseCase,
21-
unsubscribeAllNotificationUseCase: UnsubscribeAllNotificationUseCase
19+
fetchSubscribeStateUseCase: FetchSubscribeStateUseCase
2220
) {
2321
self.subscribeNotificationUseCase = subscribeNotificationUseCase
2422
self.subscribeAllNotificationUseCase = subscribeAllNotificationUseCase
25-
self.unsubscribeNotificationUseCase = unsubscribeNotificationUseCase
26-
self.unsubscribeAllNotificationUseCase = unsubscribeAllNotificationUseCase
23+
self.fetchSubscribeStateUseCase = fetchSubscribeStateUseCase
2724
}
2825

2926
public struct Input {
30-
let allSwitchButtonIsTrue: PublishRelay<Bool>
31-
let noticeSwitchButtonIsTrue: PublishRelay<Bool>
32-
let applicationSwitchButtonIsTrue: PublishRelay<Bool>
33-
let recruitmentSwitchButtonIsTrue: PublishRelay<Bool>
27+
let viewAppear: PublishRelay<Void>
28+
let allSwitchButtonDidTap: ControlProperty<Bool>
29+
let noticeSwitchButtonDidTap: ControlProperty<Bool>
30+
let applicationSwitchButtonDidTap: ControlProperty<Bool>
31+
let recruitmentSwitchButtonDidTap: ControlProperty<Bool>
3432
}
3533

36-
public struct Output { }
34+
public struct Output {
35+
let subscribeNoticeState: PublishRelay<SubscribeStateEntity>
36+
let subscribeApplicationState: PublishRelay<SubscribeStateEntity>
37+
let subscribeRecruitmentState: PublishRelay<SubscribeStateEntity>
38+
let allSubscribeState: PublishRelay<Bool>
39+
}
3740

3841
public func transform(_ input: Input) -> Output {
39-
input.allSwitchButtonIsTrue.asObservable()
42+
let subscribeStateList = PublishRelay<[SubscribeStateEntity]>()
43+
let subscribeNoticeState = PublishRelay<SubscribeStateEntity>()
44+
let subscribeApplicationState = PublishRelay<SubscribeStateEntity>()
45+
let subscribeRecruitmentState = PublishRelay<SubscribeStateEntity>()
46+
47+
let noticeState = BehaviorRelay<Bool>(value: false)
48+
let applicationState = BehaviorRelay<Bool>(value: false)
49+
let recruitmentState = BehaviorRelay<Bool>(value: false)
50+
let allSubscribeState = PublishRelay<Bool>()
51+
52+
input.viewAppear.asObservable()
4053
.flatMap {
41-
if $0 {
42-
return self.subscribeAllNotificationUseCase.execute(token: Messaging.messaging().fcmToken ?? "")
43-
} else {
44-
return self.unsubscribeAllNotificationUseCase.execute(token: Messaging.messaging().fcmToken ?? "")
54+
self.fetchSubscribeStateUseCase.execute()
55+
}
56+
.bind(to: subscribeStateList)
57+
.disposed(by: disposeBag)
58+
59+
subscribeStateList.asObservable()
60+
.subscribe(onNext: {
61+
for state in $0 {
62+
if state.topic == .notice {
63+
subscribeNoticeState.accept(state)
64+
if state.isSubscribed {
65+
noticeState.accept(true)
66+
} else {
67+
noticeState.accept(false)
68+
}
69+
} else if state.topic == .application {
70+
subscribeApplicationState.accept(state)
71+
if state.isSubscribed {
72+
applicationState.accept(true)
73+
} else {
74+
applicationState.accept(false)
75+
}
76+
} else if state.topic == .recruitment {
77+
subscribeRecruitmentState.accept(state)
78+
if state.isSubscribed {
79+
recruitmentState.accept(true)
80+
} else {
81+
recruitmentState.accept(false)
82+
}
83+
}
84+
85+
if noticeState.value && applicationState.value && recruitmentState.value {
86+
allSubscribeState.accept(true)
87+
} else {
88+
allSubscribeState.accept(false)
89+
}
4590
}
91+
})
92+
.disposed(by: disposeBag)
93+
94+
input.allSwitchButtonDidTap.asObservable()
95+
.skip(1)
96+
.flatMap { _ in
97+
self.subscribeAllNotificationUseCase.execute()
4698
}
4799
.subscribe()
48100
.disposed(by: disposeBag)
49101

50-
input.noticeSwitchButtonIsTrue.asObservable()
51-
.flatMap {
52-
if $0 {
53-
return self.subscribeNotificationUseCase.execute(
54-
token: Messaging.messaging().fcmToken ?? "",
55-
notificationType: .notice
56-
)
57-
} else {
58-
return self.unsubscribeNotificationUseCase.execute(
59-
token: Messaging.messaging().fcmToken ?? "",
60-
notificationType: .notice
61-
)
62-
}
102+
input.noticeSwitchButtonDidTap.asObservable()
103+
.skip(1)
104+
.flatMap { _ in
105+
self.subscribeNotificationUseCase.execute(
106+
token: Messaging.messaging().fcmToken ?? "",
107+
notificationType: .notice
108+
)
63109
}
64110
.subscribe()
65111
.disposed(by: disposeBag)
66112

67-
input.applicationSwitchButtonIsTrue.asObservable()
68-
.flatMap {
69-
if $0 {
70-
return self.subscribeNotificationUseCase.execute(
71-
token: Messaging.messaging().fcmToken ?? "",
72-
notificationType: .application
73-
)
74-
} else {
75-
return self.unsubscribeNotificationUseCase.execute(
76-
token: Messaging.messaging().fcmToken ?? "",
77-
notificationType: .application
78-
)
79-
}
113+
input.applicationSwitchButtonDidTap.asObservable()
114+
.skip(1)
115+
.flatMap { _ in
116+
self.subscribeNotificationUseCase.execute(
117+
token: Messaging.messaging().fcmToken ?? "",
118+
notificationType: .application
119+
)
80120
}
81121
.subscribe()
82122
.disposed(by: disposeBag)
83123

84-
input.recruitmentSwitchButtonIsTrue.asObservable()
85-
.flatMap {
86-
if $0 {
87-
return self.subscribeNotificationUseCase.execute(
88-
token: Messaging.messaging().fcmToken ?? "",
89-
notificationType: .recruitment
90-
)
91-
} else {
92-
return self.unsubscribeNotificationUseCase.execute(
93-
token: Messaging.messaging().fcmToken ?? "",
94-
notificationType: .recruitment
95-
)
96-
}
124+
input.recruitmentSwitchButtonDidTap.asObservable()
125+
.skip(1)
126+
.flatMap { _ in
127+
self.subscribeNotificationUseCase.execute(
128+
token: Messaging.messaging().fcmToken ?? "",
129+
notificationType: .recruitment
130+
)
97131
}
98132
.subscribe()
99133
.disposed(by: disposeBag)
100134

101-
return Output()
135+
return Output(
136+
subscribeNoticeState: subscribeNoticeState,
137+
subscribeApplicationState: subscribeApplicationState,
138+
subscribeRecruitmentState: subscribeRecruitmentState,
139+
allSubscribeState: allSubscribeState
140+
)
102141
}
103142
}

0 commit comments

Comments
ย (0)