Skip to content

Commit 5d62286

Browse files
committed
Connect LectureReminder with ToastView
1 parent 439dd8d commit 5d62286

File tree

9 files changed

+56
-20
lines changed

9 files changed

+56
-20
lines changed

SNUTT-2022/SNUTT/AppState/States/RoutingState.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ class ViewRoutingState {
1818
extension SettingScene {
1919
struct RoutingState {
2020
var pushToVacancy = false
21+
var pushToReminder = false
2122
}
2223
}
2324

SNUTT-2022/SNUTT/Models/Lecture.swift

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,15 @@ enum ReminderOption: String, CaseIterable, Codable {
180180
case .after10: return "10분 후"
181181
}
182182
}
183+
184+
var toToast: ToastType {
185+
switch self {
186+
case .none: .reminderNone
187+
case .before10: .reminder10Before
188+
case .onTime: .reminderOnTime
189+
case .after10: .reminder10After
190+
}
191+
}
183192
}
184193

185194
#if DEBUG

SNUTT-2022/SNUTT/Models/Toast.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import Foundation
1010
struct Toast: Identifiable {
1111
let id = UUID()
1212
let type: ToastType
13-
var action: () -> Void = {}
13+
var action: (() -> Void)?
1414
}
1515

1616
enum ToastType {

SNUTT-2022/SNUTT/Services/GlobalUIService.swift

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ protocol GlobalUIServiceProtocol: Sendable {
1616
func setSelectedTab(_ tab: TabType)
1717
func setIsErrorAlertPresented(_ value: Bool)
1818
func setIsMenuOpen(_ value: Bool)
19-
func setToast(_ toast: ToastType?)
19+
func setToast(_ toast: ToastType?, showButton: Bool?)
2020

2121
func openEllipsis(for timetable: TimetableMetadata)
2222
func closeEllipsis()
@@ -50,6 +50,12 @@ protocol GlobalUIServiceProtocol: Sendable {
5050
func showNoticeViewIfNeeded() async throws
5151
}
5252

53+
extension GlobalUIServiceProtocol {
54+
func setToast(_ toast: ToastType?, showButton: Bool? = true) {
55+
setToast(toast, showButton: showButton)
56+
}
57+
}
58+
5359
struct GlobalUIService: GlobalUIServiceProtocol, UserAuthHandler, ConfigsProvidable {
5460
var appState: AppState
5561
var localRepositories: AppEnvironment.LocalRepositories
@@ -152,14 +158,14 @@ struct GlobalUIService: GlobalUIServiceProtocol, UserAuthHandler, ConfigsProvida
152158

153159
// MARK: Toast
154160

155-
func setToast(_ toast: ToastType?) {
161+
func setToast(_ toast: ToastType?, showButton: Bool? = true) {
156162
if let toast = toast {
157163
switch toast {
158164
case .reminderNone,
159165
.reminder10Before,
160166
.reminderOnTime,
161167
.reminder10After:
162-
setReminderToast(toast)
168+
setReminderToast(toast, showButton)
163169
case .bookmark:
164170
setBookmarkToast(toast)
165171
case .vacancy:
@@ -170,8 +176,15 @@ struct GlobalUIService: GlobalUIServiceProtocol, UserAuthHandler, ConfigsProvida
170176
}
171177
}
172178

173-
private func setReminderToast(_ toast: ToastType) {
174-
appState.system.toast = .init(type: toast) { setSelectedTab(.settings) }
179+
private func setReminderToast(_ toast: ToastType, _ showButton: Bool?) {
180+
var toast = Toast(type: toast)
181+
if showButton == true {
182+
toast.action = {
183+
setSelectedTab(.settings)
184+
appState.routing.settingScene.pushToReminder = true
185+
}
186+
}
187+
appState.system.toast = toast
175188
}
176189

177190
private func setBookmarkToast(_ toast: ToastType) {
@@ -264,7 +277,7 @@ class FakeGlobalUIService: GlobalUIServiceProtocol {
264277
func setSelectedTab(_: TabType) {}
265278
func setIsErrorAlertPresented(_: Bool) {}
266279
func setIsMenuOpen(_: Bool) {}
267-
func setToast(_ toast: ToastType?) {}
280+
func setToast(_ toast: ToastType?, showButton: Bool? = true) {}
268281

269282
func openEllipsis(for _: TimetableMetadata) {}
270283
func closeEllipsis() {}

SNUTT-2022/SNUTT/Services/LectureService.swift

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -149,8 +149,9 @@ struct LectureService: LectureServiceProtocol {
149149
func changeLectureReminderState(lectureId: String, to option: ReminderOption) async throws {
150150
guard let targetTable = getCurrentOrNextSemesterPrimaryTable() else { return }
151151
let dto = try await lectureRepository.changeLectureReminderState(timetableId: targetTable.id, lectureId: lectureId, to: option.rawValue)
152-
appState.reminder.reminderList.removeAll(where: { $0.timetableLectureId == lectureId })
153-
appState.reminder.reminderList.append(.init(from: dto))
152+
if let index = appState.reminder.reminderList.firstIndex(where: { $0.timetableLectureId == lectureId }) {
153+
appState.reminder.reminderList[index] = .init(from: dto)
154+
}
154155
}
155156

156157
func getCurrentOrNextSemesterPrimaryTable() -> TimetableMetadata? {

SNUTT-2022/SNUTT/ViewModels/LectureDetailViewModel.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,7 @@ extension LectureDetailScene {
263263
do {
264264
try await services.lectureService.changeLectureReminderState(lectureId: lectureId, to: option)
265265
reminderOption = option
266+
services.globalUIService.setToast(option.toToast)
266267
} catch {
267268
services.globalUIService.presentErrorAlert(error: error)
268269
}

SNUTT-2022/SNUTT/ViewModels/LectureReminderViewModel.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ class LectureReminderViewModel: BaseViewModel, ObservableObject {
2727
func changeLectureReminderState(lectureId: String, to option: ReminderOption) async throws {
2828
do {
2929
try await services.lectureService.changeLectureReminderState(lectureId: lectureId, to: option)
30+
services.globalUIService.setToast(option.toToast, showButton: false)
3031
} catch {
3132
services.globalUIService.presentErrorAlert(error: error)
3233
}

SNUTT-2022/SNUTT/Views/Components/ToastView.swift

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -57,12 +57,14 @@ private struct ToastView: View {
5757
.font(STFont.medium14.font)
5858
.foregroundStyle(.white)
5959
Spacer()
60-
Button {
61-
toast.action()
62-
} label: {
63-
Text("보기")
64-
.font(STFont.medium14.font)
65-
.foregroundStyle(STColor.milkMint)
60+
if let action = toast.action {
61+
Button {
62+
action()
63+
} label: {
64+
Text("보기")
65+
.font(STFont.medium14.font)
66+
.foregroundStyle(STColor.milkMint)
67+
}
6668
}
6769
}
6870
.padding(.horizontal, 16)

SNUTT-2022/SNUTT/Views/Scenes/Settings/SettingScene.swift

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,10 @@ struct SettingScene: View {
2929
}
3030

3131
Section {
32-
SettingsLinkItem(title: "색상 모드", detail: viewModel.currentColorSchemeSelection.rawValue) {
32+
SettingsLinkItem(
33+
title: "색상 모드",
34+
detail: viewModel.currentColorSchemeSelection.rawValue
35+
) {
3336
ColorSchemeSettingScene(selection: $viewModel.currentColorSchemeSelection)
3437
}
3538

@@ -38,8 +41,7 @@ struct SettingScene: View {
3841
}
3942

4043
SettingsLinkItem(title: "시간표 테마") {
41-
ThemeSettingScene(viewModel:
42-
.init(container: viewModel.container))
44+
ThemeSettingScene(viewModel: .init(container: viewModel.container))
4345
.onDisappear {
4446
viewModel.closeBottomSheet()
4547
}
@@ -52,10 +54,16 @@ struct SettingScene: View {
5254
SettingsLinkItem(title: "푸시알림 설정") {
5355
PushNotificationSettingScene(viewModel: .init(container: viewModel.container))
5456
}
55-
SettingsLinkItem(title: "빈자리 알림", isActive: $viewModel.routingState.pushToVacancy) {
57+
SettingsLinkItem(
58+
title: "빈자리 알림",
59+
isActive: $viewModel.routingState.pushToVacancy
60+
) {
5661
VacancyScene(viewModel: .init(container: viewModel.container))
5762
}
58-
SettingsLinkItem(title: "강의 리마인더") {
63+
SettingsLinkItem(
64+
title: "강의 리마인더",
65+
isActive: $viewModel.routingState.pushToReminder
66+
) {
5967
LectureReminderSettingScene(viewModel: .init(container: viewModel.container))
6068
}
6169
SettingsLinkItem(title: "테마 마켓") {

0 commit comments

Comments
 (0)