@@ -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