| 
									
										
										
										
											2022-12-11 21:40:35 +08:00
										 |  |  | import 'package:flutter/widgets.dart'; | 
					
						
							|  |  |  | import 'package:flutter_hbb/common.dart'; | 
					
						
							|  |  |  | import 'package:flutter_hbb/common/hbbs/hbbs.dart'; | 
					
						
							|  |  |  | import 'package:flutter_hbb/models/model.dart'; | 
					
						
							|  |  |  | import 'package:flutter_hbb/models/peer_model.dart'; | 
					
						
							|  |  |  | import 'package:flutter_hbb/models/platform_model.dart'; | 
					
						
							|  |  |  | import 'package:get/get.dart'; | 
					
						
							|  |  |  | import 'dart:convert'; | 
					
						
							|  |  |  | import 'package:http/http.dart' as http; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class GroupModel { | 
					
						
							| 
									
										
										
										
											2023-06-17 20:48:58 +08:00
										 |  |  |   final RxBool groupLoading = false.obs; | 
					
						
							|  |  |  |   final RxString groupLoadError = "".obs; | 
					
						
							|  |  |  |   final RxString groupId = ''.obs; | 
					
						
							| 
									
										
										
										
											2023-06-21 16:04:52 +08:00
										 |  |  |   RxString groupName = ''.obs; | 
					
						
							| 
									
										
										
										
											2022-12-11 21:40:35 +08:00
										 |  |  |   final RxList<UserPayload> users = RxList.empty(growable: true); | 
					
						
							| 
									
										
										
										
											2023-06-21 16:04:52 +08:00
										 |  |  |   final RxList<Peer> peersShow = RxList.empty(growable: true); | 
					
						
							| 
									
										
										
										
											2023-06-21 09:30:32 +08:00
										 |  |  |   final RxString selectedUser = ''.obs; | 
					
						
							|  |  |  |   final RxString searchUserText = ''.obs; | 
					
						
							| 
									
										
										
										
											2022-12-11 21:40:35 +08:00
										 |  |  |   WeakReference<FFI> parent; | 
					
						
							| 
									
										
										
										
											2023-06-23 15:10:10 +08:00
										 |  |  |   var initialized = false; | 
					
						
							| 
									
										
										
										
											2022-12-11 21:40:35 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   GroupModel(this.parent); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-21 16:04:52 +08:00
										 |  |  |   reset() { | 
					
						
							| 
									
										
										
										
											2023-06-17 20:48:58 +08:00
										 |  |  |     groupName.value = ''; | 
					
						
							|  |  |  |     groupId.value = ''; | 
					
						
							| 
									
										
										
										
											2022-12-11 21:40:35 +08:00
										 |  |  |     users.clear(); | 
					
						
							|  |  |  |     peersShow.clear(); | 
					
						
							| 
									
										
										
										
											2023-06-23 15:10:10 +08:00
										 |  |  |     initialized = false; | 
					
						
							| 
									
										
										
										
											2022-12-11 21:40:35 +08:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-23 17:05:48 +08:00
										 |  |  |   Future<void> pull({force = true, quiet = false}) async { | 
					
						
							|  |  |  |     /* | 
					
						
							| 
									
										
										
										
											2023-06-23 15:10:10 +08:00
										 |  |  |     if (!force && initialized) return; | 
					
						
							| 
									
										
										
										
											2023-06-23 17:05:48 +08:00
										 |  |  |     if (!quiet) { | 
					
						
							|  |  |  |       groupLoading.value = true; | 
					
						
							|  |  |  |       groupLoadError.value = ""; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2023-06-21 16:04:52 +08:00
										 |  |  |     await _pull(); | 
					
						
							|  |  |  |     groupLoading.value = false; | 
					
						
							| 
									
										
										
										
											2023-06-23 15:10:10 +08:00
										 |  |  |     initialized = true; | 
					
						
							| 
									
										
										
										
											2023-06-23 17:05:48 +08:00
										 |  |  |     */ | 
					
						
							| 
									
										
										
										
											2023-06-21 16:04:52 +08:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   Future<void> _pull() async { | 
					
						
							|  |  |  |     reset(); | 
					
						
							| 
									
										
										
										
											2023-06-17 20:48:58 +08:00
										 |  |  |     if (bind.mainGetLocalOption(key: 'access_token') == '') { | 
					
						
							|  |  |  |       return; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     try { | 
					
						
							|  |  |  |       if (!await _getGroup()) { | 
					
						
							|  |  |  |         reset(); | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } catch (e) { | 
					
						
							| 
									
										
										
										
											2023-06-21 09:30:32 +08:00
										 |  |  |       debugPrint('$e'); | 
					
						
							| 
									
										
										
										
											2023-06-17 20:48:58 +08:00
										 |  |  |       reset(); | 
					
						
							|  |  |  |       return; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2022-12-11 21:40:35 +08:00
										 |  |  |     final api = "${await bind.mainGetApiServer()}/api/users"; | 
					
						
							|  |  |  |     try { | 
					
						
							|  |  |  |       var uri0 = Uri.parse(api); | 
					
						
							|  |  |  |       final pageSize = 20; | 
					
						
							|  |  |  |       var total = 0; | 
					
						
							| 
									
										
										
										
											2022-12-23 10:36:18 +08:00
										 |  |  |       int current = 0; | 
					
						
							| 
									
										
										
										
											2022-12-11 21:40:35 +08:00
										 |  |  |       do { | 
					
						
							| 
									
										
										
										
											2022-12-23 10:36:18 +08:00
										 |  |  |         current += 1; | 
					
						
							| 
									
										
										
										
											2022-12-11 21:40:35 +08:00
										 |  |  |         var uri = Uri( | 
					
						
							|  |  |  |             scheme: uri0.scheme, | 
					
						
							|  |  |  |             host: uri0.host, | 
					
						
							|  |  |  |             path: uri0.path, | 
					
						
							|  |  |  |             port: uri0.port, | 
					
						
							|  |  |  |             queryParameters: { | 
					
						
							|  |  |  |               'current': current.toString(), | 
					
						
							|  |  |  |               'pageSize': pageSize.toString(), | 
					
						
							| 
									
										
										
										
											2023-06-17 20:48:58 +08:00
										 |  |  |               if (gFFI.userModel.isAdmin.isFalse) 'grp': groupId.value, | 
					
						
							| 
									
										
										
										
											2022-12-11 21:40:35 +08:00
										 |  |  |             }); | 
					
						
							| 
									
										
										
										
											2023-01-06 19:26:19 +09:00
										 |  |  |         final resp = await http.get(uri, headers: getHttpHeaders()); | 
					
						
							| 
									
										
										
										
											2022-12-11 21:40:35 +08:00
										 |  |  |         if (resp.body.isNotEmpty && resp.body.toLowerCase() != "null") { | 
					
						
							| 
									
										
										
										
											2023-06-18 13:53:03 +08:00
										 |  |  |           Map<String, dynamic> json = jsonDecode(utf8.decode(resp.bodyBytes)); | 
					
						
							| 
									
										
										
										
											2022-12-11 21:40:35 +08:00
										 |  |  |           if (json.containsKey('error')) { | 
					
						
							|  |  |  |             throw json['error']; | 
					
						
							|  |  |  |           } else { | 
					
						
							| 
									
										
										
										
											2023-06-17 20:48:58 +08:00
										 |  |  |             if (json.containsKey('total')) { | 
					
						
							|  |  |  |               if (total == 0) total = json['total']; | 
					
						
							|  |  |  |               if (json.containsKey('data')) { | 
					
						
							|  |  |  |                 final data = json['data']; | 
					
						
							|  |  |  |                 if (data is List) { | 
					
						
							|  |  |  |                   for (final user in data) { | 
					
						
							|  |  |  |                     final u = UserPayload.fromJson(user); | 
					
						
							|  |  |  |                     if (!users.any((e) => e.name == u.name)) { | 
					
						
							|  |  |  |                       users.add(u); | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                   } | 
					
						
							| 
									
										
										
										
											2022-12-11 21:40:35 +08:00
										 |  |  |                 } | 
					
						
							|  |  |  |               } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2022-12-23 10:36:18 +08:00
										 |  |  |       } while (current * pageSize < total); | 
					
						
							| 
									
										
										
										
											2022-12-11 21:40:35 +08:00
										 |  |  |     } catch (err) { | 
					
						
							| 
									
										
										
										
											2023-06-21 09:30:32 +08:00
										 |  |  |       debugPrint('$err'); | 
					
						
							| 
									
										
										
										
											2023-06-17 20:48:58 +08:00
										 |  |  |       groupLoadError.value = err.toString(); | 
					
						
							| 
									
										
										
										
											2022-12-11 21:40:35 +08:00
										 |  |  |     } finally { | 
					
						
							| 
									
										
										
										
											2023-06-21 11:51:35 +08:00
										 |  |  |       _pullUserPeers(); | 
					
						
							| 
									
										
										
										
											2022-12-11 21:40:35 +08:00
										 |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-17 20:48:58 +08:00
										 |  |  |   Future<bool> _getGroup() async { | 
					
						
							|  |  |  |     final url = await bind.mainGetApiServer(); | 
					
						
							|  |  |  |     final body = { | 
					
						
							|  |  |  |       'id': await bind.mainGetMyId(), | 
					
						
							|  |  |  |       'uuid': await bind.mainGetUuid() | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  |     try { | 
					
						
							|  |  |  |       final response = await http.post(Uri.parse('$url/api/currentGroup'), | 
					
						
							|  |  |  |           headers: getHttpHeaders(), body: json.encode(body)); | 
					
						
							|  |  |  |       final status = response.statusCode; | 
					
						
							|  |  |  |       if (status == 401 || status == 400) { | 
					
						
							|  |  |  |         return false; | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2023-06-18 13:53:03 +08:00
										 |  |  |       final data = json.decode(utf8.decode(response.bodyBytes)); | 
					
						
							| 
									
										
										
										
											2023-06-17 20:48:58 +08:00
										 |  |  |       final error = data['error']; | 
					
						
							|  |  |  |       if (error != null) { | 
					
						
							|  |  |  |         throw error; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       groupName.value = data['name'] ?? ''; | 
					
						
							|  |  |  |       groupId.value = data['id'] ?? ''; | 
					
						
							|  |  |  |       return groupId.value.isNotEmpty && groupName.isNotEmpty; | 
					
						
							|  |  |  |     } catch (e) { | 
					
						
							| 
									
										
										
										
											2023-06-21 09:30:32 +08:00
										 |  |  |       debugPrint('$e'); | 
					
						
							| 
									
										
										
										
											2023-06-21 16:04:52 +08:00
										 |  |  |       groupLoadError.value = e.toString(); | 
					
						
							| 
									
										
										
										
											2023-06-17 20:48:58 +08:00
										 |  |  |     } finally {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return false; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-21 11:51:35 +08:00
										 |  |  |   Future<void> _pullUserPeers() async { | 
					
						
							| 
									
										
										
										
											2022-12-11 21:40:35 +08:00
										 |  |  |     peersShow.clear(); | 
					
						
							|  |  |  |     final api = "${await bind.mainGetApiServer()}/api/peers"; | 
					
						
							|  |  |  |     try { | 
					
						
							|  |  |  |       var uri0 = Uri.parse(api); | 
					
						
							| 
									
										
										
										
											2023-06-23 17:05:48 +08:00
										 |  |  |       final pageSize = | 
					
						
							|  |  |  |           20; // ????????????????????????????????????????????????????? stupid stupis, how about >20 peers
 | 
					
						
							| 
									
										
										
										
											2022-12-11 21:40:35 +08:00
										 |  |  |       var total = 0; | 
					
						
							| 
									
										
										
										
											2022-12-23 10:36:18 +08:00
										 |  |  |       int current = 0; | 
					
						
							| 
									
										
										
										
											2023-06-21 09:30:32 +08:00
										 |  |  |       var queryParameters = { | 
					
						
							|  |  |  |         'current': current.toString(), | 
					
						
							|  |  |  |         'pageSize': pageSize.toString(), | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  |       if (!gFFI.userModel.isAdmin.value) { | 
					
						
							|  |  |  |         queryParameters.addAll({'grp': groupId.value}); | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2022-12-11 21:40:35 +08:00
										 |  |  |       do { | 
					
						
							| 
									
										
										
										
											2022-12-23 10:36:18 +08:00
										 |  |  |         current += 1; | 
					
						
							| 
									
										
										
										
											2022-12-11 21:40:35 +08:00
										 |  |  |         var uri = Uri( | 
					
						
							|  |  |  |             scheme: uri0.scheme, | 
					
						
							|  |  |  |             host: uri0.host, | 
					
						
							|  |  |  |             path: uri0.path, | 
					
						
							|  |  |  |             port: uri0.port, | 
					
						
							| 
									
										
										
										
											2023-06-21 09:30:32 +08:00
										 |  |  |             queryParameters: queryParameters); | 
					
						
							| 
									
										
										
										
											2023-01-06 19:26:19 +09:00
										 |  |  |         final resp = await http.get(uri, headers: getHttpHeaders()); | 
					
						
							| 
									
										
										
										
											2022-12-11 21:40:35 +08:00
										 |  |  |         if (resp.body.isNotEmpty && resp.body.toLowerCase() != "null") { | 
					
						
							| 
									
										
										
										
											2023-06-18 13:53:03 +08:00
										 |  |  |           Map<String, dynamic> json = jsonDecode(utf8.decode(resp.bodyBytes)); | 
					
						
							| 
									
										
										
										
											2022-12-11 21:40:35 +08:00
										 |  |  |           if (json.containsKey('error')) { | 
					
						
							|  |  |  |             throw json['error']; | 
					
						
							|  |  |  |           } else { | 
					
						
							| 
									
										
										
										
											2023-06-17 20:48:58 +08:00
										 |  |  |             if (json.containsKey('total')) { | 
					
						
							|  |  |  |               if (total == 0) total = json['total']; | 
					
						
							|  |  |  |               if (json.containsKey('data')) { | 
					
						
							|  |  |  |                 final data = json['data']; | 
					
						
							|  |  |  |                 if (data is List) { | 
					
						
							|  |  |  |                   for (final p in data) { | 
					
						
							| 
									
										
										
										
											2023-06-21 16:04:52 +08:00
										 |  |  |                     final peerPayload = PeerPayload.fromJson(p); | 
					
						
							|  |  |  |                     final peer = PeerPayload.toPeer(peerPayload); | 
					
						
							|  |  |  |                     if (!peersShow.any((e) => e.id == peer.id)) { | 
					
						
							|  |  |  |                       peersShow.add(peer); | 
					
						
							|  |  |  |                     } | 
					
						
							| 
									
										
										
										
											2023-06-17 20:48:58 +08:00
										 |  |  |                   } | 
					
						
							| 
									
										
										
										
											2022-12-11 21:40:35 +08:00
										 |  |  |                 } | 
					
						
							|  |  |  |               } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2022-12-23 10:36:18 +08:00
										 |  |  |       } while (current * pageSize < total); | 
					
						
							| 
									
										
										
										
											2022-12-11 21:40:35 +08:00
										 |  |  |     } catch (err) { | 
					
						
							| 
									
										
										
										
											2023-06-21 09:30:32 +08:00
										 |  |  |       debugPrint('$err'); | 
					
						
							| 
									
										
										
										
											2023-06-21 16:04:52 +08:00
										 |  |  |       groupLoadError.value = err.toString(); | 
					
						
							|  |  |  |     } finally {} | 
					
						
							| 
									
										
										
										
											2022-12-11 21:40:35 +08:00
										 |  |  |   } | 
					
						
							|  |  |  | } |