diff --git a/Shared/Environment/SettingEnvironment.swift b/Shared/Environment/SettingEnvironment.swift index 3e5e488..88d0844 100644 --- a/Shared/Environment/SettingEnvironment.swift +++ b/Shared/Environment/SettingEnvironment.swift @@ -20,6 +20,7 @@ final class SettingEnvironment: ObservableObject { @Published var zoomLevel: Int #if os(iOS) @Published var boardSelectDisplayStyle: BoardSelectStyle + @Published var isFilterByStared: Bool #endif #if os(macOS) // TODO: @@ -39,6 +40,7 @@ final class SettingEnvironment: ObservableObject { #if os(iOS) boardSelectDisplayStyle = UserDefaultSetting.shared.boardSelectDisplayStyle + isFilterByStared = UserDefaultSetting.shared.isFilterByStared #endif #if os(macOS) @@ -95,6 +97,11 @@ final class SettingEnvironment: ObservableObject { .dropFirst() .assign(to: \.boardSelectDisplayStyle, on: UserDefaultSetting.shared) .store(in: &cancellables) + + $isFilterByStared + .dropFirst() + .assign(to: \.isFilterByStared, on: UserDefaultSetting.shared) + .store(in: &cancellables) #endif } @@ -107,6 +114,7 @@ final class SettingEnvironment: ObservableObject { #if os(iOS) boardSelectDisplayStyle = UserDefaultSetting.DefaultBoardSelectDisplayStyle + isFilterByStared = UserDefaultSetting.DefaultIsFilterByStared #endif } } diff --git a/Shared/Model/UserDefaultSetting.swift b/Shared/Model/UserDefaultSetting.swift index d49d469..b4d2e95 100644 --- a/Shared/Model/UserDefaultSetting.swift +++ b/Shared/Model/UserDefaultSetting.swift @@ -18,6 +18,7 @@ final class UserDefaultSetting { #if os(iOS) static let DefaultBoardSelectDisplayStyle: BoardSelectStyle = .grid + static let DefaultIsFilterByStared: Bool = false #endif @UserDefault(key: "boardSize", defaultValue: DefaultBoardSize) @@ -32,5 +33,8 @@ final class UserDefaultSetting { #if os(iOS) @UserDefault(key: "boardSelectDisplayStyle", defaultValue: DefaultBoardSelectDisplayStyle) var boardSelectDisplayStyle: BoardSelectStyle + + @UserDefault(key: "isFilterByStared", defaultValue: DefaultIsFilterByStared) + var isFilterByStared: Bool #endif } diff --git a/Shared/Util/UserDefaultConvertible.swift b/Shared/Util/UserDefaultConvertible.swift index 28225d4..2be08d5 100644 --- a/Shared/Util/UserDefaultConvertible.swift +++ b/Shared/Util/UserDefaultConvertible.swift @@ -13,6 +13,17 @@ protocol UserDefaultConvertible { func object() -> Any } +extension Bool: UserDefaultConvertible { + init?(with object: Any) { + guard let value = object as? Bool else { return nil } + self = value + } + + func object() -> Any { + self + } +} + extension Int: UserDefaultConvertible { init?(with object: Any) { guard let value = object as? Int else { return nil } diff --git a/iOS/Screen/BoardSelect/BoardSelectView.swift b/iOS/Screen/BoardSelect/BoardSelectView.swift index 05866f9..a330f18 100644 --- a/iOS/Screen/BoardSelect/BoardSelectView.swift +++ b/iOS/Screen/BoardSelect/BoardSelectView.swift @@ -13,13 +13,12 @@ struct BoardSelectView : View { @ObservedObject var repository: Repository // TODO: @EnvironmentObject で受け取れるようにできる❓ @Binding var isPresented: Bool - @State private var isStarOnly = false // MARK: Computed properties private var fileredItems: [BoardDocument] { repository.items - .filter { isStarOnly ? $0.stared : true } + .filter { setting.isFilterByStared ? $0.stared : true } } // MARK: View @@ -72,7 +71,7 @@ struct BoardSelectView : View { Divider() - Toggle(isOn: $isStarOnly) { + Toggle(isOn: $setting.isFilterByStared) { Label("Star only", systemImage: "star.fill") } }, label: {