Advertisement
amonnoris

configuration_edit_page.dart

Oct 5th, 2024
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Dart 5.84 KB | Source Code | 0 0
  1. // lib/pages/configuration_edit_page.dart
  2.  
  3. import 'package:flutter/material.dart';
  4. import 'package:flutter/services.dart';
  5. import 'package:flutter_v2ray/flutter_v2ray.dart'; // Import FlutterV2ray
  6. import 'package:provider/provider.dart';
  7. import '../models/v2ray_config.dart';
  8. import '../providers/app_state.dart';
  9.  
  10. class ConfigurationEditPage extends StatefulWidget {
  11.   final V2RayConfig? config;
  12.  
  13.   const ConfigurationEditPage({this.config, Key? key}) : super(key: key);
  14.  
  15.   @override
  16.   _ConfigurationEditPageState createState() => _ConfigurationEditPageState();
  17. }
  18.  
  19. class _ConfigurationEditPageState extends State<ConfigurationEditPage> {
  20.   final _formKey = GlobalKey<FormState>();
  21.   late TextEditingController _nameController;
  22.   late TextEditingController _remarkController;
  23.   late TextEditingController _configTextController;
  24.  
  25.   @override
  26.   void initState() {
  27.     super.initState();
  28.     _nameController = TextEditingController(text: widget.config?.name ?? '');
  29.     _remarkController =
  30.         TextEditingController(text: widget.config?.remark ?? '');
  31.     _configTextController =
  32.         TextEditingController(text: widget.config?.configText ?? '');
  33.   }
  34.  
  35.   Future<void> _saveConfig() async {
  36.     if (_formKey.currentState?.validate() ?? false) {
  37.       final newConfig = V2RayConfig(
  38.         name: _nameController.text.trim(),
  39.         remark: _remarkController.text.trim(),
  40.         configText: _configTextController.text.trim(),
  41.       );
  42.       final appState = Provider.of<AppState>(context, listen: false);
  43.       await appState.addConfig(newConfig);
  44.       Navigator.pop(context);
  45.     }
  46.   }
  47.  
  48.   @override
  49.   void dispose() {
  50.     _nameController.dispose();
  51.     _remarkController.dispose();
  52.     _configTextController.dispose();
  53.     super.dispose();
  54.   }
  55.  
  56.   void importConfigFromClipboard() async {
  57.     if (await Clipboard.hasStrings()) {
  58.       final clipboardData = await Clipboard.getData('text/plain');
  59.       if (clipboardData != null) {
  60.         final String content = clipboardData.text?.trim() ?? '';
  61.         try {
  62.           if (content.startsWith('vless://') ||
  63.               content.startsWith('vmess://') ||
  64.               content.startsWith('trojan://')) {
  65.             // It's a V2Ray share link
  66.             final V2RayURL v2rayURL = FlutterV2ray.parseFromURL(content);
  67.             final String jsonConfig = v2rayURL.getFullConfiguration();
  68.  
  69.             // Update the controllers with parsed data
  70.             setState(() {
  71.               _nameController.text = v2rayURL.remark.isNotEmpty
  72.                   ? v2rayURL.remark
  73.                   : '${v2rayURL.address}:${v2rayURL.port}';
  74.               _remarkController.text = v2rayURL.remark;
  75.               _configTextController.text = jsonConfig;
  76.             });
  77.  
  78.             ScaffoldMessenger.of(context).showSnackBar(
  79.               const SnackBar(
  80.                 content: Text('Configuration imported successfully.'),
  81.               ),
  82.             );
  83.           } else {
  84.             // Assume it's JSON configuration
  85.             setState(() {
  86.               _configTextController.text = content;
  87.             });
  88.             ScaffoldMessenger.of(context).showSnackBar(
  89.               const SnackBar(
  90.                 content: Text('Configuration imported as JSON.'),
  91.               ),
  92.             );
  93.           }
  94.         } catch (error) {
  95.           ScaffoldMessenger.of(context).showSnackBar(
  96.             SnackBar(
  97.               content: Text('Error importing configuration: $error'),
  98.             ),
  99.           );
  100.         }
  101.       }
  102.     }
  103.   }
  104.  
  105.   @override
  106.   Widget build(BuildContext context) {
  107.     final isEditing = widget.config != null;
  108.  
  109.     return Scaffold(
  110.       appBar: AppBar(
  111.         title: Text(isEditing ? 'Edit Configuration' : 'Add Configuration'),
  112.       ),
  113.       body: Padding(
  114.         padding: const EdgeInsets.all(16.0),
  115.         child: Form(
  116.           key: _formKey,
  117.           child: Column(
  118.             children: [
  119.               TextFormField(
  120.                 controller: _nameController,
  121.                 decoration:
  122.                     const InputDecoration(labelText: 'Configuration Name'),
  123.                 validator: (value) {
  124.                   if (value == null || value.trim().isEmpty) {
  125.                     return 'Please enter a configuration name.';
  126.                   }
  127.                   return null;
  128.                 },
  129.               ),
  130.               const SizedBox(height: 10),
  131.               TextFormField(
  132.                 controller: _remarkController,
  133.                 decoration: const InputDecoration(labelText: 'Remark'),
  134.               ),
  135.               const SizedBox(height: 10),
  136.               Expanded(
  137.                 child: TextFormField(
  138.                   controller: _configTextController,
  139.                   decoration: const InputDecoration(
  140.                     labelText: 'Configuration Text (JSON format)',
  141.                     alignLabelWithHint: true,
  142.                     border: OutlineInputBorder(),
  143.                   ),
  144.                   maxLines: null,
  145.                   expands: true,
  146.                   validator: (value) {
  147.                     if (value == null || value.trim().isEmpty) {
  148.                       return 'Configuration text cannot be empty.';
  149.                     }
  150.                     return null;
  151.                   },
  152.                 ),
  153.               ),
  154.               const SizedBox(height: 10),
  155.               Row(
  156.                 children: [
  157.                   ElevatedButton(
  158.                     onPressed: _saveConfig,
  159.                     child: const Text('Save'),
  160.                   ),
  161.                   const SizedBox(width: 10),
  162.                   ElevatedButton(
  163.                     onPressed: importConfigFromClipboard,
  164.                     child: const Text('Import from Clipboard'),
  165.                   ),
  166.                 ],
  167.               ),
  168.             ],
  169.           ),
  170.         ),
  171.       ),
  172.     );
  173.   }
  174. }
  175.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement