Skip to content

Commit f6d1683

Browse files
committed
feat: 설정값을 UserDefatuls에 저장
1 parent e203be5 commit f6d1683

1 file changed

Lines changed: 63 additions & 8 deletions

File tree

DevLog/Presentation/ViewModel/PushNotificationViewModel.swift

Lines changed: 63 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,9 @@ final class PushNotificationViewModel: Store {
1919
var toastType: ToastType?
2020
var isLoading: Bool = false
2121
var pendingTask: (PushNotification, Int)?
22-
var sortOption: SortOption = .latest
23-
var timeFilter: TimeFilter = .none
24-
var showUnreadOnly: Bool = false
22+
var sortOption: SortOption
23+
var timeFilter: TimeFilter
24+
var showUnreadOnly: Bool
2525
}
2626

2727
enum Action {
@@ -34,7 +34,7 @@ final class PushNotificationViewModel: Store {
3434
case setToast(isPresented: Bool, type: ToastType? = nil)
3535
case setLoading(Bool)
3636
case setNotifications([PushNotification])
37-
case setSortOption(SortOption)
37+
case toggleSortOption
3838
case setTimeFilter(TimeFilter)
3939
case toggleUnreadOnly
4040
case resetFilters
@@ -99,21 +99,49 @@ final class PushNotificationViewModel: Store {
9999
.days(7)
100100
]
101101
}
102+
103+
init(id: String) {
104+
if id == "none" {
105+
self = .none
106+
} else if id.hasPrefix("hours-") {
107+
let value = Int(id.replacingOccurrences(of: "hours-", with: "")) ?? 0
108+
self = value > 0 ? .hours(value) : .none
109+
} else if id.hasPrefix("days-") {
110+
let value = Int(id.replacingOccurrences(of: "days-", with: "")) ?? 0
111+
self = value > 0 ? .days(value) : .none
112+
} else {
113+
self = .none
114+
}
115+
}
102116
}
103117

104-
@Published private(set) var state: State = .init()
118+
@Published private(set) var state: State
105119
private let fetchUseCase: FetchPushNotificationsUseCase
106120
private let deleteUseCase: DeletePushNotificationUseCase
107121
private let toggleReadUseCase: TogglePushNotificationReadUseCase
122+
private let userDefaults: UserDefaults
123+
124+
private enum DefaultsKey {
125+
static let sortOption = "PushNotification.sortOption"
126+
static let timeFilter = "PushNotification.timeFilter"
127+
static let showUnreadOnly = "PushNotification.showUnreadOnly"
128+
}
108129

109130
init(
110131
fetchUseCase: FetchPushNotificationsUseCase,
111132
deleteUseCase: DeletePushNotificationUseCase,
112-
toggleReadUseCase: TogglePushNotificationReadUseCase
133+
toggleReadUseCase: TogglePushNotificationReadUseCase,
134+
userDefaults: UserDefaults = .standard
113135
) {
114136
self.fetchUseCase = fetchUseCase
115137
self.deleteUseCase = deleteUseCase
116138
self.toggleReadUseCase = toggleReadUseCase
139+
self.userDefaults = userDefaults
140+
self.state = State(
141+
sortOption: Self.loadSortOption(userDefaults: userDefaults),
142+
timeFilter: Self.loadTimeFilter(userDefaults: userDefaults),
143+
showUnreadOnly: userDefaults.bool(forKey: DefaultsKey.showUnreadOnly)
144+
)
117145
}
118146

119147
var displayedNotifications: [PushNotification] {
@@ -181,16 +209,22 @@ final class PushNotificationViewModel: Store {
181209
state.isLoading = value
182210
case .setNotifications(let notifications):
183211
state.notifications = notifications
184-
case .setSortOption(let option):
185-
state.sortOption = option
212+
case .toggleSortOption:
213+
state.sortOption = state.sortOption == .latest ? .oldest : .latest
214+
saveSortOption(state.sortOption)
186215
case .setTimeFilter(let filter):
187216
state.timeFilter = filter
217+
saveTimeFilter(filter)
188218
case .toggleUnreadOnly:
189219
state.showUnreadOnly.toggle()
220+
userDefaults.set(state.showUnreadOnly, forKey: DefaultsKey.showUnreadOnly)
190221
case .resetFilters:
191222
state.sortOption = .latest
192223
state.timeFilter = .none
193224
state.showUnreadOnly = false
225+
saveSortOption(.latest)
226+
saveTimeFilter(.none)
227+
userDefaults.set(false, forKey: DefaultsKey.showUnreadOnly)
194228
}
195229

196230
self.state = state
@@ -261,4 +295,25 @@ private extension PushNotificationViewModel {
261295
}
262296
state.showToast = isPresented
263297
}
298+
299+
static func loadSortOption(userDefaults: UserDefaults) -> SortOption {
300+
guard let rawValue = userDefaults.string(forKey: DefaultsKey.sortOption) else {
301+
return .latest
302+
}
303+
return rawValue == "oldest" ? .oldest : .latest
304+
}
305+
306+
static func loadTimeFilter(userDefaults: UserDefaults) -> TimeFilter {
307+
let id = userDefaults.string(forKey: DefaultsKey.timeFilter) ?? "none"
308+
return TimeFilter(id: id)
309+
}
310+
311+
func saveSortOption(_ option: SortOption) {
312+
let value = option == .oldest ? "oldest" : "latest"
313+
userDefaults.set(value, forKey: DefaultsKey.sortOption)
314+
}
315+
316+
func saveTimeFilter(_ filter: TimeFilter) {
317+
userDefaults.set(filter.id, forKey: DefaultsKey.timeFilter)
318+
}
264319
}

0 commit comments

Comments
 (0)