didvan-app/lib/widgets/floating_navigation_bar.dart

189 lines
5.9 KiB
Dart

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/divider.dart';
import 'package:didvan/widgets/didvan/icon_button.dart';
import 'package:didvan/widgets/didvan/text.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<FloatingNavigationBar> createState() => _FloatingNavigationBarState();
}
class _FloatingNavigationBarState extends State<FloatingNavigationBar> {
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,
),
SizedBox(
width: 48,
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
if (_item.comments != 0)
DidvanText(
_item.comments.toString(),
color: foregroundColor,
),
const SizedBox(width: 4),
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,
),
if (_isRadar)
DidvanIconButton(
gestureSize: 32,
onPressed: _showMoreOptions,
icon: DidvanIcons.menu_regular,
),
],
),
),
);
}
void _showMoreOptions() {
ActionSheetUtils.showBottomSheet(
data: ActionSheetData(
content: Column(
children: [
MenuItem(
title: 'ارتباط با سردبیر',
onTap: () {},
icon: DidvanIcons.profile_regular,
),
const DidvanDivider(),
MenuItem(
title: 'گزارش اشکال',
onTap: () {},
icon: DidvanIcons.description_regular,
),
],
),
title: 'موارد بیشتر',
withoutButtonMode: true,
),
);
}
}