Advertisement
amonnoris

configuration_list_page.dart

Oct 5th, 2024
159
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Dart 5.91 KB | Source Code | 0 0
  1. // lib/pages/configuration_list_page.dart
  2.  
  3. import 'package:flutter/material.dart';
  4. import 'package:provider/provider.dart';
  5. import '../models/v2ray_config.dart';
  6. import '../providers/app_state.dart';
  7. import 'configuration_edit_page.dart';
  8.  
  9. class ConfigurationListPage extends StatelessWidget {
  10.   final Function(int)?
  11.       onNavigate; // Optional callback to navigate to a specific tab
  12.  
  13.   const ConfigurationListPage({super.key, this.onNavigate});
  14.  
  15.   @override
  16.   Widget build(BuildContext context) {
  17.     final appState = Provider.of<AppState>(context);
  18.  
  19.     return Scaffold(
  20.       appBar: AppBar(
  21.         title: const Text('Servers'),
  22.         actions: [
  23.           IconButton(
  24.             icon: const Icon(Icons.add),
  25.             onPressed: appState.isConnected
  26.                 ? null
  27.                 : () async {
  28.                     await Navigator.push(
  29.                       context,
  30.                       MaterialPageRoute(
  31.                         builder: (context) => ConfigurationEditPage(),
  32.                       ),
  33.                     );
  34.                   },
  35.             tooltip: appState.isConnected
  36.                 ? 'Cannot add while connected'
  37.                 : 'Add Configuration',
  38.           ),
  39.         ],
  40.       ),
  41.       body: appState.configs.isEmpty
  42.           ? const Center(
  43.               child: Text('No configurations available.'),
  44.             )
  45.           : ListView.builder(
  46.               itemCount: appState.configs.length,
  47.               itemBuilder: (context, index) {
  48.                 final config = appState.configs[index];
  49.                 final isSelected = config.name == appState.selectedConfig?.name;
  50.  
  51.                 return ListTile(
  52.                   title: Text(config.name),
  53.                   subtitle: Text(config.remark),
  54.                   leading: isSelected
  55.                       ? const Icon(Icons.check_circle, color: Colors.green)
  56.                       : const Icon(Icons.circle_outlined),
  57.                   onTap: appState.isConnected
  58.                       ? null // Disable selection when connected
  59.                       : () {
  60.                           appState.selectConfig(config);
  61.                           if (onNavigate != null) {
  62.                             onNavigate!(0); // Navigate to Home tab
  63.                           } else {
  64.                             Navigator.pop(
  65.                                 context); // Fallback to pop if callback not provided
  66.                           }
  67.                         },
  68.                   trailing: Row(
  69.                     mainAxisSize: MainAxisSize.min,
  70.                     children: [
  71.                       IconButton(
  72.                         icon: const Icon(Icons.edit),
  73.                         onPressed: appState.isConnected
  74.                             ? null // Disable edit when connected
  75.                             : () async {
  76.                                 await Navigator.push(
  77.                                   context,
  78.                                   MaterialPageRoute(
  79.                                     builder: (context) =>
  80.                                         ConfigurationEditPage(config: config),
  81.                                   ),
  82.                                 );
  83.                               },
  84.                         tooltip: appState.isConnected
  85.                             ? 'Cannot edit while connected'
  86.                             : 'Edit Configuration',
  87.                       ),
  88.                       IconButton(
  89.                         icon: const Icon(Icons.delete),
  90.                         onPressed: appState.isConnected
  91.                             ? null // Disable delete when connected
  92.                             : () async {
  93.                                 // Confirm deletion with the user
  94.                                 final confirm = await showDialog<bool>(
  95.                                   context: context,
  96.                                   builder: (context) {
  97.                                     return AlertDialog(
  98.                                       title: const Text('Delete Configuration'),
  99.                                       content: const Text(
  100.                                           'Are you sure you want to delete this configuration?'),
  101.                                       actions: [
  102.                                         TextButton(
  103.                                           onPressed: () =>
  104.                                               Navigator.of(context).pop(false),
  105.                                           child: const Text('Cancel'),
  106.                                         ),
  107.                                         TextButton(
  108.                                           onPressed: () =>
  109.                                               Navigator.of(context).pop(true),
  110.                                           child: const Text('Delete'),
  111.                                         ),
  112.                                       ],
  113.                                     );
  114.                                   },
  115.                                 );
  116.  
  117.                                 if (confirm == true) {
  118.                                   await appState.deleteConfig(config);
  119.                                   ScaffoldMessenger.of(context).showSnackBar(
  120.                                     const SnackBar(
  121.                                       content: Text('Configuration deleted'),
  122.                                     ),
  123.                                   );
  124.                                 }
  125.                               },
  126.                         tooltip: appState.isConnected
  127.                             ? 'Cannot delete while connected'
  128.                             : 'Delete Configuration',
  129.                       ),
  130.                     ],
  131.                   ),
  132.                   // Optionally, visually indicate disabled state
  133.                   enabled: !appState.isConnected,
  134.                 );
  135.               },
  136.             ),
  137.     );
  138.   }
  139. }
  140.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement