login reAuth

4.4
Serik.Uvaissov 2020-07-08 16:16:07 +06:00
parent 02db5d8a9b
commit 9b2b0a805d
7 changed files with 117 additions and 44 deletions

View File

@ -12,9 +12,10 @@ import 'package:flutter/material.dart';
Route<dynamic> 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(

View File

@ -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) {
if (!check.operation && ( [401,402,403,412].contains(check.status) ) ) {
var future = new Future.delayed(const Duration(milliseconds: 1000), (){
_dialogService.showDialog(description: 'Необходимо пройти повторную авторизацию');
_navigatorService.replace(LoginViewRoute);
UserState state = Redux.store.state.userState;
_navigatorService.replace(LoginViewRoute, arguments: LoginModel(authType: state.authenticateType, login: state.login, password: state.password ));
});
}
}
return body;

View File

@ -10,10 +10,10 @@ class NavigatorService extends BaseService {
.pushNamed(routeName, arguments: arguments);
}
Future<dynamic> replace(String routeName) {
Future<dynamic> replace(String routeName, {dynamic arguments}) {
log.i('routeName: $routeName');
return navigatorKey.currentState
.pushNamedAndRemoveUntil(routeName, (Route<dynamic> route) => false);
.pushNamedAndRemoveUntil(routeName, (Route<dynamic> route) => false, arguments: arguments);
}

View File

@ -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<void> checkUserAction(Store<AppState> store) async {
);
if (!isAuthenticated) {
_navigation.replace(LoginViewRoute);
_navigation.replace(LoginViewRoute, arguments: LoginModel());
} else {
_navigation.replace(HomeViewRoute);
}
@ -75,7 +76,7 @@ Future<void> logoutAction(Store<AppState> store) async {
),
),
);
_navigation.replace(LoginViewRoute);
_navigation.replace(LoginViewRoute, arguments: LoginModel());
} catch (error) {
store.dispatch(SetUserStateAction(UserState(isLoading: false)));
}

View File

@ -65,26 +65,37 @@ class _AdditionalTabState extends State<AdditionalTab> {
setState(() {
closeSmenaBusy = true;
});
try {
await Redux.store.dispatch(closeSmena);
} catch (e) {
print(e);
} finally {
setState(() {
closeSmenaBusy = false;
});
}
}
void _openSmena() async {
setState(() {
openSmenaBusy = true;
});
try {
await Redux.store.dispatch(openSmena);
} catch (e) {
print(e);
} finally {
setState(() {
openSmenaBusy = false;
});
}
}
void _xReport() async {
setState(() {
xReportBusy = true;
});
try {
User user = Redux.store.state.userState.user;
Response response = await _api.xReport(user.token);
if (response.operation) {
@ -101,22 +112,31 @@ class _AdditionalTabState extends State<AdditionalTab> {
} else {
_dialog.showDialog(description: response.body['message']);
}
} catch (e) {
print(e);
} finally {
setState(() {
xReportBusy = false;
});
}
}
void _updateCatalog() async {
setState(() {
updateCatalog = true;
});
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 {
setState(() {

View File

@ -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<LoginView> {
TextEditingController emailController ;
TextEditingController passwordController;
final FocusNode passwordNode = new FocusNode();
final GlobalKey<ScaffoldState> _scaffoldKey = new GlobalKey<ScaffoldState>();
final DialogService _dialogService = locator<DialogService>();
final ApiService _apiService = locator<ApiService>();
@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<AppState, UserState>(
@ -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});
}

View File

@ -207,9 +207,11 @@ class _PaymentViewState extends State<PaymentView> {
_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();