import 'package:didvan/config/design_config.dart'; import 'package:didvan/config/theme_data.dart'; import 'package:didvan/constants/app_icons.dart'; import 'package:didvan/models/news_details_data.dart'; import 'package:didvan/models/radar_details_data.dart'; import 'package:didvan/models/view/action_sheet_data.dart'; import 'package:didvan/pages/home/settings/widgets/menu_item.dart'; import 'package:didvan/routes/routes.dart'; import 'package:didvan/utils/action_sheet.dart'; import 'package:didvan/widgets/bookmark_button.dart'; import 'package:didvan/widgets/didvan/chip.dart'; import 'package:didvan/widgets/didvan/divider.dart'; import 'package:didvan/widgets/didvan/icon_button.dart'; import 'package:didvan/widgets/didvan/text.dart'; import 'package:didvan/widgets/item_title.dart'; import 'package:flutter/material.dart'; class FloatingNavigationBar extends StatefulWidget { final RadarDetailsData? radar; final NewsDetailsData? news; final ScrollController scrollController; final VoidCallback onMark; final VoidCallback onUnmark; const FloatingNavigationBar({ Key? key, this.radar, this.news, required this.scrollController, required this.onMark, required this.onUnmark, }) : super(key: key); @override State createState() => _FloatingNavigationBarState(); } class _FloatingNavigationBarState extends State { bool get _isRadar => widget.radar != null; bool _isScrolled = false; get _item => widget.radar ?? widget.news; @override void didUpdateWidget(covariant FloatingNavigationBar oldWidget) { if (widget.radar != null && oldWidget.radar!.id != widget.radar!.id || widget.news != null && oldWidget.news!.id != widget.news!.id) { _isScrolled = false; } super.didUpdateWidget(oldWidget); } @override void initState() { widget.scrollController.addListener(() { final position = widget.scrollController.position.pixels; final offset = MediaQuery.of(context).size.width / 16 * 9 + 40; if (position > offset && !_isScrolled) { setState(() { _isScrolled = true; }); } else if (position < offset && _isScrolled) { setState(() { _isScrolled = false; }); } }); super.initState(); } @override Widget build(BuildContext context) { final Color foregroundColor = DesignConfig.isDark ? Theme.of(context).colorScheme.focusedBorder : Theme.of(context).colorScheme.focused; return Container( margin: const EdgeInsets.only(left: 32, right: 32, bottom: 20), padding: const EdgeInsets.symmetric(horizontal: 12), width: double.infinity, height: 48, decoration: BoxDecoration( color: Theme.of(context).colorScheme.navigation, borderRadius: BorderRadius.circular(24), border: DesignConfig.isDark ? Border.all( color: Theme.of(context).colorScheme.cardBorder, ) : null, ), child: Theme( data: Theme.of(context).copyWith( iconTheme: IconThemeData( color: foregroundColor, ), ), child: Row( children: [ AnimatedRotation( duration: DesignConfig.lowAnimationDuration, turns: _isScrolled ? -0.25 : 0, child: DidvanIconButton( onPressed: () { if (_isScrolled) { widget.scrollController.animateTo( 0, duration: DesignConfig.lowAnimationDuration, curve: Curves.easeIn, ); return; } Navigator.of(context).pop(); }, icon: DidvanIcons.back_regular, ), ), const Spacer(), if (_isRadar) BookmarkButton( value: _item.marked, onMark: widget.onMark, onUnmark: widget.onUnmark, bigGestureSize: true, ), SizedBox( width: 48, child: Row( mainAxisAlignment: MainAxisAlignment.center, children: [ if (_item.comments != 0) DidvanText( _item.comments.toString(), color: foregroundColor, ), DidvanIconButton( gestureSize: 32, onPressed: () => Navigator.of(context).pushNamed( Routes.comments, arguments: { 'id': _item.id, 'isRadar': _isRadar, 'title': _item.title }, ), icon: DidvanIcons.chats_regular, ), ], ), ), if (!_isRadar) const SizedBox(width: 12), if (!_isRadar) BookmarkButton( value: _item.marked, onMark: widget.onMark, onUnmark: widget.onUnmark, bigGestureSize: true, ), if (_isRadar) DidvanIconButton( gestureSize: 32, onPressed: _showMoreOptions, icon: DidvanIcons.menu_regular, ), ], ), ), ); } void _showMoreOptions() { ActionSheetUtils.showBottomSheet( data: ActionSheetData( content: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ const ItemTitle( title: 'ارتباط با سردبیر', icon: DidvanIcons.profile_regular, ), const SizedBox(height: 16), for (var i = 0; i < _item.categories.length; i++) ...[ Padding( padding: const EdgeInsets.only(right: 20), child: MenuItem( titleWidget: DidvanChip(label: _item.categories[i].label), onTap: () { Navigator.of(context).pop(); Navigator.of(context).pushNamed( Routes.direct, arguments: _item.categories[i].id, ); }, ), ), if (i != _item.categories.length - 1) const Padding( padding: EdgeInsets.only(right: 20), child: DidvanDivider(verticalPadding: 8), ), ], const DidvanDivider(), MenuItem( title: 'گزارش اشکال', onTap: () { Navigator.of(context).pop(); Navigator.of(context).pushNamed( Routes.direct, arguments: 0, ); }, icon: DidvanIcons.description_regular, ), ], ), title: 'موارد بیشتر', withoutButtonMode: true, ), ); } }