You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			243 lines
		
	
	
		
			9.0 KiB
		
	
	
	
		
			Dart
		
	
			
		
		
	
	
			243 lines
		
	
	
		
			9.0 KiB
		
	
	
	
		
			Dart
		
	
import 'dart:io';
 | 
						|
 | 
						|
import 'package:easy_localization/easy_localization.dart';
 | 
						|
import 'package:easy_localization/src/public_ext.dart';
 | 
						|
import 'package:firebase_core/firebase_core.dart';
 | 
						|
import 'package:firebase_messaging/firebase_messaging.dart';
 | 
						|
import 'package:flutter/cupertino.dart';
 | 
						|
import 'package:flutter/foundation.dart';
 | 
						|
import 'package:flutter/material.dart';
 | 
						|
import 'package:flutter/services.dart';
 | 
						|
import 'package:mohem_flutter_app/api/login_api_client.dart';
 | 
						|
import 'package:mohem_flutter_app/app_state/app_state.dart';
 | 
						|
import 'package:mohem_flutter_app/classes/colors.dart';
 | 
						|
import 'package:mohem_flutter_app/classes/consts.dart';
 | 
						|
import 'package:mohem_flutter_app/classes/utils.dart';
 | 
						|
import 'package:mohem_flutter_app/config/routes.dart';
 | 
						|
import 'package:mohem_flutter_app/extensions/int_extensions.dart';
 | 
						|
import 'package:mohem_flutter_app/extensions/string_extensions.dart';
 | 
						|
import 'package:mohem_flutter_app/extensions/widget_extensions.dart';
 | 
						|
import 'package:mohem_flutter_app/generated/locale_keys.g.dart';
 | 
						|
import 'package:mohem_flutter_app/models/check_mobile_app_version_model.dart';
 | 
						|
import 'package:mohem_flutter_app/models/get_mobile_login_info_list_model.dart';
 | 
						|
import 'package:mohem_flutter_app/models/member_information_list_model.dart';
 | 
						|
import 'package:mohem_flutter_app/models/member_login_list_model.dart';
 | 
						|
import 'package:mohem_flutter_app/models/privilege_list_model.dart';
 | 
						|
import 'package:mohem_flutter_app/widgets/button/default_button.dart';
 | 
						|
import 'package:mohem_flutter_app/widgets/input_widget.dart';
 | 
						|
import 'package:safe_device/safe_device.dart';
 | 
						|
 | 
						|
class LoginScreen extends StatefulWidget {
 | 
						|
  LoginScreen({Key? key}) : super(key: key);
 | 
						|
 | 
						|
  @override
 | 
						|
  _LoginScreenState createState() {
 | 
						|
    return _LoginScreenState();
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
class _LoginScreenState extends State<LoginScreen> {
 | 
						|
  TextEditingController username = TextEditingController();
 | 
						|
  TextEditingController password = TextEditingController();
 | 
						|
 | 
						|
  CheckMobileAppVersionModel? _checkMobileAppVersion;
 | 
						|
  MemberLoginListModel? _memberLoginList;
 | 
						|
 | 
						|
  late final FirebaseMessaging _firebaseMessaging;
 | 
						|
 | 
						|
  bool _autoLogin = false;
 | 
						|
 | 
						|
  bool? isAppOpenBySystem;
 | 
						|
 | 
						|
  bool isJailBroken = false;
 | 
						|
  bool isRealDevice = false;
 | 
						|
  bool isOnExternalStorage = false;
 | 
						|
  bool isDevelopmentModeEnable = false;
 | 
						|
 | 
						|
  @override
 | 
						|
  void initState() {
 | 
						|
    super.initState();
 | 
						|
    // checkFirebaseToken();
 | 
						|
    // if (kReleaseMode) {
 | 
						|
    //   checkDeviceSafety();
 | 
						|
    // }
 | 
						|
  }
 | 
						|
 | 
						|
  void checkDeviceSafety() async {
 | 
						|
    try {
 | 
						|
      isJailBroken = await SafeDevice.isJailBroken;
 | 
						|
      isRealDevice = await SafeDevice.isRealDevice;
 | 
						|
      if (Platform.isAndroid) {
 | 
						|
        isOnExternalStorage = await SafeDevice.isOnExternalStorage;
 | 
						|
        isDevelopmentModeEnable = await SafeDevice.isDevelopmentModeEnable;
 | 
						|
      }
 | 
						|
      if (isJailBroken || !isRealDevice || isOnExternalStorage || isDevelopmentModeEnable) {
 | 
						|
        Navigator.pushNamedAndRemoveUntil(context, AppRoutes.unsafeDeviceScreen, (_) => false);
 | 
						|
      }
 | 
						|
    } catch (error) {
 | 
						|
      print(error);
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  @override
 | 
						|
  void dispose() {
 | 
						|
    super.dispose();
 | 
						|
  }
 | 
						|
 | 
						|
  String? firebaseToken;
 | 
						|
  GetMobileLoginInfoListModel? loginInfo;
 | 
						|
 | 
						|
  Future<void> checkFirebaseToken() async {
 | 
						|
    try {
 | 
						|
      Utils.showLoading(context);
 | 
						|
      await Firebase.initializeApp();
 | 
						|
      _firebaseMessaging = FirebaseMessaging.instance;
 | 
						|
      firebaseToken = await _firebaseMessaging.getToken();
 | 
						|
      loginInfo = await LoginApiClient().getMobileLoginInfoNEW(firebaseToken ?? "", Platform.isAndroid ? "android" : "ios");
 | 
						|
      if (loginInfo == null) {
 | 
						|
        await checkPrefs();
 | 
						|
        _autoLogin = false;
 | 
						|
        Utils.hideLoading(context);
 | 
						|
        return;
 | 
						|
      } else {
 | 
						|
        loginInfo!.deviceToken = firebaseToken;
 | 
						|
        await checkPrefs();
 | 
						|
        Utils.hideLoading(context);
 | 
						|
        performLogin();
 | 
						|
      }
 | 
						|
    } catch (ex) {
 | 
						|
      Utils.hideLoading(context);
 | 
						|
      Utils.handleException(ex, context, (errorMsg) {});
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  Future<void> checkPrefs() async {
 | 
						|
    String username = await Utils.getStringFromPrefs(SharedPrefsConsts.username);
 | 
						|
    if (username.isNotEmpty) {
 | 
						|
      String password = await Utils.getStringFromPrefs(SharedPrefsConsts.password);
 | 
						|
      // String firebaseToken = await Utils.getStringFromPrefs(SharedPrefsConsts.firebaseToken);
 | 
						|
      // print("firebaseToken:$firebaseToken");
 | 
						|
      this.username.text = username;
 | 
						|
      this.password.text = password;
 | 
						|
      _autoLogin = true;
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  void performLogin() async {
 | 
						|
    Utils.showLoading(context);
 | 
						|
    try {
 | 
						|
      _checkMobileAppVersion = await LoginApiClient().checkMobileAppVersion();
 | 
						|
      _memberLoginList = await LoginApiClient().memberLogin(username.text, password.text);
 | 
						|
      AppState().setMemberLoginListModel = _memberLoginList;
 | 
						|
      AppState().setUserName = username.text;
 | 
						|
      AppState().password = password.text;
 | 
						|
      if (_autoLogin) {
 | 
						|
        AppState().setMemberInformationListModel = (await MemberInformationListModel.getFromPrefs()).first;
 | 
						|
        AppState().setPrivilegeListModel = await PrivilegeListModel.getFromPrefs();
 | 
						|
        String mohemmWifiSSID = await Utils.getStringFromPrefs(SharedPrefsConsts.mohemmWifiSSID);
 | 
						|
        String mohemmWifiPassword = await Utils.getStringFromPrefs(SharedPrefsConsts.mohemmWifiPassword);
 | 
						|
        AppState().setMohemmWifiSSID = mohemmWifiSSID;
 | 
						|
        AppState().setMohemmWifiPassword = mohemmWifiPassword;
 | 
						|
      }
 | 
						|
      Utils.hideLoading(context);
 | 
						|
      if (_autoLogin) {
 | 
						|
        Navigator.pushReplacementNamed(context, AppRoutes.verifyLastLogin, arguments: loginInfo);
 | 
						|
      } else {
 | 
						|
        Navigator.pushNamed(context, AppRoutes.verifyLogin, arguments: "$firebaseToken");
 | 
						|
      }
 | 
						|
      Utils.saveStringFromPrefs(SharedPrefsConsts.password, password.text);
 | 
						|
    } catch (ex) {
 | 
						|
      Utils.hideLoading(context);
 | 
						|
      Utils.handleException(ex, context, (msg) {
 | 
						|
        Utils.confirmDialog(context, msg);
 | 
						|
      });
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  @override
 | 
						|
  Widget build(BuildContext context) {
 | 
						|
    if (isAppOpenBySystem == null) {
 | 
						|
      isAppOpenBySystem = (ModalRoute.of(context)!.settings.arguments ?? true) as bool;
 | 
						|
      if (!kReleaseMode) {
 | 
						|
        // username.text = "15444"; // Maha User
 | 
						|
        // username.text = "15153"; // Tamer User
 | 
						|
        // password.text = "Abcd@1234";
 | 
						|
 | 
						|
        // username.text = "206535"; // Hashim User
 | 
						|
        // password.text = "Namira786";
 | 
						|
 | 
						|
        // 13777
 | 
						|
        // Ab12345cd
 | 
						|
      }
 | 
						|
      if (isAppOpenBySystem!) checkFirebaseToken();
 | 
						|
    }
 | 
						|
 | 
						|
    // username.text = "15444";
 | 
						|
 | 
						|
    return Scaffold(
 | 
						|
      body: Column(
 | 
						|
        children: [
 | 
						|
          const SizedBox(height: 23),
 | 
						|
          Expanded(
 | 
						|
            child: Padding(
 | 
						|
              padding: const EdgeInsets.all(21.0),
 | 
						|
              child: Column(
 | 
						|
                crossAxisAlignment: CrossAxisAlignment.start,
 | 
						|
                children: [
 | 
						|
                  Row(
 | 
						|
                    children: [
 | 
						|
                      Expanded(child: SizedBox()),
 | 
						|
                      Row(
 | 
						|
                        children: [
 | 
						|
                          LocaleKeys.english.tr().toText14(color: AppState().isArabic(context) ? null : MyColors.textMixColor).onPress(() {
 | 
						|
                            context.setLocale(const Locale("en", "US"));
 | 
						|
                          }),
 | 
						|
                          Container(
 | 
						|
                            width: 1,
 | 
						|
                            color: MyColors.darkWhiteColor,
 | 
						|
                            height: 16,
 | 
						|
                            margin: const EdgeInsets.only(left: 10, right: 10),
 | 
						|
                          ),
 | 
						|
                          LocaleKeys.arabic.tr().toText14(color: !AppState().isArabic(context) ? null : MyColors.textMixColor).onPress(() {
 | 
						|
                            context.setLocale(const Locale("ar", "SA"));
 | 
						|
                          }),
 | 
						|
                        ],
 | 
						|
                      ),
 | 
						|
                    ],
 | 
						|
                  ),
 | 
						|
                  Expanded(
 | 
						|
                    child: Column(
 | 
						|
                      mainAxisSize: MainAxisSize.min,
 | 
						|
                      crossAxisAlignment: CrossAxisAlignment.start,
 | 
						|
                      mainAxisAlignment: MainAxisAlignment.center,
 | 
						|
                      children: [
 | 
						|
                        LocaleKeys.login.tr().toText24(isBold: true),
 | 
						|
                        LocaleKeys.pleaseEnterLoginDetails.tr().toText16(),
 | 
						|
                        16.height,
 | 
						|
                        InputWidget(LocaleKeys.username.tr(), "123456", username),
 | 
						|
                        12.height,
 | 
						|
                        InputWidget(LocaleKeys.password.tr(), "xxxxxx", password, isTextIsPassword: true),
 | 
						|
                        9.height,
 | 
						|
                        Align(
 | 
						|
                          alignment: Alignment.centerRight,
 | 
						|
                          child: LocaleKeys.forgotPassword.tr().toText12(isUnderLine: true, color: MyColors.textMixColor).onPress(() {
 | 
						|
                            Navigator.pushNamed(context, AppRoutes.forgotPassword);
 | 
						|
                          }),
 | 
						|
                        ),
 | 
						|
                      ],
 | 
						|
                    ),
 | 
						|
                  )
 | 
						|
                ],
 | 
						|
              ),
 | 
						|
            ),
 | 
						|
          ),
 | 
						|
          DefaultButton(LocaleKeys.login.tr(), () async {
 | 
						|
            SystemChannels.textInput.invokeMethod('TextInput.hide');
 | 
						|
            performLogin();
 | 
						|
          }).insideContainer
 | 
						|
        ],
 | 
						|
      ),
 | 
						|
    );
 | 
						|
  }
 | 
						|
}
 |