В бд добавлена таблица настроек, данные для настроек берутся из базы
This commit is contained in:
@@ -51,10 +51,6 @@ class FAQScreenState<T> extends BaseState<FAQScreen> {
|
||||
return "FAQ";
|
||||
}
|
||||
|
||||
@override getMenuButtons() {
|
||||
return <Widget>[getLogoutButton()];
|
||||
}
|
||||
|
||||
@override String getHint() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -86,10 +86,6 @@ class PurchaseScreenState<T> extends BaseState<PurchaseScreen> {
|
||||
return StringsLocalization.sum();
|
||||
}
|
||||
|
||||
@override getMenuButtons() {
|
||||
return <Widget>[getFaqButton(), getLogoutButton()];
|
||||
}
|
||||
|
||||
@override getTextWidget() {
|
||||
return new TextField(
|
||||
keyboardType: TextInputType.number,
|
||||
|
||||
@@ -22,10 +22,6 @@ class PurchaseSuccessScreenState<T> extends BaseState<PurchaseSuccessScreen> {
|
||||
String sum;
|
||||
String username;
|
||||
|
||||
@override getMenuButtons() {
|
||||
return <Widget>[getFaqButton(), getLogoutButton()];
|
||||
}
|
||||
|
||||
@override String getTitle() {
|
||||
return StringsLocalization.carryingPurchase();
|
||||
}
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
import 'package:checker/db.dart';
|
||||
import 'package:checker/screens/finish_registration.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'dart:convert'; // Пакет для обработки json с ответом от сервера.
|
||||
@@ -56,8 +55,8 @@ class _RegistrationScreenState extends BaseState<RegistrationScreen> {
|
||||
|
||||
/// Токен кассы - это DIN код. DIN код - это специальный код динекта, максимальная его длина - 25 символов.
|
||||
_isValidMerchantID() {
|
||||
print("${textFieldValue.length}");
|
||||
return textFieldValue.length > 0 && textFieldValue.length < 25;
|
||||
print("${dinCode.length}");
|
||||
return dinCode.length > 0 && dinCode.length < 25;
|
||||
}
|
||||
|
||||
/// Показать progressBar, запросить токен.
|
||||
@@ -74,7 +73,7 @@ class _RegistrationScreenState extends BaseState<RegistrationScreen> {
|
||||
|
||||
String posID = await helper.getPosID();
|
||||
|
||||
createToken(textFieldValue, posID).then((response) {
|
||||
createToken(dinCode, posID).then((response) {
|
||||
|
||||
setState(() {
|
||||
error = null;
|
||||
@@ -86,7 +85,7 @@ class _RegistrationScreenState extends BaseState<RegistrationScreen> {
|
||||
Map parsedMap = JSON.decode(response.body);
|
||||
|
||||
if (response.statusCode == 201) {
|
||||
helper.insert(textFieldValue, posID, parsedMap['token']).then((_) {
|
||||
helper.createSession(dinCode, posID, parsedMap['token']).then((_) {
|
||||
helper.close();
|
||||
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:http/http.dart';
|
||||
import 'package:intl/intl.dart';
|
||||
import 'dart:convert';
|
||||
import 'dart:async';
|
||||
import 'package:checker/common.dart';
|
||||
@@ -17,6 +18,33 @@ class SplashScreen extends StatefulWidget {
|
||||
|
||||
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
|
||||
Widget getScreenContent() {
|
||||
return app == null
|
||||
@@ -36,21 +64,6 @@ class _SplashScreenState extends BaseState<SplashScreen> {
|
||||
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() {
|
||||
@@ -69,10 +82,10 @@ class _SplashScreenState extends BaseState<SplashScreen> {
|
||||
}
|
||||
|
||||
/// Запуск следующего экрана приложения.
|
||||
showNextScreen(BuildContext context) async {
|
||||
showNextScreen() async {
|
||||
|
||||
String token = await helper.getToken();
|
||||
|
||||
|
||||
// В случае, если в приложении отсутствует токен,
|
||||
// необходимо запустить регистрацию кассы.
|
||||
if (token == null) {
|
||||
@@ -81,7 +94,7 @@ class _SplashScreenState extends BaseState<SplashScreen> {
|
||||
} else {
|
||||
if (await platform.invokeMethod('isOnline')) {
|
||||
checkTokenStatus(token).then((statusResponse) {
|
||||
handleStatusResponse(context, statusResponse, helper);
|
||||
handleStatusResponse(statusResponse, helper);
|
||||
}).catchError((error) {
|
||||
helper.close().then((_) {
|
||||
print(error.toString());
|
||||
@@ -95,7 +108,7 @@ class _SplashScreenState extends BaseState<SplashScreen> {
|
||||
/// Обработка ответа.
|
||||
/// В случае, если токен был удален может прийти active: false, либо 404.
|
||||
/// Если токен не активен, попробовать создать его еще раз.
|
||||
handleStatusResponse(BuildContext context, var statusResponse, SqliteHelper helper) async {
|
||||
handleStatusResponse(var statusResponse, SqliteHelper helper) async {
|
||||
int code = statusResponse.statusCode;
|
||||
print('resp: ${code}');
|
||||
|
||||
@@ -114,7 +127,7 @@ class _SplashScreenState extends BaseState<SplashScreen> {
|
||||
startScanner(context, app, helper);
|
||||
} else {
|
||||
if (await platform.invokeMethod('isOnline')) {
|
||||
_createToken(context, helper);
|
||||
_createToken(helper);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -127,7 +140,7 @@ class _SplashScreenState extends BaseState<SplashScreen> {
|
||||
///
|
||||
/// Если вернулся код 200, значит токен был ранее удален и только что снова создался.
|
||||
/// Нужно удалить его и направить пользователя на экран регистрации.
|
||||
_createToken(BuildContext ctx, SqliteHelper helper) async {
|
||||
_createToken(SqliteHelper helper) async {
|
||||
|
||||
String merchantID = await helper.getMerchantID();
|
||||
String posID = await helper.getPosID();
|
||||
@@ -135,22 +148,22 @@ class _SplashScreenState extends BaseState<SplashScreen> {
|
||||
createToken(merchantID, posID).then((response) {
|
||||
if (response.statusCode == 409) {
|
||||
helper.close();
|
||||
pushRoute(ctx, new FinishRegistrationScreen());
|
||||
pushRoute(context, new FinishRegistrationScreen());
|
||||
} else if (response.statusCode == 201) {
|
||||
clearToken(response, ctx, helper);
|
||||
clearToken(response, helper);
|
||||
}
|
||||
}).catchError((error) => print(error.toString()));
|
||||
}
|
||||
|
||||
/// Очищаем бд, делаем запрос на удаление токена.
|
||||
void clearToken(Response response, BuildContext ctx, SqliteHelper helper) {
|
||||
void clearToken(Response response, SqliteHelper helper) {
|
||||
|
||||
helper.clear().then((_) {
|
||||
Map parsedMap = JSON.decode(response.body);
|
||||
deleteToken(parsedMap['token']).then((_) {
|
||||
helper.close();
|
||||
Navigator.of(ctx).pop(); // Убираем текущий route
|
||||
pushRoute(ctx, new RegistrationScreen()); // Запускаем регистрацию
|
||||
Navigator.of(context).pop(); // Убираем текущий route
|
||||
pushRoute(context, new RegistrationScreen()); // Запускаем регистрацию
|
||||
}).catchError((error) {
|
||||
helper.close();
|
||||
print(error.toString());
|
||||
|
||||
Reference in New Issue
Block a user