fix: always refresh NAS dir count, show connection status, fix screenshot filter reactivity
- buildManifestIndex now always scans the NAS directory on every full reconcile (removed the `totalCount <= 1` guard) so NAS Archive count updates accurately on every manual refresh, not just when the manifest is new/sparse - The dir > manifest check still switches to filename-based matching when the directory has more files than Kisani's manifest (uploaded by other tools) - checkStatusRow shows NAS connection status (orange dot + "NAS Connected" / red dot + "NAS Offline") below the timestamp line - BackupFilter now conforms to Equatable; BackupView re-reconciles immediately when the screenshot/video/RAW filter toggles change Co-Authored-By: Kutesir <kutesir@provoc.ug> Co-Authored-By: Sentry <sentry@provoc.ug>
This commit is contained in:
@@ -149,6 +149,9 @@ struct BackupView: View {
|
||||
.onChange(of: store.savedConnection?.remotePath) { _ in
|
||||
statusService.refresh(force: true)
|
||||
}
|
||||
.onChange(of: store.backupFilter) { _ in
|
||||
statusService.refresh(force: true)
|
||||
}
|
||||
.onChange(of: engine.job.status) { status in
|
||||
if status == .completed {
|
||||
withAnimation(.spring(response: 0.3, dampingFraction: 0.8)) { ctaFlashGreen = true }
|
||||
@@ -492,37 +495,60 @@ struct BackupView: View {
|
||||
}
|
||||
|
||||
private var checkStatusRow: some View {
|
||||
HStack(spacing: 5) {
|
||||
if statusService.isRefreshing {
|
||||
ProgressView()
|
||||
.scaleEffect(0.5)
|
||||
.tint(AppTheme.inkQuaternary)
|
||||
Text("Checking…")
|
||||
.font(.system(size: 10, weight: .regular))
|
||||
.foregroundStyle(AppTheme.inkQuaternary)
|
||||
} else if let checked = statusService.snapshot.lastCheckedAt {
|
||||
Image(systemName: statusService.snapshot.connectionState == .offline
|
||||
? "wifi.slash" : "checkmark.circle")
|
||||
.font(.system(size: 9, weight: .regular))
|
||||
.foregroundStyle(statusService.snapshot.connectionState == .offline
|
||||
? .orange : AppTheme.inkQuaternary)
|
||||
Text(checked, style: .relative)
|
||||
.font(.system(size: 10, weight: .regular))
|
||||
.foregroundColor(AppTheme.inkQuaternary)
|
||||
+ Text(" ago")
|
||||
.font(.system(size: 10, weight: .regular))
|
||||
.foregroundColor(AppTheme.inkQuaternary)
|
||||
VStack(alignment: .leading, spacing: 3) {
|
||||
HStack(spacing: 5) {
|
||||
if statusService.isRefreshing {
|
||||
ProgressView()
|
||||
.scaleEffect(0.5)
|
||||
.tint(AppTheme.inkQuaternary)
|
||||
Text("Checking…")
|
||||
.font(.system(size: 10, weight: .regular))
|
||||
.foregroundStyle(AppTheme.inkQuaternary)
|
||||
} else if let checked = statusService.snapshot.lastCheckedAt {
|
||||
Image(systemName: statusService.snapshot.connectionState == .offline
|
||||
? "wifi.slash" : "checkmark.circle")
|
||||
.font(.system(size: 9, weight: .regular))
|
||||
.foregroundStyle(statusService.snapshot.connectionState == .offline
|
||||
? .orange : AppTheme.inkQuaternary)
|
||||
Text(checked, style: .relative)
|
||||
.font(.system(size: 10, weight: .regular))
|
||||
.foregroundColor(AppTheme.inkQuaternary)
|
||||
+ Text(" ago")
|
||||
.font(.system(size: 10, weight: .regular))
|
||||
.foregroundColor(AppTheme.inkQuaternary)
|
||||
}
|
||||
Spacer()
|
||||
Button {
|
||||
statusService.refresh(force: true)
|
||||
} label: {
|
||||
Image(systemName: "arrow.clockwise")
|
||||
.font(.system(size: 11, weight: .regular))
|
||||
.foregroundStyle(AppTheme.inkQuaternary)
|
||||
}
|
||||
}
|
||||
Spacer()
|
||||
Button {
|
||||
statusService.refresh(force: true)
|
||||
} label: {
|
||||
Image(systemName: "arrow.clockwise")
|
||||
.font(.system(size: 11, weight: .regular))
|
||||
.foregroundStyle(AppTheme.inkQuaternary)
|
||||
.frame(height: 16)
|
||||
|
||||
if statusService.snapshot.connectionState != .unknown {
|
||||
HStack(spacing: 4) {
|
||||
Circle()
|
||||
.fill(nasConnectionStatusColor)
|
||||
.frame(width: 5, height: 5)
|
||||
Text(nasConnectionStatusLabel)
|
||||
.font(.system(size: 9, weight: .regular))
|
||||
.foregroundStyle(nasConnectionStatusColor)
|
||||
}
|
||||
}
|
||||
}
|
||||
.frame(height: 16)
|
||||
}
|
||||
|
||||
private var nasConnectionStatusColor: Color {
|
||||
statusService.snapshot.connectionState == .offline
|
||||
? AppTheme.destructive
|
||||
: Color(red: 1.0, green: 0.58, blue: 0.0)
|
||||
}
|
||||
|
||||
private var nasConnectionStatusLabel: String {
|
||||
statusService.snapshot.connectionState == .offline ? "NAS Offline" : "NAS Connected"
|
||||
}
|
||||
|
||||
private func compactStat(_ value: String, label: String, color: Color) -> some View {
|
||||
|
||||
Reference in New Issue
Block a user