| 
									
										
										
										
											2023-05-08 12:34:19 +08:00
										 |  |  | import 'dart:convert'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import 'package:flutter/material.dart'; | 
					
						
							|  |  |  | import 'package:flutter_hbb/common.dart'; | 
					
						
							|  |  |  | import 'package:flutter_hbb/models/platform_model.dart'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void showPeerSelectionDialog( | 
					
						
							|  |  |  |     {bool singleSelection = false, | 
					
						
							|  |  |  |     required Function(List<String>) onPeersCallback}) { | 
					
						
							|  |  |  |   final peers = bind.mainLoadRecentPeersSync(); | 
					
						
							|  |  |  |   if (peers.isEmpty) { | 
					
						
							|  |  |  |     debugPrint("load recent peers sync failed."); | 
					
						
							|  |  |  |     return; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   Map<String, dynamic> map = jsonDecode(peers); | 
					
						
							|  |  |  |   List<dynamic> peersList = map['peers'] ?? []; | 
					
						
							|  |  |  |   final selected = List<String>.empty(growable: true); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   submit() async { | 
					
						
							|  |  |  |     onPeersCallback.call(selected); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   gFFI.dialogManager.show((setState, close, context) { | 
					
						
							|  |  |  |     return CustomAlertDialog( | 
					
						
							|  |  |  |       title: | 
					
						
							|  |  |  |           Text(translate(singleSelection ? "Select peers" : "Select a peer")), | 
					
						
							|  |  |  |       content: SizedBox( | 
					
						
							|  |  |  |         height: 300.0, | 
					
						
							|  |  |  |         child: ListView.builder( | 
					
						
							|  |  |  |           itemBuilder: (context, index) { | 
					
						
							|  |  |  |             final Map<String, dynamic> peer = peersList[index]; | 
					
						
							|  |  |  |             final String platform = peer['platform'] ?? ""; | 
					
						
							|  |  |  |             final String id = peer['id'] ?? ""; | 
					
						
							|  |  |  |             final String alias = peer['alias'] ?? ""; | 
					
						
							|  |  |  |             return GestureDetector( | 
					
						
							|  |  |  |               onTap: () { | 
					
						
							|  |  |  |                 setState(() { | 
					
						
							|  |  |  |                   if (selected.contains(id)) { | 
					
						
							|  |  |  |                     selected.remove(id); | 
					
						
							|  |  |  |                   } else { | 
					
						
							|  |  |  |                     selected.add(id); | 
					
						
							|  |  |  |                   } | 
					
						
							|  |  |  |                 }); | 
					
						
							|  |  |  |               }, | 
					
						
							|  |  |  |               child: Container( | 
					
						
							|  |  |  |                 key: ValueKey(index), | 
					
						
							|  |  |  |                 height: 50.0, | 
					
						
							|  |  |  |                 decoration: BoxDecoration( | 
					
						
							| 
									
										
										
										
											2023-06-23 17:05:48 +08:00
										 |  |  |                     color: Theme.of(context).highlightColor, | 
					
						
							|  |  |  |                     borderRadius: BorderRadius.circular(12.0)), | 
					
						
							| 
									
										
										
										
											2023-05-08 12:34:19 +08:00
										 |  |  |                 padding: EdgeInsets.symmetric(horizontal: 16.0, vertical: 4.0), | 
					
						
							|  |  |  |                 margin: EdgeInsets.symmetric(vertical: 4.0), | 
					
						
							|  |  |  |                 child: Row( | 
					
						
							|  |  |  |                   crossAxisAlignment: CrossAxisAlignment.center, | 
					
						
							|  |  |  |                   mainAxisSize: MainAxisSize.max, | 
					
						
							|  |  |  |                   children: [ | 
					
						
							|  |  |  |                     // platform
 | 
					
						
							| 
									
										
										
										
											2023-06-23 17:05:48 +08:00
										 |  |  |                     SizedBox( | 
					
						
							|  |  |  |                       width: 8.0, | 
					
						
							|  |  |  |                     ), | 
					
						
							| 
									
										
										
										
											2023-05-08 12:34:19 +08:00
										 |  |  |                     Column( | 
					
						
							|  |  |  |                       mainAxisAlignment: MainAxisAlignment.center, | 
					
						
							|  |  |  |                       children: [ | 
					
						
							|  |  |  |                         getPlatformImage(platform, size: 34.0), | 
					
						
							|  |  |  |                       ], | 
					
						
							|  |  |  |                     ), | 
					
						
							| 
									
										
										
										
											2023-06-23 17:05:48 +08:00
										 |  |  |                     SizedBox( | 
					
						
							|  |  |  |                       width: 8.0, | 
					
						
							|  |  |  |                     ), | 
					
						
							| 
									
										
										
										
											2023-05-08 12:34:19 +08:00
										 |  |  |                     // id/alias
 | 
					
						
							|  |  |  |                     Expanded(child: Text(alias.isEmpty ? id : alias)), | 
					
						
							|  |  |  |                   ], | 
					
						
							|  |  |  |                 ), | 
					
						
							|  |  |  |               ), | 
					
						
							|  |  |  |             ); | 
					
						
							|  |  |  |           }, | 
					
						
							|  |  |  |           itemCount: peersList.length, | 
					
						
							|  |  |  |           itemExtent: 50.0, | 
					
						
							|  |  |  |         ), | 
					
						
							|  |  |  |       ), | 
					
						
							|  |  |  |       onSubmit: submit, | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | } |