import 'dart:async'; import 'package:flutter/material.dart'; import 'package:mc_common_app/classes/app_state.dart'; import 'package:mc_common_app/config/routes.dart'; import 'package:mc_common_app/extensions/int_extensions.dart'; import 'package:mc_common_app/extensions/string_extensions.dart'; import 'package:mc_common_app/generated/locale_keys.g.dart'; import 'package:mc_common_app/models/general_models/m_response.dart'; import 'package:mc_common_app/models/subscriptions_models/subscription_model.dart'; import 'package:mc_common_app/theme/colors.dart'; import 'package:mc_common_app/utils/date_helper.dart'; import 'package:mc_common_app/utils/enums.dart'; import 'package:mc_common_app/utils/navigator.dart'; import 'package:mc_common_app/utils/utils.dart'; import 'package:mc_common_app/view_models/payment_view_model.dart'; import 'package:mc_common_app/view_models/subscriptions_view_model.dart'; import 'package:mc_common_app/views/payments/payment_methods_view.dart'; import 'package:mc_common_app/widgets/button/show_fill_button.dart'; import 'package:mc_common_app/widgets/extensions/extensions_widget.dart'; import 'package:provider/provider.dart'; import 'package:easy_localization/easy_localization.dart'; class UpgradePackageSheet extends StatefulWidget { Subscription subscription; bool isRenew; UpgradePackageSheet(this.subscription, this.isRenew, {super.key}); @override State createState() => _UpgradePackageSheetState(); } class _UpgradePackageSheetState extends State { bool isNowSelected = true; String price = "0"; @override void initState() { // TODO: implement initState super.initState(); scheduleMicrotask(() { calculateUpgradePrice(); }); } calculateUpgradePrice() { context.read().calculationUpgradePrice( AppState().getUser.data?.userInfo?.providerId.toString() ?? "", widget.subscription.id.toString(), ); } @override Widget build(BuildContext context) { return Container( width: double.infinity, padding: const EdgeInsets.only(left: 21, right: 21, bottom: 21, top: 4), child: Consumer(builder: (context, model, _) { if (model.state == ViewState.busy) { return SizedBox( width: double.infinity, height: MediaQuery.of(context).size.height / 2, child: const Center(child: CircularProgressIndicator()), ); } else { if (isNowSelected) { price = double.parse(model.newPrice).toStringAsFixed(2); } return Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start, children: [ (widget.isRenew ? LocaleKeys.whendoyouWanttoRenew.tr() : LocaleKeys.whendoyouWanttoUpgrade.tr()).toText( fontSize: 18, fontWeight: FontWeight.bold, ), 12.height, packageItem( LocaleKeys.nowVar.tr(), (LocaleKeys.yourSubscriptionUpgradeAffectingFrom.tr() + " ${DateHelper.formatAsLongDate(widget.subscription.dateEnd ?? DateTime.now())}"), double.parse(model.newPrice).toStringAsFixed(2), isNowSelected, ).onPress(() { setState(() { price = model.newPrice.toString(); isNowSelected = true; }); }), 6.height, packageItem( LocaleKeys.upgradeAfterCurrentExpiry.tr(), (LocaleKeys.yourSubscriptionUpgradeCurrentSubscriptionAffectingFrom.tr() + " ${DateHelper.formatAsLongDate(widget.subscription.dateEnd ?? DateTime.now())}"), widget.subscription.price.toString(), isNowSelected ? false : true, ).onPress(() { price = widget.subscription.price.toString(); setState(() { isNowSelected = false; }); }), 12.height, ShowFillButton( title: widget.isRenew ? LocaleKeys.renewVar.tr() : LocaleKeys.upgradeVar.tr(), maxWidth: double.infinity, onPressed: () async { if (widget.isRenew) { Utils.showLoading(context); MResponse response = await model.createSubscriptionOrder(widget.subscription.id ?? 0, true, true); Utils.hideLoading(context); if (response.data != null) { context.read().updateOrderProviderSubscriptionId(id: response.data ?? 0); navigateWithName(context, AppRoutes.paymentMethodsView, arguments: PaymentTypes.subscription); } } else { navigateTo( context, PaymentMethodsView( paymentType: PaymentTypes.subscription, onTempContinue: () async { Utils.showLoading(context); MResponse mResponse = await model.payForSubscription(widget.subscription.id!, isNowSelected, false, price); Utils.hideLoading(context); if (mResponse.messageStatus == 1) { context.read().updateOrderProviderSubscriptionId(id: mResponse.data); // Utils.showToast( // "Subscriptions is successfully updated"); return true; } else { Utils.showToast(mResponse.message.toString()); return false; } }, ), ); } }, ), ], ); } }), ); } Widget packageItem(String title, String description, String price, bool isSelected) { return Row( crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start, children: [ const Icon( Icons.done, size: 14, color: Colors.white, ).toContainer( isEnabledBorder: true, backgroundColor: isSelected ? MyColors.primaryColor : Colors.transparent, borderColor: MyColors.primaryColor, borderWidget: 1, borderRadius: 0, paddingAll: 2, ), 12.width, Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start, children: [ title.toText( fontSize: 16, fontWeight: FontWeight.bold, ), 4.height, if (widget.subscription.dateEnd != null) description.toText( fontSize: 12, color: MyColors.lightTextColor, ), 10.height, Row( crossAxisAlignment: CrossAxisAlignment.end, children: [ price.toText(fontSize: 24, isBold: true), 2.width, Padding( padding: const EdgeInsets.only(bottom: 2), child: LocaleKeys.sar.tr().toText(fontSize: 16, isBold: true, color: MyColors.lightTextColor), ), ], ) ], ), ), ], ).toContainer( isShadowEnabled: true, paddingAll: 16, borderRadius: 0, borderColor: isSelected ? MyColors.primaryColor : Colors.transparent, isEnabledBorder: true, borderWidget: 2, ); } }