import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:stackwallet/providers/desktop/current_desktop_menu_item.dart'; import 'package:stackwallet/utilities/text_styles.dart'; import 'package:stackwallet/utilities/theme/stack_colors.dart'; class DMIController { VoidCallback? toggle; void dispose() { toggle = null; } } class DesktopMenuItem extends ConsumerStatefulWidget { const DesktopMenuItem({ Key? key, required this.icon, required this.label, required this.value, required this.onChanged, required this.duration, this.labelLength = 125, this.controller, }) : super(key: key); final Widget icon; final String label; final T value; final void Function(T) onChanged; final Duration duration; final double labelLength; final DMIController? controller; @override ConsumerState> createState() => _DesktopMenuItemState(); } class _DesktopMenuItemState extends ConsumerState> with SingleTickerProviderStateMixin { late final Widget icon; late final String label; late final T value; late final void Function(T) onChanged; late final Duration duration; late final double labelLength; late final DMIController? controller; late final AnimationController animationController; bool _iconOnly = false; void toggle() { setState(() { _iconOnly = !_iconOnly; }); if (_iconOnly) { animationController.reverse(); } else { animationController.forward(); } } @override void initState() { icon = widget.icon; label = widget.label; value = widget.value; onChanged = widget.onChanged; duration = widget.duration; labelLength = widget.labelLength; controller = widget.controller; controller?.toggle = toggle; animationController = AnimationController( vsync: this, duration: duration, )..forward(); super.initState(); } @override void dispose() { controller?.dispose(); animationController.dispose(); super.dispose(); } @override Widget build(BuildContext context) { final group = ref.watch(currentDesktopMenuItemProvider.state).state; debugPrint("============ value:$value ============ group:$group"); return TextButton( style: value == group ? Theme.of(context) .extension()! .getDesktopMenuButtonColorSelected(context) : Theme.of(context) .extension()! .getDesktopMenuButtonColor(context), onPressed: () { onChanged(value); }, child: Padding( padding: const EdgeInsets.symmetric( vertical: 16, ), child: Row( mainAxisAlignment: MainAxisAlignment.center, children: [ AnimatedContainer( duration: duration, width: _iconOnly ? 0 : 16, ), icon, AnimatedOpacity( duration: duration, opacity: _iconOnly ? 0 : 1.0, child: SizeTransition( sizeFactor: animationController, axis: Axis.horizontal, axisAlignment: -1, child: SizedBox( width: labelLength, child: Row( children: [ const SizedBox( width: 12, ), Text( label, style: value == group ? STextStyles.desktopMenuItemSelected(context) : STextStyles.desktopMenuItem(context), ), ], ), ), ), ) ], ), ), ); } }