import 'package:cake_wallet/core/selectable_option.dart'; import 'package:cake_wallet/src/screens/base_page.dart'; import 'package:cake_wallet/src/widgets/primary_button.dart'; import 'package:cake_wallet/src/widgets/provider_optoin_tile.dart'; import 'package:cake_wallet/src/widgets/scollable_with_bottom_section.dart'; import 'package:cake_wallet/themes/extensions/option_tile_theme.dart'; import 'package:cake_wallet/themes/extensions/transaction_trade_theme.dart'; import 'package:flutter/material.dart'; abstract class SelectOptionsPage extends BasePage { SelectOptionsPage(); String get pageTitle; EdgeInsets? get contentPadding; EdgeInsets? get tilePadding; EdgeInsets? get innerPadding; double? get imageHeight; double? get imageWidth; Color? get selectedBackgroundColor; double? get tileBorderRadius; String get bottomSectionText; bool get primaryButtonEnabled => true; String get primaryButtonText => ''; List<SelectableItem> get items; void Function(SelectableOption option)? get onOptionTap; void Function(BuildContext context)? get primaryButtonAction; @override String get title => pageTitle; @override Widget body(BuildContext context) { return ScrollableWithBottomSection( content: BodySelectOptionsPage( items: items, onOptionTap: onOptionTap, tilePadding: tilePadding, tileBorderRadius: tileBorderRadius, imageHeight: imageHeight, imageWidth: imageWidth, innerPadding: innerPadding), bottomSection: Padding( padding: contentPadding ?? EdgeInsets.zero, child: Column( children: [ Text( bottomSectionText, textAlign: TextAlign.center, style: TextStyle( fontSize: 14, fontWeight: FontWeight.normal, color: Theme.of(context).extension<TransactionTradeTheme>()!.detailsTitlesColor, ), ), if (primaryButtonEnabled) LoadingPrimaryButton( text: primaryButtonText, onPressed: () { primaryButtonAction != null ? primaryButtonAction!(context) : Navigator.pop(context); }, color: Theme.of(context).primaryColor, textColor: Colors.white, isDisabled: false, isLoading: false) ], ), ), ); } } class BodySelectOptionsPage extends StatefulWidget { const BodySelectOptionsPage({ required this.items, this.onOptionTap, this.tilePadding, this.tileBorderRadius, this.imageHeight, this.imageWidth, this.innerPadding, }); final List<SelectableItem> items; final void Function(SelectableOption option)? onOptionTap; final EdgeInsets? tilePadding; final double? tileBorderRadius; final double? imageHeight; final double? imageWidth; final EdgeInsets? innerPadding; @override _BodySelectOptionsPageState createState() => _BodySelectOptionsPageState(); } class _BodySelectOptionsPageState extends State<BodySelectOptionsPage> { late List<SelectableItem> _items; @override void initState() { super.initState(); _items = widget.items; } void _handleOptionTap(SelectableOption option) { setState(() { for (var item in _items) { if (item is SelectableOption) { item.isOptionSelected = false; } } option.isOptionSelected = true; }); widget.onOptionTap?.call(option); } @override Widget build(BuildContext context) { final isLightMode = Theme.of(context).extension<OptionTileTheme>()?.useDarkImage ?? false; Color titleColor = isLightMode ? Theme.of(context).appBarTheme.titleTextStyle!.color! : Colors.white; return Center( child: ConstrainedBox( constraints: const BoxConstraints(maxWidth: 350), child: Column( children: _items.map((item) { if (item is OptionTitle) { return Padding( padding: const EdgeInsets.only(top: 18, bottom: 8), child: Container( width: double.infinity, decoration: BoxDecoration( border: Border( bottom: BorderSide( color: titleColor, width: 1, ), ), ), child: Padding( padding: const EdgeInsets.only(bottom: 8.0), child: Text( item.title, style: TextStyle( fontSize: 18, fontWeight: FontWeight.w700, color: titleColor, ), ), ), ), ); } else if (item is SelectableOption) { return Padding( padding: widget.tilePadding ?? const EdgeInsets.only(top: 24), child: ProviderOptionTile( title: item.title, lightImagePath: item.lightIconPath, darkImagePath: item.darkIconPath, imageHeight: widget.imageHeight, imageWidth: widget.imageWidth, padding: widget.innerPadding, description: item.description, topLeftSubTitle: item.topLeftSubTitle, topRightSubTitle: item.topRightSubTitle, rightSubTitleLightIconPath: item.topRightSubTitleLightIconPath, rightSubTitleDarkIconPath: item.topRightSubTitleDarkIconPath, bottomLeftSubTitle: item.bottomLeftSubTitle, badges: item.badges, isSelected: item.isOptionSelected, borderRadius: widget.tileBorderRadius, isLightMode: isLightMode, onPressed: () => _handleOptionTap(item), ), ); } return const SizedBox.shrink(); }).toList(), ), ), ); } }