Use backend rescan summary in group editor

This commit is contained in:
Artem Kokos
2026-05-16 10:59:31 +07:00
parent 70fedb6134
commit 83d946558b
3 changed files with 76 additions and 38 deletions

View File

@@ -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 {