import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'dart:convert'; import 'dart:core'; import 'package:checker/strings.dart'; import 'package:checker/common.dart'; import 'package:checker/consts.dart'; import 'package:checker/network.dart'; import 'package:checker/base_state.dart'; import 'purchase_success.dart'; /// Экран проведения покупки. class PurchaseScreen extends StatefulWidget { PurchaseScreen(this.user, this.card); final String user; final String card; @override State createState() => new PurchaseScreenState(user, card); } class PurchaseScreenState extends BaseState { PurchaseScreenState(String userString, String card) { this.user = JSON.decode(userString); this.card = card; getLoyality(user['loyalty_url']); } bool purchaseInProgress = false; Map user; String card = ''; String loyality = ''; @override Widget getScreenContent() { return new Column( children: [new Expanded(child: new ListView(children: [ getValueWithTitle(Strings.of(context).userName(), user['first_name'] == null ? '' : user['first_name']), getValueWithTitle(Strings.of(context).card(), card), getValueWithTitle(Strings.of(context).reward(), loyality), getHintLabel(), getDecoratedTextWidget(), buildButton(getScreenMargins(36.0), getCompleteButton()), buildButton(getScreenMargins(24.0), getScanButton()) ]))]); } getScreenMargins(double top) { double side = 42.0; return new EdgeInsets.only(top: top, left: side, right: side); } getCompleteButton() { String title = Strings.of(context).completePurchase(); return buildRaisedButton(context, title, () => onPurchaseClick(context)); } getScanButton() { return buildFlatButton(context, Strings.of(context).scan(), primaryColor); } @override String getTitle() { return Strings.of(context).carryingPurchase(); } @override getHint() { return Strings.of(context).sum(); } @override getMenuButtons(BuildContext context) { return [getFaqButton(), getLogoutButton()]; } @override Color getTextFilledBackground() { return Colors.white; } @override getTextWidget() { return new TextField( keyboardType: TextInputType.number, decoration: new InputDecoration.collapsed( hintText: getHint(), hintStyle: new TextStyle(color: greyTextColor, fontSize: 16.0) ), controller: controller, onSubmitted: (String text) { setState(() { controller.text = _parseSum(text); }); }, textAlign: TextAlign.center, autofocus: true, ); } getLoyality(String url) async { if (await platform.invokeMethod('isOnline')) { var headers = { 'DM-Authorization': 'dmapptoken $appToken', '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 amountToBonus = bonuses['amount_to_bonus']; double loyalityVal = (double.parse(amountToBonus[1]) / amountToBonus[0]) * 100; this.loyality = '${loyalityVal.toStringAsFixed(0)}%'; } }); }).catchError((error) { print(error.toString()); }); } } String _cleanupNumber(String text){ String tmp = text .replaceAll(' ', '') .replaceAll('-', '') .replaceAll(',', '.') .replaceAll('..', '.'); while(tmp.indexOf('..') != -1){ tmp = tmp.replaceAll('..', '.'); } return tmp; } _parseSum(String input) { num sumTotal = 0.0; String text = _cleanupNumber(input); try { sumTotal = num.parse(text); } catch(exception) { print(exception); try { int idx = text.indexOf('.'); String integerPart = text.substring(0, idx); String fractionalPart = text.substring(idx + 1, text.length); if(fractionalPart.length > 2) { fractionalPart = fractionalPart.substring(0, 2); } return '${integerPart}.${fractionalPart}'; } catch(exception){ print(exception); } } return sumTotal.toStringAsFixed(2); } onPurchaseClick(BuildContext context) { String val = _parseSum(controller.text); showDialog(context: context, child: new AlertDialog( title: new Text(Strings.of(context).confirmation()), content: new Text(getContentMessage(val)), actions: [ new FlatButton( child: new Text(Strings.of(context).no()), onPressed: () { Navigator.of(context).pop(); }, ), new FlatButton( child: new Text(Strings.of(context).yes()), onPressed: () { purchase(val); }, ) ])); } getContentMessage(String val) { return Strings.of(context).confirmPurchase(val); } purchase(String sumTotal) async { if (await platform.invokeMethod('isOnline')) { if (!purchaseInProgress) { purchaseInProgress = true; platform.invokeMethod('getDocID').then((result) { String url = user['purchases_url']; var body = { 'doc_id': result, 'curr_iso_code': '643', 'commit': 'true', 'sum_total': sumTotal }; var headers = { 'DM-Authorization': 'dmapptoken $appToken', 'Authorization': 'dmtoken ${token}' }; httpClient.post(url, body: body, headers: headers).then((response) { print(response.body); Navigator.of(context).pop(); pushRoute(context, new PurchaseSuccessScreen(sumTotal, user['first_name'] == null ? '' : user['first_name'])); }).catchError((error) { purchaseInProgress = false; print(error.toString()); }); }); } } } }