From 8738fbfd398d4db894485647a14a8f1fc61c0d4e Mon Sep 17 00:00:00 2001 From: kifio Date: Tue, 25 Jul 2017 08:36:23 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB=20?= =?UTF-8?q?=D1=8D=D0=BA=D1=80=D0=B0=D0=BD=20FAQ=20=D1=81=D0=BE=20=D0=B2?= =?UTF-8?q?=D1=81=D0=B5=D0=BC=D0=B8=20=D0=BE=D0=BF=D0=B8=D1=81=D0=B0=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F=D0=BC=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/activate_token.dart | 4 -- lib/base_state.dart | 17 +++++++- lib/faq.dart | 89 +++++++++++++++++++++++++++++++++++++++ lib/main.dart | 2 +- lib/purchase.dart | 10 ++--- lib/purchase_success.dart | 7 --- lib/registration.dart | 4 -- 7 files changed, 109 insertions(+), 24 deletions(-) create mode 100644 lib/faq.dart diff --git a/lib/activate_token.dart b/lib/activate_token.dart index d3f5b58..da11d57 100644 --- a/lib/activate_token.dart +++ b/lib/activate_token.dart @@ -28,10 +28,6 @@ class _RegistrationScreenState extends BaseState { return 'ID магазина'; } - @overide getMenuButtons(BuildContext context) { - return [new IconButton(icon: new Icon(Icons.help_outline), onPressed: () {})]; - } - @override Widget getScreenContent() { return new Column(children: [ getLogo(), diff --git a/lib/base_state.dart b/lib/base_state.dart index 09fe37d..ad43148 100644 --- a/lib/base_state.dart +++ b/lib/base_state.dart @@ -4,6 +4,7 @@ import 'dart:convert'; import 'dart:async'; import 'main.dart'; +import 'faq.dart'; abstract class BaseState extends State { @@ -22,6 +23,18 @@ abstract class BaseState extends State { backgroundColor: primaryColor, actions: getMenuButtons(context)); } + @overide getMenuButtons(BuildContext context) { + return [getFaqButton()]; + } + + getFaqButton() { + return new IconButton(icon: new Icon(Icons.help_outline), onPressed: () => faq()); + } + + getLogoutButton() { + return new IconButton(icon: new Image.asset(logout_png, height: iconHeight, width: iconHeight), onPressed: () => logout(context)); + } + Widget getBody(BuildContext context) { return new Stack(children: [getScreenContent(), getProgressIndicator()]); } @@ -32,7 +45,9 @@ abstract class BaseState extends State { String getHint(); - getMenuButtons(); + faq() { + pushRoute(context, new FAQScreen()); + } /// Метод возвращает контейнер с отступами, который содержит картинку с логотипом. getLogo() { diff --git a/lib/faq.dart b/lib/faq.dart new file mode 100644 index 0000000..f6e4bc3 --- /dev/null +++ b/lib/faq.dart @@ -0,0 +1,89 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; + +import 'main.dart'; + +/// Класс содержит заголовки и текст блоков FAQ. +class Entry { + Entry(this.title, this.text); + final String title; + final String text; +} + +class EntryItem extends StatelessWidget { + const EntryItem(this.entry); + + final Entry entry; + + Widget _buildTiles(Entry root) { + return new ExpansionTile( + key: new PageStorageKey(root), + title: new Text(root.title), + children: [new Text(root.text)] + ); + } + + @override + Widget build(BuildContext context) { + return _buildTiles(entry); + } +} + +/// Экран проведения покупки. +class FAQScreen extends StatelessWidget { + + AppBar getAppBar(BuildContext context) { + return new AppBar(title: new Text('FAQ', style: new TextStyle(fontSize: 18.0)), + backgroundColor: primaryColor, actions: [getLogoutButton()]); + } + + getLogoutButton() { + return new IconButton(icon: new Image.asset(logout_png, height: iconHeight, width: iconHeight), onPressed: () => logout(context)); + } + @override + Widget build(BuildContext context) { + return new MaterialApp(home: new Scaffold(appBar: getAppBar(context), body: getBody())); + } + + /// Метод возвращает ListView с блоками faq. + getBody() { + return new ListView.builder( + itemBuilder: (BuildContext context, int index) => new EntryItem(data[index]), + itemCount: data.length); + } + + /// Список с контентом + final List data = [ + new Entry('Регистрация', registrationGuide), + new Entry('Использование', usageGuide), + new Entry('Контакты поддержки', supportGuide), + new Entry('Использование', commonGuide) + ]; + + /// TODO: Отформатировать строки + + static const String registrationGuide = '''После запуска приложения вы окажетесь на странице регистрации магазина. + Введите DIN код магазина (выдается партнером/менеджером International Auto Club, дублируется на почту) + Нажать кнопку: «Зарегистрировать» + Дождитесь подтверждение активации программы, нажатием кнопки “Обновите статус активации” обновите статус. + После подтверждения запроса на активацию программы Партнером/менеджером нажмите кнопку “Завершить регистрацию”, приложение готово к использованию. + + В случае желания изменить номер кассы, необходимо нажать на “значек” верхнем правом углу и вернуться на шаг регистрации.'''; + + 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 = '''Для эффективного считывания штрих кода участника системы лояльности необходимо камеру сканера поднести так, чтобы в неё не попадали вертикальные полосы рамки. + Долгое сканирование происходит из-за черной рамки, в которую помещен штрих-код, вертикальные полосы этой рамки расцениваются сканером как часть штрих-кода.'''; +} diff --git a/lib/main.dart b/lib/main.dart index da2e52e..b5734ac 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -60,7 +60,7 @@ checkToken(BuildContext context) async { /// Может производиться с нескольких экранов (splash, finish_registration). startScanner(BuildContext context) async { - // Канал слушает ловит вызовы методов из "нативной" части приложения. + // Канал ловит вызовы методов из "нативной" части приложения. // Могут быть вызваны либо logaut либо faq, либо purchase. platform.setMethodCallHandler((MethodCall call) async { diff --git a/lib/purchase.dart b/lib/purchase.dart index 2b9a021..aac3a82 100644 --- a/lib/purchase.dart +++ b/lib/purchase.dart @@ -14,10 +14,6 @@ class PurchaseScreen extends StatefulWidget { class PurchaseScreenState extends BaseState { - PurchaseScreenState() { - - } - String integerPart = '', fractionalPart = ''; @override String getTitle() { @@ -30,8 +26,8 @@ class PurchaseScreenState extends BaseState { @overide getMenuButtons(BuildContext context) { return [ - new IconButton(icon: new Icon(Icons.help_outline), onPressed: () {}), - new IconButton(icon: new Image.asset(logout_png, height: iconHeight, width: iconHeight), onPressed: () => logout(context)) + new getFaqButton(), + new getLogoutButton() ]; } @@ -71,7 +67,7 @@ class PurchaseScreenState extends BaseState { integerPart = tmpString; controller.text = tmpString; } - textFieldValue = controller.text; + textFieldValue = tmpString; }); } diff --git a/lib/purchase_success.dart b/lib/purchase_success.dart index cb433c6..67600e5 100644 --- a/lib/purchase_success.dart +++ b/lib/purchase_success.dart @@ -29,13 +29,6 @@ class PurchaseSuccessScreenState extends PurchaseScreenState { return "Проведение покупки"; } - @overide getMenuButtons(BuildContext context) { - return [ - new IconButton(icon: new Icon(Icons.help_outline), onPressed: () {}), - new IconButton(icon: new Image.asset(logout_png, height: 20.0, width: 20.0), onPressed: () => logout(context)) - ]; - } - @override Widget getScreenContent() { return new Column(children: [ getValueWithTitle('Покупатель', 'Знаменитый Рокер Паук'), diff --git a/lib/registration.dart b/lib/registration.dart index 55e0efe..54a0dee 100644 --- a/lib/registration.dart +++ b/lib/registration.dart @@ -24,10 +24,6 @@ class _RegistrationScreenState extends BaseState { return 'ID магазина'; } - @overide getMenuButtons(BuildContext context) { - return [new IconButton(icon: new Icon(Icons.help_outline), onPressed: () {})]; - } - /// Высота контейнера задана для того, чтобы элементы располагались вверху экрана /// и список скроллился снизу вверх при открытии клавиатуры. @override Widget getScreenContent() {