import 'package:aves/model/entry.dart'; import 'package:aves/model/selection.dart'; import 'package:aves/theme/durations.dart'; import 'package:aves/theme/icons.dart'; import 'package:aves/utils/constants.dart'; import 'package:aves/widgets/common/basic/text/animated_diff.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/common/identity/buttons/overlay_button.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; class SelectionButton extends StatelessWidget { final AvesEntry mainEntry; final Animation scale; static const double padding = 8; static const duration = Durations.thumbnailOverlayAnimation; const SelectionButton({ super.key, required this.mainEntry, required this.scale, }); @override Widget build(BuildContext context) { final l10n = context.l10n; final selection = context.read>(); return SafeArea( top: false, bottom: false, child: Padding( padding: const EdgeInsets.only(left: padding, right: padding, bottom: padding), child: Row( mainAxisSize: MainAxisSize.min, children: [ const Spacer(), ScalingOverlayTextButton( scale: scale, onPressed: () => selection.toggleSelection(mainEntry), child: Selector?, int>( selector: (context, selection) => selection?.selectedItems.length ?? 0, builder: (context, count, child) { return Row( mainAxisSize: MainAxisSize.min, children: [ AnimatedDiffText( count == 0 ? l10n.collectionSelectPageTitle : l10n.itemCount(count), duration: duration, ), const Padding( padding: EdgeInsets.symmetric(horizontal: 8), child: Text(Constants.separator), ), Selector, bool>( selector: (context, selection) => selection.isSelected({mainEntry}), builder: (context, isSelected, child) { return AnimatedSwitcher( duration: duration, switchInCurve: Curves.easeOutBack, switchOutCurve: Curves.easeOutBack, transitionBuilder: (child, animation) => ScaleTransition( scale: animation, child: child, ), child: Icon( isSelected ? AIcons.selected : AIcons.unselected, key: ValueKey(isSelected), ), ); }, ), ], ); }, ), ), ], ), ), ); } }