didvan-app/lib/views/home/main/main_page.dart

262 lines
9.6 KiB
Dart

import 'package:didvan/config/theme_data.dart';
import 'package:didvan/constants/app_icons.dart';
import 'package:didvan/constants/assets.dart';
import 'package:didvan/main.dart';
import 'package:didvan/models/home_page_content/home_page_list.dart';
import 'package:didvan/models/home_page_content/swot.dart';
import 'package:didvan/routes/routes.dart';
import 'package:didvan/services/app_initalizer.dart';
import 'package:didvan/views/home/main/main_page_state.dart';
import 'package:didvan/views/home/main/widgets/banner.dart';
import 'package:didvan/views/home/main/widgets/general_item.dart';
import 'package:didvan/views/home/main/widgets/main_content.dart';
import 'package:didvan/views/home/main/widgets/podcast_item.dart';
import 'package:didvan/views/home/main/widgets/story_section.dart';
import 'package:didvan/views/widgets/didvan/slider.dart';
import 'package:didvan/views/widgets/didvan/text.dart';
import 'package:didvan/views/widgets/state_handlers/state_handler.dart';
import 'package:didvan/views/widgets/search_field.dart';
import 'package:didvan/views/home/home_state.dart';
import 'package:didvan/utils/action_sheet.dart';
import 'package:didvan/models/view/action_sheet_data.dart';
import 'package:didvan/views/widgets/didvan/checkbox.dart';
import 'package:didvan/views/widgets/text_divider.dart';
import 'package:didvan/views/widgets/item_title.dart';
import 'package:didvan/views/widgets/date_picker_button.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:provider/provider.dart';
import 'package:didvan/services/network/request.dart';
import 'package:url_launcher/url_launcher_string.dart';
import 'package:didvan/views/home/main/widgets/swot_item_card.dart';
import 'package:flutter/foundation.dart' show kIsWeb, defaultTargetPlatform;
// این پکیج فقط برای نسخه وب استفاده می‌شود
import 'package:universal_html/html.dart' as html;
bool isAnyMobile() {
if (kIsWeb) {
final userAgent = html.window.navigator.userAgent.toLowerCase();
return userAgent.contains('mobile') ||
userAgent.contains('android') ||
userAgent.contains('ios');
}
return defaultTargetPlatform == TargetPlatform.android ||
defaultTargetPlatform == TargetPlatform.iOS;
}
class MainPage extends StatefulWidget {
const MainPage({
super.key,
});
@override
State<MainPage> createState() => _MainPageState();
}
class _MainPageState extends State<MainPage> {
@override
void initState() {
super.initState();
print("DEBUG: _MainPageState initstate called");
WidgetsBinding.instance.addPostFrameCallback((_) {
print("DEBUG: addPostFrameCallback called");
context.read<MainPageState>().init();
});
super.initState();
}
@override
Widget build(BuildContext context) {
print("DEBUG: _MainPageState build called");
return StateHandler<MainPageState>(
onRetry: () =>
{print("DEBUG: _MainPageState onRetry called"), context.read<MainPageState>().init},
state: context.watch<MainPageState>(),
builder: (context, state) {
print("DEBUG: FutureBuilder waiting");
print("DEBUG: FutureBuilder state.stories.isNotEmpty: ${state.stories.isNotEmpty}");
return ListView(
padding: const EdgeInsets.only(top: 0, bottom: 16),
children: [
Padding(
padding: const EdgeInsets.fromLTRB(16, 0, 16, 16),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
SvgPicture.asset(
Assets.horizontalLogoWithText,
height: 60,
color: Theme.of(context).colorScheme.title,
),
GestureDetector(
onTap: () {
Navigator.pushNamed(context, Routes.profile);
},
child: SizedBox(
width: 44,
height: 44,
child: Center(
child: SvgPicture.asset(
'lib/assets/icons/New_Profile.svg',
width: 30,
height: 30,
color: Theme.of(context).colorScheme.title,
),
),
),
),
],
),
),
Padding(
padding: const EdgeInsets.fromLTRB(16, 0, 16, 16),
child: SearchField(
title: 'دیدوان',
focusNode: context.read<HomeState>().searchFieldFocusNode,
onChanged: (value) {
final homeState = context.read<HomeState>();
homeState.search = value;
if (value.length >= 3) {
homeState.searchAll(page: 1);
}
},
onFilterButtonPressed: () => _showFilterBottomSheet(context),
isFiltered: context.watch<HomeState>().filtering,
value: context.watch<HomeState>().search,
extraIconPath: 'lib/assets/icons/profile.svg',
onExtraIconPressed: () {
print('Extra icon pressed!');
},
),
),
if (state.stories.isNotEmpty) ...[
const TextDivider(text: 'دیده‌بان'),
const _DidvanSignalsTitle(),
Padding(
padding: const EdgeInsets.symmetric(horizontal: 8),
child: StorySection(stories: state.stories),
),
],
const SizedBox(height: 12),
const TextDivider(text: 'پیشخوان استراتژیک'),
const Padding(
padding: EdgeInsets.symmetric(horizontal: 16),
child: MainPageMainContent(),
),
],
);
},
);
}
Future<void> _showFilterBottomSheet(BuildContext context) async {
final state = Provider.of<HomeState>(context, listen: false);
ActionSheetUtils(context).showBottomSheet(
data: ActionSheetData(
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.category_regular,
style: Theme.of(context).textTheme.bodyMedium,
),
const SizedBox(height: 12),
Wrap(
children: [
for (var i = 0; i < state.categoryFilters.length; i++)
if (state.categoryFilters[i].label != 'هوشان')
SizedBox(
width: (MediaQuery.of(context).size.width - 40) / 2,
child: DidvanCheckbox(
title: state.categoryFilters[i].label,
value: state.selectedCats
.contains(state.categoryFilters[i]),
onChanged: (value) {
if (value) {
state.selectedCats.add(state.categoryFilters[i]);
return;
}
state.selectedCats.remove(state.categoryFilters[i]);
},
),
),
],
),
],
),
),
);
}
}
class _DidvanSignalsTitle extends StatelessWidget {
const _DidvanSignalsTitle();
@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.only(
left: 16,
right: 16,
bottom: 16,
top: 0,
),
child: Row(
children: [
SvgPicture.asset(
'lib/assets/icons/voice-square.svg',
color: Theme.of(context).colorScheme.title,
width: 30,
height: 30,
),
const SizedBox(width: 5),
DidvanText(
"سیگنال‌های دیدوان",
style: Theme.of(context).textTheme.titleMedium,
color: Theme.of(context).colorScheme.title,
fontSize: 13,
),
],
),
);
}
}