Files
oott/frontend/lib/widgets/arp_scanner_card.dart
T
rzuastiandClaude Opus 4.8 d15411a889 Report devices seen on last scan in ARP/SNMP status
The ARP and SNMP scanner status endpoints and front-end cards now expose
the number of devices found by the most recent successful scan, following
the existing mDNS device-count pattern. The count persists across the
running/waiting transitions, and for SNMP a failed poll keeps the last
good count rather than overwriting it.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-02 08:45:45 -04:00

56 lines
1.7 KiB
Dart

import 'package:flutter/material.dart';
import '../model/arp_scanner_status.dart';
import '../theme/app_colors.dart';
import '../utils/duration_formatter.dart';
import '../utils/oott_api.dart';
import 'scanner_status_card.dart';
class ArpScannerCard extends StatelessWidget {
const ArpScannerCard({super.key});
@override
Widget build(BuildContext context) {
return ScannerStatusCard<ArpScannerStatus>(
title: 'ARP Scanner',
fetch: ({cancelToken}) =>
BackendAPI.instance.getArpScannerStatus(cancelToken: cancelToken),
resolver: _resolve,
);
}
static ScannerStatus _resolve(
BuildContext context,
ArpScannerStatus status,
double elapsed,
) {
final successColor = Theme.of(
context,
).extension<AppColorExtension>()!.success;
final neutralColor = Theme.of(context).colorScheme.outline;
final lastScan = status.lastScanDevicesSeen != null
? '${status.lastScanDevicesSeen} devices on last scan'
: null;
if (status.isRunning) {
final sublabels = <String>[
if (status.runningForSeconds != null)
'Running for ${formatSeconds(status.runningForSeconds! + elapsed)}',
?lastScan,
];
return (color: successColor, label: 'Running', sublabels: sublabels);
}
if (status.nextRunInSeconds != null) {
final remaining = (status.nextRunInSeconds! - elapsed).clamp(
0.0,
double.infinity,
);
return (
color: neutralColor,
label: 'Waiting for next run',
sublabels: ['Next run in ${formatSeconds(remaining)}', ?lastScan],
);
}
return (color: neutralColor, label: 'Not started', sublabels: []);
}
}