Redesign dashboard
This commit is contained in:
@@ -0,0 +1,71 @@
|
||||
import Foundation
|
||||
import Library
|
||||
import SwiftUI
|
||||
|
||||
@MainActor
|
||||
public struct DashboardMenu: View {
|
||||
@StateObject private var viewModel = DashboardMenuViewModel()
|
||||
|
||||
public init() {}
|
||||
|
||||
public var body: some View {
|
||||
Menu {
|
||||
ForEach(DashboardCard.allCases) { card in
|
||||
Toggle(isOn: Binding(
|
||||
get: { viewModel.enabledCards.contains(card) },
|
||||
set: { _ in
|
||||
Task {
|
||||
await viewModel.toggleCard(card)
|
||||
}
|
||||
}
|
||||
)) {
|
||||
Label(card.title, systemImage: card.systemImage)
|
||||
}
|
||||
}
|
||||
|
||||
Divider()
|
||||
|
||||
Button("Reset to Default") {
|
||||
Task {
|
||||
await viewModel.resetToDefault()
|
||||
}
|
||||
}
|
||||
} label: {
|
||||
Label("Dashboard Items", systemImage: "square.grid.2x2")
|
||||
}
|
||||
.onAppear {
|
||||
Task {
|
||||
await viewModel.loadCards()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@MainActor
|
||||
private final class DashboardMenuViewModel: ObservableObject {
|
||||
@Published var enabledCards: [DashboardCard] = []
|
||||
|
||||
func loadCards() async {
|
||||
let savedCards = await SharedPreferences.enabledDashboardCards.get()
|
||||
if savedCards.isEmpty {
|
||||
enabledCards = DashboardCard.defaultCards
|
||||
} else {
|
||||
enabledCards = savedCards.compactMap { DashboardCard(rawValue: $0) }
|
||||
}
|
||||
}
|
||||
|
||||
func toggleCard(_ card: DashboardCard) async {
|
||||
if enabledCards.contains(card) {
|
||||
enabledCards.removeAll { $0 == card }
|
||||
} else {
|
||||
enabledCards.append(card)
|
||||
}
|
||||
await SharedPreferences.enabledDashboardCards.set(enabledCards.map(\.rawValue))
|
||||
}
|
||||
|
||||
func resetToDefault() async {
|
||||
await SharedPreferences.enabledDashboardCards.set([])
|
||||
await SharedPreferences.dashboardCardOrder.set([])
|
||||
enabledCards = DashboardCard.defaultCards
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user