diff --git a/lib/widgets/purchase_slider.dart b/lib/widgets/purchase_slider.dart new file mode 100644 index 00000000..523ed373 --- /dev/null +++ b/lib/widgets/purchase_slider.dart @@ -0,0 +1,60 @@ +import 'package:flutter/material.dart'; +import 'package:equatable/equatable.dart'; + +class PaymentInfo extends Equatable { + final double value; + final String text; + + PaymentInfo(this.value, this.text); + + @override + List get props => [value, text]; +} + +typedef PaymentSliderChanged = Function(PaymentInfo); + +class PurchaseSlider extends StatelessWidget { + final List values; + final PaymentInfo selectedValue; + final PaymentSliderChanged onChanged; + + PurchaseSlider({ + @required this.values, + @required this.selectedValue, + @required this.onChanged, + }) { + values.sort((a, b) => a.value.compareTo(b.value)); + } + + @override + Widget build(BuildContext context) { + return Slider( + min: values.first.value, + max: values.last.value + 0.50, + value: selectedValue.value, + onChanged: (double val) { + int i = -1; + for (i = 1; i < values.length; i++) { + var prev = values[i - 1].value; + var cur = values[i].value; + + if (prev < val && val <= cur) { + i--; + break; + } + } + if (val == values.first.value) { + i = 0; + } else if (val >= values.last.value) { + i = values.length - 1; + } + + if (i != -1) { + onChanged(values[i]); + } + }, + label: selectedValue.text, + divisions: values.length, + ); + } +} diff --git a/lib/widgets/purchase_widget.dart b/lib/widgets/purchase_widget.dart index c8f5ad71..93ef6de0 100644 --- a/lib/widgets/purchase_widget.dart +++ b/lib/widgets/purchase_widget.dart @@ -7,6 +7,7 @@ import 'package:gitjournal/analytics.dart'; import 'package:gitjournal/.env.dart'; import 'package:gitjournal/iap.dart'; import 'package:gitjournal/settings.dart'; +import 'package:gitjournal/widgets/purchase_slider.dart'; import 'package:purchases_flutter/purchases_flutter.dart'; @@ -163,36 +164,30 @@ class _PurchaseWidgetState extends State { : buildBody(context); } + PaymentInfo _fromOffering(Offering o) { + var prod = o.monthly.product; + return PaymentInfo(prod.price, prod.priceString); + } + + Offering _fromPaymentInfo(PaymentInfo info) { + for (var o in _offerings) { + if (o.monthly.product.priceString == info.text) { + return o; + } + } + assert(false); + return null; + } + Widget buildBody(BuildContext context) { - var slider = Slider( - min: _offerings.first.monthly.product.price, - max: _offerings.last.monthly.product.price + 0.50, - value: _selectedOffering.monthly.product.price, - onChanged: (double val) { - int i = -1; - for (i = 1; i < _offerings.length; i++) { - var prev = _offerings[i - 1].monthly.product; - var cur = _offerings[i].monthly.product; - - if (prev.price < val && val <= cur.price) { - i--; - break; - } - } - if (val == _offerings.first.monthly.product.price) { - i = 0; - } else if (val >= _offerings.last.monthly.product.price) { - i = _offerings.length - 1; - } - - if (i != -1) { - setState(() { - _selectedOffering = _offerings[i]; - }); - } + var slider = PurchaseSlider( + values: _offerings.map(_fromOffering).toList(), + selectedValue: _fromOffering(_selectedOffering), + onChanged: (PaymentInfo info) { + setState(() { + _selectedOffering = _fromPaymentInfo(info); + }); }, - label: _selectedOffering.monthly.product.priceString, - divisions: _offerings.length, ); return Column(