Skip to content

Commit

Permalink
Fix calendar picker out of sync + refactor UserDefaults
Browse files Browse the repository at this point in the history
  • Loading branch information
pakerwreah committed Sep 30, 2022
1 parent 2b7e44e commit 126cfa5
Show file tree
Hide file tree
Showing 7 changed files with 255 additions and 200 deletions.
8 changes: 4 additions & 4 deletions Calendr.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,6 @@
347E6D3E25AA2811009A6716 /* CalendarViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 347E6D3D25AA2811009A6716 /* CalendarViewModelTests.swift */; };
3487A43825E706F800FCC7D7 /* NextEventViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3487A43725E706F800FCC7D7 /* NextEventViewModel.swift */; };
3487A43C25E70F5B00FCC7D7 /* NextEventView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3487A43B25E70F5B00FCC7D7 /* NextEventView.swift */; };
348B8CFC25B290C200E518FE /* Prefs.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348B8CFB25B290C200E518FE /* Prefs.swift */; };
348B8D0425B2925100E518FE /* SettingsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348B8D0325B2925100E518FE /* SettingsViewModel.swift */; };
348E701F25C43C5200B3B160 /* WeekDay.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348E701E25C43C5200B3B160 /* WeekDay.swift */; };
348E702D25C6161900B3B160 /* EventViewModelFadeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348E702C25C6161900B3B160 /* EventViewModelFadeTests.swift */; };
Expand All @@ -89,6 +88,7 @@
3492C460269FCF5B009CFAD2 /* Accessibility.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3492C45F269FCF5B009CFAD2 /* Accessibility.swift */; };
3492C464269FD64D009CFAD2 /* Accessibility.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3492C45F269FCF5B009CFAD2 /* Accessibility.swift */; };
3492C466269FD6CE009CFAD2 /* MainViewTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3492C465269FD6CE009CFAD2 /* MainViewTests.swift */; };
34934CD628E69520009635D4 /* Prefs+UserDefaults.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34934CD528E69520009635D4 /* Prefs+UserDefaults.swift */; };
349355A625BCA8D400957945 /* EventListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 349355A525BCA8D400957945 /* EventListView.swift */; };
349355AA25BCA8DF00957945 /* EventView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 349355A925BCA8DF00957945 /* EventView.swift */; };
349355B225BCB07B00957945 /* EventViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 349355B125BCB07B00957945 /* EventViewModel.swift */; };
Expand Down Expand Up @@ -225,7 +225,6 @@
347E6D3D25AA2811009A6716 /* CalendarViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CalendarViewModelTests.swift; sourceTree = "<group>"; };
3487A43725E706F800FCC7D7 /* NextEventViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NextEventViewModel.swift; sourceTree = "<group>"; };
3487A43B25E70F5B00FCC7D7 /* NextEventView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NextEventView.swift; sourceTree = "<group>"; };
348B8CFB25B290C200E518FE /* Prefs.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Prefs.swift; sourceTree = "<group>"; };
348B8D0325B2925100E518FE /* SettingsViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsViewModel.swift; sourceTree = "<group>"; };
348E701E25C43C5200B3B160 /* WeekDay.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WeekDay.swift; sourceTree = "<group>"; };
348E702C25C6161900B3B160 /* EventViewModelFadeTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EventViewModelFadeTests.swift; sourceTree = "<group>"; };
Expand All @@ -239,6 +238,7 @@
3492C45D269F7966009CFAD2 /* UITestCase+Queries.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UITestCase+Queries.swift"; sourceTree = "<group>"; };
3492C45F269FCF5B009CFAD2 /* Accessibility.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Accessibility.swift; sourceTree = "<group>"; };
3492C465269FD6CE009CFAD2 /* MainViewTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainViewTests.swift; sourceTree = "<group>"; };
34934CD528E69520009635D4 /* Prefs+UserDefaults.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Prefs+UserDefaults.swift"; sourceTree = "<group>"; };
349355A525BCA8D400957945 /* EventListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EventListView.swift; sourceTree = "<group>"; };
349355A925BCA8DF00957945 /* EventView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EventView.swift; sourceTree = "<group>"; };
349355B125BCB07B00957945 /* EventViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EventViewModel.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -615,7 +615,7 @@
3449403125C348C70020E664 /* CalendarPickerViewController.swift */,
34B5A09C25B118EC00F7F7ED /* CalendarPickerViewModel.swift */,
3449402D25C348B20020E664 /* GeneralSettingsViewController.swift */,
348B8CFB25B290C200E518FE /* Prefs.swift */,
34934CD528E69520009635D4 /* Prefs+UserDefaults.swift */,
34B5A09225B0CE6F00F7F7ED /* SettingsViewController.swift */,
348B8D0325B2925100E518FE /* SettingsViewModel.swift */,
);
Expand Down Expand Up @@ -831,10 +831,10 @@
3468E653284BD44600B21EC8 /* EventBarStyle.swift in Sources */,
34F128E12597B9C9007DF31C /* MainViewController.swift in Sources */,
3477F3E425FD5285008EA888 /* NSView+Rx.swift in Sources */,
348B8CFC25B290C200E518FE /* Prefs.swift in Sources */,
34D55FE325F06669007F5C81 /* Sequence.swift in Sources */,
347D0FED2595467A002451EC /* CalendarCellView.swift in Sources */,
3421DA212693F12400056837 /* Calendar+Factory.swift in Sources */,
34934CD628E69520009635D4 /* Prefs+UserDefaults.swift in Sources */,
34FD09D925AE269600AAAAE2 /* DateProvider.swift in Sources */,
34AC60C626925FA5005312B6 /* PreviewExtensions.swift in Sources */,
3477F3CE25FAE56A008EA888 /* EventDetailsViewModel.swift in Sources */,
Expand Down
43 changes: 24 additions & 19 deletions Calendr/Settings/CalendarPickerViewModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,10 @@ class CalendarPickerViewModel {

var isPopover: Bool { popoverSettings != nil }

private let userDefaults: UserDefaults
private let toggleCalendarSubject = PublishRelay<String>()
private let disposeBag = DisposeBag()

init(
calendarService: CalendarServiceProviding,
userDefaults: UserDefaults,
Expand All @@ -31,33 +35,34 @@ class CalendarPickerViewModel {
.flatMapLatest(calendarService.calendars)
.share(replay: 1)

let toggleCalendarSubject = PublishRelay<String>()

self.toggleCalendar = toggleCalendarSubject.asObserver()

self.enabledCalendars = calendars.map { calendars in
{
userDefaults
.stringArray(forKey: Prefs.enabledCalendars)?
.filter($0.contains) ?? $0

}(calendars.map(\.identifier))
self.enabledCalendars = Observable.combineLatest(
calendars, userDefaults.rx.observe(\.enabledCalendars)
)
.map { calendars, enabled in
let identifiers = calendars.map(\.identifier)
guard let enabled = enabled else { return identifiers }
return enabled.filter(identifiers.contains)
}
.flatMapLatest { initial in
.share(replay: 1)

self.userDefaults = userDefaults
self.popoverSettings = popoverSettings

toggleCalendarSubject.scan(initial) { identifiers, toggled in
setUpBindings()
}

private func setUpBindings() {

toggleCalendarSubject
.withLatestFrom(enabledCalendars) { ($0, $1) }
.map { toggled, identifiers in
identifiers.contains(toggled)
? identifiers.filter { $0 != toggled }
: identifiers + [toggled]
}
.startWith(initial)
}
.do(onNext: {
userDefaults.setValue($0, forKey: Prefs.enabledCalendars)
})
.share(replay: 1)

self.popoverSettings = popoverSettings
.bind(to: userDefaults.rx.enabledCalendars)
.disposed(by: disposeBag)
}
}
92 changes: 92 additions & 0 deletions Calendr/Settings/Prefs+UserDefaults.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
//
// Prefs+UserDefaults.swift
// Calendr
//
// Created by Paker on 30/09/22.
//

import Foundation

enum Prefs {
static let enabledCalendars = "enabled_calendars"
static let statusItemIconEnabled = "status_item_icon_enabled"
static let statusItemDateEnabled = "status_item_date_enabled"
static let statusItemDateStyle = "status_item_date_style"
static let showEventStatusItem = "show_event_status_item"
static let eventStatusItemLength = "event_status_item_length"
static let eventStatusItemDetectNotch = "event_status_item_detect_notch"
static let showWeekNumbers = "show_week_numbers"
static let preserveSelectedDate = "preserve_selected_date"
static let showDeclinedEvents = "show_declined_events"
static let showPastEvents = "show_past_events"
static let transparencyLevel = "transparency_level"
static let calendarScaling = "calendar_scaling"
}

extension UserDefaults {

@objc dynamic var enabledCalendars: [String]? {
get { stringArray(forKey: Prefs.enabledCalendars) }
set { set(newValue, forKey: Prefs.enabledCalendars) }
}

@objc dynamic var statusItemIconEnabled: Bool {
get { bool(forKey: Prefs.statusItemIconEnabled) }
set { set(newValue, forKey: Prefs.statusItemIconEnabled) }
}

@objc dynamic var statusItemDateEnabled: Bool {
get { bool(forKey: Prefs.statusItemDateEnabled) }
set { set(newValue, forKey: Prefs.statusItemDateEnabled) }
}

@objc dynamic var statusItemDateStyle: UInt {
get { UInt(integer(forKey: Prefs.statusItemDateStyle)) }
set { set(newValue, forKey: Prefs.statusItemDateStyle) }
}

@objc dynamic var showEventStatusItem: Bool {
get { bool(forKey: Prefs.showEventStatusItem) }
set { set(newValue, forKey: Prefs.showEventStatusItem) }
}

@objc dynamic var eventStatusItemLength: Int {
get { integer(forKey: Prefs.eventStatusItemLength) }
set { set(newValue, forKey: Prefs.eventStatusItemLength) }
}

@objc dynamic var eventStatusItemDetectNotch: Bool {
get { bool(forKey: Prefs.eventStatusItemDetectNotch) }
set { set(newValue, forKey: Prefs.eventStatusItemDetectNotch) }
}

@objc dynamic var showWeekNumbers: Bool {
get { bool(forKey: Prefs.showWeekNumbers) }
set { set(newValue, forKey: Prefs.showWeekNumbers) }
}

@objc dynamic var preserveSelectedDate: Bool {
get { bool(forKey: Prefs.preserveSelectedDate) }
set { set(newValue, forKey: Prefs.preserveSelectedDate) }
}

@objc dynamic var showDeclinedEvents: Bool {
get { bool(forKey: Prefs.showDeclinedEvents) }
set { set(newValue, forKey: Prefs.showDeclinedEvents) }
}

@objc dynamic var showPastEvents: Bool {
get { bool(forKey: Prefs.showPastEvents) }
set { set(newValue, forKey: Prefs.showPastEvents) }
}

@objc dynamic var transparencyLevel: Int {
get { integer(forKey: Prefs.transparencyLevel) }
set { set(newValue, forKey: Prefs.transparencyLevel) }
}

@objc dynamic var calendarScaling: Double {
get { double(forKey: Prefs.calendarScaling) }
set { set(newValue, forKey: Prefs.calendarScaling) }
}
}
24 changes: 0 additions & 24 deletions Calendr/Settings/Prefs.swift

This file was deleted.

72 changes: 24 additions & 48 deletions Calendr/Settings/SettingsViewModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -93,42 +93,18 @@ class SettingsViewModel: StatusItemSettings, NextEventSettings, CalendarSettings
Prefs.calendarScaling: 1
])

let statusItemIconBehavior = BehaviorSubject(
value: userDefaults.bool(forKey: Prefs.statusItemIconEnabled)
)
let statusItemDateBehavior = BehaviorSubject(
value: userDefaults.bool(forKey: Prefs.statusItemDateEnabled)
)
let statusItemDateStyleBehavior = BehaviorSubject(
value: DateStyle(rawValue: UInt(userDefaults.integer(forKey: Prefs.statusItemDateStyle))) ?? .none
)
let showEventStatusItemBehavior = BehaviorSubject(
value: userDefaults.bool(forKey: Prefs.showEventStatusItem)
)
let eventStatusItemLengthBehavior = BehaviorSubject(
value: userDefaults.integer(forKey: Prefs.eventStatusItemLength)
)
let eventStatusItemDetectNotchBehavior = BehaviorSubject(
value: userDefaults.bool(forKey: Prefs.eventStatusItemDetectNotch)
)
let showWeekNumbersBehavior = BehaviorSubject(
value: userDefaults.bool(forKey: Prefs.showWeekNumbers)
)
let showDeclinedEventsBehavior = BehaviorSubject(
value: userDefaults.bool(forKey: Prefs.showDeclinedEvents)
)
let preserveSelectedDateBehavior = BehaviorSubject(
value: userDefaults.bool(forKey: Prefs.preserveSelectedDate)
)
let showPastEventsBehavior = BehaviorSubject(
value: userDefaults.bool(forKey: Prefs.showPastEvents)
)
let transparencyBehavior = BehaviorSubject(
value: userDefaults.integer(forKey: Prefs.transparencyLevel)
)
let calendarScalingBehavior = BehaviorSubject(
value: userDefaults.double(forKey: Prefs.calendarScaling)
)
let statusItemIconBehavior = BehaviorSubject(value: userDefaults.statusItemIconEnabled)
let statusItemDateBehavior = BehaviorSubject(value: userDefaults.statusItemDateEnabled)
let statusItemDateStyleBehavior = BehaviorSubject(value: DateStyle(rawValue: userDefaults.statusItemDateStyle) ?? .none)
let showEventStatusItemBehavior = BehaviorSubject(value: userDefaults.showEventStatusItem)
let eventStatusItemLengthBehavior = BehaviorSubject(value: userDefaults.eventStatusItemLength)
let eventStatusItemDetectNotchBehavior = BehaviorSubject(value: userDefaults.eventStatusItemDetectNotch)
let showWeekNumbersBehavior = BehaviorSubject(value: userDefaults.showWeekNumbers)
let showDeclinedEventsBehavior = BehaviorSubject(value: userDefaults.showDeclinedEvents)
let preserveSelectedDateBehavior = BehaviorSubject(value: userDefaults.preserveSelectedDate)
let showPastEventsBehavior = BehaviorSubject(value: userDefaults.showPastEvents)
let transparencyBehavior = BehaviorSubject(value: userDefaults.transparencyLevel)
let calendarScalingBehavior = BehaviorSubject(value: userDefaults.calendarScaling)

toggleStatusItemIcon = statusItemIconBehavior.asObserver()
toggleStatusItemDate = statusItemDateBehavior.asObserver()
Expand All @@ -152,73 +128,73 @@ class SettingsViewModel: StatusItemSettings, NextEventSettings, CalendarSettings

showStatusItemIcon = statusItemIconAndDate.map(\.0)
.do(onNext: {
userDefaults.setValue($0, forKey: Prefs.statusItemIconEnabled)
userDefaults.statusItemIconEnabled = $0
})
.share(replay: 1)

showStatusItemDate = statusItemIconAndDate.map(\.1)
.do(onNext: {
userDefaults.setValue($0, forKey: Prefs.statusItemDateEnabled)
userDefaults.statusItemDateEnabled = $0
})
.share(replay: 1)

statusItemDateStyle = statusItemDateStyleBehavior
.do(onNext: {
userDefaults.setValue($0.rawValue, forKey: Prefs.statusItemDateStyle)
userDefaults.statusItemDateStyle = $0.rawValue
})
.share(replay: 1)

showEventStatusItem = showEventStatusItemBehavior
.do(onNext: {
userDefaults.setValue($0, forKey: Prefs.showEventStatusItem)
userDefaults.showEventStatusItem = $0
})
.share(replay: 1)

eventStatusItemLength = eventStatusItemLengthBehavior
.do(onNext: {
userDefaults.setValue($0, forKey: Prefs.eventStatusItemLength)
userDefaults.eventStatusItemLength = $0
})
.share(replay: 1)

eventStatusItemDetectNotch = eventStatusItemDetectNotchBehavior
.do(onNext: {
userDefaults.setValue($0, forKey: Prefs.eventStatusItemDetectNotch)
userDefaults.eventStatusItemDetectNotch = $0
})
.share(replay: 1)

showWeekNumbers = showWeekNumbersBehavior
.do(onNext: {
userDefaults.setValue($0, forKey: Prefs.showWeekNumbers)
userDefaults.showWeekNumbers = $0
})
.share(replay: 1)

showDeclinedEvents = showDeclinedEventsBehavior
.do(onNext: {
userDefaults.setValue($0, forKey: Prefs.showDeclinedEvents)
userDefaults.showDeclinedEvents = $0
})
.share(replay: 1)

preserveSelectedDate = preserveSelectedDateBehavior
.do(onNext: {
userDefaults.setValue($0, forKey: Prefs.preserveSelectedDate)
userDefaults.preserveSelectedDate = $0
})
.share(replay: 1)

showPastEvents = showPastEventsBehavior
.do(onNext: {
userDefaults.setValue($0, forKey: Prefs.showPastEvents)
userDefaults.showPastEvents = $0
})
.share(replay: 1)

popoverTransparency = transparencyBehavior
.do(onNext: {
userDefaults.setValue($0, forKey: Prefs.transparencyLevel)
userDefaults.transparencyLevel = $0
})
.share(replay: 1)

calendarScaling = calendarScalingBehavior
.do(onNext: {
userDefaults.setValue($0, forKey: Prefs.calendarScaling)
userDefaults.calendarScaling = $0
})
.share(replay: 1)

Expand Down
Loading

0 comments on commit 126cfa5

Please sign in to comment.