didvan-app/lib/views/widgets/logo_app_bar.dart

318 lines
11 KiB
Dart

import 'dart:async';
import 'package:didvan/config/theme_data.dart';
import 'package:didvan/constants/app_icons.dart';
import 'package:didvan/models/category.dart';
import 'package:didvan/models/view/action_sheet_data.dart';
import 'package:didvan/routes/routes.dart';
import 'package:didvan/utils/action_sheet.dart';
import 'package:didvan/views/home/home_state.dart';
import 'package:didvan/views/widgets/date_picker_button.dart';
import 'package:didvan/views/widgets/didvan/checkbox.dart';
import 'package:didvan/views/widgets/item_title.dart';
import 'package:didvan/views/widgets/search_field.dart';
import 'package:didvan/views/widgets/didvan/icon_button.dart';
import 'package:didvan/views/widgets/didvan/text.dart';
import 'package:didvan/views/widgets/logos/didvan_vertical_logo.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart';
import 'package:provider/provider.dart';
class LogoAppBar extends StatelessWidget implements PreferredSizeWidget {
LogoAppBar({Key? key}) : super(key: key);
@override
Size get preferredSize => const Size(double.infinity, 144);
@override
Widget build(BuildContext context) {
final state = context.read<HomeState>();
final MediaQueryData d = MediaQuery.of(context);
return Container(
height: 144,
decoration: BoxDecoration(
borderRadius: const BorderRadius.only(bottomLeft: Radius.circular(20)),
color: Theme.of(context).colorScheme.surface,
boxShadow: [
BoxShadow(
color: const Color(0XFF1B3C59).withOpacity(0.15),
blurRadius: 8,
spreadRadius: 0,
offset: const Offset(0, 8),
)
],
),
margin: EdgeInsets.only(top: d.padding.top),
padding: const EdgeInsets.all(16),
alignment: Alignment.centerRight,
child: Column(
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
const DidvanHorizontalLogo(),
Row(
children: [
DidvanIconButton(
icon: DidvanIcons.profile_light,
size: 32,
onPressed: () =>
Navigator.of(context).pushNamed(Routes.profile),
),
Container(
height: 32,
width: 1,
color: Theme.of(context).colorScheme.border,
),
Stack(
children: [
DidvanIconButton(
icon: state.unreadCount == 0
? DidvanIcons.message_light
: DidvanIcons.message_solid,
size: 32,
onPressed: () =>
Navigator.of(context).pushNamed(Routes.direct),
),
if (state.unreadCount != 0)
Positioned(
top: 8,
right: 4,
child: Container(
height: 12,
width: 12,
decoration: BoxDecoration(
shape: BoxShape.circle,
color: Theme.of(context).colorScheme.secondary,
),
),
),
],
),
],
),
],
),
const SizedBox(height: 16),
Consumer<HomeState>(
builder: (context, state, child) => SearchField(
title: state.currentPageIndex == 3 ? 'رصدهای من' : 'دیدوان',
onChanged: (value) => _onChanged(value, context),
focusNode: FocusNode(),
onFilterButtonPressed: () => _showFilterBottomSheet(context),
isFiltered: state.filtering && state.search == '',
),
),
],
),
);
}
void _onChanged(String value, BuildContext context) {
final state = context.read<HomeState>();
if (value.length < 3 && value.isNotEmpty || state.lastSearch == value) {
return;
}
state.timer?.cancel();
state.timer = Timer(const Duration(seconds: 1), () {
state.search = value;
if (state.currentPageIndex == 3) {
state.searchMarks(page: 1);
} else {
state.searchAll(page: 1);
}
});
}
final categoryFilters = [
CategoryData(id: 1, label: 'پویش افق'),
CategoryData(id: 2, label: 'دنیای فولاد'),
CategoryData(id: 3, label: 'ویدئوکست'),
CategoryData(id: 4, label: 'پادکست'),
CategoryData(id: 1, label: 'تحلیل‌های راداری'),
CategoryData(id: 1, label: 'سها'),
];
Future<void> _showFilterBottomSheet(BuildContext context) async {
final state = context.read<HomeState>();
await ActionSheetUtils.showBottomSheet(
data: ActionSheetData(
title: 'فیلتر جستجو',
smallDismissButton: true,
titleIcon: DidvanIcons.filter_regular,
dismissTitle: 'حذف فیلتر',
confrimTitle: 'نمایش نتایج',
onDismissed: () => state.resetFilters(false),
onConfirmed: () => state.searchAll(page: 1),
content: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
if (state.currentPageIndex != 3) ...[
ItemTitle(
title: 'تاریخ ایجاد',
style: Theme.of(context).textTheme.bodyMedium,
icon: DidvanIcons.calendar_range_regular,
),
const SizedBox(height: 8),
StatefulBuilder(
builder: (context, setState) => Row(
children: [
DatePickerButton(
initialValue: state.startDate,
emptyText: 'از تاریخ',
onPicked: (date) =>
setState(() => state.startDate = date),
lastDate: state.endDate,
),
const SizedBox(width: 8),
DatePickerButton(
initialValue: state.endDate,
emptyText: 'تا تاریخ',
onPicked: (date) => setState(() => state.endDate = date),
firstDate: state.startDate,
),
],
),
),
const SizedBox(height: 28),
],
ItemTitle(
title: 'دسته بندی',
icon: DidvanIcons.radar_regular,
style: Theme.of(context).textTheme.bodyMedium,
),
const SizedBox(height: 12),
Wrap(
children: [
for (var i = 0; i < categoryFilters.length; i++)
SizedBox(
width: (MediaQuery.of(context).size.width - 40) / 2,
child: DidvanCheckbox(
title: categoryFilters[i].label,
value: state.selectedCats.contains(state.categories[i]),
onChanged: (value) {
if (value) {
state.selectedCats.add(state.categories[i]);
return;
}
state.selectedCats.remove(state.categories[i]);
},
),
),
],
),
],
),
),
);
}
// void _handleMenuOpen(BuildContext context) {
// ActionSheetUtils.showBottomSheet(
// data: ActionSheetData(
// content: Column(
// children: [
// Row(
// crossAxisAlignment: CrossAxisAlignment.center,
// children: [
// SvgPicture.asset(
// Assets.strategicRadarIcon,
// width: 48,
// height: 48,
// ),
// const SizedBox(width: 4),
// DidvanText(
// 'سامانه رادارهای استراتژیک',
// style: Theme.of(context).textTheme.titleMedium,
// ),
// ],
// ),
// const SizedBox(height: 16),
// _BottomSheetItem(
// icon: Assets.progressRadarIcon,
// title: 'رادار روند',
// enabled: true,
// onTap: () {
// launchUrlString(
// 'https://trend.didvan.app/',
// mode: LaunchMode.inAppWebView,
// );
// },
// ),
// const SizedBox(height: 16),
// _BottomSheetItem(
// icon: Assets.techRadarIcon,
// title: 'رادار تکنولوژی',
// onTap: () {},
// ),
// const SizedBox(height: 16),
// _BottomSheetItem(
// icon: Assets.riskRadarIcon,
// title: 'رادار ریسک',
// enabled: true,
// onTap: () {
// launchUrlString(
// 'https://risk.didvan.app/',
// mode: LaunchMode.inAppWebView,
// );
// },
// ),
// const SizedBox(height: 16),
// _BottomSheetItem(
// icon: Assets.startupRadarIcon,
// title: 'رادار استارت‌آپ',
// onTap: () {},
// ),
// ],
// ),
// hasConfirmButton: false,
// hasDismissButton: false,
// ),
// );
// }
}
class _BottomSheetItem extends StatelessWidget {
final String icon;
final String title;
final bool enabled;
final VoidCallback onTap;
const _BottomSheetItem({
required this.icon,
required this.title,
this.enabled = false,
required this.onTap,
});
@override
Widget build(BuildContext context) {
return GestureDetector(
onTap: enabled ? onTap : null,
child: Container(
color: Colors.transparent,
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
SvgPicture.asset(
icon,
theme: SvgTheme(
currentColor: enabled
? Theme.of(context).colorScheme.title
: Theme.of(context).colorScheme.disabledText,
),
),
const SizedBox(width: 8),
DidvanText(
title,
color: enabled
? Theme.of(context).colorScheme.title
: Theme.of(context).colorScheme.disabledText,
),
],
),
),
);
}
}