mirror of
https://github.com/dz0ny/meshcore-sar.git
synced 2026-08-11 16:30:28 +00:00
feat: Add repeater discovery onboarding flow
This commit is contained in:
@@ -12,7 +12,9 @@ import '../widgets/compact_signal_indicator.dart' show SignalMetric;
|
||||
enum _DiscoveryListFilter { all, repeaters, sensors, others }
|
||||
|
||||
class DiscoveryScreen extends StatefulWidget {
|
||||
const DiscoveryScreen({super.key});
|
||||
final bool autoDiscoverRepeatersOnOpen;
|
||||
|
||||
const DiscoveryScreen({super.key, this.autoDiscoverRepeatersOnOpen = false});
|
||||
|
||||
@override
|
||||
State<DiscoveryScreen> createState() => _DiscoveryScreenState();
|
||||
@@ -25,6 +27,7 @@ class _DiscoveryScreenState extends State<DiscoveryScreen> {
|
||||
final Set<int> _runningDiscoveryTypes = <int>{};
|
||||
final TextEditingController _searchController = TextEditingController();
|
||||
bool _isResolvingAll = false;
|
||||
bool _hasQueuedAutoRepeaterDiscovery = false;
|
||||
String _searchQuery = '';
|
||||
_DiscoveryListFilter _selectedFilter = _DiscoveryListFilter.all;
|
||||
late final Future<List<MeshMapNode>> _cachedNodesFuture;
|
||||
@@ -35,6 +38,13 @@ class _DiscoveryScreenState extends State<DiscoveryScreen> {
|
||||
_cachedNodesFuture = MeshMapNodesService.loadCachedNodes(
|
||||
cacheTtl: MeshMapNodesService.traceCacheTtl,
|
||||
);
|
||||
|
||||
if (widget.autoDiscoverRepeatersOnOpen) {
|
||||
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||||
if (!mounted) return;
|
||||
_autoDiscoverRepeaters();
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
@@ -96,9 +106,10 @@ class _DiscoveryScreenState extends State<DiscoveryScreen> {
|
||||
advertType: advertType,
|
||||
);
|
||||
if (!mounted) return;
|
||||
final l10n = AppLocalizations.of(context)!;
|
||||
final label = switch (advertType) {
|
||||
_repeaterAdvertType => 'Repeater discovery sent',
|
||||
_sensorAdvertType => 'Sensor discovery sent',
|
||||
_repeaterAdvertType => l10n.repeaterDiscoverySent,
|
||||
_sensorAdvertType => l10n.sensorDiscoverySent,
|
||||
_ => 'Discovery sent',
|
||||
};
|
||||
ScaffoldMessenger.of(
|
||||
@@ -113,6 +124,14 @@ class _DiscoveryScreenState extends State<DiscoveryScreen> {
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> _autoDiscoverRepeaters() async {
|
||||
if (_hasQueuedAutoRepeaterDiscovery) {
|
||||
return;
|
||||
}
|
||||
_hasQueuedAutoRepeaterDiscovery = true;
|
||||
await _discoverNodeType(_repeaterAdvertType);
|
||||
}
|
||||
|
||||
Future<void> _resolveAdvert(PendingAdvert advert) async {
|
||||
final keyHex = advert.publicKeyHex;
|
||||
if (_resolvingAdvertKeys.contains(keyHex)) return;
|
||||
|
||||
@@ -737,12 +737,10 @@ class _HomeScreenState extends State<HomeScreen>
|
||||
}
|
||||
}
|
||||
|
||||
void _showConnectionDialog(BuildContext context) {
|
||||
showModalBottomSheet(
|
||||
context: context,
|
||||
isScrollControlled: true,
|
||||
Future<void> _showConnectionDialog(BuildContext context) async {
|
||||
await showConnectionDialogFlow(
|
||||
context,
|
||||
backgroundColor: Colors.transparent,
|
||||
builder: (context) => const ConnectionDialog(),
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -221,14 +221,13 @@ class _WelcomeWizardScreenState extends State<WelcomeWizardScreen> {
|
||||
}
|
||||
|
||||
Future<void> _openConnectionDialog() async {
|
||||
await showModalBottomSheet(
|
||||
context: context,
|
||||
isScrollControlled: true,
|
||||
builder: (context) => const ConnectionDialog(),
|
||||
final connected = await showConnectionDialogFlow(
|
||||
context,
|
||||
offerPostConnectRepeaterDiscovery: true,
|
||||
);
|
||||
if (!mounted) return;
|
||||
final connectionProvider = context.read<ConnectionProvider>();
|
||||
if (connectionProvider.deviceInfo.isConnected) {
|
||||
if (connected) {
|
||||
await connectionProvider.refreshDeviceInfo();
|
||||
}
|
||||
if (!mounted) return;
|
||||
|
||||
Reference in New Issue
Block a user