import 'package:flutter_redux/flutter_redux.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:material_design_icons_flutter/material_design_icons_flutter.dart'; import 'package:satu/core/redux/actions/user_actions.dart'; import 'package:satu/core/redux/state/user_state.dart'; import 'package:satu/core/redux/store.dart'; import 'package:satu/core/services/dialog_service.dart'; import 'package:satu/core/services/navigator_service.dart'; import 'package:satu/core/utils/locator.dart'; import 'package:satu/routes/route_names.dart'; import 'package:satu/shared/ui_helpers.dart'; import 'package:satu/widgets/buttons/busy_button.dart'; import 'package:satu/widgets/fields/input_field.dart'; import 'package:satu/widgets/ui/logo.dart'; class LoginView extends StatefulWidget { @override _LoginViewState createState() => _LoginViewState(); } class _LoginViewState extends State { late TextEditingController emailController; late TextEditingController passwordController; final FocusNode passwordNode = new FocusNode(); final DialogService _dialogService = locator(); @override void initState() { super.initState(); // emailController = TextEditingController(text: 'test11@gmail.com'); // passwordController = TextEditingController(text: 'qwe123'); emailController = TextEditingController(); passwordController = TextEditingController(); } @override void dispose() { emailController.dispose(); passwordController.dispose(); passwordNode.dispose(); super.dispose(); } @override Widget build(BuildContext context) { return StoreConnector( converter: (store) => store.state.userState!, builder: (context, vm) { return Scaffold(body: LayoutBuilder( builder: (context, constraints) { return SingleChildScrollView( child: ConstrainedBox( constraints: BoxConstraints(minHeight: constraints.maxHeight), child: Column( mainAxisSize: MainAxisSize.max, mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: [ const LogoSatu(), InputField( placeholder: 'Введите почту', controller: emailController, textInputType: TextInputType.emailAddress, nextFocusNode: passwordNode, ), verticalSpaceSmall, InputField( placeholder: 'Введите пароль', password: true, controller: passwordController, fieldFocusNode: passwordNode, enterPressed: _pressBtnEnter, textInputAction: TextInputAction.done, ), verticalSpaceMedium, Padding( padding: EdgeInsets.only( left: 45.sp, right: 45.sp, top: 30.sp), child: BusyButton( title: 'ВОЙТИ', busy: vm.isLoading!, onPressed: _pressBtnEnter, ), ), verticalSpaceLarge, IconButton( icon: const Icon(MdiIcons.qrcodeScan), iconSize: ScreenUtil().setSp(40.0), tooltip: 'Scan', onPressed: scan, ) ], ), ), ); }, )); }); } Future _pressBtnEnter() async { Redux.store! .dispatch(authenticate(emailController.text, passwordController.text)); } Future scan() async { final NavigatorService _nav = locator(); final dynamic result = await _nav.push(addByBarcodeViewRoute); if (result != null) { if (result.length == 60) { Redux.store?.dispatch(authenticateByToken(result as String)); } else { _dialogService.showDialog(description: 'Не верный формат QR кода'); } } } } class LoginModel { LoginModel( {required this.authType, required this.login, required this.password}); final String authType; final String login; final String password; }