From e8788f72a312c46bf81db612caf00e1d3c3bb441 Mon Sep 17 00:00:00 2001 From: kifio Date: Tue, 12 Sep 2017 00:08:13 +0300 Subject: [PATCH] =?UTF-8?q?=D0=AD=D0=BA=D1=80=D0=B0=D0=BD=20=D0=BF=D0=B5?= =?UTF-8?q?=D1=80=D0=B5=D0=BA=D0=BB=D1=8E=D1=87=D0=B5=D0=BD=D0=B8=D1=8F=20?= =?UTF-8?q?=D0=B2=D0=B0=D0=BB=D1=8E=D1=82=D1=8B=20=D0=BE=D1=82=D0=BA=D1=80?= =?UTF-8?q?=D1=8B=D0=B2=D0=B0=D0=B5=D1=82=D1=81=D1=8F=20=D1=81=20=D0=BF?= =?UTF-8?q?=D0=B5=D1=80=D0=B2=D0=BE=D0=B3=D0=BE=20=D1=80=D0=B0=D0=B7=D0=B0?= =?UTF-8?q?,=20=D1=81=D0=BE=D0=B5=D0=B4=D0=B8=D0=BD=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=20=D1=81=20=D0=B1=D0=B0=D0=B7=D0=BE=D0=B9=20=D0=B4=D0=B0?= =?UTF-8?q?=D0=BD=D0=BD=D1=8B=D1=85=20=D0=BD=D0=B5=20=D0=BE=D1=82=D0=BA?= =?UTF-8?q?=D1=80=D1=8B=D0=B2=D0=B0=D0=B5=D1=82=D1=81=D1=8F=20=D0=BD=D0=B0?= =?UTF-8?q?=20=D1=82=D0=B5=D1=85=20=D1=8D=D0=BA=D1=80=D0=B0=D0=BD=D0=B0?= =?UTF-8?q?=D1=85,=20=D0=BD=D0=B0=20=D0=BA=D0=BE=D1=82=D0=BE=D1=80=D1=8B?= =?UTF-8?q?=D1=85=20=D1=8D=D1=82=D0=BE=20=D0=BD=D0=B5=20=D1=82=D1=80=D0=B5?= =?UTF-8?q?=D0=B1=D1=83=D0=B5=D1=82=D1=81=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/base/base_screen.dart | 13 ++++++++ lib/common.dart | 5 +-- lib/main.dart | 17 +++------- lib/screens/currencies.dart | 11 +++---- lib/screens/purchase.dart | 15 ++++++--- lib/screens/registration.dart | 6 +++- lib/screens/settings.dart | 52 +++++++++++++++--------------- lib/screens/splash.dart | 60 +++++++++++++++++------------------ 8 files changed, 98 insertions(+), 81 deletions(-) create mode 100644 lib/base/base_screen.dart diff --git a/lib/base/base_screen.dart b/lib/base/base_screen.dart new file mode 100644 index 0000000..4ff6667 --- /dev/null +++ b/lib/base/base_screen.dart @@ -0,0 +1,13 @@ +import 'package:checker/db.dart'; +import 'package:flutter/material.dart'; + +abstract class BaseScreen extends StatefulWidget { + + final SqliteHelper helper; + final String app; + + BaseScreen(this.helper, this.app); + + @override + State createState(); +} \ No newline at end of file diff --git a/lib/common.dart b/lib/common.dart index d1d238b..5c4d8dd 100644 --- a/lib/common.dart +++ b/lib/common.dart @@ -1,6 +1,7 @@ import 'package:checker/screens/faq.dart'; import 'package:checker/screens/purchase.dart'; import 'package:checker/screens/registration.dart'; +import 'package:checker/screens/splash.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; @@ -43,7 +44,7 @@ logout(BuildContext context) async { platform.invokeMethod('removeKeys').then((result) { Navigator.of(context).pop(); Navigator.of(context).pop(); - pushRouteReplacement(context, new RegistrationScreen()); // Запускаем регистрацию + pushRouteReplacement(context, new SplashScreen()); // Запускаем регистрацию }); }).catchError((error) { print(error.toString()); @@ -66,7 +67,7 @@ forceLogout(String token , BuildContext context) async { helper.clear().then((_) { helper.close().then((_) { Navigator.of(context).pop(); - pushRouteReplacement(context, new RegistrationScreen()); // Запускаем регистрацию + pushRouteReplacement(context, new SplashScreen()); }); }); }); diff --git a/lib/main.dart b/lib/main.dart index 8b6e94d..8c81152 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,25 +1,16 @@ import 'package:flutter/material.dart'; import 'package:checker/screens/splash.dart'; import 'consts.dart'; -import 'strings.dart'; -import 'common.dart'; -import 'dart:async'; /// Точка входа в приложение. void main() { runApp(new Checker()); } -class Checker extends StatefulWidget { - @override CheckerState createState() => new CheckerState(); -} - -class CheckerState extends State { - +class Checker extends StatelessWidget { @override Widget build(BuildContext context) { return new MaterialApp( - title: appName, - home: new SplashScreen()); + title: appName, + home: new SplashScreen()); } - -} +} \ No newline at end of file diff --git a/lib/screens/currencies.dart b/lib/screens/currencies.dart index 18dcbe7..bbd5499 100644 --- a/lib/screens/currencies.dart +++ b/lib/screens/currencies.dart @@ -1,15 +1,14 @@ +import 'dart:async'; + +import 'package:checker/base/base_screen.dart'; import 'package:checker/base/settings_base_state.dart'; import 'package:checker/db.dart'; import 'package:flutter/material.dart'; import 'package:checker/strings.dart'; -import 'package:checker/common.dart'; -class CurrenciesScreen extends StatefulWidget { +class CurrenciesScreen extends BaseScreen { - final SqliteHelper helper; - final String app; - - CurrenciesScreen(this.helper, this.app); + CurrenciesScreen(helper, app) : super(helper, app); @override State createState() => new _CurrenciesState(helper, app); } diff --git a/lib/screens/purchase.dart b/lib/screens/purchase.dart index e49a70d..82f61bf 100644 --- a/lib/screens/purchase.dart +++ b/lib/screens/purchase.dart @@ -219,10 +219,17 @@ class PurchaseScreenState extends BaseState { httpClient.post(url, body: body, headers: headers).then((response) { print(response.body); - helper.close().then((_) { - Navigator.of(context).pop(); - pushRouteReplacement(context, new PurchaseSuccessScreen(sumTotal, user['first_name'] == null ? '' : user['first_name'])); - }); + Map parsedMap = JSON.decode(response.body); + + if (parsedMap.containsKey('errors')) { + List errors = parsedMap['errors']; + // TODO: ПОказывать сообщение с ошибкой! + } else { + helper.close().then((_) { + Navigator.of(context).pop(); + pushRouteReplacement(context, new PurchaseSuccessScreen(sumTotal, user['first_name'] == null ? '' : user['first_name'])); + }); + } }).catchError((error) { purchaseInProgress = false; diff --git a/lib/screens/registration.dart b/lib/screens/registration.dart index 3d5bbd3..ea42ffa 100644 --- a/lib/screens/registration.dart +++ b/lib/screens/registration.dart @@ -1,3 +1,4 @@ +import 'package:checker/base/base_screen.dart'; import 'package:checker/screens/finish_registration.dart'; import 'package:flutter/material.dart'; import 'dart:convert'; // Пакет для обработки json с ответом от сервера. @@ -9,7 +10,10 @@ import 'package:checker/base/base_state.dart'; import 'package:checker/strings.dart'; /// Экран регистрации магазина и кассы. -class RegistrationScreen extends StatefulWidget { +class RegistrationScreen extends BaseScreen { + + RegistrationScreen(helper, app) : super(helper, app); + @override State createState() => new _RegistrationScreenState(); } diff --git a/lib/screens/settings.dart b/lib/screens/settings.dart index 2aef273..8d6211f 100644 --- a/lib/screens/settings.dart +++ b/lib/screens/settings.dart @@ -1,18 +1,15 @@ -import 'package:checker/db.dart'; -import 'package:checker/screens/currencies.dart'; -import 'package:checker/screens/languages.dart'; -import 'package:flutter/material.dart'; +import 'package:checker/base/base_screen.dart'; +import 'package:checker/base/base_state.dart'; import 'package:checker/common.dart'; import 'package:checker/consts.dart'; +import 'package:checker/db.dart'; +import 'package:checker/screens/currencies.dart'; import 'package:checker/strings.dart'; -import 'package:checker/base/base_state.dart'; +import 'package:flutter/material.dart'; -class SettingsScreen extends StatefulWidget { +class SettingsScreen extends BaseScreen { - final SqliteHelper helper; - final String app; - - SettingsScreen(this.helper, this.app); + SettingsScreen(helper, app) : super(helper, app); @override State createState() => new SettingsState(helper, app); } @@ -27,7 +24,7 @@ class MenuItem { class SettingsState extends BaseState { - List menuItems; + List menuItems = [new MenuItem(StringsLocalization.currency(), '')]; SettingsState(SqliteHelper helper, String app) { this.helper = helper; @@ -35,15 +32,15 @@ class SettingsState extends BaseState { } @override Widget build(BuildContext ctx) { - helper.getSettings().then((info) { - setState(() { - print("load settings"); - menuItems = [ -// new MenuItem(StringsLocalization.locale(), getLocaleTitle(info["locale"])), - new MenuItem(StringsLocalization.currency(), getCurrencyTitle(info["currency"])) - ]; - }); - }); + helper.getSettings().then((info) { + if (menuItems != null) { + if (menuItems[0].selectedValue != info['currency'].toString()) { + setState(() { + menuItems[0].selectedValue = info['currency'].toString(); + }); + } + } + }); return getMainWidget(); } @@ -73,16 +70,21 @@ class SettingsState extends BaseState { return new Container( height: 56.0, padding: new EdgeInsets.only(left: 8.0), - child: (new FlatButton(onPressed: () => onPressed(menuItems.indexOf(item)), + child: (new FlatButton( + onPressed: () => onPressed(menuItems.indexOf(item)), child: new Row(children: [ - new Expanded(child: new Text(item.title, style: new TextStyle(fontWeight: FontWeight.w600, color: faqGrey, fontSize: 14.0))), - new Text(item.selectedValue, style: new TextStyle(fontWeight: FontWeight.w400, color: faqGrey, fontSize: 14.0)), - getArrow()])))); + new Expanded(child: new Text(item.title, style: new TextStyle( + fontWeight: FontWeight.w600, + color: faqGrey, + fontSize: 14.0))), + new Text(getCurrencyTitle(int.parse(item.selectedValue)), style: new TextStyle( + fontWeight: FontWeight.w400, color: faqGrey, fontSize: 14.0)), + getArrow() + ])))); } void onPressed(int position) { switch (position) { -// case 0 : return pushRoute(context, new LanguagesScreen()); case 0 : return pushRoute(context, new CurrenciesScreen(helper, app)); } } diff --git a/lib/screens/splash.dart b/lib/screens/splash.dart index 704eb6a..1f3dd3b 100644 --- a/lib/screens/splash.dart +++ b/lib/screens/splash.dart @@ -1,17 +1,18 @@ +import 'dart:async'; +import 'dart:convert'; + +import 'package:checker/base/base_state.dart'; +import 'package:checker/common.dart'; +import 'package:checker/consts.dart'; +import 'package:checker/db.dart'; +import 'package:checker/network.dart'; +import 'package:checker/resources.dart'; +import 'package:checker/screens/finish_registration.dart'; +import 'package:checker/screens/registration.dart'; import 'package:checker/strings.dart'; import 'package:flutter/material.dart'; import 'package:http/http.dart'; import 'package:intl/intl.dart'; -import 'dart:convert'; -import 'dart:async'; -import 'package:checker/common.dart'; -import 'package:checker/network.dart'; -import 'package:checker/consts.dart'; -import 'package:checker/resources.dart'; -import 'package:checker/db.dart'; -import 'package:checker/base/base_state.dart'; -import 'package:checker/screens/registration.dart'; -import 'package:checker/screens/finish_registration.dart'; class SplashScreen extends StatefulWidget { @override State createState() => new _SplashScreenState(); @@ -26,10 +27,9 @@ class _SplashScreenState extends BaseState { @override void onStart() { helper.getSettings().then((info) { if (info == null) { - platform.invokeMethod('getLocale').then((locale) { - Intl.defaultLocale = locale; - StringsLocalization.load(locale).then((l) { - platform.invokeMethod('getCurrency').then((currency) { + platform.invokeMethod('getCurrency').then((currency) { + platform.invokeMethod('getLocale').then((locale) { + initLocale(locale, () { helper.createAppInfo(locale, currency).then((_) { showNext(); }); @@ -38,8 +38,7 @@ class _SplashScreenState extends BaseState { }); } else { helper.getLocale().then((locale) { - Intl.defaultLocale = locale; - StringsLocalization.load(locale).then((l) { + initLocale(locale, () { showNext(); }); }); @@ -47,6 +46,13 @@ class _SplashScreenState extends BaseState { }); } + void initLocale(String locale, Future onValue()) { + Intl.defaultLocale = locale; + StringsLocalization.load(locale).then((_) { + onValue(); + }); + } + void showNext() { new Future.delayed(const Duration(milliseconds: 1000), () { showNextScreen(); @@ -69,7 +75,8 @@ class _SplashScreenState extends BaseState { bottom: 5.0), child: new Image.asset(powered_by_dinect_splash_png, height: 16.0, - width: 122.0)))]); + width: 122.0))) + ]); } /// Возвращает столбец с логотипом приложения и текстом под ним. @@ -86,19 +93,18 @@ class _SplashScreenState extends BaseState { new Image.asset( splash_text_png, height: 40.0, - width: 240.0)])); + width: 240.0) + ])); } /// Запуск следующего экрана приложения. showNextScreen() async { - String token = await helper.getToken(); // В случае, если в приложении отсутствует токен, // необходимо запустить регистрацию кассы. if (token == null) { - await helper.close(); - pushRouteReplacement(context, new RegistrationScreen()); + pushRouteReplacement(context, new RegistrationScreen(helper, app)); } else { if (await platform.invokeMethod('isOnline')) { checkTokenStatus(token).then((statusResponse) { @@ -122,12 +128,9 @@ class _SplashScreenState extends BaseState { if (code == 404) { helper.clear().then((result) { - helper.close().then((_) { - pushRouteReplacement(context, new RegistrationScreen()); - }); + pushRouteReplacement(context, new RegistrationScreen(helper, app)); }); } else { - Map status = JSON.decode(statusResponse.body); bool active = status['active'] == null ? false : status['active']; @@ -149,7 +152,6 @@ class _SplashScreenState extends BaseState { /// Если вернулся код 200, значит токен был ранее удален и только что снова создался. /// Нужно удалить его и направить пользователя на экран регистрации. _createToken(SqliteHelper helper) async { - String merchantID = await helper.getMerchantID(); String posID = await helper.getPosID(); @@ -165,13 +167,11 @@ class _SplashScreenState extends BaseState { /// Очищаем бд, делаем запрос на удаление токена. void clearToken(Response response, SqliteHelper helper) { - helper.clear().then((_) { Map parsedMap = JSON.decode(response.body); deleteToken(parsedMap['token']).then((_) { - helper.close(); - Navigator.of(context).pop(); // Убираем текущий route - pushRouteReplacement(context, new RegistrationScreen()); // Запускаем регистрацию + Navigator.of(context).pop(); + pushRouteReplacement(context, new RegistrationScreen(helper, app)); }).catchError((error) { helper.close(); print(error.toString());