import 'dart:developer'; import 'dart:io' as io; import 'package:get/get.dart'; import 'package:http/http.dart' as http; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:muaawana/config/provider.dart'; import 'package:sign_in_button/sign_in_button.dart'; import 'package:sign_in_with_apple/sign_in_with_apple.dart'; import '../../config/lang_enum.dart'; import '../../providers/auth_provider.dart'; import '../../providers/client_picker_provider.dart'; import '../../providers/language_provider.dart'; import '../../providers/utils_provider.dart'; import '../client_view/main_screen.dart'; import '../technicien_view/home_tech_screen.dart'; import 'forget_password_view.dart'; import 'oauth_screen.dart'; import 'register_view.dart'; import '../../config/app_constant.dart'; import '../../config/size.dart'; import '../../config/style.dart'; import '../../utils/text_style.dart'; import '../../utils/text_widget.dart'; import '../../widgets/custom_botton_widget.dart'; import '../../widgets/custom_search_textfield.dart'; import '../../widgets/home_indicator_widget.dart'; class LoginScreen extends StatefulWidget { const LoginScreen({Key? key, required this.isFromSplash}) : super(key: key); final bool isFromSplash; @override State createState() => _LoginScreenState(); } class _LoginScreenState extends State { final hm = SizeConfig.heightMultiplier; final wm = SizeConfig.widthMultiplier; final tm = SizeConfig.textMultiplier; final TextEditingController _emailTextEditingController = TextEditingController(); final TextEditingController _passwordTextEditingController = TextEditingController(); // bool? check1 = false; bool? isTechnician; @override void initState() { super.initState(); getLogin(); } getLogin() async { await context.read().getLogin(); if (context.read().email != null) { setState(() { _emailTextEditingController.text = context.read().email!; }); } if (context.read().password != null) { setState(() { _passwordTextEditingController.text = context.read().password!; }); } await context.read().initPlatformState(); await context.read().getIpAddress(); } @override void dispose() { _emailTextEditingController.dispose(); _passwordTextEditingController.dispose(); super.dispose(); } @override Widget build(BuildContext context) { final loginProvider = Provider.of(context); final langP = Provider.of(context); final rolePickerProvider = Provider.of(context); Color getColor(Set states) { const Set interactiveStates = { MaterialState.selected, MaterialState.focused, MaterialState.pressed, }; if (states.any(interactiveStates.contains)) { return Colors.transparent; } return AppStyle.textCategGrey; } // if(loginProvider.remember && ) return Scaffold( backgroundColor: Theme.of(context).scaffoldBackgroundColor, body: SingleChildScrollView( child: Column( crossAxisAlignment: CrossAxisAlignment.center, children: [ Padding( padding: EdgeInsets.only(top: hm * 7), child: Image.asset( Consts.appLogo, height: 77, ), ), Padding( padding: EdgeInsets.symmetric(vertical: wm * 10, horizontal: wm * 10), child: Column( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.start, children: [ Txt( text: "Login", style: tS("Inter", 28, FontWeight.bold, Theme.of(context).colorScheme.onSurface), ), Txt( text: "Enter your email & password", style: tS( "pop_regular", 18, FontWeight.normal, Theme.of(context).colorScheme.onSurface), ), const SizedBox( height: 50, ), CustomTextField( controller: _emailTextEditingController, hintText: langP.translate('Email'), isRTL: langP.currentLangCode == Language.en ? false : true, iconPosition: CustomTextFieldIconPosition.none, // onChanged: (String) {}, ), SizedBox( height: hm * 2, ), CustomTextField( obscure: rolePickerProvider.obscure, controller: _passwordTextEditingController, hintText: langP.translate('Password'), iconPosition: CustomTextFieldIconPosition.end, isRTL: langP.currentLangCode == Language.en ? false : true, endIcon: Padding( padding: const EdgeInsets.symmetric(horizontal: 10.0), child: rolePickerProvider.obscure ? GestureDetector( onTap: () { rolePickerProvider.setObscure(); }, child: const Icon( Icons.remove_red_eye, color: AppStyle.textCategGrey, ), ) : GestureDetector( onTap: () { rolePickerProvider.setObscure(); }, child: const Icon( Icons.remove_red_eye, color: AppStyle.primary, ), ), ), // onChanged: (String) {}, ), Row( children: [ Checkbox( value: context.read().remember, onChanged: (value) { context.read().rememberMe(); }, checkColor: AppStyle.primary, fillColor: MaterialStateProperty.resolveWith(getColor), ), Txt( text: "Remember me", style: tS("Inter", 12, FontWeight.w400, Theme.of(context).colorScheme.onSurface), ), const Expanded(child: SizedBox()), GestureDetector( onTap: () { Navigator.push( context, MaterialPageRoute( builder: (context) => const ForgotPasswordScreen())); }, child: Txt( text: "Forgot Password?", style: tS( "Inter", 11, FontWeight.w400, Theme.of(context).colorScheme.primary, textDecoration: TextDecoration.underline), ), ), ], ), Align( alignment: Alignment.center, child: Padding( padding: EdgeInsets.only(top: hm * 4, bottom: hm), child: GestureDetector( onTap: () { //print("clicked login"); loginProvider.userLogin( context, _emailTextEditingController.text, _passwordTextEditingController.text, widget.isFromSplash); }, child: CustomButtonWidget( height: 50, width: double.infinity, borderRadius: 10, fontSize: 15, fillColor: AppStyle.buttonBlue, borderColor: AppStyle.buttonBlue, textColor: AppStyle.white, text: 'Continue', fontFamily: 'lato-regular', fontWeight: FontWeight.normal, loader: loginProvider.loader, ), ), ), ), SizedBox(height: 15), Center( child: SizedBox( width: double.infinity, height: 50, child: SignInButton( Buttons.google, text: "Sign in with Google", onPressed: () async { FocusScope.of(context).unfocus(); try { final result = await Navigator.push( context, MaterialPageRoute( builder: (context) => const OAuthPageView(provider: "google"), ), ); if (!context.mounted || result == null || result is! String) { if (context.mounted) { Navigator.pop(context); // Close loading Get.showSnackbar(const GetSnackBar( title: "Sign In Cancelled", message: 'Google sign-in was cancelled', duration: Duration(seconds: 2), )); } return; } // Process authentication final authProvider = context.read(); final role = await authProvider.socialLoginHandling( context, result, widget.isFromSplash, ); if (!context.mounted) return; Navigator.pop(context); // Close loading if (role != null && context.mounted) { log("Navigating to home screen with role: $role"); Navigator.pushAndRemoveUntil( context, MaterialPageRoute( builder: (context) => role == "ROLE_TECHNICIAN" ? const HomeTechView() : const HomeClientView(), ), (route) => false, ); } } catch (e) { log('Google sign-in error: $e'); if (context.mounted) { Navigator.pop( context); // Ensure loading is dismissed Get.showSnackbar(GetSnackBar( title: "Sign In Failed", message: 'Google sign-in failed: ${e.toString()}', duration: const Duration(seconds: 3), )); } } }, elevation: 1, shape: const RoundedRectangleBorder( borderRadius: BorderRadius.all(Radius.circular(10))), ), ), ), SizedBox(height: 10), Center( child: SizedBox( width: double.infinity, height: 50, child: SignInButton( Buttons.apple, onPressed: () async { final credential = await SignInWithApple.getAppleIDCredential( scopes: [ AppleIDAuthorizationScopes.email, AppleIDAuthorizationScopes.fullName, ], webAuthenticationOptions: WebAuthenticationOptions( clientId: 'com.camelsoft.muaawanaappleauth', redirectUri: Uri.parse( 'https://server.muaawana.com/api/v1/auth/apple/oauth2/redirect', ), ), ); log(credential.identityToken.toString()); log(credential.userIdentifier.toString()); log(credential.toString()); final signInWithAppleEndpoint = Uri( scheme: 'https', host: 'server.muaawana.com', path: '/api/v1/auth/apple/apple', queryParameters: { 'code': credential.authorizationCode, if (credential.givenName != null) 'firstName': credential.givenName!, if (credential.familyName != null) 'lastName': credential.familyName!, 'useBundleId': !kIsWeb && (io.Platform.isIOS || io.Platform.isMacOS) ? 'true' : 'false', if (credential.state != null) 'state': credential.state!, }, ); await http.Client().get(signInWithAppleEndpoint); await loginProvider.loginApple( credential.identityToken!, context, widget.isFromSplash, credential.email != null && credential.givenName != null); }, elevation: 1, shape: const RoundedRectangleBorder( borderRadius: BorderRadius.all(Radius.circular(10))), ), ), ), rolePickerProvider.role != 'ROLE_TECHNICIAN' ? Align( alignment: Alignment.center, child: Padding( padding: EdgeInsets.only(top: hm * 1, bottom: hm), child: Row( mainAxisAlignment: MainAxisAlignment.center, children: [ Txt( text: "Don't have an account?", style: tS( "Inter", 14, FontWeight.w400, Theme.of(context).colorScheme.onSurface, ), ), const SizedBox(width: 3), GestureDetector( onTap: () { Navigator.push( context, MaterialPageRoute( builder: (context) => RegisterScreen( isFromSplash: widget.isFromSplash, ), ), ); }, child: Txt( text: "Create one now!", style: tS( "Inter", 13, FontWeight.w700, Theme.of(context).colorScheme.onSurface, ), ), ), ], ), ), ) : Container(), ], ), ), SizedBox(child: HomeIndicatorBottomWidget()) ], ), ), ); } }