В бд добавлена таблица настроек, данные для настроек берутся из базы
This commit is contained in:
@@ -46,36 +46,42 @@ android {
|
|||||||
applicationId 'com.dinect.autobonus'
|
applicationId 'com.dinect.autobonus'
|
||||||
buildConfigField "String", "locale", "\"en\""
|
buildConfigField "String", "locale", "\"en\""
|
||||||
buildConfigField "String", "flavor", "\"autobonus\""
|
buildConfigField "String", "flavor", "\"autobonus\""
|
||||||
|
buildConfigField "int", "currency", "643"
|
||||||
}
|
}
|
||||||
|
|
||||||
autobonus_ru {
|
autobonus_ru {
|
||||||
applicationId 'com.dinect.autobonus'
|
applicationId 'com.dinect.autobonus'
|
||||||
buildConfigField "String", "locale", "\"ru\""
|
buildConfigField "String", "locale", "\"ru\""
|
||||||
buildConfigField "String", "flavor", "\"autobonus\""
|
buildConfigField "String", "flavor", "\"autobonus\""
|
||||||
|
buildConfigField "int", "currency", "643"
|
||||||
}
|
}
|
||||||
|
|
||||||
autobonus_ua {
|
autobonus_ua {
|
||||||
applicationId 'com.dinect.autobonus'
|
applicationId 'com.dinect.autobonus'
|
||||||
buildConfigField "String", "locale", "\"ua\""
|
buildConfigField "String", "locale", "\"ua\""
|
||||||
buildConfigField "String", "flavor", "\"autobonus\""
|
buildConfigField "String", "flavor", "\"autobonus\""
|
||||||
|
buildConfigField "int", "currency", "643"
|
||||||
}
|
}
|
||||||
|
|
||||||
pip_en {
|
pip_en {
|
||||||
applicationId 'com.dinect.pip'
|
applicationId 'com.dinect.pip'
|
||||||
buildConfigField "String", "locale", "\"en\""
|
buildConfigField "String", "locale", "\"en\""
|
||||||
buildConfigField "String", "flavor", "\"pip\""
|
buildConfigField "String", "flavor", "\"pip\""
|
||||||
|
buildConfigField "int", "currency", "980"
|
||||||
}
|
}
|
||||||
|
|
||||||
pip_ru {
|
pip_ru {
|
||||||
applicationId 'com.dinect.pip'
|
applicationId 'com.dinect.pip'
|
||||||
buildConfigField "String", "locale", "\"ru\""
|
buildConfigField "String", "locale", "\"ru\""
|
||||||
buildConfigField "String", "flavor", "\"pip\""
|
buildConfigField "String", "flavor", "\"pip\""
|
||||||
|
buildConfigField "int", "currency", "980"
|
||||||
}
|
}
|
||||||
|
|
||||||
pip_ua {
|
pip_ua {
|
||||||
applicationId 'com.dinect.pip'
|
applicationId 'com.dinect.pip'
|
||||||
buildConfigField "String", "locale", "\"ua\""
|
buildConfigField "String", "locale", "\"ua\""
|
||||||
buildConfigField "String", "flavor", "\"pip\""
|
buildConfigField "String", "flavor", "\"pip\""
|
||||||
|
buildConfigField "int", "currency", "980"
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -66,6 +66,10 @@ public class MainActivity extends FlutterActivity {
|
|||||||
result.success(BuildConfig.flavor);
|
result.success(BuildConfig.flavor);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case "getCurrency":
|
||||||
|
result.success(BuildConfig.currency);
|
||||||
|
break;
|
||||||
|
|
||||||
case "startScanner":
|
case "startScanner":
|
||||||
final Map arguments = call.arguments();
|
final Map arguments = call.arguments();
|
||||||
final int idx = mPreferences.getInt(SCANNER_BACKEND_KEY, 0);
|
final int idx = mPreferences.getInt(SCANNER_BACKEND_KEY, 0);
|
||||||
@@ -144,10 +148,13 @@ public class MainActivity extends FlutterActivity {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void getLocale() {
|
public void getCurrency() {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void getLocale() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
public void startScanner() {
|
public void startScanner() {
|
||||||
|
|
||||||
|
|||||||
BIN
assets/settings_arrow.png
Normal file
BIN
assets/settings_arrow.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.0 KiB |
@@ -3,8 +3,11 @@ import 'package:flutter/material.dart';
|
|||||||
import 'package:flutter/services.dart';
|
import 'package:flutter/services.dart';
|
||||||
import 'package:intl/intl.dart';
|
import 'package:intl/intl.dart';
|
||||||
|
|
||||||
import 'common.dart';
|
import 'package:checker/common.dart';
|
||||||
import 'consts.dart';
|
import 'package:checker/consts.dart';
|
||||||
|
import 'package:checker/screens/settings.dart';
|
||||||
|
import 'package:checker/screens/faq.dart';
|
||||||
|
import 'package:checker/strings.dart';
|
||||||
import 'package:checker/db.dart';
|
import 'package:checker/db.dart';
|
||||||
|
|
||||||
abstract class BaseState<T extends StatefulWidget> extends State<T> {
|
abstract class BaseState<T extends StatefulWidget> extends State<T> {
|
||||||
@@ -21,24 +24,23 @@ abstract class BaseState<T extends StatefulWidget> extends State<T> {
|
|||||||
String error;
|
String error;
|
||||||
|
|
||||||
/// Введенное пользователем значение.
|
/// Введенное пользователем значение.
|
||||||
String textFieldValue = '';
|
String dinCode = '';
|
||||||
|
|
||||||
@override Widget build(BuildContext ctx) {
|
@override Widget build(BuildContext ctx) {
|
||||||
|
|
||||||
platform.invokeMethod('getLocale').then((locale) {
|
if (helper == null) {
|
||||||
Intl.defaultLocale = locale;
|
|
||||||
if (app == null) {
|
|
||||||
platform.invokeMethod('getFlavor').then((flavor) {
|
|
||||||
setState(() {
|
|
||||||
app = flavor;
|
|
||||||
helper = new SqliteHelper();
|
helper = new SqliteHelper();
|
||||||
helper.open().then((_) {
|
helper.open().then((_) {
|
||||||
|
if (app == null) {
|
||||||
|
platform.invokeMethod('getFlavor').then((flavor) {
|
||||||
|
app = flavor;
|
||||||
|
setState(() {
|
||||||
onStart();
|
onStart();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
}
|
||||||
|
|
||||||
return getMainWidget();
|
return getMainWidget();
|
||||||
}
|
}
|
||||||
@@ -67,7 +69,9 @@ abstract class BaseState<T extends StatefulWidget> extends State<T> {
|
|||||||
Widget getScreenContent();
|
Widget getScreenContent();
|
||||||
|
|
||||||
/// Возвращает заголовок для AppBar
|
/// Возвращает заголовок для AppBar
|
||||||
String getTitle();
|
String getTitle() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
AppBar getAppBar() {
|
AppBar getAppBar() {
|
||||||
return new AppBar(title: new Text(getTitle(), style: new TextStyle(fontSize: 18.0)),
|
return new AppBar(title: new Text(getTitle(), style: new TextStyle(fontSize: 18.0)),
|
||||||
@@ -76,29 +80,44 @@ abstract class BaseState<T extends StatefulWidget> extends State<T> {
|
|||||||
|
|
||||||
List<Widget> getMenuButtons() {
|
List<Widget> getMenuButtons() {
|
||||||
return <Widget>[
|
return <Widget>[
|
||||||
new PopupMenuButton(
|
new PopupMenuButton<int>(
|
||||||
|
onSelected: onOptionsItemClick,
|
||||||
itemBuilder: (BuildContext context) {
|
itemBuilder: (BuildContext context) {
|
||||||
[
|
return [new PopupMenuItem(
|
||||||
|
value: 0,
|
||||||
|
child: getMenuItem(settings_png, StringsLocalization.settings())),
|
||||||
new PopupMenuItem(
|
new PopupMenuItem(
|
||||||
child: new Row(
|
value: 1,
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
child: getMenuItem(help_png, StringsLocalization.help())),
|
||||||
children: [
|
new PopupMenuItem(
|
||||||
new Image.asset(
|
value: 2,
|
||||||
settings_png, width: 48.0, height: 48.0),
|
child: getMenuItem(logout_png, StringsLocalization.logout()))
|
||||||
new Image.asset(help_png, width: 48.0, height: 48.0),
|
|
||||||
new Image.asset(logout_png, width: 48.0, height: 48.0),
|
|
||||||
]))
|
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
)];
|
)];
|
||||||
}
|
}
|
||||||
|
|
||||||
Widget getFaqButton() {
|
void onOptionsItemClick(int index) {
|
||||||
return new IconButton(icon: new Icon(Icons.help_outline), onPressed: () => faq(context, false));
|
switch (index) {
|
||||||
|
case 0: {
|
||||||
|
pushRoute(context, new SettingsScreen());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 1: {
|
||||||
|
pushRoute(context, new FAQScreen(false));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 0: {
|
||||||
|
logout(context);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Widget getLogoutButton() {
|
Widget getMenuItem(String image, String text) {
|
||||||
return new IconButton(icon: new Image.asset(logout_png, height: iconHeight, width: iconHeight), onPressed: () => logout(context));
|
return new Row(children: [
|
||||||
|
new Image.asset(image, width: 28.0, height: 28.0),
|
||||||
|
new Container(padding: new EdgeInsets.only(left: 8.0), child: new Text(text))
|
||||||
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Возврвщает контейнер, внутри которого Text с подсказкой.
|
/// Возврвщает контейнер, внутри которого Text с подсказкой.
|
||||||
@@ -112,7 +131,7 @@ abstract class BaseState<T extends StatefulWidget> extends State<T> {
|
|||||||
|
|
||||||
/// Возвращает подсказку, либо ошибку, если введенные в поле ввода данные неверны.
|
/// Возвращает подсказку, либо ошибку, если введенные в поле ввода данные неверны.
|
||||||
String getHintString() {
|
String getHintString() {
|
||||||
if (textFieldValue.length == 0 && error == null) {
|
if (dinCode.length == 0 && error == null) {
|
||||||
return ' ';
|
return ' ';
|
||||||
} else if (error != null) {
|
} else if (error != null) {
|
||||||
return error;
|
return error;
|
||||||
@@ -130,7 +149,7 @@ abstract class BaseState<T extends StatefulWidget> extends State<T> {
|
|||||||
/// Смена состояния экрана при изменении текста в поле ввода.
|
/// Смена состояния экрана при изменении текста в поле ввода.
|
||||||
void handleUserInput(String text) {
|
void handleUserInput(String text) {
|
||||||
setState(() {
|
setState(() {
|
||||||
textFieldValue = text;
|
dinCode = text;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3,13 +3,14 @@ import 'package:flutter/material.dart';
|
|||||||
// Serious constants
|
// Serious constants
|
||||||
const String appName = "AutoBonus";
|
const String appName = "AutoBonus";
|
||||||
|
|
||||||
const String url = 'https://pos-api-autoclub.dinect.com/20130701/';
|
const String url = 'https://pos-api-int.dinect.com/20130701/';
|
||||||
const String appToken = 'bdea0f3ba9034b688019a7cac753d1209e2b227f';
|
const String appToken = '9fec83cdca38c357e6b65dbb17514cdd36bf2a08';
|
||||||
|
|
||||||
// Assets
|
// Assets
|
||||||
const String logout_png = 'assets/logout.png';
|
const String logout_png = 'assets/logout.png';
|
||||||
const String help_png = 'assets/help.png';
|
const String help_png = 'assets/help.png';
|
||||||
const String settings_png = 'assets/settings.png';
|
const String settings_png = 'assets/settings.png';
|
||||||
|
const String settings_arrow_png = 'assets/settings_arrow.png';
|
||||||
|
|
||||||
const String activate_token_bg_png = 'assets/activate_token_message_background.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 active_token_bg_png = 'assets/active_token_message_background.png';
|
||||||
|
|||||||
48
lib/db.dart
48
lib/db.dart
@@ -5,12 +5,20 @@ import 'package:path/path.dart';
|
|||||||
import 'package:sqflite/sqflite.dart';
|
import 'package:sqflite/sqflite.dart';
|
||||||
import 'package:path_provider/path_provider.dart';
|
import 'package:path_provider/path_provider.dart';
|
||||||
|
|
||||||
|
/// Данные о таблице сессии пользователя.
|
||||||
const String tableSession = "session";
|
const String tableSession = "session";
|
||||||
|
|
||||||
const String columnMerchantID = "merchant_id"; // DIN code, который вводится при авторизации
|
const String columnMerchantID = "merchant_id"; // DIN code, который вводится при авторизации
|
||||||
const String columnToken = "token"; // Токен для pos. Приходит с бэкэнда.
|
const String columnToken = "token"; // Токен для pos. Приходит с бэкэнда.
|
||||||
const String columnPosID = "pos_id"; // идентификатор для создания токена на бэке.
|
const String columnPosID = "pos_id"; // идентификатор для создания токена на бэке.
|
||||||
const String columnDocID = "doc_id"; // идентификатор, для проведения покупки на бэкенде.
|
const String columnDocID = "doc_id"; // идентификатор, для проведения покупки на бэкенде.
|
||||||
|
|
||||||
|
/// Данные о таблице данных приложения.
|
||||||
|
const String tableSettings = "settings";
|
||||||
|
|
||||||
|
const String columnCurrency = "currency"; // валюта.
|
||||||
|
const String columnLocale = "locale"; // локаль.
|
||||||
|
|
||||||
//{
|
//{
|
||||||
// columnMerchantID: merchantID,
|
// columnMerchantID: merchantID,
|
||||||
// columnToken: token,
|
// columnToken: token,
|
||||||
@@ -28,15 +36,22 @@ class SqliteHelper {
|
|||||||
String path = join(documentsDirectory.path, "demo.db");
|
String path = join(documentsDirectory.path, "demo.db");
|
||||||
db = await openDatabase(path, version: 1,
|
db = await openDatabase(path, version: 1,
|
||||||
onCreate: (Database db, int version) async {
|
onCreate: (Database db, int version) async {
|
||||||
await db.execute('''create table session (
|
|
||||||
|
await db.execute('''create table $tableSession (
|
||||||
$columnMerchantID text primary key,
|
$columnMerchantID text primary key,
|
||||||
$columnToken text,
|
$columnToken text,
|
||||||
$columnPosID text,
|
$columnPosID text,
|
||||||
$columnDocID integer)''');
|
$columnDocID integer)''');
|
||||||
|
|
||||||
|
await db.execute('''create table $tableSettings (
|
||||||
|
$columnCurrency integer,
|
||||||
|
$columnLocale text)''');
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
Future insert(String merchantID, String posID, String token) async {
|
/// Создается запись в таблице, содержащая
|
||||||
|
/// необходимые для идентификации пользователя и проведения запросов.
|
||||||
|
Future createSession(String merchantID, String posID, String token) async {
|
||||||
|
|
||||||
Map session = {
|
Map session = {
|
||||||
columnMerchantID: merchantID,
|
columnMerchantID: merchantID,
|
||||||
@@ -48,36 +63,53 @@ class SqliteHelper {
|
|||||||
return db.insert(tableSession, session);
|
return db.insert(tableSession, session);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Создается запись в таблице, содержащая данные, которые не зависят от сессии.
|
||||||
|
Future createAppInfo(String locale, int currency) async {
|
||||||
|
List<Map> appInfo = await db.query(tableSettings);
|
||||||
|
if (appInfo.length > 0) {
|
||||||
|
return null;
|
||||||
|
} else {
|
||||||
|
return db.insert(tableSettings, {
|
||||||
|
columnLocale: locale,
|
||||||
|
columnCurrency: currency
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<Map> getSettings() async {
|
||||||
|
return await selectAll(tableSettings);
|
||||||
|
}
|
||||||
|
|
||||||
Future<String> getToken() async {
|
Future<String> getToken() async {
|
||||||
Map session = await _getSession();
|
Map session = await selectAll(tableSession);
|
||||||
String token = session != null ? session[columnToken] : null;
|
String token = session != null ? session[columnToken] : null;
|
||||||
print('token: {$token}');
|
print('token: {$token}');
|
||||||
return token;
|
return token;
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<String> getMerchantID() async {
|
Future<String> getMerchantID() async {
|
||||||
Map session = await _getSession();
|
Map session = await selectAll(tableSession);
|
||||||
String merchantID = session != null ? session[columnMerchantID] : null;
|
String merchantID = session != null ? session[columnMerchantID] : null;
|
||||||
print('token: {$merchantID}');
|
print('token: {$merchantID}');
|
||||||
return merchantID;
|
return merchantID;
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<String> getPosID() async {
|
Future<String> getPosID() async {
|
||||||
Map session = await _getSession();
|
Map session = await selectAll(tableSession);
|
||||||
return session != null ? session[columnPosID] : new DateTime.now().millisecondsSinceEpoch.toString();
|
return session != null ? session[columnPosID] : new DateTime.now().millisecondsSinceEpoch.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<int> getDocID() async {
|
Future<int> getDocID() async {
|
||||||
Map session = await _getSession();
|
Map session = await selectAll(tableSession);
|
||||||
int docID = session != null ? session[columnDocID] : 0;
|
int docID = session != null ? session[columnDocID] : 0;
|
||||||
db.update(tableSession, {columnDocID: docID + 1});
|
db.update(tableSession, {columnDocID: docID + 1});
|
||||||
print('docid: {$docID}');
|
print('docid: {$docID}');
|
||||||
return docID;
|
return docID;
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<Map> _getSession() async {
|
Future<Map> selectAll(String table) async {
|
||||||
|
|
||||||
List<Map> maps = await db.query(tableSession, columns: null);
|
List<Map> maps = await db.query(table, columns: null);
|
||||||
|
|
||||||
if (maps.length > 0) {
|
if (maps.length > 0) {
|
||||||
return maps.first;
|
return maps.first;
|
||||||
|
|||||||
@@ -38,6 +38,11 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||||||
"sum" : MessageLookupByLibrary.simpleMessage("Sum"),
|
"sum" : MessageLookupByLibrary.simpleMessage("Sum"),
|
||||||
"update_activ_status" : MessageLookupByLibrary.simpleMessage("Update activation status"),
|
"update_activ_status" : MessageLookupByLibrary.simpleMessage("Update activation status"),
|
||||||
"user_name" : MessageLookupByLibrary.simpleMessage("User name"),
|
"user_name" : MessageLookupByLibrary.simpleMessage("User name"),
|
||||||
"yes" : MessageLookupByLibrary.simpleMessage("Yes")
|
"yes" : MessageLookupByLibrary.simpleMessage("Yes"),
|
||||||
|
"settings" : MessageLookupByLibrary.simpleMessage("Settings"),
|
||||||
|
"help " : MessageLookupByLibrary.simpleMessage("FAQ"),
|
||||||
|
"logout" : MessageLookupByLibrary.simpleMessage("Logout"),
|
||||||
|
"currency" : MessageLookupByLibrary.simpleMessage("Currency"),
|
||||||
|
"locale" : MessageLookupByLibrary.simpleMessage("Locale")
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -38,6 +38,11 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||||||
"sum" : MessageLookupByLibrary.simpleMessage("Сумма"),
|
"sum" : MessageLookupByLibrary.simpleMessage("Сумма"),
|
||||||
"update_activ_status" : MessageLookupByLibrary.simpleMessage("Обновить статус активации"),
|
"update_activ_status" : MessageLookupByLibrary.simpleMessage("Обновить статус активации"),
|
||||||
"user_name" : MessageLookupByLibrary.simpleMessage("ФИО"),
|
"user_name" : MessageLookupByLibrary.simpleMessage("ФИО"),
|
||||||
"yes" : MessageLookupByLibrary.simpleMessage("Да")
|
"yes" : MessageLookupByLibrary.simpleMessage("Да"),
|
||||||
|
"settings" : MessageLookupByLibrary.simpleMessage("Настройки"),
|
||||||
|
"help " : MessageLookupByLibrary.simpleMessage("Справка"),
|
||||||
|
"logout" : MessageLookupByLibrary.simpleMessage("Выход"),
|
||||||
|
"currency" : MessageLookupByLibrary.simpleMessage("Валюта"),
|
||||||
|
"locale" : MessageLookupByLibrary.simpleMessage("Язык")
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -51,10 +51,6 @@ class FAQScreenState<T> extends BaseState<FAQScreen> {
|
|||||||
return "FAQ";
|
return "FAQ";
|
||||||
}
|
}
|
||||||
|
|
||||||
@override getMenuButtons() {
|
|
||||||
return <Widget>[getLogoutButton()];
|
|
||||||
}
|
|
||||||
|
|
||||||
@override String getHint() {
|
@override String getHint() {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -86,10 +86,6 @@ class PurchaseScreenState<T> extends BaseState<PurchaseScreen> {
|
|||||||
return StringsLocalization.sum();
|
return StringsLocalization.sum();
|
||||||
}
|
}
|
||||||
|
|
||||||
@override getMenuButtons() {
|
|
||||||
return <Widget>[getFaqButton(), getLogoutButton()];
|
|
||||||
}
|
|
||||||
|
|
||||||
@override getTextWidget() {
|
@override getTextWidget() {
|
||||||
return new TextField(
|
return new TextField(
|
||||||
keyboardType: TextInputType.number,
|
keyboardType: TextInputType.number,
|
||||||
|
|||||||
@@ -22,10 +22,6 @@ class PurchaseSuccessScreenState<T> extends BaseState<PurchaseSuccessScreen> {
|
|||||||
String sum;
|
String sum;
|
||||||
String username;
|
String username;
|
||||||
|
|
||||||
@override getMenuButtons() {
|
|
||||||
return <Widget>[getFaqButton(), getLogoutButton()];
|
|
||||||
}
|
|
||||||
|
|
||||||
@override String getTitle() {
|
@override String getTitle() {
|
||||||
return StringsLocalization.carryingPurchase();
|
return StringsLocalization.carryingPurchase();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
import 'package:checker/db.dart';
|
|
||||||
import 'package:checker/screens/finish_registration.dart';
|
import 'package:checker/screens/finish_registration.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'dart:convert'; // Пакет для обработки json с ответом от сервера.
|
import 'dart:convert'; // Пакет для обработки json с ответом от сервера.
|
||||||
@@ -56,8 +55,8 @@ class _RegistrationScreenState extends BaseState<RegistrationScreen> {
|
|||||||
|
|
||||||
/// Токен кассы - это DIN код. DIN код - это специальный код динекта, максимальная его длина - 25 символов.
|
/// Токен кассы - это DIN код. DIN код - это специальный код динекта, максимальная его длина - 25 символов.
|
||||||
_isValidMerchantID() {
|
_isValidMerchantID() {
|
||||||
print("${textFieldValue.length}");
|
print("${dinCode.length}");
|
||||||
return textFieldValue.length > 0 && textFieldValue.length < 25;
|
return dinCode.length > 0 && dinCode.length < 25;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Показать progressBar, запросить токен.
|
/// Показать progressBar, запросить токен.
|
||||||
@@ -74,7 +73,7 @@ class _RegistrationScreenState extends BaseState<RegistrationScreen> {
|
|||||||
|
|
||||||
String posID = await helper.getPosID();
|
String posID = await helper.getPosID();
|
||||||
|
|
||||||
createToken(textFieldValue, posID).then((response) {
|
createToken(dinCode, posID).then((response) {
|
||||||
|
|
||||||
setState(() {
|
setState(() {
|
||||||
error = null;
|
error = null;
|
||||||
@@ -86,7 +85,7 @@ class _RegistrationScreenState extends BaseState<RegistrationScreen> {
|
|||||||
Map parsedMap = JSON.decode(response.body);
|
Map parsedMap = JSON.decode(response.body);
|
||||||
|
|
||||||
if (response.statusCode == 201) {
|
if (response.statusCode == 201) {
|
||||||
helper.insert(textFieldValue, posID, parsedMap['token']).then((_) {
|
helper.createSession(dinCode, posID, parsedMap['token']).then((_) {
|
||||||
helper.close();
|
helper.close();
|
||||||
pushRoute(context, new FinishRegistrationScreen());
|
pushRoute(context, new FinishRegistrationScreen());
|
||||||
});
|
});
|
||||||
|
|||||||
71
lib/screens/settings.dart
Normal file
71
lib/screens/settings.dart
Normal file
@@ -0,0 +1,71 @@
|
|||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:http/http.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/db.dart';
|
||||||
|
import 'package:checker/strings.dart';
|
||||||
|
import 'package:checker/base_state.dart';
|
||||||
|
import 'package:checker/screens/registration.dart';
|
||||||
|
import 'package:checker/screens/finish_registration.dart';
|
||||||
|
|
||||||
|
class SettingsScreen extends StatefulWidget {
|
||||||
|
@override State createState() => new _SettingsState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class MenuItem {
|
||||||
|
|
||||||
|
MenuItem();
|
||||||
|
|
||||||
|
String title;
|
||||||
|
String selectedValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
class _SettingsState extends BaseState<SettingsScreen> {
|
||||||
|
|
||||||
|
List<MenuItem> menuItems;
|
||||||
|
|
||||||
|
@override onStart() {
|
||||||
|
if (menuItems == null) {
|
||||||
|
helper.getSettings().then((info) {
|
||||||
|
setState(() {
|
||||||
|
|
||||||
|
print("load settings");
|
||||||
|
|
||||||
|
menuItems = [new MenuItem(), new MenuItem()];
|
||||||
|
|
||||||
|
menuItems[0].title = StringsLocalization.locale();
|
||||||
|
menuItems[0].selectedValue = info["locale"];
|
||||||
|
|
||||||
|
menuItems[1].title = StringsLocalization.currency();
|
||||||
|
menuItems[1].selectedValue = info["currency"].toString();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget getScreenContent() {
|
||||||
|
return menuItems == null
|
||||||
|
? getBackground()
|
||||||
|
: new ListView(children: getSettings());
|
||||||
|
}
|
||||||
|
|
||||||
|
List<Widget> getSettings() {
|
||||||
|
List<Widget> widgets = new List();
|
||||||
|
for (MenuItem item in menuItems) {
|
||||||
|
widgets.add(new Row(children: [
|
||||||
|
new Text(item.title, textAlign: TextAlign.left),
|
||||||
|
new Text(item.selectedValue,textAlign: TextAlign.right),
|
||||||
|
new Image.asset(settings_arrow_png, width: 28.0, height: 28.0, alignment: FractionalOffset.centerRight)]));
|
||||||
|
}
|
||||||
|
return widgets;
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
String getTitle() {
|
||||||
|
return StringsLocalization.settings();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:http/http.dart';
|
import 'package:http/http.dart';
|
||||||
|
import 'package:intl/intl.dart';
|
||||||
import 'dart:convert';
|
import 'dart:convert';
|
||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
import 'package:checker/common.dart';
|
import 'package:checker/common.dart';
|
||||||
@@ -17,6 +18,33 @@ class SplashScreen extends StatefulWidget {
|
|||||||
|
|
||||||
class _SplashScreenState extends BaseState<SplashScreen> {
|
class _SplashScreenState extends BaseState<SplashScreen> {
|
||||||
|
|
||||||
|
@override Widget getMainWidget() {
|
||||||
|
return getScreenContent();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override void onStart() {
|
||||||
|
helper.getSettings().then((info) {
|
||||||
|
if (info == null) {
|
||||||
|
platform.invokeMethod('getLocale').then((locale) {
|
||||||
|
Intl.defaultLocale = locale;
|
||||||
|
platform.invokeMethod('getCurrency').then((currency) {
|
||||||
|
helper.createAppInfo(locale, currency).then((_) {
|
||||||
|
showNext();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
showNext();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
void showNext() {
|
||||||
|
new Future.delayed(const Duration(milliseconds: 1000), () {
|
||||||
|
showNextScreen();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget getScreenContent() {
|
Widget getScreenContent() {
|
||||||
return app == null
|
return app == null
|
||||||
@@ -36,21 +64,6 @@ class _SplashScreenState extends BaseState<SplashScreen> {
|
|||||||
width: 122.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() {
|
getLogo() {
|
||||||
@@ -69,7 +82,7 @@ class _SplashScreenState extends BaseState<SplashScreen> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Запуск следующего экрана приложения.
|
/// Запуск следующего экрана приложения.
|
||||||
showNextScreen(BuildContext context) async {
|
showNextScreen() async {
|
||||||
|
|
||||||
String token = await helper.getToken();
|
String token = await helper.getToken();
|
||||||
|
|
||||||
@@ -81,7 +94,7 @@ class _SplashScreenState extends BaseState<SplashScreen> {
|
|||||||
} else {
|
} else {
|
||||||
if (await platform.invokeMethod('isOnline')) {
|
if (await platform.invokeMethod('isOnline')) {
|
||||||
checkTokenStatus(token).then((statusResponse) {
|
checkTokenStatus(token).then((statusResponse) {
|
||||||
handleStatusResponse(context, statusResponse, helper);
|
handleStatusResponse(statusResponse, helper);
|
||||||
}).catchError((error) {
|
}).catchError((error) {
|
||||||
helper.close().then((_) {
|
helper.close().then((_) {
|
||||||
print(error.toString());
|
print(error.toString());
|
||||||
@@ -95,7 +108,7 @@ class _SplashScreenState extends BaseState<SplashScreen> {
|
|||||||
/// Обработка ответа.
|
/// Обработка ответа.
|
||||||
/// В случае, если токен был удален может прийти active: false, либо 404.
|
/// В случае, если токен был удален может прийти active: false, либо 404.
|
||||||
/// Если токен не активен, попробовать создать его еще раз.
|
/// Если токен не активен, попробовать создать его еще раз.
|
||||||
handleStatusResponse(BuildContext context, var statusResponse, SqliteHelper helper) async {
|
handleStatusResponse(var statusResponse, SqliteHelper helper) async {
|
||||||
int code = statusResponse.statusCode;
|
int code = statusResponse.statusCode;
|
||||||
print('resp: ${code}');
|
print('resp: ${code}');
|
||||||
|
|
||||||
@@ -114,7 +127,7 @@ class _SplashScreenState extends BaseState<SplashScreen> {
|
|||||||
startScanner(context, app, helper);
|
startScanner(context, app, helper);
|
||||||
} else {
|
} else {
|
||||||
if (await platform.invokeMethod('isOnline')) {
|
if (await platform.invokeMethod('isOnline')) {
|
||||||
_createToken(context, helper);
|
_createToken(helper);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -127,7 +140,7 @@ class _SplashScreenState extends BaseState<SplashScreen> {
|
|||||||
///
|
///
|
||||||
/// Если вернулся код 200, значит токен был ранее удален и только что снова создался.
|
/// Если вернулся код 200, значит токен был ранее удален и только что снова создался.
|
||||||
/// Нужно удалить его и направить пользователя на экран регистрации.
|
/// Нужно удалить его и направить пользователя на экран регистрации.
|
||||||
_createToken(BuildContext ctx, SqliteHelper helper) async {
|
_createToken(SqliteHelper helper) async {
|
||||||
|
|
||||||
String merchantID = await helper.getMerchantID();
|
String merchantID = await helper.getMerchantID();
|
||||||
String posID = await helper.getPosID();
|
String posID = await helper.getPosID();
|
||||||
@@ -135,22 +148,22 @@ class _SplashScreenState extends BaseState<SplashScreen> {
|
|||||||
createToken(merchantID, posID).then((response) {
|
createToken(merchantID, posID).then((response) {
|
||||||
if (response.statusCode == 409) {
|
if (response.statusCode == 409) {
|
||||||
helper.close();
|
helper.close();
|
||||||
pushRoute(ctx, new FinishRegistrationScreen());
|
pushRoute(context, new FinishRegistrationScreen());
|
||||||
} else if (response.statusCode == 201) {
|
} else if (response.statusCode == 201) {
|
||||||
clearToken(response, ctx, helper);
|
clearToken(response, helper);
|
||||||
}
|
}
|
||||||
}).catchError((error) => print(error.toString()));
|
}).catchError((error) => print(error.toString()));
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Очищаем бд, делаем запрос на удаление токена.
|
/// Очищаем бд, делаем запрос на удаление токена.
|
||||||
void clearToken(Response response, BuildContext ctx, SqliteHelper helper) {
|
void clearToken(Response response, SqliteHelper helper) {
|
||||||
|
|
||||||
helper.clear().then((_) {
|
helper.clear().then((_) {
|
||||||
Map parsedMap = JSON.decode(response.body);
|
Map parsedMap = JSON.decode(response.body);
|
||||||
deleteToken(parsedMap['token']).then((_) {
|
deleteToken(parsedMap['token']).then((_) {
|
||||||
helper.close();
|
helper.close();
|
||||||
Navigator.of(ctx).pop(); // Убираем текущий route
|
Navigator.of(context).pop(); // Убираем текущий route
|
||||||
pushRoute(ctx, new RegistrationScreen()); // Запускаем регистрацию
|
pushRoute(context, new RegistrationScreen()); // Запускаем регистрацию
|
||||||
}).catchError((error) {
|
}).catchError((error) {
|
||||||
helper.close();
|
helper.close();
|
||||||
print(error.toString());
|
print(error.toString());
|
||||||
|
|||||||
@@ -39,4 +39,9 @@ class StringsLocalization {
|
|||||||
static String scan() => Intl.message('scan', name: 'scan', locale: Intl.defaultLocale);
|
static String scan() => Intl.message('scan', name: 'scan', locale: Intl.defaultLocale);
|
||||||
static String buyer() => Intl.message('buyer', name: 'buyer', locale: Intl.defaultLocale);
|
static String buyer() => Intl.message('buyer', name: 'buyer', locale: Intl.defaultLocale);
|
||||||
static String idNotFound() => Intl.message('ID_not_found', name: 'ID_not_found', locale: Intl.defaultLocale);
|
static String idNotFound() => Intl.message('ID_not_found', name: 'ID_not_found', locale: Intl.defaultLocale);
|
||||||
|
static String settings() => Intl.message('settings', name: 'settings', locale: Intl.defaultLocale);
|
||||||
|
static String help () => Intl.message('help ', name: 'help ', locale: Intl.defaultLocale);
|
||||||
|
static String logout() => Intl.message('logout', name: 'logout', locale: Intl.defaultLocale);
|
||||||
|
static String currency() => Intl.message('currency', name: 'currency', locale: Intl.defaultLocale);
|
||||||
|
static String locale() => Intl.message('locale', name: 'locale', locale: Intl.defaultLocale);
|
||||||
}
|
}
|
||||||
@@ -33,6 +33,7 @@ flutter:
|
|||||||
- assets/pip_splash.png
|
- assets/pip_splash.png
|
||||||
|
|
||||||
- assets/settings.png
|
- assets/settings.png
|
||||||
|
- assets/settings_arrow.png
|
||||||
- assets/help.png
|
- assets/help.png
|
||||||
- assets/logout.png
|
- assets/logout.png
|
||||||
- assets/activate_token_message_background.png
|
- assets/activate_token_message_background.png
|
||||||
|
|||||||
Reference in New Issue
Block a user