import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:prosappco/blocs/sing_in_bloc/sign_in_bloc.dart'; import '../../components/strings.dart'; import '../../components/textfield.dart'; class SignInScreen extends StatefulWidget { const SignInScreen({super.key}); @override State createState() => _SignInScreenState(); } class _SignInScreenState extends State { final _formKey = GlobalKey(); final emailController = TextEditingController(); final passwordController = TextEditingController(); String? _errorMsg; bool obscurePassword = true; IconData iconPassword = CupertinoIcons.eye_fill; bool signInRequired = false; @override Widget build(BuildContext context) { return BlocListener( listener: (context, state) { if (state is SignInSuccess) { setState(() { signInRequired = false; }); } else if (state is SignInProcess) { setState(() { signInRequired = true; }); } else if (state is SignInFailure) { setState(() { signInRequired = false; _errorMsg = 'Invalid email or password'; }); } }, child: Form( key: _formKey, child: Column( children: [ const SizedBox(height: 20), SizedBox( width: MediaQuery.of(context).size.width * 0.9, child: MyTextField( controller: emailController, hintText: 'Email', obscureText: false, keyboardType: TextInputType.emailAddress, prefixIcon: const Icon(CupertinoIcons.mail_solid), errorMsg: _errorMsg, validator: (val) { if (val!.isEmpty) { return 'Please fill in this field'; } else if (!emailRexExp.hasMatch(val)) { return 'Please enter a valid email'; } return null; }), ), const SizedBox(height: 10), SizedBox( width: MediaQuery.of(context).size.width * 0.9, child: MyTextField( controller: passwordController, hintText: 'Password', obscureText: obscurePassword, keyboardType: TextInputType.visiblePassword, prefixIcon: const Icon(CupertinoIcons.lock_fill), errorMsg: _errorMsg, validator: (val) { if (val!.isEmpty) { return 'Please fill in this field'; } else if (!passwordRexExp.hasMatch(val)) { return 'Please enter a valid password'; } return null; }, suffixIcon: IconButton( onPressed: () { setState(() { obscurePassword = !obscurePassword; if (obscurePassword) { iconPassword = CupertinoIcons.eye_fill; } else { iconPassword = CupertinoIcons.eye_slash_fill; } }); }, icon: Icon(iconPassword), ), ), ), const SizedBox(height: 20), !signInRequired ? SizedBox( width: MediaQuery.of(context).size.width * 0.9, height: 50, child: TextButton( onPressed: () { if (_formKey.currentState!.validate()) { context.read().add(SignInRequired( emailController.text, passwordController.text)); } }, style: TextButton.styleFrom( elevation: 3.0, backgroundColor: Theme.of(context).colorScheme.primary, foregroundColor: Colors.white, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(60))), child: const Padding( padding: EdgeInsets.symmetric( horizontal: 25, vertical: 5), child: Text( 'Sign In', textAlign: TextAlign.center, style: TextStyle( color: Colors.white, fontSize: 16, fontWeight: FontWeight.w600), ), )), ) : const CircularProgressIndicator() ], )), ); } }