Add dismissible pending updates alert banner at top of Dashboard
Shows a warning-colored banner when sources need updating, with an X to dismiss. The existing Pending Updates section lower in the dashboard remains unchanged. Fixes #18 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -11,6 +11,7 @@ struct DashboardView: View {
|
|||||||
@State private var showingCustomize = false
|
@State private var showingCustomize = false
|
||||||
@State private var sectionConfigs = DashboardLayoutStore.load()
|
@State private var sectionConfigs = DashboardLayoutStore.load()
|
||||||
@AppStorage("calmModeEnabled") private var calmModeEnabled = true
|
@AppStorage("calmModeEnabled") private var calmModeEnabled = true
|
||||||
|
@State private var pendingAlertDismissed = false
|
||||||
|
|
||||||
init() {
|
init() {
|
||||||
_viewModel = StateObject(wrappedValue: DashboardViewModel())
|
_viewModel = StateObject(wrappedValue: DashboardViewModel())
|
||||||
@@ -24,6 +25,18 @@ struct DashboardView: View {
|
|||||||
ScrollView {
|
ScrollView {
|
||||||
VStack(spacing: 20) {
|
VStack(spacing: 20) {
|
||||||
if viewModel.hasData {
|
if viewModel.hasData {
|
||||||
|
if !pendingAlertDismissed && !viewModel.sourcesNeedingUpdate.isEmpty {
|
||||||
|
PendingUpdatesAlertBanner(
|
||||||
|
count: viewModel.sourcesNeedingUpdate.count,
|
||||||
|
onDismiss: {
|
||||||
|
withAnimation {
|
||||||
|
pendingAlertDismissed = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
.transition(.move(edge: .top).combined(with: .opacity))
|
||||||
|
}
|
||||||
|
|
||||||
ForEach(visibleSections) { config in
|
ForEach(visibleSections) { config in
|
||||||
sectionView(for: config)
|
sectionView(for: config)
|
||||||
}
|
}
|
||||||
@@ -1046,6 +1059,36 @@ struct EmptyDashboardView: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// MARK: - Pending Updates Alert Banner
|
||||||
|
|
||||||
|
struct PendingUpdatesAlertBanner: View {
|
||||||
|
let count: Int
|
||||||
|
let onDismiss: () -> Void
|
||||||
|
|
||||||
|
var body: some View {
|
||||||
|
HStack(spacing: 10) {
|
||||||
|
Image(systemName: "exclamationmark.triangle.fill")
|
||||||
|
.foregroundColor(.white)
|
||||||
|
|
||||||
|
Text("\(count) source\(count == 1 ? "" : "s") pending update")
|
||||||
|
.font(.subheadline.weight(.semibold))
|
||||||
|
.foregroundColor(.white)
|
||||||
|
|
||||||
|
Spacer()
|
||||||
|
|
||||||
|
Button(action: onDismiss) {
|
||||||
|
Image(systemName: "xmark")
|
||||||
|
.font(.caption.weight(.bold))
|
||||||
|
.foregroundColor(.white.opacity(0.8))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.padding(.horizontal, 16)
|
||||||
|
.padding(.vertical, 12)
|
||||||
|
.background(Color.appWarning)
|
||||||
|
.cornerRadius(AppConstants.UI.cornerRadius)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// MARK: - Pending Updates Card
|
// MARK: - Pending Updates Card
|
||||||
|
|
||||||
struct PendingUpdatesCard: View {
|
struct PendingUpdatesCard: View {
|
||||||
|
|||||||
Reference in New Issue
Block a user