Use backend rescan summary in group editor
This commit is contained in:
@@ -80,39 +80,19 @@ class _GroupEditScreenState extends ConsumerState<GroupEditScreen> {
|
||||
}
|
||||
|
||||
Future<void> _rescan() async {
|
||||
final beforeIds = ref
|
||||
.read(devicesProvider)
|
||||
.data
|
||||
.map((device) => device.groupMemberId)
|
||||
.toSet();
|
||||
|
||||
setState(() => _rescanning = true);
|
||||
try {
|
||||
await ref.read(apiProvider).rescanNetwork();
|
||||
|
||||
var changed = false;
|
||||
for (var attempt = 0; attempt < 6; attempt++) {
|
||||
await Future.delayed(const Duration(seconds: 1));
|
||||
await ref.read(devicesProvider.notifier).load();
|
||||
final currentIds = ref
|
||||
.read(devicesProvider)
|
||||
.data
|
||||
.map((device) => device.groupMemberId)
|
||||
.toSet();
|
||||
if (!_sameSet(beforeIds, currentIds)) {
|
||||
changed = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
final response = await ref.read(apiProvider).rescanNetwork();
|
||||
await ref.read(devicesProvider.notifier).load();
|
||||
final summary = response.data is Map
|
||||
? Map<String, dynamic>.from(response.data as Map)
|
||||
: const <String, dynamic>{};
|
||||
final message = formatRescanSummary(summary);
|
||||
|
||||
if (!mounted) return;
|
||||
ScaffoldMessenger.of(context).showSnackBar(
|
||||
SnackBar(
|
||||
content: Text(
|
||||
changed
|
||||
? 'Список устройств обновился'
|
||||
: 'Сканирование завершилось, но новых устройств пока не видно',
|
||||
),
|
||||
content: Text(message),
|
||||
duration: const Duration(seconds: 2),
|
||||
),
|
||||
);
|
||||
@@ -427,17 +407,31 @@ class _GroupEditScreenState extends ConsumerState<GroupEditScreen> {
|
||||
);
|
||||
}
|
||||
|
||||
bool _sameSet(Set<String> left, Set<String> right) {
|
||||
if (left.length != right.length) {
|
||||
return false;
|
||||
}
|
||||
for (final item in left) {
|
||||
if (!right.contains(item)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
int _summaryInt(Map<String, dynamic> summary, String key) {
|
||||
final value = summary[key];
|
||||
if (value is int) {
|
||||
return value;
|
||||
}
|
||||
return int.tryParse(value?.toString() ?? '') ?? 0;
|
||||
}
|
||||
|
||||
String formatRescanSummary(Map<String, dynamic> summary) {
|
||||
final found = _summaryInt(summary, 'found');
|
||||
final added = _summaryInt(summary, 'added');
|
||||
final updated = _summaryInt(summary, 'updated');
|
||||
final removed = _summaryInt(summary, 'removed_offline');
|
||||
|
||||
if (added == 0 && updated == 0 && removed == 0 && found == 0) {
|
||||
return 'Сканирование завершено: устройства не найдены';
|
||||
}
|
||||
|
||||
if (added == 0 && removed == 0) {
|
||||
return 'Сканирование завершено: найдено $found, обновлено $updated';
|
||||
}
|
||||
|
||||
return 'Сканирование завершено: найдено $found, новых $added, обновлено $updated, убрано $removed';
|
||||
}
|
||||
|
||||
class _ConflictBanner extends StatelessWidget {
|
||||
|
||||
Reference in New Issue
Block a user