import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:qpay/screens/pay/pay_controller.dart'; import 'package:skeletonizer/skeletonizer.dart'; class PayScreen extends StatefulWidget { const PayScreen({super.key}); @override State createState() => _PayScreenState(); } class _PayScreenState extends State with TickerProviderStateMixin { late AnimationController _controller; late Animation _fadeAnimation; late Animation _slideAnimation; final _formKey = GlobalKey(); final _amountController = TextEditingController(); final _descriptionController = TextEditingController(); String _selectedBillType = ''; @override void initState() { super.initState(); _controller = AnimationController( vsync: this, duration: const Duration(milliseconds: 800), ); _fadeAnimation = Tween(begin: 0.0, end: 1.0).animate( CurvedAnimation( parent: _controller, curve: const Interval(0.0, 0.5, curve: Curves.easeOut), ), ); _slideAnimation = Tween( begin: const Offset(0, 0.1), end: Offset.zero, ).animate( CurvedAnimation( parent: _controller, curve: const Interval(0.0, 0.5, curve: Curves.easeOut), ), ); _controller.forward(); } @override void dispose() { _controller.dispose(); _amountController.dispose(); _descriptionController.dispose(); super.dispose(); } void _showErrorSnackBar(String? message) { ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text(message.toString()), behavior: SnackBarBehavior.floating, ), ); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: const Text( 'Make Payment', style: TextStyle(color: Colors.black87), ), ), body: Consumer( builder: (context, controller, child) { if (controller.model.errorMessage != null) { WidgetsBinding.instance.addPostFrameCallback((_) { _showErrorSnackBar(controller.model.errorMessage); }); } return SingleChildScrollView( child: Padding( padding: const EdgeInsets.all(16.0), child: FadeTransition( opacity: _fadeAnimation, child: SlideTransition( position: _slideAnimation, child: Form( key: _formKey, child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ SizedBox(height: 20), _buildBillProductSelector(controller), const SizedBox(height: 24), _buildAmountField(), const SizedBox(height: 24), _buildDescriptionField(), const SizedBox(height: 32), _buildPayButton(), ], ), ), ), ), ), ); }, ), ); } Widget _buildBillProductSelector(PayController controller) { return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ const Text( 'Select Provider Product', style: TextStyle(fontSize: 16, fontWeight: FontWeight.w500), ), const SizedBox(height: 12), Container( padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 4), decoration: BoxDecoration( color: Theme.of(context).colorScheme.surface, borderRadius: BorderRadius.circular(12), border: Border.all( color: Theme.of(context).colorScheme.primary.withOpacity(0.2), ), ), child: DropdownButtonHideUnderline( child: DropdownButton( isExpanded: true, icon: const Icon(Icons.arrow_drop_down), items: [ ...controller.model.products.map( (e) => DropdownMenuItem( value: e.uid, child: Text(e.displayName), ), ), ], onChanged: (String? newValue) { if (newValue != null) { setState(() { _selectedBillType = newValue; }); } }, ), ), ), ], ); } Widget _buildAmountField() { return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ const Text( 'Amount', style: TextStyle(fontSize: 16, fontWeight: FontWeight.w500), ), const SizedBox(height: 12), TextFormField( controller: _amountController, keyboardType: TextInputType.number, decoration: const InputDecoration( prefixIcon: Icon(Icons.attach_money), hintText: 'Enter amount', ), validator: (value) { if (value == null || value.isEmpty) { return 'Please enter an amount'; } if (double.tryParse(value) == null) { return 'Please enter a valid amount'; } return null; }, ), ], ); } Widget _buildDescriptionField() { return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ const Text( 'Description', style: TextStyle(fontSize: 16, fontWeight: FontWeight.w500), ), const SizedBox(height: 12), TextFormField( controller: _descriptionController, maxLines: 3, decoration: const InputDecoration( hintText: 'Enter description (optional)', alignLabelWithHint: true, ), ), ], ); } Widget _buildPayButton() { return SizedBox( width: double.infinity, child: ElevatedButton( onPressed: () { if (_formKey.currentState!.validate()) { // TODO: Implement payment logic ScaffoldMessenger.of(context).showSnackBar( const SnackBar( content: Text('Payment processed successfully!'), backgroundColor: Colors.green, ), ); } }, style: ElevatedButton.styleFrom( padding: const EdgeInsets.symmetric(vertical: 16), ), child: const Text( 'Pay Now', style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold), ), ), ); } }