From 0659198a1711c312d69aaf6679ab093609be5c33 Mon Sep 17 00:00:00 2001 From: nikitateplyakov Date: Wed, 6 Mar 2019 23:42:10 +0800 Subject: [PATCH 1/8] return purchases screen --- assets/values-en/strings.xml | 8 ++ assets/values-ru/strings.xml | 8 ++ lib/base/base_state.dart | 18 +++- lib/network.dart | 30 ++++++ lib/screens/purchase.dart | 11 +++ lib/screens/return.dart | 186 +++++++++++++++++++++++++++++++++++ lib/strings.dart | 8 ++ pubspec.lock | 7 ++ pubspec.yaml | 1 + 9 files changed, 275 insertions(+), 2 deletions(-) create mode 100644 lib/screens/return.dart diff --git a/assets/values-en/strings.xml b/assets/values-en/strings.xml index 0015bb0..b2b3ee7 100644 --- a/assets/values-en/strings.xml +++ b/assets/values-en/strings.xml @@ -154,4 +154,12 @@ Set on switch on Camera Go back to %s. Open settings + Return + Are you sure you want to return purchase, which cost %s on %s? + +You cannot undo this. +You bonus balance will be changed and you will have %s bonus points. + Return confirmed + Purchase, which cost %s on %s is returned. + Points diff --git a/assets/values-ru/strings.xml b/assets/values-ru/strings.xml index d51ed37..b84f307 100644 --- a/assets/values-ru/strings.xml +++ b/assets/values-ru/strings.xml @@ -153,4 +153,12 @@ Вернитесь к приложению %s. Открыть настройки + Возврвт + Вы подтверждаете возврат покупки на сумму %s от %s? + +Отменить возврат нельзя. +Бонусный баланс будет изменен и составит %s баллов. + Возврат подтверждет + Покупка на сумму %s от %s возвращена. + Баллы diff --git a/lib/base/base_state.dart b/lib/base/base_state.dart index be78f8a..64a0e24 100644 --- a/lib/base/base_state.dart +++ b/lib/base/base_state.dart @@ -1,4 +1,5 @@ import 'dart:async'; +import 'dart:io'; import 'package:checker/resources.dart'; import 'package:flutter/material.dart'; @@ -10,7 +11,6 @@ import 'package:checker/screens/faq.dart'; import 'package:checker/strings.dart'; import 'package:checker/db.dart'; import 'package:flutter/rendering.dart'; -import 'package:meta/meta.dart'; abstract class BaseState extends State { @@ -78,7 +78,14 @@ abstract class BaseState extends State { child: getMenuItem(help_png, StringsLocalization.help()) )); - if (Theme.of(context).platform != TargetPlatform.iOS) { + if(showReturnScreen()) { + menuItemList.add(new PopupMenuItem( + value: 3, + child: getMenuItem(exit_png, StringsLocalization.returnLabel()) + )); + } + + if (Platform.isAndroid) { menuItemList.add(new PopupMenuItem( value: 2, child: getMenuItem(exit_png, StringsLocalization.exit()) @@ -95,6 +102,8 @@ abstract class BaseState extends State { ]; } + bool showReturnScreen() => false; + void onOptionsItemClick(int index) { switch (index) { case 0: { @@ -119,9 +128,14 @@ abstract class BaseState extends State { platform.invokeMethod('finish'); break; } + case 3: + openReturnScreen(); + break; } } + void openReturnScreen() {} + /// Возвращает пункт меню (Картинка с текстом) Widget getMenuItem(String image, String text) { return new Row(children: [ diff --git a/lib/network.dart b/lib/network.dart index fd85033..7f64166 100644 --- a/lib/network.dart +++ b/lib/network.dart @@ -106,3 +106,33 @@ getEndpoint() async { getToken() async { return await platform.invokeMethod('getAppToken'); } + +Future getUserPurchases(String token, int userId, int page) async { + + var headers = { + 'DM-Authorization': 'dmapptoken ${await getToken()}', + 'Authorization': 'dmtoken $token', + 'Accept-Language': StringsLocalization.localeCode + }; + + + var finalEndpoint = "${await getEndpoint()}users/$userId/purchases/?returned=false&page=$page"; + print(finalEndpoint); + + return httpClient.get(finalEndpoint, headers: headers); +} + +Future returnPurchase(String token, int userId, int purchaseId) async { + + var headers = { + 'DM-Authorization': 'dmapptoken ${await getToken()}', + 'Authorization': 'dmtoken $token', + 'Accept-Language': StringsLocalization.localeCode + }; + + + var finalEndpoint = "${await getEndpoint()}users/$userId/purchases/$purchaseId"; + print(finalEndpoint); + + return httpClient.delete(finalEndpoint, headers: headers); +} diff --git a/lib/screens/purchase.dart b/lib/screens/purchase.dart index c7309b5..5f1c51d 100644 --- a/lib/screens/purchase.dart +++ b/lib/screens/purchase.dart @@ -1,5 +1,6 @@ import 'package:checker/base/base_screen.dart'; import 'package:checker/db.dart'; +import 'package:checker/screens/return.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'dart:convert'; @@ -127,6 +128,16 @@ class PurchaseScreenState extends BaseState { return listView; } + bool showReturnScreen() => true; + + void openReturnScreen() { + Future.delayed(const Duration(milliseconds: 200), () { + Route route = MaterialPageRoute(builder: (BuildContext context) => + ReturnScreen(helper, app, user['id'], user['bonus']), fullscreenDialog: true); + Navigator.push(context, route); + }); + } + getBonusInputField() { var bonusTextField = new TextField( keyboardType: TextInputType.number, diff --git a/lib/screens/return.dart b/lib/screens/return.dart new file mode 100644 index 0000000..5264612 --- /dev/null +++ b/lib/screens/return.dart @@ -0,0 +1,186 @@ +import 'dart:convert'; + +import 'package:checker/base/base_screen.dart'; +import 'package:checker/base/base_state.dart'; +import 'package:checker/db.dart'; +import 'package:checker/strings.dart'; +import 'package:flutter/material.dart'; +import 'package:checker/network.dart'; +import 'package:http/http.dart'; +import 'package:intl/intl.dart'; + +class ReturnScreen extends BaseScreen { + final int userId; + final int bonus; + + ReturnScreen(SqliteHelper helper, String app, this.userId, this.bonus) : super(helper, app); + + @override + _ReturnScreenState createState() => _ReturnScreenState(helper, app); +} + +class _ReturnScreenState extends BaseState { + static DateFormat dateFormat = DateFormat('d MMM yy'); + + ScrollController _controller; + List _purchases = []; + int _bonus; + int _page = 1; + bool _fullLoaded = false; + bool _loading = false; + + + _ReturnScreenState(SqliteHelper helper, String app) : super(helper, app); + + bool isAutomaticallyImplyLeading() => true; + + @override + Widget getScreenContent() => ListView.separated( + itemBuilder: (context, index) { + final TextStyle style = Theme.of(context).textTheme.subhead; + if(index > 0) { + final item = _purchases[index - 1]; + final DateTime date = DateTime.parse(item['date']); + final String formattedDate = dateFormat.format(date); + return GestureDetector( + child: Padding( + padding: const EdgeInsets.all(16), + child: Row( + children: [ + Expanded( + child: Text(formattedDate, style: style), + ), + Expanded( + child: Text(item['sum_total'], style: style), + ), + Expanded( + child: Text(item['sum_bonus'].toString(), style: style), + ) + ], + ), + ), + onTap: () => _confirmReturnPurchase(item, formattedDate), + ); + } else { + final TextStyle headerStyle = style.copyWith(color: Colors.grey); + return Padding( + padding: const EdgeInsets.all(16), + child: Row( + children: [ + Expanded( + child: Container(), + ), + Expanded( + child: Text(StringsLocalization.sum(), style: headerStyle), + ), + Expanded( + child: Text(StringsLocalization.points(), style: headerStyle), + ) + ], + ), + ); + } + }, + separatorBuilder: (_, index) => index == 0 + ? Container() + : Padding( + padding: const EdgeInsets.symmetric(horizontal: 16), + child: Divider(height: 1,), + ), + itemCount: _purchases.length > 0 ? _purchases.length + 1 : _purchases.length, + controller: _controller); + + @override + Widget build(BuildContext context) => getMainWidget(); + + @override + String getTitle() => StringsLocalization.returnLabel(); + + @override + void initState() { + super.initState(); + setState(() { + loading = true; + }); + _loadUserPurchases(); + _bonus = widget.bonus; + _controller = ScrollController(); + _controller.addListener(_scrollListener); + } + + void _scrollListener() { + if (_controller.offset >= _controller.position.maxScrollExtent && + !_controller.position.outOfRange) { + _loadUserPurchases(); + } + } + + void _loadUserPurchases() async { + if(!_fullLoaded && !_loading) { + _loading = true; + setState(() => loading = true); + String token = await helper.getToken(); + Response response = await getUserPurchases(token, widget.userId, _page); + final responseJson = json.decode(response.body); + List purchases = responseJson['results']; + _fullLoaded = _page == responseJson['pages']; + setState(() { + loading = false; + _purchases.addAll(purchases); + }); + _page++; + _loading = false; + setState(() => loading = false); + } + } + + void _confirmReturnPurchase(Map purchase, String formattedDate) { + showDialog( + context: context, + builder: (context) => + AlertDialog( + title: Text(StringsLocalization.confirmation()), + content: Text(StringsLocalization.returnConfirmation( + purchase['sum_total'], formattedDate, _bonus + purchase['sum_bonus'])), + actions: [ + FlatButton( + child: Text(StringsLocalization.no()), + onPressed: () => Navigator.pop(context), + ), + FlatButton( + child: Text(StringsLocalization.yes()), + onPressed: () { + Navigator.pop(context); + _returnPurchase(purchase, formattedDate); + } + ) + ], + ) + ); + } + + void _returnPurchase(Map purchase, String formattedDate) async { + String token = await helper.getToken(); + final Response response = await returnPurchase(token, widget.userId, purchase['id']); + if(response.statusCode == 204) { + _bonus += purchase['sum_bonus']; + setState(() { + _purchases.removeWhere((p) => p['id'] == purchase['id']); + }); + showDialog( + context: context, + builder: (context) => + AlertDialog( + title: Text(StringsLocalization.returnConfirmed()), + content: Text(StringsLocalization.returnConfirmedContent(purchase['sum_total'], formattedDate)), + actions: [ + FlatButton( + child: Text(StringsLocalization.yes()), + onPressed: () => Navigator.pop(context) + ) + ], + ) + ); + } + } +} diff --git a/lib/strings.dart b/lib/strings.dart index 8061b96..08ce633 100644 --- a/lib/strings.dart +++ b/lib/strings.dart @@ -125,6 +125,11 @@ class StringsLocalization { String trimmedVal = val.substring(0, val.length - 3); return sprintf(strings['payment_complite'], [val, declineCurrency(int.parse(trimmedVal), code)]); } + static String returnConfirmation(String sum, String date, int points) => + sprintf(strings['return_purchase_content'], [sum, date, points.toString()]); + + static String returnConfirmedContent(String sum, String date) => + sprintf(strings['return_confirmation_content'], [sum, date]); static String registration() => strings['registration']; static String usage() => strings['usage']; @@ -218,4 +223,7 @@ class StringsLocalization { static String joysMinus() => strings['joys_minus']; static String joysHint() => strings['joys_hint']; static String phone() => strings['phone']; + static String returnLabel() => strings['returnLabel']; + static String returnConfirmed() => strings['return_confirmation']; + static String points() => strings['points']; } diff --git a/pubspec.lock b/pubspec.lock index 9f407d6..f06d8c4 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -48,6 +48,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.4.10" + intl: + dependency: "direct main" + description: + name: intl + url: "https://pub.dartlang.org" + source: hosted + version: "0.15.7" meta: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index ae07c59..2a8b048 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -9,6 +9,7 @@ dependencies: image_picker: '^0.4.1' # use for ask permissions @ iOS xml: "^3.0.0" sentry: 2.2.0 + intl: 0.15.7 flutter: sdk: flutter From 89db867305615d2ea8ee8ac9ddf78c942195876b Mon Sep 17 00:00:00 2001 From: vtretyakov Date: Tue, 12 Mar 2019 15:01:57 +0700 Subject: [PATCH 2/8] Added Icon for return --- assets/return.png | Bin 0 -> 8293 bytes lib/consts.dart | 1 + 2 files changed, 1 insertion(+) create mode 100644 assets/return.png diff --git a/assets/return.png b/assets/return.png new file mode 100644 index 0000000000000000000000000000000000000000..9ead30d713a13130ded98c827fab1b3aeca384de GIT binary patch literal 8293 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 u_ho!He}5ZZuqUyzCc5{(e@C%&Moz Date: Tue, 12 Mar 2019 17:13:08 +0800 Subject: [PATCH 3/8] return icon, purchases sort --- lib/base/base_state.dart | 2 +- lib/network.dart | 2 +- pubspec.yaml | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/base/base_state.dart b/lib/base/base_state.dart index 64a0e24..a8dfca8 100644 --- a/lib/base/base_state.dart +++ b/lib/base/base_state.dart @@ -81,7 +81,7 @@ abstract class BaseState extends State { if(showReturnScreen()) { menuItemList.add(new PopupMenuItem( value: 3, - child: getMenuItem(exit_png, StringsLocalization.returnLabel()) + child: getMenuItem(return_png, StringsLocalization.returnLabel()) )); } diff --git a/lib/network.dart b/lib/network.dart index 7f64166..200c2a0 100644 --- a/lib/network.dart +++ b/lib/network.dart @@ -116,7 +116,7 @@ Future getUserPurchases(String token, int userId, int page) async { }; - var finalEndpoint = "${await getEndpoint()}users/$userId/purchases/?returned=false&page=$page"; + var finalEndpoint = "${await getEndpoint()}users/$userId/purchases/?returned=false&sort=desc&page=$page"; print(finalEndpoint); return httpClient.get(finalEndpoint, headers: headers); diff --git a/pubspec.yaml b/pubspec.yaml index 2a8b048..ecb8afa 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -42,6 +42,7 @@ flutter: - assets/settings_arrow.png - assets/help.png - assets/check.png + - assets/return.png - assets/exit.png - assets/activate_token_message_background.png - assets/active_token_message_background.png From 016b156eb8e5304658cf3a80c5ef5ba5dfbb2694 Mon Sep 17 00:00:00 2001 From: vtretyakov Date: Fri, 15 Mar 2019 10:37:06 +0700 Subject: [PATCH 4/8] text fix --- assets/values-ru/strings.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/assets/values-ru/strings.xml b/assets/values-ru/strings.xml index b84f307..0397885 100644 --- a/assets/values-ru/strings.xml +++ b/assets/values-ru/strings.xml @@ -153,12 +153,12 @@ Вернитесь к приложению %s. Открыть настройки - Возврвт + Возврат Вы подтверждаете возврат покупки на сумму %s от %s? Отменить возврат нельзя. -Бонусный баланс будет изменен и составит %s баллов. - Возврат подтверждет +Бонусный баланс будет изменен и составит %s бонусов. + Возврат подтвержден Покупка на сумму %s от %s возвращена. Баллы From 845cae829dd30cbbc9a7eafcb17de310e14e8225 Mon Sep 17 00:00:00 2001 From: vtretyakov Date: Sun, 17 Mar 2019 23:42:25 +0700 Subject: [PATCH 5/8] Bonus count fix --- lib/screens/return.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/screens/return.dart b/lib/screens/return.dart index 5264612..77fede4 100644 --- a/lib/screens/return.dart +++ b/lib/screens/return.dart @@ -141,7 +141,7 @@ class _ReturnScreenState extends BaseState { AlertDialog( title: Text(StringsLocalization.confirmation()), content: Text(StringsLocalization.returnConfirmation( - purchase['sum_total'], formattedDate, _bonus + purchase['sum_bonus'])), + purchase['sum_total'], formattedDate, _bonus - purchase['sum_bonus'])), actions: [ FlatButton( child: Text(StringsLocalization.no()), From f330a3dcd390ed94661b52e39cedd664b63d9407 Mon Sep 17 00:00:00 2001 From: nikitateplyakov Date: Tue, 9 Apr 2019 22:38:03 +0800 Subject: [PATCH 6/8] fix return item with consumed points --- lib/screens/return.dart | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/lib/screens/return.dart b/lib/screens/return.dart index 77fede4..cd89dd6 100644 --- a/lib/screens/return.dart +++ b/lib/screens/return.dart @@ -134,14 +134,28 @@ class _ReturnScreenState extends BaseState { } } + num extractReturnPoints(Map purchase) { + final returnPoints = purchase['sum_bonus']; + if(returnPoints is num) { + return returnPoints; + } else if(returnPoints is String) { + final RegExp returnPattern = RegExp(r"(\d+)"); + final List digits = returnPattern.allMatches(returnPoints).toList(); + return int.parse(digits[0].group(0)) - int.parse(digits[1].group(1)); + } else { + return 0; + } + } + void _confirmReturnPurchase(Map purchase, String formattedDate) { + final num totalReturn = extractReturnPoints(purchase); showDialog( context: context, builder: (context) => AlertDialog( title: Text(StringsLocalization.confirmation()), content: Text(StringsLocalization.returnConfirmation( - purchase['sum_total'], formattedDate, _bonus - purchase['sum_bonus'])), + purchase['sum_total'], formattedDate, _bonus - totalReturn)), actions: [ FlatButton( child: Text(StringsLocalization.no()), @@ -151,7 +165,7 @@ class _ReturnScreenState extends BaseState { child: Text(StringsLocalization.yes()), onPressed: () { Navigator.pop(context); - _returnPurchase(purchase, formattedDate); + _returnPurchase(purchase, formattedDate, totalReturn); } ) ], @@ -159,11 +173,11 @@ class _ReturnScreenState extends BaseState { ); } - void _returnPurchase(Map purchase, String formattedDate) async { + void _returnPurchase(Map purchase, String formattedDate, num totalReturn) async { String token = await helper.getToken(); final Response response = await returnPurchase(token, widget.userId, purchase['id']); if(response.statusCode == 204) { - _bonus += purchase['sum_bonus']; + _bonus += totalReturn; setState(() { _purchases.removeWhere((p) => p['id'] == purchase['id']); }); From ea3672a885fc70c7d2579219fb57de0fa67fa87b Mon Sep 17 00:00:00 2001 From: vtretyakov Date: Tue, 9 Apr 2019 22:59:46 +0700 Subject: [PATCH 7/8] update translation --- assets/values-es/strings.xml | 10 +++++++++- assets/values-ua/strings.xml | 10 +++++++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/assets/values-es/strings.xml b/assets/values-es/strings.xml index 55630dd..4ed0d1d 100644 --- a/assets/values-es/strings.xml +++ b/assets/values-es/strings.xml @@ -23,7 +23,7 @@ Confirmacón No Compra por %s %s está realizada - The payment of %s %s was completed + Se completó el pago de %s %s Registro Explotación Contactos del soporte técnico @@ -150,4 +150,12 @@ Establecer en el interruptor de la cámara Vuelve a %s Abre las configuraciones + Regreso + ¿Está seguro de que desea devolver la compra, que costó %s en %s + +No puedes deshacer esto. +Se cambiará su saldo de bonificación y tendrá %s puntos de bonificación. + Regreso confirmado + Compra, cuyo costo %s en %s se devuelve. + Puntos diff --git a/assets/values-ua/strings.xml b/assets/values-ua/strings.xml index 44a320b..b733dd9 100644 --- a/assets/values-ua/strings.xml +++ b/assets/values-ua/strings.xml @@ -23,7 +23,7 @@ Підтвердження Ні Купівля на суму %s %s проведена - The payment of %s %s was completed + Виплату %s %s було завершено Реєстрація Використання Контакти підтримки @@ -155,4 +155,12 @@ Поверніться до додатка %s. Відкрити параметри + Повернення + Ви дійсно хочете повернути покупку, яка коштує %s на %s? + +Ви не можете скасувати це. +Баланс бонусів буде змінено, і ви отримаєте %s бонусний бал. + Повернення підтверджено + Повертається придбання, вартість якого %s на %s. + Бонусні бали From 37fee9aa8340e2f0d2d2ac19a8b0f87ee630dfa5 Mon Sep 17 00:00:00 2001 From: vtretyakov Date: Tue, 9 Apr 2019 22:59:54 +0700 Subject: [PATCH 8/8] branch close