Исправления, автоклуб

This commit is contained in:
Ivan Murashov
2017-07-28 18:36:51 +03:00
parent e53ceb9ef0
commit 7207c6e247
16 changed files with 203 additions and 171 deletions

View File

@@ -1,7 +1,7 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.dinect.checker" package="com.dinect.checker"
android:versionCode="1" android:versionCode="1"
android:versionName="0.0.5"> android:versionName="0.1">
<uses-sdk android:minSdkVersion="16" android:targetSdkVersion="21" /> <uses-sdk android:minSdkVersion="16" android:targetSdkVersion="21" />
@@ -18,8 +18,8 @@
In most cases you can leave this as-is, but you if you want to provide In most cases you can leave this as-is, but you if you want to provide
additional functionality it is fine to subclass or reimplement additional functionality it is fine to subclass or reimplement
FlutterApplication and put your custom class here. --> FlutterApplication and put your custom class here. -->
<application android:name="io.flutter.app.FlutterApplication" android:label="@string/app_name" android:icon="@mipmap/ic_launcher_app"> <application android:name="io.flutter.app.FlutterApplication" android:label="@string/app_name" android:icon="@mipmap/ic_launcher">
<activity android:name="com.dinect.checker.activity.MainActivity" <activity android:name="com.dinect.checker.MainActivity"
android:launchMode="singleTop" android:launchMode="singleTop"
android:screenOrientation="portrait" android:screenOrientation="portrait"
android:theme="@android:style/Theme.Black.NoTitleBar" android:theme="@android:style/Theme.Black.NoTitleBar"
@@ -32,7 +32,7 @@
</intent-filter> </intent-filter>
</activity> </activity>
<activity android:name="com.dinect.checker.activity.CameraActivity" <activity android:name="com.dinect.checker.CameraActivity"
android:screenOrientation="portrait" android:screenOrientation="portrait"
android:theme="@style/AppTheme"/> android:theme="@style/AppTheme"/>

View File

@@ -1,4 +1,4 @@
package com.dinect.checker.activity; package com.dinect.checker;
import android.support.v7.app.AppCompatActivity; import android.support.v7.app.AppCompatActivity;
import android.content.pm.ActivityInfo; import android.content.pm.ActivityInfo;
@@ -64,7 +64,7 @@ import android.app.AlertDialog;
import android.app.AlertDialog.Builder; import android.app.AlertDialog.Builder;
import android.content.DialogInterface; import android.content.DialogInterface;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import com.dinect.checker.activity.Utils; import com.dinect.checker.Utils;
import com.dinect.checker.R; import com.dinect.checker.R;
public class CameraActivity extends AppCompatActivity implements Camera.PreviewCallback { public class CameraActivity extends AppCompatActivity implements Camera.PreviewCallback {
@@ -209,15 +209,11 @@ public class CameraActivity extends AppCompatActivity implements Camera.PreviewC
int result = mScanner.scanImage(barcode); int result = mScanner.scanImage(barcode);
if (result != 0) { if (result != 0) {
mCamera.cancelAutoFocus();
mCamera.setPreviewCallback(null);
mCamera.stopPreview();
mPreviewing = false; mPreviewing = false;
SymbolSet syms = mScanner.getResults(); SymbolSet syms = mScanner.getResults();
for (Symbol sym : syms) { for (Symbol sym : syms) {
String symData = sym.getData(); String symData = sym.getData();
if (!TextUtils.isEmpty(symData) && Utils.isOnline(this)) { if (!TextUtils.isEmpty(symData) && Utils.isOnline(this)) {
mPreviewing = false;
requestUser(sym.getData()); requestUser(sym.getData());
break; break;
} else { } else {
@@ -288,7 +284,6 @@ public class CameraActivity extends AppCompatActivity implements Camera.PreviewC
if (code == 200) { if (code == 200) {
try { try {
String s = response.body().string(); String s = response.body().string();
Log.d("kifio", s);
JSONArray users = new JSONArray(s); JSONArray users = new JSONArray(s);
if (users.length() > 0) { if (users.length() > 0) {
Intent intent = new Intent(); Intent intent = new Intent();
@@ -325,7 +320,7 @@ public class CameraActivity extends AppCompatActivity implements Camera.PreviewC
private CameraActivity mActivity; private CameraActivity mActivity;
private String mCode = ""; private String mCode = "";
private String mUrl = "https://pos-api-int.dinect.com/20130701/users?auto="; private String mUrl = "http://pos-api-autoclub.dinect.com/20130701/users?auto=";
private String mCard = ""; private String mCard = "";
private String mToken = ""; private String mToken = "";
@@ -347,11 +342,8 @@ public class CameraActivity extends AppCompatActivity implements Camera.PreviewC
@Override @Override
public void run() { public void run() {
Log.d("kifio", mUrl);
Log.d("kifio", mToken);
Request request = new Request.Builder() Request request = new Request.Builder()
.addHeader("DM-Authorization", "dmapptoken 9fec83cdca38c357e6b65dbb17514cdd36bf2a08") .addHeader("DM-Authorization", "dmapptoken bdea0f3ba9034b688019a7cac753d1209e2b227f")
.addHeader("Authorization", "dmtoken " + mToken) .addHeader("Authorization", "dmtoken " + mToken)
.url(mUrl) .url(mUrl)
.build(); .build();

View File

@@ -1,4 +1,4 @@
package com.dinect.checker.activity; package com.dinect.checker;
import android.content.Context; import android.content.Context;
import android.app.Activity; import android.app.Activity;

View File

@@ -1,11 +1,12 @@
package com.dinect.checker.activity; package com.dinect.checker;
import android.os.Bundle; import android.os.Bundle;
import android.content.Intent; import android.content.Intent;
import android.util.Log; import android.util.Log;
import android.widget.Toast;
import android.content.Context; import android.content.Context;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import com.dinect.checker.activity.CameraActivity; import com.dinect.checker.CameraActivity;
import io.flutter.app.FlutterActivity; import io.flutter.app.FlutterActivity;
import io.flutter.plugins.GeneratedPluginRegistrant; import io.flutter.plugins.GeneratedPluginRegistrant;
import io.flutter.plugin.common.MethodCall; import io.flutter.plugin.common.MethodCall;
@@ -32,10 +33,9 @@ public class MainActivity extends FlutterActivity {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
GeneratedPluginRegistrant.registerWith(this); GeneratedPluginRegistrant.registerWith(this);
final String INSTANCE_ID_CHANNEL = "com.dinect.checker/instance_id";
mPreferences = getPreferences(Context.MODE_PRIVATE); mPreferences = getPreferences(Context.MODE_PRIVATE);
mChannel = new MethodChannel(getFlutterView(), INSTANCE_ID_CHANNEL); mChannel = new MethodChannel(getFlutterView(), "com.dinect.checker/instance_id");
mChannel.setMethodCallHandler( mChannel.setMethodCallHandler(
new MethodCallHandler() { new MethodCallHandler() {
@Override @Override
@@ -73,19 +73,20 @@ public class MainActivity extends FlutterActivity {
mPreferences.edit().putInt(PREF_DOC_ID, docId).apply(); mPreferences.edit().putInt(PREF_DOC_ID, docId).apply();
result.success(String.valueOf(docId)); result.success(String.valueOf(docId));
break; break;
case "isOnline":
boolean online = Utils.isOnline(MainActivity.this);
if (!online) {
Toast.makeText(MainActivity.this, "Проверьте интернет соединение", Toast.LENGTH_SHORT).show();
}
result.success(online);
break;
case "getPosID": case "getPosID":
String posId = mPreferences.getString(PREF_POS_ID, null); String posId = mPreferences.getString(PREF_POS_ID, null);
if (posId == null) { if (posId == null) {
posId = String.valueOf(System.currentTimeMillis()); posId = String.valueOf(System.currentTimeMillis());
} }
Log.d("kifio", posId);
mPreferences.edit().putString(PREF_POS_ID, posId).apply(); mPreferences.edit().putString(PREF_POS_ID, posId).apply();
result.success(posId); result.success(posId);
break; break;
default: default:
result.notImplemented(); result.notImplemented();
@@ -119,15 +120,15 @@ public class MainActivity extends FlutterActivity {
} }
} }
private void handleItemClick() { public void handleItemClick() {
} }
private void getDocID() { public void getDocID() {
} }
private void removeKeys() { public void removeKeys() {
} }
@@ -159,4 +160,8 @@ public class MainActivity extends FlutterActivity {
} }
public void isOnline() {
}
} }

View File

@@ -1,4 +1,4 @@
package com.dinect.checker.activity; package com.dinect.checker;
import android.content.Context; import android.content.Context;
import android.net.NetworkInfo; import android.net.NetworkInfo;

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB

View File

@@ -40,24 +40,28 @@ class _RegistrationScreenState extends BaseState<FinishRegistrationScreen> {
]); ]);
} }
handleTap() { // Если токен активирован, то открывается экран со сканером,
// Если нет, то отправляется запрос на проверку статуса токена.
handleTap() async {
if (_tokenActive) { if (_tokenActive) {
startScanner(context); startScanner(context);
} else { } else {
checkTokenStatus(token).then((response) { if (await platform.invokeMethod('isOnline')) {
checkTokenStatus(token).then((response) {
print(response.body); print(response.body);
Map parsedMap = JSON.decode(response.body); Map parsedMap = JSON.decode(response.body);
// Обновить экран, заменить сообщение о необходимости активации токена, на сообщние о том, что токен активен. // Обновить экран, заменить сообщение о необходимости активации токена, на сообщние о том, что токен активен.
setState(() { setState(() {
_tokenActive = parsedMap['active']; _tokenActive = parsedMap['active'];
});
}).catchError((error) {
print(error.toString());
return false;
}); });
}
}).catchError((error) {
print(error.toString());
return false;
});
} }
} }
@@ -92,7 +96,7 @@ class _RegistrationScreenState extends BaseState<FinishRegistrationScreen> {
/// Получаем текст сообщения, в зависимости от статуса активации. /// Получаем текст сообщения, в зависимости от статуса активации.
getMessageString() { getMessageString() {
return _tokenActive ? 'Программа активирована' : 'Запрос на активацию программы отправлен, дождитесь подтверждения активации администратором'; return _tokenActive ? tokenActiveMessage : tokenWaitMessage;
} }
/// Фоновое изображение для сообщения. /// Фоновое изображение для сообщения.

View File

@@ -1,12 +1,14 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
// Serious constants // Serious constants
const String url = 'https://pos-api-int.dinect.com/20130701/'; const String url = 'http://pos-api-autoclub.dinect.com/20130701/';
const String appToken = '9fec83cdca38c357e6b65dbb17514cdd36bf2a08'; const String appToken = 'bdea0f3ba9034b688019a7cac753d1209e2b227f';
// Hints // Texts
const String merchantIDHint = 'ID магазина'; const String merchantIDHint = 'ID магазина';
const String posIDHint = 'Номер кассы'; const String posIDHint = 'Номер кассы';
const String tokenActiveMessage = 'Программа активирована';
const String tokenWaitMessage = 'Запрос на активацию программы отправлен, дождитесь подтверждения активации администратором';
// Assets // Assets
const String logo_png = 'assets/registration_logo.png'; const String logo_png = 'assets/registration_logo.png';

View File

@@ -80,29 +80,49 @@ class FAQScreenState<T> extends BaseState<FAQScreen> {
]; ];
static const String registrationGuide = ''' static const String registrationGuide = '''
mPreviewing = true;После запуска приложения вы окажетесь на странице регистрации магазина. После запуска приложения вы окажетесь на странице регистрации магазина.
Введите DIN код магазина (выдается партнером/менеджером International Auto Club, дублируется на почту)
Кликнете по кнопке: «Зарегистрировать»
Дождитесь подтверждение активации программы, кликом по кнопке «Обновите статус активации» обновите статус.
После подтверждения запроса на активацию программы Партнером/менеджером кликнете по кнопке «Завершить регистрацию», приложение готово к использованию.
При желании изменить номер кассы, необходимо кликнуть на «значок» верхнем правом углу и вернуться на шаг регистрации. Введите DIN код магазина (выдается партнером/менеджером International Auto Club, дублируется на почту)
Кликните по кнопке: «Зарегистрировать»
Дождитесь подтверждение активации программы, кликом по кнопке «Обновите статус активации» обновите статус.
После подтверждения запроса на активацию программы Партнером/менеджером кликните по кнопке «Завершить регистрацию», приложение готово к использованию.
При желании изменить номер кассы, необходимо кликнуть на «значок» верхнем правом углу и вернуться на шаг регистрации.
'''; ''';
static const String usageGuide = '''Действие 1: static const String usageGuide = '''
При предъявлении покупателем штрих кода участника системы лояльности, запустите данное приложение. Действие 1:
На экране появиться сканер штрих кодов. Поднесите гаджет к смартфону или карте покупателя и отсканируйте предъявленный штрих код сканером.
При успешном сканировании на вашем экране появятся данные партнера.
Действие 2:
Необходимо ввести сумму покупки данного покупателя и нажать на кнопку «Зафиксировать».
Всплывет окно “Подтверждения правильности ввода суммы” в случае правильного ввода суммы, нажмите “ДА”, сумма будет проведена и вознаграждение будет начислено участнику системы лояльности.
Если же сумма введена с ошибкой, нажмите “НЕТ” вы вернетесь на шаг ввода суммы и скорректируете ее.'''; При предъявлении покупателем штрих-кода участника системы лояльности, запустите данное приложение.
static const String supportGuide = '''При некорректной работе приложения AUTO BONUS просьба сразу обратиться по телефону нашей технической поддержки: 8-800-234-6064 (звонок бесплатный), вас свяжут с менеджером. При звонке приготовьтесь назвать ИНН и наименование вашей организации. На экране появится сканер штрих кодов. Отсканируйте предъявленный штрих-код сканером.
Рекомендуйте покупателям установить мобильное приложение дисконтной системы International Auto Club AUTO BONUS, и получайте кэш бэк и их покупок в любых наземных или интернет магазинов.
Наш сайт https://www.auto-club.biz''';
static const String commonGuide = '''Для эффективного считывания штрих кода участника системы лояльности необходимо камеру сканера поднести так, чтобы в неё не попадали вертикальные полосы рамки. При успешном сканировании на вашем экране появятся данные партнера.
Долгое сканирование происходит из-за черной рамки, в которую помещен штрих-код, вертикальные полосы этой рамки расцениваются сканером как часть штрих-кода.''';
Действие 2:
Необходимо ввести сумму покупки данного покупателя и кликнуть по кнопке «Зафиксировать».
Всплывет окно подтверждения правильности ввода суммы». В случае правильного ввода суммы, кликните «ДА», сумма будет проведена и вознаграждение будет начислено участнику системы лояльности.
Если сумма введена с ошибкой, кликните «НЕТ» и Вы вернетесь на шаг ввода суммы и сможете её скорректировать.
''';
static const String supportGuide = '''
При некорректной работе приложения AUTO BONUS просьба сразу обратиться по телефону нашей технической поддержки: 8-800-234-6064 (звонок бесплатный) и Вас свяжут с менеджером.
При звонке приготовьтесь назвать ИНН и наименование вашей организации.
Рекомендуйте покупателям установить мобильное приложение дисконтной системы International Auto Club AUTO CLUB и получайте новых лояльных покупателей.
Наш сайт https://www.auto-club.biz
''';
static const String commonGuide = '''
Для эффективного считывания штрих-кода участника системы лояльности необходимо камеру сканера поднести так, чтобы в неё не попадали вертикальные полосы рамки.
Увеличение времени сканирования может произойти из-за черной рамки, в которую помещен штрих-код, так как вертикальные полосы этой рамки расцениваются сканером как часть штрих-кода.
''';
} }

View File

@@ -24,12 +24,11 @@ class PurchaseScreen extends StatefulWidget {
class PurchaseScreenState<T> extends BaseState<PurchaseScreen> { class PurchaseScreenState<T> extends BaseState<PurchaseScreen> {
RegExp exp; RegExp moneyRegexp = new RegExp(r'''^(?!0\.00)\d{1,11}(\.\d{0,2})?$''');
PurchaseScreenState(String userString, String card) { PurchaseScreenState(String userString, String card) {
this.user = JSON.decode(userString); this.user = JSON.decode(userString);
this.card = card; this.card = card;
exp = new RegExp(r'''^(?!0\.00)\d{1,11}(\.\d{0,2})?$''');
getLoyality(user['loyalty_url']); getLoyality(user['loyalty_url']);
} }
@@ -40,15 +39,15 @@ class PurchaseScreenState<T> extends BaseState<PurchaseScreen> {
@override Widget getScreenContent() { @override Widget getScreenContent() {
return new Column( return new Column(
children: <Widget>[new Expanded(child: new ListView(children: <Widget>[ children: <Widget>[new Expanded(child: new ListView(children: <Widget>[
getValueWithTitle('ФИО', user['first_name'] == null ? '' : user['first_name']), getValueWithTitle('ФИО', user['first_name'] == null ? '' : user['first_name']),
getValueWithTitle('Карта', card), getValueWithTitle('Карта', card),
getValueWithTitle('Вознаграждение', loyality), getValueWithTitle('Вознаграждение', loyality),
getHintLabel(), getHintLabel(),
getDecoratedTextWidget(), getDecoratedTextWidget(),
buildButton(new EdgeInsets.only(top: 36.0, left: buttonVerticalMargin, right: buttonVerticalMargin), buildRaisedButton(context, 'ЗАВЕРШИТЬ ПОКУПКУ', () => onPurchaseClick(context))), buildButton(new EdgeInsets.only(top: 36.0, left: buttonVerticalMargin, right: buttonVerticalMargin), buildRaisedButton(context, 'ЗАВЕРШИТЬ ПОКУПКУ', () => onPurchaseClick(context))),
buildButton(new EdgeInsets.only(top: 24.0, left: buttonVerticalMargin, right: buttonVerticalMargin), buildFlatButton(context, 'СКАНИРОВАТЬ', primaryColor)) buildButton(new EdgeInsets.only(top: 24.0, left: buttonVerticalMargin, right: buttonVerticalMargin), buildFlatButton(context, 'СКАНИРОВАТЬ', primaryColor))
]))]); ]))]);
} }
@override String getTitle() { @override String getTitle() {
@@ -72,7 +71,7 @@ class PurchaseScreenState<T> extends BaseState<PurchaseScreen> {
setState(() { setState(() {
if (tmpString.length == 0 || exp.hasMatch(tmpString)) { if (tmpString.length == 0 || moneyRegexp.hasMatch(tmpString)) {
if (tmpString.contains('.')) { if (tmpString.contains('.')) {
int dotIndex = tmpString.indexOf('.'); int dotIndex = tmpString.indexOf('.');
integerPart = tmpString.substring(0, dotIndex); integerPart = tmpString.substring(0, dotIndex);
@@ -102,15 +101,14 @@ class PurchaseScreenState<T> extends BaseState<PurchaseScreen> {
onChanged: (text) => handleUserInput(text)); onChanged: (text) => handleUserInput(text));
} }
getLoyality(String url) { getLoyality(String url) async {
print(url); if (await platform.invokeMethod('isOnline')) {
print(token);
var headers = { var headers = {
'DM-Authorization': 'dmapptoken 9fec83cdca38c357e6b65dbb17514cdd36bf2a08', 'DM-Authorization': 'dmapptoken 9fec83cdca38c357e6b65dbb17514cdd36bf2a08',
'Authorization': 'dmtoken ${token}' 'Authorization': 'dmtoken ${token}'
}; };
httpClient.get(url, headers: headers).then((response) { httpClient.get(url, headers: headers).then((response) {
@@ -118,24 +116,18 @@ class PurchaseScreenState<T> extends BaseState<PurchaseScreen> {
Map bonuses = JSON.decode(response.body); Map bonuses = JSON.decode(response.body);
String type = bonuses['type']; String type = bonuses['type'];
setState(() { setState(() {
if (type == 'amount') { if (type == 'amount') {
this.loyality = '${user['discount']}%'; this.loyality = '${user['discount']}%';
} else { } else {
List amountToBonus = bonuses['amount_to_bonus']; List amountToBonus = bonuses['amount_to_bonus'];
// print(amountToBonus[0]);
// print(amountToBonus[1]);
this.loyality = '${(amountToBonus[0] / double.parse(amountToBonus[1])).toStringAsFixed(0)}%'; this.loyality = '${(amountToBonus[0] / double.parse(amountToBonus[1])).toStringAsFixed(0)}%';
} }
}); });
}).catchError((error) { }).catchError((error) {
print(error.toString()); print(error.toString());
}); });
}
} }
_buildSum() { _buildSum() {
@@ -175,33 +167,36 @@ class PurchaseScreenState<T> extends BaseState<PurchaseScreen> {
])); ]));
} }
purchase(String sum_total) { purchase(String sum_total) async {
platform.invokeMethod('getDocID').then((result) { if (await platform.invokeMethod('isOnline')) {
String url = user['purchases_url']; platform.invokeMethod('getDocID').then((result) {
var body = { String url = user['purchases_url'];
'doc_id': result,
'curr_iso_code': '643',
'commit': 'true',
'sum_total': sum_total
};
var headers = { var body = {
'DM-Authorization': 'dmapptoken 9fec83cdca38c357e6b65dbb17514cdd36bf2a08', 'doc_id': result,
'Authorization': 'dmtoken ${token}' 'curr_iso_code': '643',
}; 'commit': 'true',
'sum_total': sum_total
};
httpClient.post(url, body: body, headers: headers).then((response) { var headers = {
'DM-Authorization': 'dmapptoken 9fec83cdca38c357e6b65dbb17514cdd36bf2a08',
'Authorization': 'dmtoken ${token}'
};
print(response.body); httpClient.post(url, body: body, headers: headers).then((response) {
Navigator.of(context).pop();
pushRoute(context, new PurchaseSuccessScreen(sum_total, user['first_name'] == null ? '' : user['first_name']));
}).catchError((error) { print(response.body);
print(error.toString()); Navigator.of(context).pop();
}); pushRoute(context, new PurchaseSuccessScreen(sum_total, user['first_name'] == null ? '' : user['first_name']));
});
}).catchError((error) {
print(error.toString());
});
});
}
} }
} }

View File

@@ -22,19 +22,29 @@ class _RegistrationScreenState extends BaseState<RegistrationScreen> {
return 'ID магазина'; return 'ID магазина';
} }
/// Высота контейнера задана для того, чтобы элементы располагались вверху экрана // Список виджетов, автоматически прокручиваемый вверх при открытии клавиатуры.
/// и список скроллился снизу вверх при открытии клавиатуры.
@override Widget getScreenContent() { @override Widget getScreenContent() {
return new Container( return new Container(
child: new ListView(children: <Widget>[ child: new ListView(children: <Widget>[
new Center(child: new Column(children: <Widget>[ new Column(children: <Widget>[
getLogo(), getLogo(),
getHintLabel(), getHintLabel(),
getDecoratedTextWidget(), getDecoratedTextWidget(),
new Container(margin: new EdgeInsets.only(top: 36.0), child: buildRaisedButton(context, 'ЗАРЕГИСТРИРОВАТЬ', _isValidMerchantID() && !loading ? () => _registerShop(context) : null))])) getButton()])
])); ]));
} }
// Возвращает кнопку регистрации.
getButton() {
return new Container(margin: new EdgeInsets.only(top: 36.0), child:
buildRaisedButton(context, 'ЗАРЕГИСТРИРОВАТЬ', getOnPressed()));
}
// Возвращает обработчик нажатий на кнопку регистрации.
getOnPressed() {
return _isValidMerchantID() && !loading ? () => _registerShop(context) : null;
}
/// Токен кассы - это DIN код. DIN код - это специальный код динекта, максимальная его длина - 25 символов. /// Токен кассы - это DIN код. DIN код - это специальный код динекта, максимальная его длина - 25 символов.
_isValidMerchantID() { _isValidMerchantID() {
print("${textFieldValue.length}"); print("${textFieldValue.length}");
@@ -51,28 +61,29 @@ class _RegistrationScreenState extends BaseState<RegistrationScreen> {
/// Получение от платформы id установки, формирование запроса на получение токена, сохранение токена. /// Получение от платформы id установки, формирование запроса на получение токена, сохранение токена.
_register(BuildContext context) async { _register(BuildContext context) async {
if (await platform.invokeMethod('isOnline')) {
createToken(textFieldValue, await platform.invokeMethod('getPosID')).then((response) {
createToken(textFieldValue, await platform.invokeMethod('getPosID')).then((response) {
setState(() {
error = null;
loading = false;
});
print(response.body);
Map parsedMap = JSON.decode(response.body);
if (response.statusCode == 201) {
token = parsedMap['token'];
platform.invokeMethod('saveToken', {'token' : token});
platform.invokeMethod('saveMerchantID', {'merchantID' : textFieldValue});
pushRoute(context, new FinishRegistrationScreen());
} else {
setState(() { setState(() {
error = parsedMap['errors'][0]; error = null;
loading = false;
}); });
}
}).catchError((error) { print(response.body);
print(error.toString()); Map parsedMap = JSON.decode(response.body);
}); if (response.statusCode == 201) {
token = parsedMap['token'];
platform.invokeMethod('saveToken', {'token' : token});
platform.invokeMethod('saveMerchantID', {'merchantID' : textFieldValue});
pushRoute(context, new FinishRegistrationScreen());
} else {
setState(() {
error = parsedMap['errors'][0];
});
}
}).catchError((error) {
print(error.toString());
});
}
} }
} }

View File

@@ -18,27 +18,28 @@ class SplashScreen extends StatelessWidget {
showNextScreen(context); showNextScreen(context);
}); });
return new Stack(children: <Widget>[getBackgroundContainer(), getLogo(), return new Stack(children: <Widget>[getSplashBackground(), getLogo(),
new Align(alignment: FractionalOffset.bottomRight, child: 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)))]); 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)))]);
} }
// Возвращает столбец с логотипом приложения и текстом под ним.
// Столбец занимает не все доступное пространство, а необходимый минимум в центре экрана.
getLogo() { getLogo() {
return new Center(child: new Column(mainAxisSize: MainAxisSize.min, return new Center(child: new Column(mainAxisSize: MainAxisSize.min,
children: <Widget>[new Image.asset(logo_png, height: 112.0, width: 252.0), children: <Widget>[new Image.asset(logo_png, height: 112.0, width: 252.0),
new Image.asset(splash_text_png, height: 40.0, width: 240.0)])); new Image.asset(splash_text_png, height: 40.0, width: 240.0)]));
} }
getBackgroundContainer() { // Возвращает контейнер, который содержит decoration с фоновым изображением.
const margin = 48.0;
return new Container(padding: new EdgeInsets.only(left: margin, right: margin), decoration: getSplashBackground());
}
getSplashBackground() { getSplashBackground() {
return new BoxDecoration(image: new DecorationImage(image: new ExactAssetImage(splash_png), fit: BoxFit.cover)); return new Container(decoration:
new BoxDecoration(image:
new DecorationImage(image: new ExactAssetImage(splash_png), fit: BoxFit.cover)));
} }
/// Запуск следующего экрана приложения. // Запуск следующего экрана приложения.
showNextScreen(BuildContext context) async { showNextScreen(BuildContext context) async {
token = await platform.invokeMethod('getToken'); token = await platform.invokeMethod('getToken');
@@ -49,12 +50,14 @@ class SplashScreen extends StatelessWidget {
if (token == null) { if (token == null) {
pushRoute(context, new RegistrationScreen()); pushRoute(context, new RegistrationScreen());
} else { } else {
checkTokenStatus(token).then((statusResponse) { if (await platform.invokeMethod('isOnline')) {
handleStatusResponse(context, statusResponse); checkTokenStatus(token).then((statusResponse) {
}).catchError((error) { handleStatusResponse(context, statusResponse);
print(error.toString()); }).catchError((error) {
return false; print(error.toString());
}); return false;
});
}
} }
} }
@@ -78,25 +81,25 @@ class SplashScreen extends StatelessWidget {
if (active) { if (active) {
startScanner(context); startScanner(context);
} else { } else {
createToken(await platform.invokeMethod('getMerchantID'), await platform.invokeMethod('getPosID')).then((response) { if (await platform.invokeMethod('isOnline')) {
print('response.body: ${response.body}'); createToken(await platform.invokeMethod('getMerchantID'), await platform.invokeMethod('getPosID')).then((response) {
if (response.statusCode == 409) {
if (response.statusCode == 409) { pushRoute(context, new FinishRegistrationScreen());
pushRoute(context, new FinishRegistrationScreen()); } else if (response.statusCode == 201) {
} else if (response.statusCode == 201) { platform.invokeMethod('removeKeys').then((result) {
platform.invokeMethod('removeKeys').then((result) { Map parsedMap = JSON.decode(result);
Map parsedMap = JSON.decode(result); String t = parsedMap['token'];
String t = parsedMap['token']; deleteToken(t).then((response) {
deleteToken(t).then((response) { print(response.body);
print(response.body); Navigator.of(context).pop(); // Убираем текущий route
Navigator.of(context).pop(); // Убираем текущий route pushRoute(context, new RegistrationScreen()); // Запускаем регистрацию
pushRoute(context, new RegistrationScreen()); // Запускаем регистрацию }).catchError((error) {
}).catchError((error) { print(error.toString());
print(error.toString()); });
}); });
}); }
} }).catchError((error) => print(error.toString()));
}).catchError((error) => print(error.toString())); }
} }
} }
} }