146 lines
5.1 KiB
Dart
146 lines
5.1 KiB
Dart
import 'package:flutter/material.dart';
|
||
import 'package:intl/intl.dart';
|
||
import 'dart:convert';
|
||
import 'dart:async';
|
||
import 'common.dart';
|
||
import 'network.dart';
|
||
import 'consts.dart';
|
||
import 'registration.dart';
|
||
import 'finish_registration.dart';
|
||
import 'resources.dart';
|
||
import 'base_state.dart';
|
||
|
||
class SplashScreen extends StatefulWidget {
|
||
@override State createState() => new _SplashScreenState();
|
||
}
|
||
|
||
class _SplashScreenState extends BaseState<SplashScreen> {
|
||
|
||
@override
|
||
Widget getScreenContent() {
|
||
return app == null
|
||
? getBackground()
|
||
: new Stack(
|
||
children: <Widget>[
|
||
getBackground(),
|
||
getLogo(),
|
||
new Align(
|
||
alignment: FractionalOffset.bottomRight,
|
||
child: new Container(
|
||
margin: new EdgeInsets.only(
|
||
right: 11.0,
|
||
bottom: 5.0),
|
||
child: new Image.asset(powered_by_dinect_splash_png,
|
||
height: 16.0,
|
||
width: 122.0)))]);
|
||
}
|
||
|
||
@override Widget getMainWidget() {
|
||
return getScreenContent();
|
||
}
|
||
|
||
@override
|
||
String getTitle() {
|
||
return null;
|
||
}
|
||
|
||
@override void onStart() {
|
||
new Future.delayed(const Duration(milliseconds: 1000), () {
|
||
showNextScreen(context);
|
||
});
|
||
}
|
||
|
||
/// Возвращает столбец с логотипом приложения и текстом под ним.
|
||
/// Столбец занимает не все доступное пространство, а необходимый минимум в центре экрана.
|
||
getLogo() {
|
||
return new Center(
|
||
child: new Column(
|
||
mainAxisSize: MainAxisSize.min,
|
||
children: <Widget>[
|
||
new Image.asset(
|
||
Resources.getLogo(app),
|
||
height: 112.0,
|
||
width: 252.0),
|
||
new Image.asset(
|
||
splash_text_png,
|
||
height: 40.0,
|
||
width: 240.0)]));
|
||
}
|
||
|
||
/// Запуск следующего экрана приложения.
|
||
showNextScreen(BuildContext context) async {
|
||
|
||
String token = await platform.invokeMethod('getToken');
|
||
|
||
// В случае, если в приложении отсутствует токен,
|
||
// необходимо запустить регистрацию кассы.
|
||
if (token == null) {
|
||
pushRoute(context, new RegistrationScreen());
|
||
} else {
|
||
if (await platform.invokeMethod('isOnline')) {
|
||
checkTokenStatus(token).then((statusResponse) {
|
||
handleStatusResponse(context, statusResponse);
|
||
}).catchError((error) {
|
||
print(error.toString());
|
||
return false;
|
||
});
|
||
}
|
||
}
|
||
}
|
||
|
||
/// Обработка ответа.
|
||
/// В случае, если токен был удален может прийти active: false, либо 404.
|
||
/// Если токен не активен, попробовать создать его еще раз.
|
||
handleStatusResponse(BuildContext context, var statusResponse) async {
|
||
int code = statusResponse.statusCode;
|
||
print('resp: ${code}');
|
||
|
||
if (code == 404) {
|
||
platform.invokeMethod('removeKeys').then((result) {
|
||
print('try to start registration');
|
||
pushRoute(context, new RegistrationScreen());
|
||
});
|
||
} else {
|
||
|
||
Map status = JSON.decode(statusResponse.body);
|
||
bool active = status['active'] == null ? false : status['active'];
|
||
|
||
if (active) {
|
||
startScanner(context, app);
|
||
} else {
|
||
if (await platform.invokeMethod('isOnline')) {
|
||
_createToken(context);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
/// Отправляется запрос на создание токена.
|
||
///
|
||
/// Если вернулся код 409, значит такой токен уже существует и активирован.
|
||
/// Нужно направить пользователя на экран подтверждения активации.
|
||
///
|
||
/// Если вернулся код 200, значит токен был ранее удален и только что снова создался.
|
||
/// Нужно удалить его и направить пользователя на экран регистрации.
|
||
_createToken(BuildContext ctx) async {
|
||
String merchantID = await platform.invokeMethod('getMerchantID');
|
||
String posID = await platform.invokeMethod('getPosID');
|
||
createToken(merchantID, posID).then((response) {
|
||
if (response.statusCode == 409) {
|
||
pushRoute(ctx, new FinishRegistrationScreen());
|
||
} else if (response.statusCode == 201) {
|
||
platform.invokeMethod('removeKeys').then((result) {
|
||
Map parsedMap = JSON.decode(result);
|
||
deleteToken(parsedMap['token']).then((response) {
|
||
print(response.body);
|
||
Navigator.of(ctx).pop(); // Убираем текущий route
|
||
pushRoute(ctx, new RegistrationScreen()); // Запускаем регистрацию
|
||
}).catchError((error) {
|
||
print(error.toString());
|
||
});
|
||
});
|
||
}
|
||
}).catchError((error) => print(error.toString()));
|
||
}
|
||
}
|