diff --git a/assets/expansion_icon.png b/assets/faq_expansion_icon.png similarity index 100% rename from assets/expansion_icon.png rename to assets/faq_expansion_icon.png diff --git a/assets/help.png b/assets/help.png new file mode 100644 index 0000000..5d7029a Binary files /dev/null and b/assets/help.png differ diff --git a/assets/logout.png b/assets/logout.png index 83b23bb..2f79181 100644 Binary files a/assets/logout.png and b/assets/logout.png differ diff --git a/assets/settings.png b/assets/settings.png new file mode 100644 index 0000000..1e19365 Binary files /dev/null and b/assets/settings.png differ diff --git a/checker.iml b/checker.iml deleted file mode 100644 index 3b8d8be..0000000 --- a/checker.iml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/lib/base_state.dart b/lib/base_state.dart index 0ceb4be..4aa805c 100644 --- a/lib/base_state.dart +++ b/lib/base_state.dart @@ -1,5 +1,3 @@ -import 'dart:async'; - import 'package:checker/resources.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; @@ -7,10 +5,12 @@ import 'package:intl/intl.dart'; import 'common.dart'; import 'consts.dart'; -import 'strings.dart'; +import 'package:checker/db.dart'; abstract class BaseState extends State { + SqliteHelper helper; + /// Тип сборки. Определяет, какие брать ресурсы (цвета, картинки) String app; @@ -31,7 +31,10 @@ abstract class BaseState extends State { platform.invokeMethod('getFlavor').then((flavor) { setState(() { app = flavor; - onStart(); + helper = new SqliteHelper(); + helper.open().then((_){ + onStart(); + }); }); }); } @@ -57,7 +60,7 @@ abstract class BaseState extends State { } void onStart() { - + print("ON START!"); } /// Возвращает контейнер с всеми виджетами экрана. @@ -72,7 +75,22 @@ abstract class BaseState extends State { } List getMenuButtons() { - return [getFaqButton()]; + return [ + new PopupMenuButton( + itemBuilder: (BuildContext context) { + [ + new PopupMenuItem( + child: new Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + new Image.asset( + settings_png, width: 48.0, height: 48.0), + new Image.asset(help_png, width: 48.0, height: 48.0), + new Image.asset(logout_png, width: 48.0, height: 48.0), + ])) + ]; + } + )]; } Widget getFaqButton() { diff --git a/lib/common.dart b/lib/common.dart index ce2e840..5a078b8 100644 --- a/lib/common.dart +++ b/lib/common.dart @@ -1,13 +1,13 @@ -import 'db.dart'; -import 'package:flutter/services.dart'; +import 'package:checker/screens/faq.dart'; +import 'package:checker/screens/purchase.dart'; +import 'package:checker/screens/registration.dart'; import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; import 'consts.dart'; +import 'db.dart'; import 'network.dart'; import 'resources.dart'; -import 'package:checker/registration.dart'; -import 'package:checker/purchase.dart'; -import 'faq.dart'; import 'strings.dart'; // Канал для взаимодействия с кодом платформы. @@ -53,13 +53,18 @@ logout(BuildContext context) async { showYesNoDialog(context, StringsLocalization.confirmation(), StringsLocalization.askChangeStore(), positiveCalback); } -forceLogout(SqliteHelper helper, BuildContext context) async { - String token = await helper.getToken(); +forceLogout(String token , BuildContext context) async { + deleteToken(token).then((response) { print(response.body); - platform.invokeMethod('removeKeys').then((result) { - Navigator.of(context).pop(); - pushRoute(context, new RegistrationScreen()); // Запускаем регистрацию + SqliteHelper helper = new SqliteHelper(); + helper.open().then((_) { + helper.clear().then((_) { + helper.close().then((_) { + Navigator.of(context).pop(); + pushRoute(context, new RegistrationScreen()); // Запускаем регистрацию + }); + }); }); }).catchError((error) { print(error.toString()); @@ -79,7 +84,7 @@ startScanner(BuildContext context, String app, SqliteHelper helper) async { print('call.method: ${call.method}'); if (call.method == 'logout') { - forceLogout(helper, context); + forceLogout(token, context); } else if (call.method == 'faq') { faq(context, true); } else { diff --git a/lib/consts.dart b/lib/consts.dart index a098939..60d9b85 100644 --- a/lib/consts.dart +++ b/lib/consts.dart @@ -8,11 +8,17 @@ const String appToken = '9fec83cdca38c357e6b65dbb17514cdd36bf2a08'; // Assets const String logout_png = 'assets/logout.png'; +const String help_png = 'assets/help.png'; +const String settings_png = 'assets/settings.png'; + const String activate_token_bg_png = 'assets/activate_token_message_background.png'; const String active_token_bg_png = 'assets/active_token_message_background.png'; -const String expansion_icon_png = 'assets/expansion_icon.png'; + +const String expansion_icon_png = 'assets/faq_expansion_icon.png'; + const String powered_by_dinect_splash_png = 'assets/powered_by_dinect_splash.png'; const String powered_by_dinect_png = 'assets/powered_by_dinect.png'; + const String splash_text_png = 'assets/splash_text.png'; const Color greyTextColor = const Color(0xffa5a5a5); diff --git a/lib/db.dart b/lib/db.dart index 2443ccc..db078d3 100644 --- a/lib/db.dart +++ b/lib/db.dart @@ -41,7 +41,8 @@ class SqliteHelper { Map session = { columnMerchantID: merchantID, columnPosID: posID, - columnToken: token + columnToken: token, + columnDocID: 0 }; return db.insert(tableSession, session); @@ -49,12 +50,16 @@ class SqliteHelper { Future getToken() async { Map session = await _getSession(); - return session != null ? session[columnToken] : null; + String token = session != null ? session[columnToken] : null; + print('token: {$token}'); + return token; } Future getMerchantID() async { Map session = await _getSession(); - return session != null ? session[columnMerchantID] : null; + String merchantID = session != null ? session[columnMerchantID] : null; + print('token: {$merchantID}'); + return merchantID; } Future getPosID() async { @@ -62,6 +67,14 @@ class SqliteHelper { return session != null ? session[columnPosID] : new DateTime.now().millisecondsSinceEpoch.toString(); } + Future getDocID() async { + Map session = await _getSession(); + int docID = session != null ? session[columnDocID] : 0; + db.update(tableSession, {columnDocID: docID + 1}); + print('docid: {$docID}'); + return docID; + } + Future _getSession() async { List maps = await db.query(tableSession, columns: null); diff --git a/lib/main.dart b/lib/main.dart index d0d13ae..a9da1c9 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'splash.dart'; +import 'package:checker/screens/splash.dart'; import 'consts.dart'; import 'strings.dart'; import 'common.dart'; diff --git a/lib/faq.dart b/lib/screens/faq.dart similarity index 97% rename from lib/faq.dart rename to lib/screens/faq.dart index c13f87a..481f02c 100644 --- a/lib/faq.dart +++ b/lib/screens/faq.dart @@ -1,8 +1,8 @@ import 'package:flutter/material.dart'; -import 'base_state.dart'; -import 'consts.dart'; -import 'common.dart'; +import 'package:checker/base_state.dart'; +import 'package:checker/consts.dart'; +import 'package:checker/common.dart'; /// Класс содержит заголовки и текст блоков FAQ. class Entry { @@ -68,7 +68,7 @@ class FAQScreenState extends BaseState { onWillPop() { if(returnToScanner) { - return startScanner(context, app); + return startScanner(context, app, helper); } else { return true; } diff --git a/lib/finish_registration.dart b/lib/screens/finish_registration.dart similarity index 89% rename from lib/finish_registration.dart rename to lib/screens/finish_registration.dart index 014e8e9..5956f37 100644 --- a/lib/finish_registration.dart +++ b/lib/screens/finish_registration.dart @@ -1,6 +1,5 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:checker/db.dart'; import 'dart:convert'; // Пакет для обработки json с ответом от сервера. import 'package:checker/common.dart'; @@ -15,23 +14,15 @@ class FinishRegistrationScreen extends StatefulWidget { class _RegistrationScreenState extends BaseState { - SqliteHelper helper; - bool _tokenActive = false; - String _merchantID = ''; + String _merchantID; - _RegistrationScreenState() { - helper = new SqliteHelper(); - if (textFieldValue == "") { - helper.open().then((_){ - helper.getMerchantID().then((result) { - setState(() { - _merchantID = result; - print('merchanID: ${_merchantID}'); - }); - }); + @override void onStart() { + helper.getMerchantID().then((result) { + setState(() { + _merchantID = result; }); - } + }); } @override String getTitle() { @@ -39,7 +30,7 @@ class _RegistrationScreenState extends BaseState { } @override getHint() { - return StringsLocalization.idStore(); + return _merchantID; } @override Widget getScreenContent() { diff --git a/lib/purchase.dart b/lib/screens/purchase.dart similarity index 89% rename from lib/purchase.dart rename to lib/screens/purchase.dart index 53887df..88e60b2 100644 --- a/lib/purchase.dart +++ b/lib/screens/purchase.dart @@ -3,13 +3,13 @@ import 'package:flutter/services.dart'; import 'dart:convert'; import 'dart:core'; -import 'resources.dart'; -import 'strings.dart'; -import 'common.dart'; -import 'consts.dart'; -import 'network.dart'; -import 'base_state.dart'; -import 'purchase_success.dart'; +import 'package:checker/resources.dart'; +import 'package:checker/strings.dart'; +import 'package:checker/common.dart'; +import 'package:checker/consts.dart'; +import 'package:checker/network.dart'; +import 'package:checker/base_state.dart'; +import 'package:checker/screens/purchase_success.dart'; /// Экран проведения покупки. class PurchaseScreen extends StatefulWidget { @@ -32,6 +32,9 @@ class PurchaseScreenState extends BaseState { PurchaseScreenState(String userString, String card) { this.user = JSON.decode(userString); this.card = card; + } + + @override void onStart() { getLoyalty(user['loyalty_url']); } @@ -69,7 +72,7 @@ class PurchaseScreenState extends BaseState { child: new Text( title, style: new TextStyle(color: textColor)), - onPressed: () => startScanner(context, app)), + onPressed: () => startScanner(context, app, helper)), decoration: new BoxDecoration( border: new Border.all(color: Resources.getButtonColor(app), width: 1.0), borderRadius: new BorderRadius.all(new Radius.circular(4.0)))); @@ -109,7 +112,7 @@ class PurchaseScreenState extends BaseState { if (await platform.invokeMethod('isOnline')) { - String token = await sqliteHelper.getToken(); + String token = await helper.getToken(); var headers = { 'DM-Authorization': 'dmapptoken $appToken', @@ -199,8 +202,8 @@ class PurchaseScreenState extends BaseState { if (!purchaseInProgress) { purchaseInProgress = true; - String token = await sqliteHelper.getToken(); - platform.invokeMethod('getDocID').then((result) { + String token = await helper.getToken(); + helper.getMerchantID().then((result) { String url = user['purchases_url']; @@ -219,8 +222,10 @@ class PurchaseScreenState extends BaseState { httpClient.post(url, body: body, headers: headers).then((response) { print(response.body); - Navigator.of(context).pop(); - pushRoute(context, new PurchaseSuccessScreen(sumTotal, user['first_name'] == null ? '' : user['first_name'])); + helper.close().then((_) { + Navigator.of(context).pop(); + pushRoute(context, new PurchaseSuccessScreen(sumTotal, user['first_name'] == null ? '' : user['first_name'])); + }); }).catchError((error) { purchaseInProgress = false; diff --git a/lib/purchase_success.dart b/lib/screens/purchase_success.dart similarity index 99% rename from lib/purchase_success.dart rename to lib/screens/purchase_success.dart index dfebd2d..fc0134b 100644 --- a/lib/purchase_success.dart +++ b/lib/screens/purchase_success.dart @@ -50,7 +50,7 @@ class PurchaseSuccessScreenState extends BaseState { getScanButton() { String title = StringsLocalization.scan(); - return buildRaisedButton(title, () => startScanner(context, app)); + return buildRaisedButton(title, () => startScanner(context, app, helper)); } getSuccessMessage() { diff --git a/lib/registration.dart b/lib/screens/registration.dart similarity index 92% rename from lib/registration.dart rename to lib/screens/registration.dart index 4ea45b5..ff61741 100644 --- a/lib/registration.dart +++ b/lib/screens/registration.dart @@ -1,5 +1,5 @@ import 'package:checker/db.dart'; -import 'package:checker/finish_registration.dart'; +import 'package:checker/screens/finish_registration.dart'; import 'package:flutter/material.dart'; import 'dart:convert'; // Пакет для обработки json с ответом от сервера. @@ -72,8 +72,6 @@ class _RegistrationScreenState extends BaseState { _register() async { if (await platform.invokeMethod('isOnline')) { - SqliteHelper helper = new SqliteHelper(); - await helper.open(); String posID = await helper.getPosID(); createToken(textFieldValue, posID).then((response) { @@ -84,21 +82,20 @@ class _RegistrationScreenState extends BaseState { }); print(response.body); - + print(response.statusCode.toString()); Map parsedMap = JSON.decode(response.body); if (response.statusCode == 201) { - helper.insert(textFieldValue, posID, parsedMap['token']); - helper.close(); - pushRoute(context, new FinishRegistrationScreen()); + helper.insert(textFieldValue, posID, parsedMap['token']).then((_) { + helper.close(); + pushRoute(context, new FinishRegistrationScreen()); + }); } else { - helper.close(); setState(() { error = parsedMap['errors'][0]; }); } }).catchError((error) { - helper.close(); print(error.toString()); }); } diff --git a/lib/splash.dart b/lib/screens/splash.dart similarity index 93% rename from lib/splash.dart rename to lib/screens/splash.dart index cde2563..0585269 100644 --- a/lib/splash.dart +++ b/lib/screens/splash.dart @@ -1,16 +1,15 @@ import 'package:flutter/material.dart'; import 'package:http/http.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 'db.dart'; -import 'resources.dart'; -import 'base_state.dart'; +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_state.dart'; +import 'package:checker/screens/registration.dart'; +import 'package:checker/screens/finish_registration.dart'; class SplashScreen extends StatefulWidget { @override State createState() => new _SplashScreenState(); @@ -37,7 +36,6 @@ class _SplashScreenState extends BaseState { width: 122.0)))]); } - @override Widget getMainWidget() { return getScreenContent(); } @@ -73,8 +71,6 @@ class _SplashScreenState extends BaseState { /// Запуск следующего экрана приложения. showNextScreen(BuildContext context) async { - SqliteHelper helper = new SqliteHelper(); - await helper.open(); String token = await helper.getToken(); // В случае, если в приложении отсутствует токен, diff --git a/pubspec.yaml b/pubspec.yaml index 9d607a0..dc47938 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -32,10 +32,12 @@ flutter: - assets/autobonus_splash.png - assets/pip_splash.png + - assets/settings.png + - assets/help.png - assets/logout.png - assets/activate_token_message_background.png - assets/active_token_message_background.png - - assets/expansion_icon.png + - assets/faq_expansion_icon.png - assets/powered_by_dinect_splash.png - assets/powered_by_dinect.png - assets/autobonus_logo.png