From 5ad9263cc42254059f0a4e529b1067dba69b1cb5 Mon Sep 17 00:00:00 2001 From: Winston Lowe Date: Thu, 19 Mar 2026 16:17:25 -0700 Subject: [PATCH] feat: Refactor repeater resolution logic across multiple screens --- lib/screens/neighbors_screen.dart | 25 ++++++++++++++++------- lib/screens/repeater_cli_screen.dart | 15 ++++++++++++-- lib/screens/repeater_settings_screen.dart | 15 ++++++++++++-- lib/screens/repeater_status_screen.dart | 15 ++++++++++++-- lib/screens/telemetry_screen.dart | 20 +++++++++++++++++- lib/widgets/repeater_login_dialog.dart | 14 +++++++++++-- lib/widgets/room_login_dialog.dart | 15 ++++++++++++-- 7 files changed, 101 insertions(+), 18 deletions(-) diff --git a/lib/screens/neighbors_screen.dart b/lib/screens/neighbors_screen.dart index 5afeda41..f4c16734 100644 --- a/lib/screens/neighbors_screen.dart +++ b/lib/screens/neighbors_screen.dart @@ -44,6 +44,24 @@ class _NeighborsScreenState extends State { PathSelection? _pendingStatusSelection; List>? _parsedNeighbors; + int _resolveRepeaterIndex = -1; + + Contact _resolveRepeater(MeshCoreConnector connector) { + if (_resolveRepeaterIndex >= 0 && + _resolveRepeaterIndex < connector.contacts.length && + connector.contacts[_resolveRepeaterIndex].publicKeyHex == + widget.repeater.publicKeyHex) { + return connector.contacts[_resolveRepeaterIndex]; + } + _resolveRepeaterIndex = connector.contacts.indexWhere( + (c) => c.publicKeyHex == widget.repeater.publicKeyHex, + ); + if (_resolveRepeaterIndex == -1) { + return widget.repeater; + } + return connector.contacts[_resolveRepeaterIndex]; + } + @override void initState() { super.initState(); @@ -163,13 +181,6 @@ class _NeighborsScreenState extends State { } } - Contact _resolveRepeater(MeshCoreConnector connector) { - return connector.contacts.firstWhere( - (c) => c.publicKeyHex == widget.repeater.publicKeyHex, - orElse: () => widget.repeater, - ); - } - Future _loadNeighbors() async { if (_commandService == null) return; diff --git a/lib/screens/repeater_cli_screen.dart b/lib/screens/repeater_cli_screen.dart index 1c7ff438..52d92aac 100644 --- a/lib/screens/repeater_cli_screen.dart +++ b/lib/screens/repeater_cli_screen.dart @@ -77,11 +77,22 @@ class _RepeaterCliScreenState extends State { }); } + int _resolveRepeaterIndex = -1; + Contact _resolveRepeater(MeshCoreConnector connector) { - return connector.contacts.firstWhere( + if (_resolveRepeaterIndex >= 0 && + _resolveRepeaterIndex < connector.contacts.length && + connector.contacts[_resolveRepeaterIndex].publicKeyHex == + widget.repeater.publicKeyHex) { + return connector.contacts[_resolveRepeaterIndex]; + } + _resolveRepeaterIndex = connector.contacts.indexWhere( (c) => c.publicKeyHex == widget.repeater.publicKeyHex, - orElse: () => widget.repeater, ); + if (_resolveRepeaterIndex == -1) { + return widget.repeater; + } + return connector.contacts[_resolveRepeaterIndex]; } void _handleTextMessageResponse(Uint8List frame) { diff --git a/lib/screens/repeater_settings_screen.dart b/lib/screens/repeater_settings_screen.dart index bae0f509..6375e0b3 100644 --- a/lib/screens/repeater_settings_screen.dart +++ b/lib/screens/repeater_settings_screen.dart @@ -129,11 +129,22 @@ class _RepeaterSettingsScreenState extends State { _commandService?.handleResponse(widget.repeater, parsed.text); } + int _resolveRepeaterIndex = -1; + Contact _resolveRepeater(MeshCoreConnector connector) { - return connector.contacts.firstWhere( + if (_resolveRepeaterIndex >= 0 && + _resolveRepeaterIndex < connector.contacts.length && + connector.contacts[_resolveRepeaterIndex].publicKeyHex == + widget.repeater.publicKeyHex) { + return connector.contacts[_resolveRepeaterIndex]; + } + _resolveRepeaterIndex = connector.contacts.indexWhere( (c) => c.publicKeyHex == widget.repeater.publicKeyHex, - orElse: () => widget.repeater, ); + if (_resolveRepeaterIndex == -1) { + return widget.repeater; + } + return connector.contacts[_resolveRepeaterIndex]; } bool _matchesRepeaterPrefix(Uint8List prefix) { diff --git a/lib/screens/repeater_status_screen.dart b/lib/screens/repeater_status_screen.dart index 95254f43..f9384195 100644 --- a/lib/screens/repeater_status_screen.dart +++ b/lib/screens/repeater_status_screen.dart @@ -91,11 +91,22 @@ class _RepeaterStatusScreenState extends State { }); } + int _resolveRepeaterIndex = -1; + Contact _resolveRepeater(MeshCoreConnector connector) { - return connector.contacts.firstWhere( + if (_resolveRepeaterIndex >= 0 && + _resolveRepeaterIndex < connector.contacts.length && + connector.contacts[_resolveRepeaterIndex].publicKeyHex == + widget.repeater.publicKeyHex) { + return connector.contacts[_resolveRepeaterIndex]; + } + _resolveRepeaterIndex = connector.contacts.indexWhere( (c) => c.publicKeyHex == widget.repeater.publicKeyHex, - orElse: () => widget.repeater, ); + if (_resolveRepeaterIndex == -1) { + return widget.repeater; + } + return connector.contacts[_resolveRepeaterIndex]; } void _handleTextMessageResponse(Uint8List frame) { diff --git a/lib/screens/telemetry_screen.dart b/lib/screens/telemetry_screen.dart index aa0fa1cc..66911dc5 100644 --- a/lib/screens/telemetry_screen.dart +++ b/lib/screens/telemetry_screen.dart @@ -38,6 +38,24 @@ class _TelemetryScreenState extends State { int _tripTime = 0; + int _resolveContactIndex = -1; + + Contact _resolveContact(MeshCoreConnector connector) { + if (_resolveContactIndex >= 0 && + _resolveContactIndex < connector.contacts.length && + connector.contacts[_resolveContactIndex].publicKeyHex == + widget.contact.publicKeyHex) { + return connector.contacts[_resolveContactIndex]; + } + _resolveContactIndex = connector.contacts.indexWhere( + (c) => c.publicKeyHex == widget.contact.publicKeyHex, + ); + if (_resolveContactIndex == -1) { + return widget.contact; + } + return connector.contacts[_resolveContactIndex]; + } + @override void initState() { super.initState(); @@ -144,7 +162,7 @@ class _TelemetryScreenState extends State { try { final connector = Provider.of(context, listen: false); final selection = await connector.preparePathForContactSend( - widget.contact, + _resolveContact(connector), ); _pendingStatusSelection = selection; Uint8List frame; diff --git a/lib/widgets/repeater_login_dialog.dart b/lib/widgets/repeater_login_dialog.dart index ec0af665..ce6c2b7f 100644 --- a/lib/widgets/repeater_login_dialog.dart +++ b/lib/widgets/repeater_login_dialog.dart @@ -69,11 +69,21 @@ class _RepeaterLoginDialogState extends State { bool _isLoggingIn = false; + int _resolveRepeaterIndex = -1; Contact _resolveRepeater(MeshCoreConnector connector) { - return connector.contacts.firstWhere( + if (_resolveRepeaterIndex >= 0 && + _resolveRepeaterIndex < connector.contacts.length && + connector.contacts[_resolveRepeaterIndex].publicKeyHex == + widget.repeater.publicKeyHex) { + return connector.contacts[_resolveRepeaterIndex]; + } + _resolveRepeaterIndex = connector.contacts.indexWhere( (c) => c.publicKeyHex == widget.repeater.publicKeyHex, - orElse: () => widget.repeater, ); + if (_resolveRepeaterIndex == -1) { + return widget.repeater; + } + return connector.contacts[_resolveRepeaterIndex]; } Future _handleLogin() async { diff --git a/lib/widgets/room_login_dialog.dart b/lib/widgets/room_login_dialog.dart index 7324f442..91d2c8c8 100644 --- a/lib/widgets/room_login_dialog.dart +++ b/lib/widgets/room_login_dialog.dart @@ -64,11 +64,22 @@ class _RoomLoginDialogState extends State { bool _isLoggingIn = false; + int _resolveRepeaterIndex = -1; + Contact _resolveRepeater(MeshCoreConnector connector) { - return connector.contacts.firstWhere( + if (_resolveRepeaterIndex >= 0 && + _resolveRepeaterIndex < connector.contacts.length && + connector.contacts[_resolveRepeaterIndex].publicKeyHex == + widget.room.publicKeyHex) { + return connector.contacts[_resolveRepeaterIndex]; + } + _resolveRepeaterIndex = connector.contacts.indexWhere( (c) => c.publicKeyHex == widget.room.publicKeyHex, - orElse: () => widget.room, ); + if (_resolveRepeaterIndex == -1) { + return widget.room; + } + return connector.contacts[_resolveRepeaterIndex]; } Future _handleLogin() async {