import 'package:flutter/material.dart'; import 'package:intl_phone_field/intl_phone_field.dart'; import 'package:telemednet/data/services/data_service.dart'; import 'package:telemednet/data/services/navigation_service.dart'; import 'package:telemednet/widgets/primary_button.dart'; class SignUpScreen extends StatefulWidget { final String selectedUserType; const SignUpScreen({ super.key, required this.selectedUserType, }); @override State createState() => _SignUpScreenState(); } class _SignUpScreenState extends State { final GlobalKey _formKey = GlobalKey(); final _emailController = TextEditingController(); final _passwordController = TextEditingController(); String _completePhoneNumber = ''; bool _isLoading = false; bool _obscurePassword = true; @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: const Text('Sign Up'), elevation: 0, ), body: Container( decoration: const BoxDecoration(), child: Form( key: _formKey, child: SingleChildScrollView( padding: const EdgeInsets.all(24.0), child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ Text( 'Register as ${widget.selectedUserType}', style: Theme.of(context).textTheme.headlineLarge?.copyWith( fontWeight: FontWeight.bold, ), ), const SizedBox(height: 24), Column( children: [ TextFormField( controller: _emailController, decoration: InputDecoration( labelText: 'Email', border: OutlineInputBorder( borderRadius: BorderRadius.circular(8), ), enabledBorder: OutlineInputBorder( borderRadius: BorderRadius.circular(8), borderSide: BorderSide(color: Colors.grey.shade300), ), focusedBorder: OutlineInputBorder( borderRadius: BorderRadius.circular(8), ), prefixIcon: const Icon(Icons.email_outlined, color: Colors.blue), ), keyboardType: TextInputType.emailAddress, validator: (value) { if (value?.isEmpty ?? true) { return 'Please enter your email'; } if (!RegExp(r'^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$') .hasMatch(value!)) { return 'Please enter a valid email'; } return null; }, ), const SizedBox(height: 16), TextFormField( controller: _passwordController, decoration: InputDecoration( labelText: 'Password', border: OutlineInputBorder( borderRadius: BorderRadius.circular(8), ), enabledBorder: OutlineInputBorder( borderRadius: BorderRadius.circular(8), borderSide: BorderSide(color: Colors.grey.shade300), ), focusedBorder: OutlineInputBorder( borderRadius: BorderRadius.circular(8), borderSide: const BorderSide(color: Colors.blue), ), prefixIcon: const Icon(Icons.lock_outline, color: Colors.blue), suffixIcon: IconButton( icon: Icon( _obscurePassword ? Icons.visibility_off : Icons.visibility, color: Colors.blue, ), onPressed: () => setState( () => _obscurePassword = !_obscurePassword), ), ), obscureText: _obscurePassword, validator: (value) { if (value?.isEmpty ?? true) { return 'Please enter your password'; } if ((value?.length ?? 0) < 6) { return 'Password must be at least 6 characters'; } return null; }, ), const SizedBox(height: 16), IntlPhoneField( decoration: InputDecoration( labelText: 'Phone Number', border: OutlineInputBorder( borderRadius: BorderRadius.circular(8), ), enabledBorder: OutlineInputBorder( borderRadius: BorderRadius.circular(8), borderSide: BorderSide(color: Colors.grey.shade300), ), focusedBorder: OutlineInputBorder( borderRadius: BorderRadius.circular(8), borderSide: const BorderSide(color: Colors.blue), ), ), initialCountryCode: 'IN', onChanged: (phone) { _completePhoneNumber = phone.completeNumber; }, validator: (phone) { if (phone?.completeNumber.isEmpty ?? true) { return 'Please enter your phone number'; } return null; }, dropdownTextStyle: const TextStyle(color: Colors.blue), style: const TextStyle(color: Colors.blue), ), ], ), const SizedBox(height: 24), PrimaryButton( onPressed: _isLoading ? null : _handleSignUp, text: _isLoading ? 'Creating Account...' : 'Create Account', icon: Icons.person_add, ), ], ), ), ), ), ); } Future _handleSignUp() async { if (_formKey.currentState == null || !_formKey.currentState!.validate()) { return; } setState(() { _isLoading = true; }); try { final result = await DataService.createUserProfile( email: _emailController.text.trim(), password: _passwordController.text, userType: widget.selectedUserType, phoneNumber: _completePhoneNumber, ); if (mounted) { if (result['success']) { if (widget.selectedUserType.toLowerCase() == 'doctor') { await NavigationService.handleDoctorNavigation(context); } else { await NavigationService.handlePatientNavigation(context); } } else { _showErrorSnackBar(result['message']); } } } catch (e) { if (mounted) { _showErrorSnackBar('An unexpected error occurred. Please try again.'); } } finally { if (mounted) { setState(() { _isLoading = false; }); } } } void _showErrorSnackBar(String message) { ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text(message), backgroundColor: Colors.red, behavior: SnackBarBehavior.floating, margin: const EdgeInsets.all(16), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(8), ), ), ); } @override void dispose() { _emailController.dispose(); _passwordController.dispose(); super.dispose(); } }