Scale duration formatting up to months

formatSeconds previously capped at minutes; extend it to dynamically
show the two largest relevant units up through months for the passive
scanners' "Listening for ..." line and other duration displays.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
rzuasti
2026-06-08 11:15:20 -04:00
co-authored by Claude Opus 4.8
parent dedfe1c838
commit ed04a9bc89
2 changed files with 37 additions and 4 deletions
+17 -4
View File
@@ -1,7 +1,20 @@
/// Formats a duration given in [seconds] into a compact, human-readable string.
///
/// The format scales with the magnitude of the duration, always showing the two
/// largest relevant units: seconds for sub-minute spans, then minutes, hours,
/// days, weeks and finally months for longer ones.
String formatSeconds(double seconds) { String formatSeconds(double seconds) {
final total = seconds.round().clamp(0, double.maxFinite.toInt()); final total = seconds.round().clamp(0, double.maxFinite.toInt());
if (total < 60) return '${total}s'; const minute = 60;
final m = total ~/ 60; const hour = 60 * minute;
final s = total % 60; const day = 24 * hour;
return '${m}m ${s}s'; const week = 7 * day;
const month = 30 * day;
if (total < minute) return '${total}s';
if (total < hour) return '${total ~/ minute}m ${total % minute}s';
if (total < day) return '${total ~/ hour}h ${(total % hour) ~/ minute}m';
if (total < week) return '${total ~/ day}d ${(total % day) ~/ hour}h';
if (total < month) return '${total ~/ week}w ${(total % week) ~/ day}d';
return '${total ~/ month}mo ${(total % month) ~/ week}w';
} }
@@ -21,6 +21,26 @@ void main() {
expect(formatSeconds(59.6), '1m 0s'); expect(formatSeconds(59.6), '1m 0s');
}); });
test('renders hour-and-minute values past 60 minutes', () {
expect(formatSeconds(3600), '1h 0m');
expect(formatSeconds(3600 + 125), '1h 2m');
});
test('renders day-and-hour values past 24 hours', () {
expect(formatSeconds(86400), '1d 0h');
expect(formatSeconds(86400 + 3 * 3600), '1d 3h');
});
test('renders week-and-day values past 7 days', () {
expect(formatSeconds(604800), '1w 0d');
expect(formatSeconds(604800 + 2 * 86400), '1w 2d');
});
test('renders month-and-week values past 30 days', () {
expect(formatSeconds(2592000), '1mo 0w');
expect(formatSeconds(2592000 + 14 * 86400), '1mo 2w');
});
test('clamps negative values to zero', () { test('clamps negative values to zero', () {
expect(formatSeconds(-10), '0s'); expect(formatSeconds(-10), '0s');
}); });