import ' package:flutter/gestures.dart ' ;
import ' package:flutter/material.dart ' ;
import ' package:fluttertoast/fluttertoast.dart ' ;
import ' package:provider/provider.dart ' ;
import ' package:shared_preferences/shared_preferences.dart ' ;
import ' package:test_sa/controllers/notification/firebase_notification_manger.dart ' ;
import ' package:test_sa/controllers/providers/settings/app_settings.dart ' ;
import ' package:test_sa/extensions/context_extension.dart ' ;
import ' package:test_sa/extensions/int_extensions.dart ' ;
import ' package:test_sa/extensions/string_extensions.dart ' ;
import ' package:test_sa/extensions/text_extensions.dart ' ;
import ' package:test_sa/extensions/widget_extensions.dart ' ;
import ' package:test_sa/new_views/app_style/app_color.dart ' ;
import ' package:test_sa/new_views/forget_password_module/forget_passwod_verify_otp.dart ' ;
import ' package:test_sa/new_views/forget_password_module/models/general_response_model.dart ' ;
import ' package:test_sa/new_views/pages/land_page/land_page.dart ' ;
import ' package:test_sa/new_views/swipe_module/swipe_view.dart ' ;
import ' package:url_launcher/url_launcher.dart ' ;
import ' ../../controllers/providers/api/user_provider.dart ' ;
import ' ../../controllers/providers/settings/setting_provider.dart ' ;
import ' ../../controllers/validator/validator.dart ' ;
import ' ../../models/user.dart ' ;
import ' ../common_widgets/app_filled_button.dart ' ;
import ' ../common_widgets/app_text_form_field.dart ' ;
class LoginPage extends StatefulWidget {
static const String routeName = " /login_page " ;
const LoginPage ( { Key key } ) : super ( key: key ) ;
@ override
State < LoginPage > createState ( ) = > _LoginPageState ( ) ;
}
class _LoginPageState extends State < LoginPage > {
final User _user = User ( ) ;
bool _passwordVisible = false ;
UserProvider _userProvider ;
SettingProvider _settingProvider ;
TextEditingController userNameController = TextEditingController ( ) ;
final GlobalKey < FormState > _formKey = GlobalKey < FormState > ( ) ;
bool rememberMe = false ;
bool privacyPolicyChecked = false ;
@ override
void initState ( ) {
super . initState ( ) ;
if ( FirebaseNotificationManger . token = = null ) FirebaseNotificationManger . getToken ( ) ;
}
@ override
Widget build ( BuildContext context ) {
_userProvider = Provider . of < UserProvider > ( context ) ;
if ( _settingProvider = = null ) {
_settingProvider = Provider . of < SettingProvider > ( context ) ;
rememberMe = _settingProvider . rememberMe ;
if ( rememberMe ) {
_user . userName = _settingProvider . username ;
userNameController . text = _user . userName ? ? ' ' ;
_user . password = _settingProvider . password ;
}
}
return Form (
key: _formKey ,
child: Scaffold (
body: Column (
children: [
SingleChildScrollView (
child: Column (
mainAxisAlignment: MainAxisAlignment . center ,
crossAxisAlignment: CrossAxisAlignment . start ,
children: [
Hero ( tag: " logo " , child: " logo " . toSvgAsset ( height: 64 ) ) ,
64. height ,
context . translation . login . heading2 ( context ) . custom ( fontWeight: FontWeight . w600 , color: context . isDark ? AppColor . primary50 : AppColor . neutral50 ) ,
context . translation . enterCredsToLogin . heading6 ( context ) . custom ( color: context . isDark ? AppColor . neutral10 : AppColor . neutral20 ) ,
32. height ,
AppTextFormField (
initialValue: _user ? . userName ,
controller: userNameController ,
validator: ( value ) = > Validator . hasValue ( value ) ? null : context . translation . requiredField ,
labelText: context . translation . username ,
textInputType: TextInputType . text ,
onSaved: ( value ) {
_user . userName = value ;
} ,
) ,
16. height ,
AppTextFormField (
initialValue: _user ? . password ,
labelText: context . translation . password ,
suffixIcon: Icon (
// Based on passwordVisible state choose the icon
_passwordVisible ? Icons . visibility : Icons . visibility_off ,
color: context . isDark ? AppColor . neutral10 : AppColor . neutral20 ,
) . paddingOnly ( end: 12 ) . onPress ( ( ) {
setState ( ( ) {
_passwordVisible = ! _passwordVisible ;
} ) ;
} ) ,
obscureText: ! _passwordVisible ,
validator: ( value ) = > Validator . isValidPassword ( value )
? null
: value . isEmpty
? context . translation . requiredField
: context . translation . passwordLengthMessage ,
onSaved: ( value ) {
_user . password = value ;
} ,
) ,
16. height ,
Align (
alignment: AlignmentDirectional . centerEnd ,
child: InkWell (
onTap: ( ) async {
if ( userNameController . text . isNotEmpty ) {
GeneralResponseModel response = await _userProvider . sendForgetPasswordOtp ( context: context , employeeId: userNameController . text ) ;
if ( response . isSuccess ) {
Navigator . push (
context ,
MaterialPageRoute (
builder: ( context ) = > ForgetPasswordVerifyOtpView (
data: { ' employeeId ' : userNameController . text , ' phoneNumber ' : response . data } ,
) ) ) ;
// Navigator.push(context, ForgetPasswordVerifyOtpView.routeName);
} else {
context . showConfirmDialog ( response ? . message ? ? context . translation . failedToCompleteRequest ) ;
}
} else {
Fluttertoast . showToast ( msg: context . translation . employeeIdIsRequired ) ;
}
} ,
child: context . translation . forgotPassword . bodyText ( context ) . custom ( color: AppColor . primary50 , fontWeight: FontWeight . w500 ) ,
) ,
) ,
Row (
children: [
Checkbox (
value: rememberMe ,
activeColor: AppColor . blueStatus ( context ) ,
materialTapTargetSize: MaterialTapTargetSize . shrinkWrap ,
onChanged: ( value ) {
setState ( ( ) {
rememberMe = value ;
} ) ;
} ) ,
" Remember Me " . bodyText ( context ) . custom ( color: context . isDark ? AppColor . primary50 : AppColor . neutral50 ) . expanded ,
] ,
) ,
Row (
crossAxisAlignment: CrossAxisAlignment . center ,
children: [
Checkbox (
value: privacyPolicyChecked ,
activeColor: AppColor . blueStatus ( context ) ,
materialTapTargetSize: MaterialTapTargetSize . shrinkWrap ,
onChanged: ( value ) {
if ( value = = null ) return ;
privacyPolicyChecked = value ;
setState ( ( ) { } ) ;
} ) ,
RichText (
text: TextSpan ( text: " I have read and agree to " , style: AppTextStyles . bodyText . copyWith ( color: context . isDark ? AppColor . primary50 : AppColor . neutral50 ) , children: [
TextSpan (
text: " Privacy Policy " ,
style: AppTextStyles . bodyText . copyWith ( color: AppColor . blueStatus ( context ) , decoration: TextDecoration . underline ) ,
recognizer: TapGestureRecognizer ( )
. . onTap = ( ) async {
Uri uri = Uri . parse ( " https://cloudsolutions.com.sa/en/privacy-policy " ) ;
try {
launchUrl ( uri ) ;
} catch ( ex ) { }
} ) ,
] ) ,
) . expanded ,
] ,
) ,
16. height ,
] ,
) ,
) . center . expanded ,
AppFilledButton ( label: context . translation . login , maxWidth: true , onPressed: _login ) ,
] ,
) . paddingOnly ( start: 16 , end: 16 , bottom: 24 , top: 24 ) ,
) ,
) ;
}
Future < void > _login ( ) async {
if ( ! _formKey . currentState . validate ( ) ) return ;
if ( privacyPolicyChecked = = false ) {
" You must agree to privacy policy " . showToast ;
return ;
}
FocusScope . of ( context ) . unfocus ( ) ;
_formKey . currentState . save ( ) ;
int status = await _userProvider . login ( context: context , user: _user ) ;
if ( status > = 200 & & status < 300 & & _userProvider . user . isAuthenticated ? ? false ) {
await _settingProvider . setUser ( _userProvider . user ) ;
( await SharedPreferences . getInstance ( ) ) . remove ( ASettings . localAuth ) ;
await _settingProvider . setRememberMe ( _user . userName , _user . password , rememberMe ) ;
if ( _userProvider . user . onlySwipe ) {
Navigator . pushReplacementNamed ( context , SwipeView . routeName ) ;
} else {
Navigator . pushReplacementNamed ( context , LandPage . routeName ) ;
}
} else {
context . showConfirmDialog ( _userProvider . user ? . message ? ? context . translation . failedToCompleteRequest ) ;
}
}
}