Simplify and modularize device, notification, and settings screens

Extract inline widget closures into named StatelessWidgets (_DeviceCard,
_DeviceFilterSheet, _NotificationCard), replace magic ints and hardcoded
repeated widgets with enum-driven loops, fix the InputDecorator/DropdownButton
hack in device_actions, merge symmetric _markAsRead/_markAsNew into _setRead,
and remove dead _isLoading/_isSaving state in settings where operations are
synchronous.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
rzuasti
2026-05-28 11:14:29 -04:00
co-authored by Claude Sonnet 4.6
parent e1287e5a0f
commit e6ec771f3b
6 changed files with 535 additions and 586 deletions
+23 -24
View File
@@ -129,12 +129,9 @@ class _DeviceEventHistoryState extends State<DeviceEventHistory> {
SingleChildScrollView(
scrollDirection: Axis.horizontal,
child: SegmentedButton<_TimeRange>(
segments:
_TimeRange.values
.map(
(r) => ButtonSegment(value: r, label: Text(r.label)),
)
.toList(),
segments: _TimeRange.values
.map((r) => ButtonSegment(value: r, label: Text(r.label)))
.toList(),
selected: {_selectedRange},
onSelectionChanged: (selection) {
setState(() => _selectedRange = selection.first);
@@ -187,18 +184,17 @@ class _EventChart extends StatelessWidget {
final minX = (cutoffMs / intervalMs).floor() * intervalMs;
final maxX = (nowMs / intervalMs).ceil() * intervalMs;
final spots =
events.map((e) {
final isNew = e.eventType == 'NewDevice';
return ScatterSpot(
e.createdOn.millisecondsSinceEpoch.toDouble(),
1.0,
dotPainter: FlDotCirclePainter(
radius: isNew ? 9.0 : 6.0,
color: theme.colorScheme.tertiary,
),
);
}).toList();
final spots = events.map((e) {
final isNew = e.eventType == 'NewDevice';
return ScatterSpot(
e.createdOn.millisecondsSinceEpoch.toDouble(),
1.0,
dotPainter: FlDotCirclePainter(
radius: isNew ? 9.0 : 6.0,
color: theme.colorScheme.tertiary,
),
);
}).toList();
return ScatterChart(
ScatterChartData(
@@ -259,8 +255,9 @@ class _EventChart extends StatelessWidget {
final event = events[idx];
final dt = event.createdOn.toLocal();
final dateStr = DateFormat('MMM d, yyyy HH:mm').format(dt);
final typeLabel =
event.eventType == 'NewDevice' ? 'First seen' : 'Device seen';
final typeLabel = event.eventType == 'NewDevice'
? 'First seen'
: 'Device seen';
final diffs = <TextSpan>[];
if (event.ipv4Address != device.ipv4Address) {
@@ -276,10 +273,12 @@ class _EventChart extends StatelessWidget {
);
}
if (event.vendor != device.vendor) {
final eventVendor =
event.vendor.isEmpty ? '(unknown)' : event.vendor;
final currentVendor =
device.vendor.isEmpty ? '(unknown)' : device.vendor;
final eventVendor = event.vendor.isEmpty
? '(unknown)'
: event.vendor;
final currentVendor = device.vendor.isEmpty
? '(unknown)'
: device.vendor;
diffs.add(
TextSpan(
text: '\nVendor: $eventVendor$currentVendor',