import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import '../../../components/my_text_field.dart'; import '../blocs/sign_in_bloc/sign_in_bloc.dart'; class SignInScreen extends StatefulWidget { const SignInScreen({super.key}); @override State createState() => _SignInScreenState(); } class _SignInScreenState extends State { final passwordController = TextEditingController(); final emailController = TextEditingController(); final _formKey = GlobalKey(); bool signInRequired = false; IconData iconPassword = CupertinoIcons.eye_fill; bool obscurePassword = true; String? _errorMsg; @override Widget build(BuildContext context) { return BlocListener( listener: (context, state) { if (state is SignInProcess) { setState(() { signInRequired = true; }); } else { setState(() { signInRequired = false; }); if (state is SignInFailure) { setState(() { // PERUBAHAN: Pesan error lebih umum karena Google gagal belum tentu soal password _errorMsg = 'Sign in failed. Please try again.'; }); } } }, 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'; } 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'; } 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.5, 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(), /// ======= Tombol Login Google ======= /// const SizedBox(height: 20), SizedBox( width: MediaQuery.of(context).size.width * 0.5, child: TextButton.icon( onPressed: () { // == Mengirim event login Google ke Bloc == // context.read().add(GoogleSignInRequired()); }, icon: SizedBox( height: 20, width: 20, child: Image.asset( 'images/google-icon-logo.png', fit: BoxFit.contain, ), ), label: const Text( 'Sign In with Google', style: TextStyle( color: Colors.black, fontSize: 16, fontWeight: FontWeight.w600), ), style: TextButton.styleFrom( elevation: 3.0, backgroundColor: Colors.white, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(60), side: const BorderSide(color: Colors.grey))), ), ), ], )), ); } }