209 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
			
		
		
	
	
			209 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
| import 'package:flutter/material.dart';
 | |
| import 'package:flutter/services.dart';
 | |
| 
 | |
| import '../../common.dart';
 | |
| import '../../models/platform_model.dart';
 | |
| 
 | |
| void changeIdDialog() {
 | |
|   var newId = "";
 | |
|   var msg = "";
 | |
|   var isInProgress = false;
 | |
|   TextEditingController controller = TextEditingController();
 | |
|   gFFI.dialogManager.show((setState, close) {
 | |
|     submit() async {
 | |
|       debugPrint("onSubmit");
 | |
|       newId = controller.text.trim();
 | |
|       setState(() {
 | |
|         msg = "";
 | |
|         isInProgress = true;
 | |
|         bind.mainChangeId(newId: newId);
 | |
|       });
 | |
| 
 | |
|       var status = await bind.mainGetAsyncStatus();
 | |
|       while (status == " ") {
 | |
|         await Future.delayed(const Duration(milliseconds: 100));
 | |
|         status = await bind.mainGetAsyncStatus();
 | |
|       }
 | |
|       if (status.isEmpty) {
 | |
|         // ok
 | |
|         close();
 | |
|         return;
 | |
|       }
 | |
|       setState(() {
 | |
|         isInProgress = false;
 | |
|         msg = translate(status);
 | |
|       });
 | |
|     }
 | |
| 
 | |
|     return CustomAlertDialog(
 | |
|       title: Text(translate("Change ID")),
 | |
|       content: Column(
 | |
|         crossAxisAlignment: CrossAxisAlignment.start,
 | |
|         children: [
 | |
|           Text(translate("id_change_tip")),
 | |
|           const SizedBox(
 | |
|             height: 12.0,
 | |
|           ),
 | |
|           TextField(
 | |
|             decoration: InputDecoration(
 | |
|                 border: const OutlineInputBorder(),
 | |
|                 errorText: msg.isEmpty ? null : translate(msg)),
 | |
|             inputFormatters: [
 | |
|               LengthLimitingTextInputFormatter(16),
 | |
|               // FilteringTextInputFormatter(RegExp(r"[a-zA-z][a-zA-z0-9\_]*"), allow: true)
 | |
|             ],
 | |
|             maxLength: 16,
 | |
|             controller: controller,
 | |
|             focusNode: FocusNode()..requestFocus(),
 | |
|           ),
 | |
|           const SizedBox(
 | |
|             height: 4.0,
 | |
|           ),
 | |
|           Offstage(
 | |
|               offstage: !isInProgress, child: const LinearProgressIndicator())
 | |
|         ],
 | |
|       ),
 | |
|       actions: [
 | |
|         TextButton(onPressed: close, child: Text(translate("Cancel"))),
 | |
|         TextButton(onPressed: submit, child: Text(translate("OK"))),
 | |
|       ],
 | |
|       onSubmit: submit,
 | |
|       onCancel: close,
 | |
|     );
 | |
|   });
 | |
| }
 | |
| 
 | |
| void changeWhiteList({Function()? callback}) async {
 | |
|   var newWhiteList = (await bind.mainGetOption(key: 'whitelist')).split(',');
 | |
|   var newWhiteListField = newWhiteList.join('\n');
 | |
|   var controller = TextEditingController(text: newWhiteListField);
 | |
|   var msg = "";
 | |
|   var isInProgress = false;
 | |
|   gFFI.dialogManager.show((setState, close) {
 | |
|     return CustomAlertDialog(
 | |
|       title: Text(translate("IP Whitelisting")),
 | |
|       content: Column(
 | |
|         crossAxisAlignment: CrossAxisAlignment.start,
 | |
|         children: [
 | |
|           Text(translate("whitelist_sep")),
 | |
|           const SizedBox(
 | |
|             height: 8.0,
 | |
|           ),
 | |
|           Row(
 | |
|             children: [
 | |
|               Expanded(
 | |
|                 child: TextField(
 | |
|                     maxLines: null,
 | |
|                     decoration: InputDecoration(
 | |
|                       border: const OutlineInputBorder(),
 | |
|                       errorText: msg.isEmpty ? null : translate(msg),
 | |
|                     ),
 | |
|                     controller: controller,
 | |
|                     focusNode: FocusNode()..requestFocus()),
 | |
|               ),
 | |
|             ],
 | |
|           ),
 | |
|           const SizedBox(
 | |
|             height: 4.0,
 | |
|           ),
 | |
|           Offstage(
 | |
|               offstage: !isInProgress, child: const LinearProgressIndicator())
 | |
|         ],
 | |
|       ),
 | |
|       actions: [
 | |
|         TextButton(onPressed: close, child: Text(translate("Cancel"))),
 | |
|         TextButton(
 | |
|             onPressed: () async {
 | |
|               await bind.mainSetOption(key: 'whitelist', value: '');
 | |
|               callback?.call();
 | |
|               close();
 | |
|             },
 | |
|             child: Text(translate("Clear"))),
 | |
|         TextButton(
 | |
|             onPressed: () async {
 | |
|               setState(() {
 | |
|                 msg = "";
 | |
|                 isInProgress = true;
 | |
|               });
 | |
|               newWhiteListField = controller.text.trim();
 | |
|               var newWhiteList = "";
 | |
|               if (newWhiteListField.isEmpty) {
 | |
|                 // pass
 | |
|               } else {
 | |
|                 final ips =
 | |
|                     newWhiteListField.trim().split(RegExp(r"[\s,;\n]+"));
 | |
|                 // test ip
 | |
|                 final ipMatch = RegExp(r"^\d+\.\d+\.\d+\.\d+$");
 | |
|                 for (final ip in ips) {
 | |
|                   if (!ipMatch.hasMatch(ip)) {
 | |
|                     msg = "${translate("Invalid IP")} $ip";
 | |
|                     setState(() {
 | |
|                       isInProgress = false;
 | |
|                     });
 | |
|                     return;
 | |
|                   }
 | |
|                 }
 | |
|                 newWhiteList = ips.join(',');
 | |
|               }
 | |
|               await bind.mainSetOption(key: 'whitelist', value: newWhiteList);
 | |
|               callback?.call();
 | |
|               close();
 | |
|             },
 | |
|             child: Text(translate("OK"))),
 | |
|       ],
 | |
|       onCancel: close,
 | |
|     );
 | |
|   });
 | |
| }
 | |
| 
 | |
| Future<String> changeDirectAccessPort(
 | |
|     String currentIP, String currentPort) async {
 | |
|   final controller = TextEditingController(text: currentPort);
 | |
|   await gFFI.dialogManager.show((setState, close) {
 | |
|     return CustomAlertDialog(
 | |
|       title: Text(translate("Change Local Port")),
 | |
|       content: Column(
 | |
|         crossAxisAlignment: CrossAxisAlignment.start,
 | |
|         children: [
 | |
|           const SizedBox(height: 8.0),
 | |
|           Row(
 | |
|             children: [
 | |
|               Expanded(
 | |
|                 child: TextField(
 | |
|                     maxLines: null,
 | |
|                     keyboardType: TextInputType.number,
 | |
|                     decoration: InputDecoration(
 | |
|                         hintText: '21118',
 | |
|                         isCollapsed: true,
 | |
|                         prefix: Text('$currentIP : '),
 | |
|                         suffix: IconButton(
 | |
|                             padding: EdgeInsets.zero,
 | |
|                             icon: const Icon(Icons.clear, size: 16),
 | |
|                             onPressed: () => controller.clear())),
 | |
|                     inputFormatters: [
 | |
|                       FilteringTextInputFormatter.allow(RegExp(
 | |
|                           r'^([0-9]|[1-9]\d|[1-9]\d{2}|[1-9]\d{3}|[1-5]\d{4}|6[0-4]\d{3}|65[0-4]\d{2}|655[0-2]\d|6553[0-5])$')),
 | |
|                     ],
 | |
|                     controller: controller,
 | |
|                     focusNode: FocusNode()..requestFocus()),
 | |
|               ),
 | |
|             ],
 | |
|           ),
 | |
|         ],
 | |
|       ),
 | |
|       actions: [
 | |
|         TextButton(onPressed: close, child: Text(translate("Cancel"))),
 | |
|         TextButton(
 | |
|             onPressed: () async {
 | |
|               await bind.mainSetOption(
 | |
|                   key: 'direct-access-port', value: controller.text);
 | |
|               close();
 | |
|             },
 | |
|             child: Text(translate("OK"))),
 | |
|       ],
 | |
|       onCancel: close,
 | |
|     );
 | |
|   });
 | |
|   return controller.text;
 | |
| }
 |