import 'dart:convert'; import 'package:flutter/foundation.dart'; import 'platform_model.dart'; class Peer { final String id; final String username; final String hostname; final String platform; final List tags; bool online = false; Peer.fromJson(this.id, Map json) : username = json['username'] ?? '', hostname = json['hostname'] ?? '', platform = json['platform'] ?? '', tags = json['tags'] ?? []; Peer({ required this.id, required this.username, required this.hostname, required this.platform, required this.tags, }); Peer.loading() : this( id: '...', username: '...', hostname: '...', platform: '...', tags: []); } class Peers extends ChangeNotifier { final String name; final String loadEvent; List peers; static const _cbQueryOnlines = 'callback_query_onlines'; Peers({required this.name, required this.peers, required this.loadEvent}) { platformFFI.registerEventHandler(_cbQueryOnlines, name, (evt) { _updateOnlineState(evt); }); platformFFI.registerEventHandler(loadEvent, name, (evt) { _updatePeers(evt); }); } @override void dispose() { platformFFI.unregisterEventHandler(_cbQueryOnlines, name); platformFFI.unregisterEventHandler(loadEvent, name); super.dispose(); } Peer getByIndex(int index) { if (index < peers.length) { return peers[index]; } else { return Peer.loading(); } } int getPeersCount() { return peers.length; } void _updateOnlineState(Map evt) { evt['onlines'].split(',').forEach((online) { for (var i = 0; i < peers.length; i++) { if (peers[i].id == online) { peers[i].online = true; } } }); evt['offlines'].split(',').forEach((offline) { for (var i = 0; i < peers.length; i++) { if (peers[i].id == offline) { peers[i].online = false; } } }); notifyListeners(); } void _updatePeers(Map evt) { final onlineStates = _getOnlineStates(); peers = _decodePeers(evt['peers']); for (var peer in peers) { final state = onlineStates[peer.id]; peer.online = state != null && state != false; } notifyListeners(); } Map _getOnlineStates() { var onlineStates = {}; for (var peer in peers) { onlineStates[peer.id] = peer.online; } return onlineStates; } List _decodePeers(String peersStr) { try { if (peersStr == "") return []; List peers = json.decode(peersStr); return peers .map((s) => s as List) .map((s) => Peer.fromJson(s[0] as String, s[1] as Map)) .toList(); } catch (e) { debugPrint('peers(): $e'); } return []; } }