import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'dart:convert'; import 'dart:async'; import 'main.dart'; import 'base_state.dart'; import 'purchase_success.dart'; /// Экран проведения покупки. class PurchaseScreen extends StatefulWidget { PurchaseScreen(this.response, this.card); Map response; String card; @override State createState() => new PurchaseScreenState(response, card); } class PurchaseScreenState extends BaseState { PurchaseScreenState(Map user, String card) { this.user = user; this.card = card; getLoyality(user['loyalty_url']); } Map user; String card = ''; String integerPart = '', fractionalPart = ''; String loyality = ''; @override Widget getScreenContent() { return new Container(height: 412.0, child: new ListView(reverse: true, children: [ new Column(children: [ getValueWithTitle('ФИО', user['first_name']), getValueWithTitle('Карта', card), getValueWithTitle('Вознаграждение', loyality), getHintLabel(), getDecoratedTextWidget(), 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))]) ].reversed.toList())); } @override String getTitle() { return "Проведение покупки"; } @override getHint() { return 'Сумма'; } @overide getMenuButtons(BuildContext context) { return [getFaqButton(), getLogoutButton()]; } @override Color getTextFilledBackground() { return Colors.white; } /// Смена состояния экрана при изменении текста в поле ввода. @override handleUserInput(String tmpString) { setState(() { tmpString = tmpString.replaceAll('-', ''); tmpString = tmpString.replaceAll(', ', ''); print(tmpString); if (tmpString.contains('.')) { int dotIndex = tmpString.indexOf('.'); integerPart = tmpString.substring(0, dotIndex); fractionalPart = tmpString.substring(dotIndex + 1, tmpString.length); if (fractionalPart.length > 2) { fractionalPart = fractionalPart.substring(0, 2); } controller.text = '${integerPart}.${fractionalPart}'; } else { integerPart = tmpString; controller.text = tmpString; } textFieldValue = tmpString; }); } getLoyality(String url) { var headers = { 'DM-Authorization': 'dmapptoken 9fec83cdca38c357e6b65dbb17514cdd36bf2a08', 'Authorization': 'dmtoken ${token}' }; httpClient.get(url, headers: headers).then((response) { print(response.body); Map bonuses = JSON.decode(response.body); String type = bonuses['type']; setState(() { if (type == 'amount') { this.loyality = user['discount']; } else { List bonusToAmount = bonuses['bonus_to_amount']; this.loyality = (bonusToAmount[1].toInt() / bonusToAmount[0].toInt() ).toString(); } }); }).catchError((error) { print(error.toString()); }); } _buildSum() { String temporaryInteger = integerPart; String temporaryFractional = fractionalPart; while (temporaryFractional.length < 2) { temporaryFractional = temporaryFractional + '0'; } return temporaryInteger + '.' + temporaryFractional; } onPurchaseClick(BuildContext context) { String val = _buildSum(); print(val); showDialog(context: context, child: new AlertDialog( title: new Text('Подтверждение'), content: new Text('Вы подтверждаете покупку на ${val} руб?'), actions: [ new FlatButton( child: new Text('Нет'), onPressed: () { Navigator.of(context).pop(); }, ), new FlatButton( child: new Text('Да'), onPressed: () { purchase(val); }, ) ])); } purchase(String sum_total) { platform.invokeMethod('getDocID').then((result) { String url = user['purchases_url']; var body = { 'doc_id': result, 'curr_iso_code': '643', 'commit': 'true', 'sum_total': sum_total }; var headers = { 'DM-Authorization': 'dmapptoken 9fec83cdca38c357e6b65dbb17514cdd36bf2a08', 'Authorization': 'dmtoken ${token}' }; httpClient.post(url, body: body, headers: headers).then((response) { print(response.body); Navigator.of(context).pop(); pushRoute(context, new PurchaseSuccessScreen(sum_total, user['first_name'])); }).catchError((error) { print(error.toString()); }); }); } }