633 lines
		
	
	
		
			24 KiB
		
	
	
	
		
			Dart
		
	
	
			
		
		
	
	
			633 lines
		
	
	
		
			24 KiB
		
	
	
	
		
			Dart
		
	
	
import 'package:auto_size_text/auto_size_text.dart';
 | 
						|
import 'package:design/design.dart';
 | 
						|
import 'package:flutter/material.dart';
 | 
						|
import 'package:guru_app/financial/iap/iap_model.dart';
 | 
						|
import 'package:guru_ui/pages/subscription/subscription_page.dart';
 | 
						|
import 'package:guru_ui/widget/image/adaptive_image.dart';
 | 
						|
import 'package:guru_widgets/button/single_tap_widget.dart';
 | 
						|
import 'package:guru_widgets/theme/guru_theme.dart';
 | 
						|
 | 
						|
part 'subscription_card.g.dart';
 | 
						|
 | 
						|
@DesignSpec(width: 242, height: 320, nestedSpec: true)
 | 
						|
abstract class SubscriptionMainCardDesignSpec implements BasicDesignSpec {
 | 
						|
  @SpecSize(SpecWidth(242), SpecHeight(58))
 | 
						|
  Size get decorationSize;
 | 
						|
 | 
						|
  @SpecRadius.only(topStart: SpecHeight(24), topEnd: SpecHeight(24))
 | 
						|
  BorderRadiusDirectional get premiumCenterCardDecorationRadius;
 | 
						|
 | 
						|
  @SpecAbsoluteFontSize(22)
 | 
						|
  double get decorationFontSize;
 | 
						|
 | 
						|
  @SpecHeight(4)
 | 
						|
  double get cardBorderWidth;
 | 
						|
 | 
						|
  @SpecRadius.circular(SpecHeight(24))
 | 
						|
  BorderRadiusDirectional get cardRadius;
 | 
						|
 | 
						|
  @SpecEdgeInsets.only(
 | 
						|
      top: SpecHeight(40), start: SpecWidth(16), end: SpecWidth(16))
 | 
						|
  EdgeInsetsDirectional get titleMargin;
 | 
						|
 | 
						|
  @SpecAbsoluteFontSize(38)
 | 
						|
  double get titleFontSize;
 | 
						|
 | 
						|
  @SpecEdgeInsets.only(
 | 
						|
      top: SpecHeight(10), start: SpecWidth(16), end: SpecWidth(16))
 | 
						|
  EdgeInsetsDirectional get subTitleMargin;
 | 
						|
 | 
						|
  @SpecAbsoluteFontSize(20)
 | 
						|
  double get subTitleFontSize;
 | 
						|
 | 
						|
  @SpecEdgeInsets.only(
 | 
						|
      bottom: SpecHeight(6), start: SpecWidth(16), end: SpecWidth(16))
 | 
						|
  EdgeInsetsDirectional get thenMargin;
 | 
						|
 | 
						|
  @SpecAbsoluteFontSize(20)
 | 
						|
  double get thenFontSize;
 | 
						|
 | 
						|
  @SpecEdgeInsets.only(
 | 
						|
      bottom: SpecHeight(32), start: SpecWidth(16), end: SpecWidth(16))
 | 
						|
  EdgeInsetsDirectional get priceMargin;
 | 
						|
 | 
						|
  @SpecAbsoluteFontSize(24)
 | 
						|
  double get priceFontSize;
 | 
						|
 | 
						|
  @SpecHeight(-30)
 | 
						|
  double get cardLabelTopSpcing;
 | 
						|
 | 
						|
  @SpecHeight(-20)
 | 
						|
  double get cardLabelRightSpcing;
 | 
						|
 | 
						|
  @SpecHeight(112)
 | 
						|
  double get cardLabelSize;
 | 
						|
 | 
						|
  static SubscriptionMainCardDesignSpec create(Size size,
 | 
						|
          {Offset offset = Offset.zero}) =>
 | 
						|
      _SubscriptionMainCardDesignSpec.from(size, offset: offset);
 | 
						|
}
 | 
						|
 | 
						|
@DesignSpec(width: 206, height: 268, nestedSpec: true)
 | 
						|
abstract class SubscriptionEdgeCardDesignSpec implements BasicDesignSpec {
 | 
						|
  @SpecHeight(4)
 | 
						|
  double get cardBorderWidth;
 | 
						|
 | 
						|
  @SpecRadius.circular(SpecHeight(24))
 | 
						|
  BorderRadiusDirectional get cardRadius;
 | 
						|
 | 
						|
  @SpecEdgeInsets.only(
 | 
						|
      top: SpecHeight(40), start: SpecWidth(16), end: SpecWidth(16))
 | 
						|
  EdgeInsetsDirectional get titleMargin;
 | 
						|
 | 
						|
  @SpecAbsoluteFontSize(32)
 | 
						|
  double get titleFontSize;
 | 
						|
 | 
						|
  @SpecEdgeInsets.only(
 | 
						|
      top: SpecHeight(10), start: SpecWidth(16), end: SpecWidth(16))
 | 
						|
  EdgeInsetsDirectional get subTitleMargin;
 | 
						|
 | 
						|
  @SpecAbsoluteFontSize(20)
 | 
						|
  double get subTitleFontSize;
 | 
						|
 | 
						|
  @SpecEdgeInsets.only(
 | 
						|
      bottom: SpecHeight(4), start: SpecWidth(16), end: SpecWidth(16))
 | 
						|
  EdgeInsetsDirectional get thenMargin;
 | 
						|
 | 
						|
  @SpecAbsoluteFontSize(17)
 | 
						|
  double get thenFontSize;
 | 
						|
 | 
						|
  @SpecEdgeInsets.only(
 | 
						|
      bottom: SpecHeight(32), start: SpecWidth(16), end: SpecWidth(16))
 | 
						|
  EdgeInsetsDirectional get priceMargin;
 | 
						|
 | 
						|
  @SpecAbsoluteFontSize(24)
 | 
						|
  double get priceFontSize;
 | 
						|
 | 
						|
  @SpecHeight(-30)
 | 
						|
  double get cardLabelTopSpcing;
 | 
						|
 | 
						|
  @SpecHeight(-20)
 | 
						|
  double get cardLabelRightSpcing;
 | 
						|
 | 
						|
  @SpecHeight(112)
 | 
						|
  double get cardLabelSize;
 | 
						|
 | 
						|
  static SubscriptionEdgeCardDesignSpec create(Size size,
 | 
						|
          {Offset offset = Offset.zero}) =>
 | 
						|
      _SubscriptionEdgeCardDesignSpec.from(size, offset: offset);
 | 
						|
}
 | 
						|
 | 
						|
@DesignSpec(width: 650, height: 124, nestedSpec: true)
 | 
						|
abstract class SubscriptionListCardDesignSpec implements BasicDesignSpec {
 | 
						|
  @SpecRadius.circular(SpecHeight(24))
 | 
						|
  BorderRadiusDirectional get cardRadius;
 | 
						|
 | 
						|
  @SpecEdgeInsets.only(start: SpecWidth(40), end: SpecWidth(40))
 | 
						|
  EdgeInsetsDirectional get cardPadding;
 | 
						|
 | 
						|
  @SpecAbsoluteFontSize(32)
 | 
						|
  double get titleFontSize;
 | 
						|
 | 
						|
  @SpecEdgeInsets.only(top: SpecWidth(10))
 | 
						|
  EdgeInsetsDirectional get subTitleMargin;
 | 
						|
 | 
						|
  @SpecAbsoluteFontSize(22)
 | 
						|
  double get subTitleFontSize;
 | 
						|
 | 
						|
  @SpecAbsoluteFontSize(26)
 | 
						|
  double get priceFontSize;
 | 
						|
 | 
						|
  @SpecHeight(-12)
 | 
						|
  double get cardLabelTopSpcing;
 | 
						|
 | 
						|
  @SpecHeight(20)
 | 
						|
  double get cardLabelRightSpcing;
 | 
						|
 | 
						|
  @SpecSize(SpecWidth(126), SpecHeight(36))
 | 
						|
  Size get cardLabelSize;
 | 
						|
 | 
						|
  static SubscriptionListCardDesignSpec create(Size size,
 | 
						|
          {Offset offset = Offset.zero}) =>
 | 
						|
      _SubscriptionListCardDesignSpec.from(size, offset: offset);
 | 
						|
}
 | 
						|
 | 
						|
class SubscriptionMainCardModel {
 | 
						|
  final IapProduct? product;
 | 
						|
  final SubscriptionCardItem cardItem;
 | 
						|
  final SubscriptionTheme subscriptionTheme;
 | 
						|
  final GuruColorScheme? colorScheme;
 | 
						|
  final SubscriptionMainCardDesignSpec designSpec;
 | 
						|
  final VoidCallback onTap;
 | 
						|
  final bool selected;
 | 
						|
 | 
						|
  SubscriptionMainCardModel(
 | 
						|
      {required this.product,
 | 
						|
      required this.cardItem,
 | 
						|
      required this.subscriptionTheme,
 | 
						|
      this.colorScheme,
 | 
						|
      required this.designSpec,
 | 
						|
      required this.onTap,
 | 
						|
      this.selected = false});
 | 
						|
}
 | 
						|
 | 
						|
class SubscriptionMainCard extends StatelessWidget {
 | 
						|
  final SubscriptionMainCardModel model;
 | 
						|
 | 
						|
  IapProduct? get product => model.product;
 | 
						|
 | 
						|
  SubscriptionCardItem get cardItem => model.cardItem;
 | 
						|
 | 
						|
  SubscriptionTheme get subscriptionTheme => model.subscriptionTheme;
 | 
						|
 | 
						|
  GuruColorScheme? get colorScheme => model.colorScheme;
 | 
						|
 | 
						|
  SubscriptionMainCardDesignSpec get designSpec => model.designSpec;
 | 
						|
 | 
						|
  bool get selected => model.selected;
 | 
						|
 | 
						|
  const SubscriptionMainCard({Key? key, required this.model}) : super(key: key);
 | 
						|
 | 
						|
  @override
 | 
						|
  Widget build(BuildContext context) {
 | 
						|
    final activeTheme = subscriptionTheme.activeCardStyle;
 | 
						|
    final defaultTheme = subscriptionTheme.cardStyle;
 | 
						|
    final activeDecoration = activeTheme?.decoration ??
 | 
						|
        BoxDecoration(
 | 
						|
          color: colorScheme?.primaryContentColor,
 | 
						|
          borderRadius: designSpec.cardRadius,
 | 
						|
          border: Border.all(
 | 
						|
            color: colorScheme?.primaryColor ?? const Color(0xFF07B25E),
 | 
						|
            width: designSpec.cardBorderWidth,
 | 
						|
            strokeAlign: BorderSide.strokeAlignCenter, //StrokeAlign.inside,
 | 
						|
          ),
 | 
						|
        );
 | 
						|
    final defaultDecoration = defaultTheme?.decoration ??
 | 
						|
        BoxDecoration(
 | 
						|
            color: colorScheme?.primaryContentColor,
 | 
						|
            borderRadius: designSpec.cardRadius);
 | 
						|
 | 
						|
    final decoration = selected ? activeDecoration : defaultDecoration;
 | 
						|
 | 
						|
    return TapWidget(
 | 
						|
        onTap: () {
 | 
						|
          model.onTap();
 | 
						|
        },
 | 
						|
        child: Container(
 | 
						|
            decoration: decoration,
 | 
						|
            width: designSpec.measuredSize.width,
 | 
						|
            height: designSpec.measuredSize.height,
 | 
						|
            child: Stack(clipBehavior: Clip.none, children: [
 | 
						|
              Column(
 | 
						|
                crossAxisAlignment: CrossAxisAlignment.center,
 | 
						|
                mainAxisAlignment: MainAxisAlignment.spaceBetween,
 | 
						|
                children: [
 | 
						|
                  Column(
 | 
						|
                    mainAxisSize: MainAxisSize.min,
 | 
						|
                    crossAxisAlignment: CrossAxisAlignment.center,
 | 
						|
                    children: [
 | 
						|
                      if (cardItem.labelText != null)
 | 
						|
                        Container(
 | 
						|
                          width: designSpec.decorationSize.width,
 | 
						|
                          height: designSpec.decorationSize.height,
 | 
						|
                          decoration: BoxDecoration(
 | 
						|
                            borderRadius:
 | 
						|
                                designSpec.premiumCenterCardDecorationRadius,
 | 
						|
                            color: selected
 | 
						|
                                ? const Color(0xFF07B25E)
 | 
						|
                                : const Color(0x12FFFFFF),
 | 
						|
                          ),
 | 
						|
                          alignment: Alignment.center,
 | 
						|
                          padding: EdgeInsetsDirectional.only(
 | 
						|
                              top: designSpec.cardBorderWidth),
 | 
						|
                          child: AutoSizeText(
 | 
						|
                            cardItem.labelText!,
 | 
						|
                            stepGranularity: 0.1,
 | 
						|
                            minFontSize: 5,
 | 
						|
                            maxLines: 1,
 | 
						|
                            style: TextStyle(
 | 
						|
                              color: selected
 | 
						|
                                  ? Colors.white
 | 
						|
                                  : const Color(0x4DFFFFFF),
 | 
						|
                              fontSize: designSpec.decorationFontSize,
 | 
						|
                              fontWeight: GuruTheme.fwSemiBold,
 | 
						|
                            ),
 | 
						|
                          ),
 | 
						|
                        ),
 | 
						|
                      Padding(
 | 
						|
                        padding: designSpec.titleMargin,
 | 
						|
                        child: AutoSizeText(
 | 
						|
                          cardItem.title,
 | 
						|
                          maxLines: 2,
 | 
						|
                          minFontSize: 5,
 | 
						|
                          textAlign: TextAlign.center,
 | 
						|
                          style: TextStyle(
 | 
						|
                              height: 1.236,
 | 
						|
                              color: selected
 | 
						|
                                  ? (activeTheme?.cardTitleColor ??
 | 
						|
                                      Colors.white)
 | 
						|
                                  : (defaultTheme?.cardTitleColor ??
 | 
						|
                                      const Color(0xE6FFFFFF)),
 | 
						|
                              fontSize: designSpec.titleFontSize,
 | 
						|
                              fontWeight: GuruTheme.fwBold),
 | 
						|
                        ),
 | 
						|
                      ),
 | 
						|
                    ],
 | 
						|
                  ),
 | 
						|
                  Column(
 | 
						|
                      mainAxisSize: MainAxisSize.min,
 | 
						|
                      crossAxisAlignment: CrossAxisAlignment.center,
 | 
						|
                      children: [
 | 
						|
                        if (cardItem.thenTexg != null)
 | 
						|
                          Padding(
 | 
						|
                            padding: designSpec.thenMargin,
 | 
						|
                            child: Text(
 | 
						|
                              cardItem.thenTexg!,
 | 
						|
                              style: TextStyle(
 | 
						|
                                height: 1.25,
 | 
						|
                                color: selected
 | 
						|
                                    ? (activeTheme?.cardSubTitleColor ??
 | 
						|
                                        const Color(0xE6FFFFFF))
 | 
						|
                                    : (defaultTheme?.cardSubTitleColor ??
 | 
						|
                                        const Color(0xB3FFFFFF)),
 | 
						|
                                fontSize: designSpec.thenFontSize,
 | 
						|
                                fontWeight: GuruTheme.fwMedium,
 | 
						|
                              ),
 | 
						|
                            ),
 | 
						|
                          ),
 | 
						|
                        Padding(
 | 
						|
                          padding: designSpec.priceMargin,
 | 
						|
                          child: AutoSizeText(
 | 
						|
                            product?.details.price ?? "?",
 | 
						|
                            minFontSize: 5,
 | 
						|
                            style: TextStyle(
 | 
						|
                              height: 1.25,
 | 
						|
                              color: selected
 | 
						|
                                  ? (activeTheme?.cardPriceColor ??
 | 
						|
                                      const Color(0xE6FFFFFF))
 | 
						|
                                  : (defaultTheme?.cardPriceColor ??
 | 
						|
                                      const Color(0xB3FFFFFF)),
 | 
						|
                              fontSize: designSpec.priceFontSize,
 | 
						|
                              fontWeight: GuruTheme.fwSemiBold,
 | 
						|
                            ),
 | 
						|
                          ),
 | 
						|
                        ),
 | 
						|
                      ])
 | 
						|
                ],
 | 
						|
              ),
 | 
						|
              if (cardItem.labelImage != null)
 | 
						|
                Positioned.directional(
 | 
						|
                    textDirection: Directionality.of(context),
 | 
						|
                    top: designSpec.cardLabelTopSpcing,
 | 
						|
                    end: designSpec.cardLabelRightSpcing,
 | 
						|
                    child: AdaptiveImage(cardItem.labelImage!,
 | 
						|
                        height: designSpec.cardLabelSize))
 | 
						|
            ])));
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
class SubscriptionEdgeCardModel {
 | 
						|
  final IapProduct? product;
 | 
						|
  final SubscriptionCardItem cardItem;
 | 
						|
  final SubscriptionTheme subscriptionTheme;
 | 
						|
  final GuruColorScheme? colorScheme;
 | 
						|
  final SubscriptionEdgeCardDesignSpec designSpec;
 | 
						|
  final VoidCallback onTap;
 | 
						|
  final bool selected;
 | 
						|
 | 
						|
  SubscriptionEdgeCardModel(
 | 
						|
      {required this.product,
 | 
						|
      required this.cardItem,
 | 
						|
      required this.subscriptionTheme,
 | 
						|
      this.colorScheme,
 | 
						|
      required this.designSpec,
 | 
						|
      required this.onTap,
 | 
						|
      this.selected = false});
 | 
						|
}
 | 
						|
 | 
						|
class SubscriptionEdgeCard extends StatelessWidget {
 | 
						|
  final SubscriptionEdgeCardModel model;
 | 
						|
 | 
						|
  IapProduct? get product => model.product;
 | 
						|
 | 
						|
  SubscriptionCardItem get cardItem => model.cardItem;
 | 
						|
 | 
						|
  SubscriptionTheme get subscriptionTheme => model.subscriptionTheme;
 | 
						|
 | 
						|
  GuruColorScheme? get colorScheme => model.colorScheme;
 | 
						|
 | 
						|
  SubscriptionEdgeCardDesignSpec get designSpec => model.designSpec;
 | 
						|
 | 
						|
  bool get selected => model.selected;
 | 
						|
 | 
						|
  const SubscriptionEdgeCard({Key? key, required this.model}) : super(key: key);
 | 
						|
 | 
						|
  @override
 | 
						|
  Widget build(BuildContext context) {
 | 
						|
    final activeTheme = subscriptionTheme.activeCardStyle;
 | 
						|
    final defaultTheme = subscriptionTheme.cardStyle;
 | 
						|
    final activeDecoration = activeTheme?.decoration ??
 | 
						|
        BoxDecoration(
 | 
						|
          color: colorScheme?.primaryContentColor,
 | 
						|
          borderRadius: designSpec.cardRadius,
 | 
						|
          border: Border.all(
 | 
						|
            color: colorScheme?.primaryColor ?? const Color(0xFF07B25E),
 | 
						|
            width: designSpec.cardBorderWidth,
 | 
						|
            strokeAlign: BorderSide.strokeAlignInside, //StrokeAlign.inside,
 | 
						|
          ),
 | 
						|
        );
 | 
						|
    final defaultDecoration = defaultTheme?.decoration ??
 | 
						|
        BoxDecoration(
 | 
						|
            color: colorScheme?.primaryContentColor ?? const Color(0xff252525),
 | 
						|
            borderRadius: designSpec.cardRadius);
 | 
						|
 | 
						|
    final decoration = selected ? activeDecoration : defaultDecoration;
 | 
						|
 | 
						|
    return TapWidget(
 | 
						|
        onTap: () {
 | 
						|
          model.onTap();
 | 
						|
        },
 | 
						|
        child: Container(
 | 
						|
            decoration: decoration,
 | 
						|
            width: designSpec.measuredSize.width,
 | 
						|
            height: designSpec.measuredSize.height,
 | 
						|
            child:
 | 
						|
                Stack(fit: StackFit.expand, clipBehavior: Clip.none, children: [
 | 
						|
              Column(
 | 
						|
                crossAxisAlignment: CrossAxisAlignment.center,
 | 
						|
                mainAxisAlignment: MainAxisAlignment.spaceBetween,
 | 
						|
                children: [
 | 
						|
                  Column(
 | 
						|
                    mainAxisSize: MainAxisSize.min,
 | 
						|
                    crossAxisAlignment: CrossAxisAlignment.center,
 | 
						|
                    children: [
 | 
						|
                      Padding(
 | 
						|
                        padding: designSpec.titleMargin,
 | 
						|
                        child: AutoSizeText(
 | 
						|
                          cardItem.title,
 | 
						|
                          maxLines: 2,
 | 
						|
                          minFontSize: 5,
 | 
						|
                          textAlign: TextAlign.center,
 | 
						|
                          style: TextStyle(
 | 
						|
                              height: 1.25,
 | 
						|
                              color: selected
 | 
						|
                                  ? (activeTheme?.cardTitleColor ??
 | 
						|
                                      Colors.white)
 | 
						|
                                  : (defaultTheme?.cardTitleColor ??
 | 
						|
                                      const Color(0xE6FFFFFF)),
 | 
						|
                              fontSize: designSpec.titleFontSize,
 | 
						|
                              fontWeight: GuruTheme.fwBold),
 | 
						|
                        ),
 | 
						|
                      ),
 | 
						|
                      if (cardItem.subTitle != null)
 | 
						|
                        Padding(
 | 
						|
                          padding: designSpec.subTitleMargin,
 | 
						|
                          child: Text(
 | 
						|
                            cardItem.subTitle!,
 | 
						|
                            maxLines: 2,
 | 
						|
                            textAlign: TextAlign.center,
 | 
						|
                            style: TextStyle(
 | 
						|
                                height: 1.25,
 | 
						|
                                color: selected
 | 
						|
                                    ? (activeTheme?.cardSubTitleColor ??
 | 
						|
                                        const Color(0xE6FFFFFF))
 | 
						|
                                    : (defaultTheme?.cardSubTitleColor ??
 | 
						|
                                        const Color(0xB3FFFFFF)),
 | 
						|
                                fontSize: designSpec.subTitleFontSize,
 | 
						|
                                fontWeight: GuruTheme.fwMedium),
 | 
						|
                          ),
 | 
						|
                        ),
 | 
						|
                    ],
 | 
						|
                  ),
 | 
						|
                  Column(
 | 
						|
                      mainAxisSize: MainAxisSize.min,
 | 
						|
                      crossAxisAlignment: CrossAxisAlignment.center,
 | 
						|
                      children: [
 | 
						|
                        if (cardItem.thenTexg != null)
 | 
						|
                          Padding(
 | 
						|
                            padding: designSpec.thenMargin,
 | 
						|
                            child: Text(
 | 
						|
                              cardItem.thenTexg!,
 | 
						|
                              style: TextStyle(
 | 
						|
                                height: 1.29,
 | 
						|
                                color: selected
 | 
						|
                                    ? const Color(0xE6FFFFFF)
 | 
						|
                                    : const Color(0xB3FFFFFF),
 | 
						|
                                fontSize: designSpec.thenFontSize,
 | 
						|
                                fontWeight: GuruTheme.fwMedium,
 | 
						|
                              ),
 | 
						|
                            ),
 | 
						|
                          ),
 | 
						|
                        Padding(
 | 
						|
                          padding: designSpec.priceMargin,
 | 
						|
                          child: AutoSizeText(
 | 
						|
                            product?.details.price ?? "?",
 | 
						|
                            minFontSize: 5,
 | 
						|
                            maxLines: 1,
 | 
						|
                            style: TextStyle(
 | 
						|
                              height: 1.25,
 | 
						|
                              color: selected
 | 
						|
                                  ? (activeTheme?.cardPriceColor ??
 | 
						|
                                      const Color(0xE6FFFFFF))
 | 
						|
                                  : (defaultTheme?.cardPriceColor ??
 | 
						|
                                      const Color(0xB3FFFFFF)),
 | 
						|
                              fontSize: designSpec.priceFontSize,
 | 
						|
                              fontWeight: GuruTheme.fwSemiBold,
 | 
						|
                            ),
 | 
						|
                          ),
 | 
						|
                        ),
 | 
						|
                      ])
 | 
						|
                ],
 | 
						|
              ),
 | 
						|
              if (cardItem.labelImage != null)
 | 
						|
                Positioned.directional(
 | 
						|
                    textDirection: Directionality.of(context),
 | 
						|
                    top: designSpec.cardLabelTopSpcing,
 | 
						|
                    end: designSpec.cardLabelRightSpcing,
 | 
						|
                    child: AdaptiveImage(cardItem.labelImage!,
 | 
						|
                        height: designSpec.cardLabelSize))
 | 
						|
            ])));
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
class SubscriptionListCardModel {
 | 
						|
  final IapProduct? product;
 | 
						|
  final SubscriptionCardItem cardItem;
 | 
						|
  final SubscriptionTheme subscriptionTheme;
 | 
						|
  final GuruColorScheme? colorScheme;
 | 
						|
  final SubscriptionListCardDesignSpec designSpec;
 | 
						|
  final VoidCallback onTap;
 | 
						|
  final bool selected;
 | 
						|
 | 
						|
  SubscriptionListCardModel(
 | 
						|
      {required this.product,
 | 
						|
      required this.cardItem,
 | 
						|
      required this.subscriptionTheme,
 | 
						|
      this.colorScheme,
 | 
						|
      required this.designSpec,
 | 
						|
      required this.onTap,
 | 
						|
      this.selected = false});
 | 
						|
}
 | 
						|
 | 
						|
class SubscriptionListCard extends StatelessWidget {
 | 
						|
  final SubscriptionListCardModel model;
 | 
						|
 | 
						|
  IapProduct? get product => model.product;
 | 
						|
 | 
						|
  SubscriptionCardItem get cardItem => model.cardItem;
 | 
						|
 | 
						|
  SubscriptionTheme get subscriptionTheme => model.subscriptionTheme;
 | 
						|
 | 
						|
  GuruColorScheme? get colorScheme => model.colorScheme;
 | 
						|
 | 
						|
  SubscriptionListCardDesignSpec get designSpec => model.designSpec;
 | 
						|
 | 
						|
  bool get selected => model.selected;
 | 
						|
 | 
						|
  const SubscriptionListCard({Key? key, required this.model}) : super(key: key);
 | 
						|
 | 
						|
  @override
 | 
						|
  Widget build(BuildContext context) {
 | 
						|
    final activeTheme = subscriptionTheme.activeCardStyle;
 | 
						|
    final defaultTheme = subscriptionTheme.cardStyle;
 | 
						|
    final activeDecoration = activeTheme?.decoration ??
 | 
						|
        BoxDecoration(
 | 
						|
          color: colorScheme?.primaryContentColor,
 | 
						|
          borderRadius: designSpec.cardRadius,
 | 
						|
          border: Border.all(
 | 
						|
            color: colorScheme?.primaryColor ?? const Color(0xFF07B25E),
 | 
						|
            width: 2,
 | 
						|
            strokeAlign: BorderSide.strokeAlignInside, //StrokeAlign.inside,
 | 
						|
          ),
 | 
						|
        );
 | 
						|
    final defaultDecoration = defaultTheme?.decoration ??
 | 
						|
        BoxDecoration(
 | 
						|
            color: colorScheme?.primaryContentColor ?? const Color(0xff252525),
 | 
						|
            borderRadius: designSpec.cardRadius);
 | 
						|
 | 
						|
    final decoration = selected ? activeDecoration : defaultDecoration;
 | 
						|
 | 
						|
    return TapWidget(
 | 
						|
        onTap: () {
 | 
						|
          model.onTap();
 | 
						|
        },
 | 
						|
        child: Container(
 | 
						|
            decoration: decoration,
 | 
						|
            width: designSpec.measuredSize.width,
 | 
						|
            height: designSpec.measuredSize.height,
 | 
						|
            child:
 | 
						|
                Stack(fit: StackFit.expand, clipBehavior: Clip.none, children: [
 | 
						|
              Padding(
 | 
						|
                padding: designSpec.cardPadding,
 | 
						|
                child: Row(
 | 
						|
                  mainAxisAlignment: MainAxisAlignment.spaceBetween,
 | 
						|
                  children: [
 | 
						|
                    Column(
 | 
						|
                      mainAxisSize: MainAxisSize.min,
 | 
						|
                      crossAxisAlignment: CrossAxisAlignment.start,
 | 
						|
                      children: [
 | 
						|
                        AutoSizeText(
 | 
						|
                          cardItem.title,
 | 
						|
                          maxLines: 1,
 | 
						|
                          minFontSize: 5,
 | 
						|
                          textAlign: TextAlign.center,
 | 
						|
                          style: TextStyle(
 | 
						|
                              height: 1.25,
 | 
						|
                              color: selected
 | 
						|
                                  ? (activeTheme?.cardTitleColor ??
 | 
						|
                                      Colors.white)
 | 
						|
                                  : (defaultTheme?.cardTitleColor ??
 | 
						|
                                      const Color(0xE6FFFFFF)),
 | 
						|
                              fontSize: designSpec.titleFontSize,
 | 
						|
                              fontWeight: GuruTheme.fwBold),
 | 
						|
                        ),
 | 
						|
                        if (cardItem.subTitle != null)
 | 
						|
                          Padding(
 | 
						|
                            padding: designSpec.subTitleMargin,
 | 
						|
                            child: Text(
 | 
						|
                              cardItem.subTitle!,
 | 
						|
                              maxLines: 2,
 | 
						|
                              textAlign: TextAlign.center,
 | 
						|
                              style: TextStyle(
 | 
						|
                                  height: 1.25,
 | 
						|
                                  color: selected
 | 
						|
                                      ? (activeTheme?.cardSubTitleColor ??
 | 
						|
                                          const Color(0xE6FFFFFF))
 | 
						|
                                      : (defaultTheme?.cardSubTitleColor ??
 | 
						|
                                          const Color(0xB3FFFFFF)),
 | 
						|
                                  fontSize: designSpec.subTitleFontSize,
 | 
						|
                                  fontWeight: GuruTheme.fwMedium),
 | 
						|
                            ),
 | 
						|
                          ),
 | 
						|
                      ],
 | 
						|
                    ),
 | 
						|
                    Text(
 | 
						|
                      product?.details.price ?? "?",
 | 
						|
                      style: TextStyle(
 | 
						|
                        height: 1.25,
 | 
						|
                        color: selected
 | 
						|
                            ? (activeTheme?.cardPriceColor ??
 | 
						|
                                const Color(0xE6FFFFFF))
 | 
						|
                            : (defaultTheme?.cardPriceColor ??
 | 
						|
                                const Color(0xB3FFFFFF)),
 | 
						|
                        fontSize: designSpec.priceFontSize,
 | 
						|
                        fontWeight: GuruTheme.fwSemiBold,
 | 
						|
                      ),
 | 
						|
                    ),
 | 
						|
                  ],
 | 
						|
                ),
 | 
						|
              ),
 | 
						|
              if (cardItem.labelImage != null)
 | 
						|
                Positioned.directional(
 | 
						|
                    textDirection: Directionality.of(context),
 | 
						|
                    top: designSpec.cardLabelTopSpcing,
 | 
						|
                    end: designSpec.cardLabelRightSpcing,
 | 
						|
                    child: AdaptiveImage(
 | 
						|
                      cardItem.labelImage!,
 | 
						|
                      height: designSpec.cardLabelSize.height,
 | 
						|
                      width: designSpec.cardLabelSize.width,
 | 
						|
                    ))
 | 
						|
            ])));
 | 
						|
  }
 | 
						|
}
 |