import 'package:riverpod_annotation/riverpod_annotation.dart'; import '../../../../backend/api/commands.dart' as commands; import '../../../../backend/discovery/model.dart'; part 'peers_controller.g.dart'; @riverpod class PeersController extends _$PeersController { @override Future> build() async { return commands.getPeers(); } Future refresh() async { state = const AsyncLoading(); state = await AsyncValue.guard(commands.getPeers); } void upsertPeer(Peer peer) { final current = state.asData?.value ?? const []; final index = current.indexWhere((item) => item.id == peer.id); if (index < 0) { state = AsyncData([...current, peer]); return; } final old = current[index]; if (old == peer) { return; } final next = [...current]; next[index] = peer; state = AsyncData(next); } void removePeer(String id) { final current = state.asData?.value; if (current == null || current.isEmpty) { return; } final next = current.where((item) => item.id != id).toList(growable: false); if (next.length != current.length) { state = AsyncData(next); } } }