import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import '../utils/frequency_input_formatter.dart'; class EditClearancePage extends StatefulWidget { final String clearanceLimit; final String route; final String altitude; final String squawk; final String frequency; final bool isDarkMode; final Function toggleDarkMode; const EditClearancePage({super.key, required this.clearanceLimit, required this.route, required this.altitude, required this.squawk, required this.frequency, required this.isDarkMode, required this.toggleDarkMode, }); @override EditClearancePageState createState() => EditClearancePageState(); } class EditClearancePageState extends State { final _formKey = GlobalKey(); late TextEditingController _clearanceLimitController; late TextEditingController _routeController; late TextEditingController _altitudeController; late TextEditingController _squawkController; late TextEditingController _frequencyController; final FocusNode _altitudeFocusNode = FocusNode(); @override void initState() { super.initState(); _clearanceLimitController = TextEditingController(text: widget.clearanceLimit); _routeController = TextEditingController(text: widget.route); _altitudeController = TextEditingController(text: widget.altitude); _squawkController = TextEditingController(text: widget.squawk); _frequencyController = TextEditingController(text: widget.frequency); _altitudeFocusNode.addListener(() { if (!_altitudeFocusNode.hasFocus) { _formatAltitude(_altitudeController); } }); } @override void dispose() { _clearanceLimitController.dispose(); _routeController.dispose(); _altitudeController.dispose(); _squawkController.dispose(); _frequencyController.dispose(); _altitudeFocusNode.dispose(); super.dispose(); } void _formatAltitude(TextEditingController controller) { String text = controller.text.trim(); if (text.isEmpty) { return; } if (text.startsWith('FL') || text.endsWith('ft')) { return; } if (RegExp(r'^\d{2,3}$').hasMatch(text)) { controller.text = 'FL$text'; } else if (RegExp(r'^\d{4,}$').hasMatch(text)) { controller.text = '$text ft'; } } void _submitForm() { Navigator.pop( context, { 'clearanceLimit': _clearanceLimitController.text, 'route': _routeController.text, 'altitude': _altitudeController.text, 'squawk': _squawkController.text, 'frequency': _frequencyController.text, }, ); } Widget buildTextField(String label, TextEditingController controller) { return Padding( padding: const EdgeInsets.symmetric(vertical: 10), child: TextFormField( controller: controller, decoration: InputDecoration( labelText: label, border: const OutlineInputBorder(), ), ), ); } Widget buildAltitudeField(TextEditingController controller, FocusNode focusNode) { return Padding( padding: const EdgeInsets.symmetric(vertical: 10), child: TextFormField( controller: controller, focusNode: focusNode, keyboardType: TextInputType.number, decoration: const InputDecoration( labelText: 'Altitude', border: OutlineInputBorder(), ), inputFormatters: [ FilteringTextInputFormatter.digitsOnly, ], ), ); } Widget buildSquawkField(TextEditingController controller) { return Padding( padding: const EdgeInsets.symmetric(vertical: 10), child: TextFormField( controller: controller, keyboardType: TextInputType.number, decoration: const InputDecoration( labelText: 'Transponder (Squawk)', border: OutlineInputBorder(), ), inputFormatters: [ FilteringTextInputFormatter.allow(RegExp(r'[0-7]')), LengthLimitingTextInputFormatter(4), ], ), ); } Widget buildFrequencyField(TextEditingController controller) { return Padding( padding: const EdgeInsets.symmetric(vertical: 10), child: TextFormField( controller: controller, keyboardType: const TextInputType.numberWithOptions(decimal: true), decoration: const InputDecoration( labelText: 'Frequency', border: OutlineInputBorder(), ), inputFormatters: [ FrequencyInputFormatter(), ], ), ); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: const Text('IFR Buddy'), actions: [ IconButton( icon: Icon(widget.isDarkMode ? Icons.dark_mode : Icons.light_mode), onPressed: () { widget.toggleDarkMode(); }, ), ], ), body: Padding( padding: const EdgeInsets.all(16.0), child: Card( elevation: 4, child: Padding( padding: const EdgeInsets.all(16.0), child: Form( key: _formKey, child: ListView( children: [ buildTextField('Clearance Limit', _clearanceLimitController), buildTextField('Route', _routeController), buildAltitudeField(_altitudeController, _altitudeFocusNode), buildSquawkField(_squawkController), buildFrequencyField(_frequencyController), const SizedBox(height: 20), ElevatedButton( onPressed: _submitForm, child: const Text('Submit Edited Clearance'), ), ], ), ), ), ), ), ); } }