From 9b2b0a805db0127d182d1fc0260d125660107f4c Mon Sep 17 00:00:00 2001 From: "Serik.Uvaissov" Date: Wed, 8 Jul 2020 16:16:07 +0600 Subject: [PATCH] login reAuth --- lib/core/router.dart | 3 +- lib/core/services/ApiService.dart | 15 ++++- lib/core/services/navigator_service.dart | 4 +- lib/redux/actions/user_actions.dart | 5 +- lib/views/home/tabs/AdditionalTab.dart | 84 +++++++++++++++--------- lib/views/login/login_view.dart | 46 ++++++++++++- lib/views/payment/payment_view.dart | 4 +- 7 files changed, 117 insertions(+), 44 deletions(-) diff --git a/lib/core/router.dart b/lib/core/router.dart index b8b1fe8..574f5de 100644 --- a/lib/core/router.dart +++ b/lib/core/router.dart @@ -12,9 +12,10 @@ import 'package:flutter/material.dart'; Route generateRoute(RouteSettings settings) { switch (settings.name) { case LoginViewRoute: + LoginModel model = settings.arguments as LoginModel; return _getPageRoute( routeName: settings.name, - viewToShow: LoginView(), + viewToShow: LoginView(loginModel: model,), ); case HomeViewRoute: return _getPageRoute( diff --git a/lib/core/services/ApiService.dart b/lib/core/services/ApiService.dart index 0f4f5b4..d3fd170 100644 --- a/lib/core/services/ApiService.dart +++ b/lib/core/services/ApiService.dart @@ -2,6 +2,9 @@ import 'dart:convert'; import 'dart:io'; import 'package:aman_kassa_flutter/core/base/base_service.dart'; +import 'package:aman_kassa_flutter/redux/state/user_state.dart'; +import 'package:aman_kassa_flutter/redux/store.dart'; +import 'package:aman_kassa_flutter/views/login/login_view.dart'; import 'package:device_info/device_info.dart'; import 'package:aman_kassa_flutter/core/models/message.dart'; import 'package:aman_kassa_flutter/core/models/response.dart'; @@ -156,9 +159,15 @@ class ApiService extends BaseService { String body = await response.stream.bytesToString(); if(statusCheck) { //Проверка на авторизованный запрос, необязательный параметр Response check = Response.fromJsonDynamic(json.decode(body)); - if (!check.operation && check.status == 401) { - _dialogService.showDialog(description: 'Необходимо пройти повторную авторизацию'); - _navigatorService.replace(LoginViewRoute); + if (!check.operation && ( [401,402,403,412].contains(check.status) ) ) { + + var future = new Future.delayed(const Duration(milliseconds: 1000), (){ + _dialogService.showDialog(description: 'Необходимо пройти повторную авторизацию'); + UserState state = Redux.store.state.userState; + _navigatorService.replace(LoginViewRoute, arguments: LoginModel(authType: state.authenticateType, login: state.login, password: state.password )); + }); + + } } return body; diff --git a/lib/core/services/navigator_service.dart b/lib/core/services/navigator_service.dart index bc07b14..9be0ff2 100644 --- a/lib/core/services/navigator_service.dart +++ b/lib/core/services/navigator_service.dart @@ -10,10 +10,10 @@ class NavigatorService extends BaseService { .pushNamed(routeName, arguments: arguments); } - Future replace(String routeName) { + Future replace(String routeName, {dynamic arguments}) { log.i('routeName: $routeName'); return navigatorKey.currentState - .pushNamedAndRemoveUntil(routeName, (Route route) => false); + .pushNamedAndRemoveUntil(routeName, (Route route) => false, arguments: arguments); } diff --git a/lib/redux/actions/user_actions.dart b/lib/redux/actions/user_actions.dart index 5826974..3eae93b 100644 --- a/lib/redux/actions/user_actions.dart +++ b/lib/redux/actions/user_actions.dart @@ -11,6 +11,7 @@ import 'package:aman_kassa_flutter/core/services/dialog_service.dart'; import 'package:aman_kassa_flutter/core/services/navigator_service.dart'; import 'package:aman_kassa_flutter/redux/constants/auth_type_const.dart'; import 'package:aman_kassa_flutter/redux/state/user_state.dart'; +import 'package:aman_kassa_flutter/views/login/login_view.dart'; import 'package:redux/redux.dart'; import 'package:meta/meta.dart'; import 'package:redux_thunk/redux_thunk.dart'; @@ -54,7 +55,7 @@ Future checkUserAction(Store store) async { ); if (!isAuthenticated) { - _navigation.replace(LoginViewRoute); + _navigation.replace(LoginViewRoute, arguments: LoginModel()); } else { _navigation.replace(HomeViewRoute); } @@ -75,7 +76,7 @@ Future logoutAction(Store store) async { ), ), ); - _navigation.replace(LoginViewRoute); + _navigation.replace(LoginViewRoute, arguments: LoginModel()); } catch (error) { store.dispatch(SetUserStateAction(UserState(isLoading: false))); } diff --git a/lib/views/home/tabs/AdditionalTab.dart b/lib/views/home/tabs/AdditionalTab.dart index 06855e5..579cfd2 100644 --- a/lib/views/home/tabs/AdditionalTab.dart +++ b/lib/views/home/tabs/AdditionalTab.dart @@ -65,57 +65,77 @@ class _AdditionalTabState extends State { setState(() { closeSmenaBusy = true; }); - await Redux.store.dispatch(closeSmena); - setState(() { - closeSmenaBusy = false; - }); + try { + await Redux.store.dispatch(closeSmena); + } catch (e) { + print(e); + } finally { + setState(() { + closeSmenaBusy = false; + }); + } } void _openSmena() async { setState(() { openSmenaBusy = true; }); - await Redux.store.dispatch(openSmena); - setState(() { - openSmenaBusy = false; - }); + try { + await Redux.store.dispatch(openSmena); + } catch (e) { + print(e); + } finally { + setState(() { + openSmenaBusy = false; + }); + } } void _xReport() async { setState(() { xReportBusy = true; }); - User user = Redux.store.state.userState.user; - Response response = await _api.xReport(user.token); - if (response.operation) { - _navigator.push(ImageShowRoute, - arguments: - ImageShowModel(data: response.body['check'], title: 'X Отчет')); - String url = response?.body['link']; - _dataService.insertVoucher( - user: user, - name: 'X Отчет', - base64Data: response.body['check'], - type: VoucherTypeReport, - url: url); - } else { - _dialog.showDialog(description: response.body['message']); + try { + User user = Redux.store.state.userState.user; + Response response = await _api.xReport(user.token); + if (response.operation) { + _navigator.push(ImageShowRoute, + arguments: + ImageShowModel(data: response.body['check'], title: 'X Отчет')); + String url = response?.body['link']; + _dataService.insertVoucher( + user: user, + name: 'X Отчет', + base64Data: response.body['check'], + type: VoucherTypeReport, + url: url); + } else { + _dialog.showDialog(description: response.body['message']); + } + } catch (e) { + print(e); + } finally { + setState(() { + xReportBusy = false; + }); } - setState(() { - xReportBusy = false; - }); } void _updateCatalog() async { setState(() { updateCatalog = true; }); - Dialogs.showLoadingDialog(context, _keyLoader); - await _dataService.getDataFromServer(Redux.store.state.userState.user); - Navigator.of(_keyLoader.currentContext, rootNavigator: true).pop(); - setState(() { - updateCatalog = false; - }); + try { + Dialogs.showLoadingDialog(context, _keyLoader); + await _dataService.getDataFromServer(Redux.store.state.userState.user); + Navigator.of(_keyLoader.currentContext, rootNavigator: true).pop(); + } catch (e) { + print(e); + } finally { + setState(() { + updateCatalog = false; + }); + } } void _deposit() async { diff --git a/lib/views/login/login_view.dart b/lib/views/login/login_view.dart index 4ae217d..63765a6 100644 --- a/lib/views/login/login_view.dart +++ b/lib/views/login/login_view.dart @@ -4,6 +4,7 @@ import 'package:aman_kassa_flutter/core/locator.dart'; import 'package:aman_kassa_flutter/core/services/ApiService.dart'; import 'package:aman_kassa_flutter/core/services/dialog_service.dart'; import 'package:aman_kassa_flutter/redux/actions/user_actions.dart'; +import 'package:aman_kassa_flutter/redux/constants/auth_type_const.dart'; import 'package:aman_kassa_flutter/redux/state/user_state.dart'; import 'package:aman_kassa_flutter/redux/store.dart'; import 'package:aman_kassa_flutter/shared/app_colors.dart'; @@ -19,15 +20,47 @@ import 'package:flutter_redux/flutter_redux.dart'; import 'package:flutter/material.dart'; import 'package:material_design_icons_flutter/material_design_icons_flutter.dart'; -class LoginView extends StatelessWidget { - final emailController = TextEditingController(); - final passwordController = TextEditingController(); +class LoginView extends StatefulWidget { + final LoginModel loginModel; + LoginView({this.loginModel}); + + @override + _LoginViewState createState() => _LoginViewState(); +} + +class _LoginViewState extends State { + + TextEditingController emailController ; + + TextEditingController passwordController; final FocusNode passwordNode = new FocusNode(); + final GlobalKey _scaffoldKey = new GlobalKey(); + final DialogService _dialogService = locator(); + final ApiService _apiService = locator(); + @override + void initState() { + super.initState(); + if(widget.loginModel!=null && widget.loginModel.authType == AuthenticateTypeLogin) { + emailController = TextEditingController(text: widget.loginModel.login); + passwordController = TextEditingController(text: widget.loginModel.password); + } else { + emailController = TextEditingController(); + passwordController = TextEditingController(); + } + } + + @override + void dispose() { + emailController.dispose(); + passwordController.dispose(); + super.dispose(); + } + @override Widget build(BuildContext context) { return StoreConnector( @@ -147,3 +180,10 @@ class LoginView extends StatelessWidget { } } } + +class LoginModel { + final String authType; + final String login; + final String password; + LoginModel({this.authType, this.login, this.password}); +} \ No newline at end of file diff --git a/lib/views/payment/payment_view.dart b/lib/views/payment/payment_view.dart index b5199d7..c0d7e7a 100644 --- a/lib/views/payment/payment_view.dart +++ b/lib/views/payment/payment_view.dart @@ -207,9 +207,11 @@ class _PaymentViewState extends State { _navigatorService.pop(); _navigatorService.push(ImageShowRoute, arguments: ImageShowModel(data:check, title: message, url: url )); - } else if (!response.operation && response.status != 500) { + } else if (!response.operation && ![401,402,403,412,500].contains(response.status)) { Navigator.of(_keyLoader.currentContext, rootNavigator: true).pop(); _dialogService.showDialog(description: response.body['message']); + } else { + Navigator.of(_keyLoader.currentContext, rootNavigator: true).pop(); } } else { Navigator.of(_keyLoader.currentContext, rootNavigator: true).pop();