feature: save filter by stared
This commit is contained in:
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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 }
|
||||
|
||||
@@ -13,13 +13,12 @@ struct BoardSelectView<Repository: FirestoreBoardRepositoryProtorol> : 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<Repository: FirestoreBoardRepositoryProtorol> : View {
|
||||
|
||||
Divider()
|
||||
|
||||
Toggle(isOn: $isStarOnly) {
|
||||
Toggle(isOn: $setting.isFilterByStared) {
|
||||
Label("Star only", systemImage: "star.fill")
|
||||
}
|
||||
}, label: {
|
||||
|
||||
Reference in New Issue
Block a user