import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:supplier_new/common/dashboard.dart'; import 'package:supplier_new/common/settings.dart'; import 'package:firebase_messaging/firebase_messaging.dart'; class Login extends StatefulWidget { const Login({super.key}); @override State createState() => _LoginState(); } class _LoginState extends State { final storage = FlutterSecureStorage( aOptions: AndroidOptions( resetOnError: true, encryptedSharedPreferences: true, ), ); bool isObscureText=true; TextEditingController mobileNumberController = TextEditingController(); TextEditingController passwordController = TextEditingController(); final _formKey = GlobalKey(); @override void initState() { isObscureText=true; super.initState(); } @override Widget build(BuildContext context) { return Scaffold( backgroundColor: Colors.white, body: Stack( children: [ /*Container( decoration: const BoxDecoration( image: DecorationImage(image: AssetImage("images/backgroundimage.png"), fit: BoxFit.cover,), ), ),*/ GestureDetector( onTap: () { FocusManager.instance.primaryFocus?.unfocus(); }, child: SafeArea( child: SingleChildScrollView( child: Padding( padding: const EdgeInsets.fromLTRB(24, 0, 24, 0), child: Form( key: _formKey, child: Column( children: [ SizedBox(height: MediaQuery.of(context).size.height * .2), CircleAvatar(radius: 80, backgroundColor: Color(0XFFF3F1FB)), SizedBox(height: MediaQuery.of(context).size.height * .05), SizedBox(height:MediaQuery.of(context).size.height * .024,), TextFormField( controller: mobileNumberController, keyboardType: TextInputType.number, maxLength: 10, autovalidateMode: AutovalidateMode.onUserInteraction, decoration: textFormFieldDecoration(Icons.phone,'Mobile Number'), style: fontTextStyle(14, Color(0XFF2A2A2A), FontWeight.w400), cursorColor: Color(0XFF8270DB), inputFormatters: [ // Allow only numbers FilteringTextInputFormatter.digitsOnly, // Restrict first digit 6-9 TextInputFormatter.withFunction( (oldValue, newValue) { if (newValue.text.isEmpty) { return newValue; } // First digit must be 6-9 if (!RegExp(r'^[6-9]').hasMatch(newValue.text)) { return oldValue; } return newValue; }, ), ], validator: (value) { if (value == null || value.isEmpty) { return "Please enter mobile number"; } if (!RegExp(r'^[6-9]').hasMatch(value)) { return "Please enter digits 6,7,8,9"; } if (value.length != 10) { return "Enter valid 10 digit number"; } return null; }, ), SizedBox(height:MediaQuery.of(context).size.height * .016,), Container( child: TextFormField( cursorColor:Color(0XFF8270DB), obscureText: isObscureText, obscuringCharacter: '*', controller: passwordController, decoration: InputDecoration( filled: false, fillColor: Colors.white, labelText: 'Password', //prefixIcon: const Icon(Icons.lock, color: Colors.white,), labelStyle: fontTextStyle(14,Color(0XFF7E7F80),FontWeight.w400), border: OutlineInputBorder( borderRadius: BorderRadius.circular(4.0), borderSide: BorderSide(color: greyColor, width: 1, )), focusedBorder: OutlineInputBorder( borderRadius: BorderRadius.circular(4.0), borderSide: BorderSide(color: Color(0XFF8270DB),width: 2,), ), enabledBorder: OutlineInputBorder( borderRadius: BorderRadius.circular(4.0), borderSide: BorderSide(color: greyColor), ), suffixIcon: IconButton( icon: isObscureText==true?Image.asset('images/eye_icon.png',color: Color(0XFF7E7F80),width: 30,height: 30,):Image.asset('images/open_eye.png',color:Color(0XFF7E7F80),width: 30,height: 30,), /* Icon( icon:Image.asset('assets/your_image.png'), color: isObscureText==true?greyColor:primaryColor, ),*/ onPressed: () { print("show password"); setState(() { isObscureText = !isObscureText; }); }, ), ), style: fontTextStyle(14,Color(0XFF2A2A2A),FontWeight.w400), validator: (value) { if (value == null || value.isEmpty) { return "Please enter password"; } return null; }, ), ), SizedBox(height:MediaQuery.of(context).size.height * .016,), Align( alignment: Alignment.bottomLeft, child:GestureDetector( onTap: (){ /* Navigator.push( context, MaterialPageRoute(builder: (context) => ForgotpasswordNew()), );*/ }, child: Text( 'Forgot Password?', style: fontTextStyle(12,Color(0XFF1D7AFC),FontWeight.w600), ), ) ), SizedBox(height:MediaQuery.of(context).size.height * .024,), Container( width:double.infinity, height: MediaQuery.of(context).size.height * .06, child: ElevatedButton( style: ElevatedButton.styleFrom( foregroundColor: Colors.white, backgroundColor: primaryColor, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(12.0), // Customize the radius ), ), onPressed: () async { // 🔥 THIS MAKES VALIDATION WORK if (!_formKey.currentState!.validate()) { return; } AppSettings.preLoaderDialog(context); bool isOnline = await AppSettings.internetConnectivity(); if(isOnline){ SharedPreferences prefs = await SharedPreferences.getInstance(); String? fcmToken = prefs.getString('fcmToken'); var payload = { "phone": mobileNumberController.text.trim(), "password": passwordController.text.trim(), "fcmIds": [fcmToken] }; bool signinStatus = await AppSettings.login(payload); Navigator.of(context,rootNavigator: true).pop(); if (signinStatus) { String token = AppSettings.accessToken; await storage.write( key: 'authToken', value: token); Navigator.push( context, MaterialPageRoute( builder: (context) => const DashboardScreen()), ); AppSettings.longSuccessToast( "Logged in Successfully"); mobileNumberController.clear(); passwordController.clear(); } else { AppSettings.longFailedToast( "Invalid details"); } } else{ Navigator.of(context, rootNavigator: true).pop(); AppSettings.longFailedToast( "Please Check internet"); } }, child: Text('Login',style: fontTextStyle(12,Colors.white,FontWeight.w600),), )), ], ), ) )), ), ), ], ) ); } }