72 lines
2.0 KiB
Swift
72 lines
2.0 KiB
Swift
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
|
|
}
|
|
}
|