Skip to content

Commit

Permalink
Fixing bug where settings might not be reflected - Closes #124
Browse files Browse the repository at this point in the history
  • Loading branch information
DamascenoRafael committed Apr 4, 2023
1 parent 9403994 commit a5b515d
Show file tree
Hide file tree
Showing 5 changed files with 58 additions and 48 deletions.
40 changes: 35 additions & 5 deletions reminders-menubar/Models/RemindersData.swift
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ import Combine
import EventKit

class RemindersData: ObservableObject {

private let userPreferences = UserPreferences.shared

private var cancellationTokens: [AnyCancellable] = []
Expand Down Expand Up @@ -37,7 +36,7 @@ class RemindersData: ObservableObject {
)

cancellationTokens.append(
userPreferences.$calendarIdentifiersFilter.dropFirst().sink { [weak self] calendarIdentifiersFilter in
$calendarIdentifiersFilter.dropFirst().sink { [weak self] calendarIdentifiersFilter in
self?.filteredReminderLists = RemindersService.shared.getReminders(of: calendarIdentifiersFilter)
}
)
Expand All @@ -49,16 +48,47 @@ class RemindersData: ObservableObject {

@Published var filteredReminderLists: [ReminderList] = []

@objc func update() {
userPreferences.forceUpdate()
@Published var calendarIdentifiersFilter: [String] = {
guard let identifiers = UserPreferences.shared.preferredCalendarIdentifiersFilter else {
// NOTE: On first use it will load all reminder lists.
let calendars = RemindersService.shared.getCalendars()
let allIdentifiers = calendars.map({ $0.calendarIdentifier })
return allIdentifiers
}

return identifiers
}() {
didSet {
UserPreferences.shared.preferredCalendarIdentifiersFilter = calendarIdentifiersFilter
}
}

@Published var calendarForSaving: EKCalendar? = {
guard RemindersService.shared.authorizationStatus() == .authorized else {
return nil
}

guard let identifier = UserPreferences.shared.preferredCalendarIdentifierForSaving,
let calendar = RemindersService.shared.getCalendar(withIdentifier: identifier) else {
return RemindersService.shared.getDefaultCalendar()
}

return calendar
}() {
didSet {
let identifier = calendarForSaving?.calendarIdentifier
UserPreferences.shared.preferredCalendarIdentifierForSaving = identifier
}
}

@objc func update() {
// TODO: Prefer receive(on:options:) over explicit use of dispatch queues when performing work in subscribers.
// https://developer.apple.com/documentation/combine/fail/receive(on:options:)
DispatchQueue.main.async {
let calendars = RemindersService.shared.getCalendars()
self.calendars = calendars

self.userPreferences.calendarIdentifiersFilter = self.userPreferences.calendarIdentifiersFilter.filter({
self.calendarIdentifiersFilter = self.calendarIdentifiersFilter.filter({
RemindersService.shared.isValid(calendarIdentifier: $0)
})

Expand Down
44 changes: 12 additions & 32 deletions reminders-menubar/Services/UserPreferences.swift
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import EventKit
import SwiftUI
import ServiceManagement

private struct PreferencesKeys {
Expand All @@ -25,10 +25,6 @@ class UserPreferences: ObservableObject {

private static let defaults = UserDefaults.standard

func forceUpdate() {
UserPreferences.shared = UserPreferences()
}

@Published var remindersMenuBarOpeningEvent = false

@Published var reminderMenuBarIcon: RmbIcon = {
Expand All @@ -42,37 +38,21 @@ class UserPreferences: ObservableObject {
}
}

@Published var calendarIdentifiersFilter: [String] = {
guard let identifiers = defaults.stringArray(forKey: PreferencesKeys.calendarIdentifiersFilter) else {
// NOTE: On first use it will load all reminder lists.
let calendars = RemindersService.shared.getCalendars()
let allIdentifiers = calendars.map({ $0.calendarIdentifier })
return allIdentifiers
var preferredCalendarIdentifiersFilter: [String]? {
get {
return UserPreferences.defaults.stringArray(forKey: PreferencesKeys.calendarIdentifiersFilter)
}

return identifiers
}() {
didSet {
UserPreferences.defaults.set(calendarIdentifiersFilter, forKey: PreferencesKeys.calendarIdentifiersFilter)
set {
UserPreferences.defaults.set(newValue, forKey: PreferencesKeys.calendarIdentifiersFilter)
}
}

@Published var calendarForSaving: EKCalendar? = {
guard RemindersService.shared.authorizationStatus() == .authorized else {
return nil
}

guard let identifier = defaults.string(forKey: PreferencesKeys.calendarIdentifierForSaving),
let calendar = RemindersService.shared.getCalendar(withIdentifier: identifier) else {
let defaultCalendar = RemindersService.shared.getDefaultCalendar()
return defaultCalendar
var preferredCalendarIdentifierForSaving: String? {
get {
return UserPreferences.defaults.string(forKey: PreferencesKeys.calendarIdentifierForSaving)
}

return calendar
}() {
didSet {
let identifier = calendarForSaving?.calendarIdentifier
UserPreferences.defaults.set(identifier, forKey: PreferencesKeys.calendarIdentifierForSaving)
set {
UserPreferences.defaults.set(newValue, forKey: PreferencesKeys.calendarIdentifierForSaving)
}
}

Expand Down Expand Up @@ -122,7 +102,7 @@ class UserPreferences: ObservableObject {
}

var atLeastOneFilterIsSelected: Bool {
return showUpcomingReminders || !self.calendarIdentifiersFilter.isEmpty
return showUpcomingReminders || preferredCalendarIdentifiersFilter == nil || !preferredCalendarIdentifiersFilter!.isEmpty
}

var launchAtLoginIsEnabled: Bool {
Expand Down
6 changes: 3 additions & 3 deletions reminders-menubar/Views/CalendarTitle.swift
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import SwiftUI
import EventKit

struct CalendarTitle: View {
@ObservedObject var userPreferences = UserPreferences.shared
@EnvironmentObject var remindersData: RemindersData
@Environment(\.colorSchemeContrast) private var colorSchemeContrast

var calendar: EKCalendar
Expand All @@ -18,9 +18,9 @@ struct CalendarTitle: View {
Spacer()

Button(action: {
userPreferences.calendarForSaving = calendar
remindersData.calendarForSaving = calendar
}) {
let isSelected = userPreferences.calendarForSaving?.calendarIdentifier == calendar.calendarIdentifier
let isSelected = remindersData.calendarForSaving?.calendarIdentifier == calendar.calendarIdentifier
Image(systemName: isSelected ? "folder.fill" : "folder")
.font(Font.headline.weight(.medium))
.foregroundColor(calendarFolderIsHovered ? Color(calendar.color) : nil)
Expand Down
8 changes: 4 additions & 4 deletions reminders-menubar/Views/FormNewReminderView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,9 @@ struct FormNewReminderView: View {

Menu {
ForEach(remindersData.calendars, id: \.calendarIdentifier) { calendar in
Button(action: { userPreferences.calendarForSaving = calendar }) {
Button(action: { remindersData.calendarForSaving = calendar }) {
let isSelected =
userPreferences.calendarForSaving?.calendarIdentifier == calendar.calendarIdentifier
remindersData.calendarForSaving?.calendarIdentifier == calendar.calendarIdentifier
SelectableView(title: calendar.title, isSelected: isSelected, color: Color(calendar.color))
}
}
Expand Down Expand Up @@ -61,7 +61,7 @@ struct FormNewReminderView: View {
.frame(width: 14, height: 16)
.padding(8)
.padding(.trailing, 2)
.background(Color(userPreferences.calendarForSaving?.color ?? .white))
.background(Color(remindersData.calendarForSaving?.color ?? .white))
.cornerRadius(8)
.modifier(ContrastBorderOverlay())
.help(rmbLocalized(.newReminderCalendarSelectionToSaveHelp))
Expand Down Expand Up @@ -104,7 +104,7 @@ struct FormNewReminderView: View {

func createNewReminder() {
guard !rmbReminder.title.isEmpty,
let calendarForSaving = userPreferences.calendarForSaving else {
let calendarForSaving = remindersData.calendarForSaving else {
return
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,14 +22,14 @@ struct SettingsBarFilterMenu: View {
ForEach(remindersData.calendars, id: \.calendarIdentifier) { calendar in
let calendarIdentifier = calendar.calendarIdentifier
Button(action: {
let index = userPreferences.calendarIdentifiersFilter.firstIndex(of: calendarIdentifier)
let index = remindersData.calendarIdentifiersFilter.firstIndex(of: calendarIdentifier)
if let index {
userPreferences.calendarIdentifiersFilter.remove(at: index)
remindersData.calendarIdentifiersFilter.remove(at: index)
} else {
userPreferences.calendarIdentifiersFilter.append(calendarIdentifier)
remindersData.calendarIdentifiersFilter.append(calendarIdentifier)
}
}) {
let isSelected = userPreferences.calendarIdentifiersFilter.contains(calendarIdentifier)
let isSelected = remindersData.calendarIdentifiersFilter.contains(calendarIdentifier)
SelectableView(title: calendar.title, isSelected: isSelected, color: Color(calendar.color))
}
}
Expand Down

0 comments on commit a5b515d

Please sign in to comment.