import 'package:didvan/config/theme_data.dart'; import 'package:didvan/constants/app_icons.dart'; import 'package:didvan/models/home_page_content/home_page_list.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/widgets/didvan/slider.dart'; import 'package:didvan/views/widgets/didvan/text.dart'; import 'package:didvan/views/widgets/state_handlers/state_handler.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; // import 'package:url_launcher/url_launcher_string.dart'; import 'package:didvan/services/network/request.dart'; class MainPage extends StatefulWidget { const MainPage({super.key}); @override State createState() => _MainPageState(); } class _MainPageState extends State { @override void initState() { context.read().init(); super.initState(); } @override Widget build(BuildContext context) { return StateHandler( onRetry: context.read().init, state: context.watch(), builder: (context, state) => ListView.builder( padding: const EdgeInsets.symmetric(vertical: 16), itemBuilder: (context, index) { if (index == 0) { return const MainPageMainContent(); } index--; if (index == 4) { return Padding( padding: const EdgeInsets.only(top: 32), child: Column( children: [ Padding( padding: const EdgeInsets.only( left: 16, right: 16, bottom: 16, top: 28, ), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ const InfoTitle(), GestureDetector( onTap: () => { Navigator.of(context).pushNamed(Routes.infography) }, child: Row( children: [ DidvanText( "همه", color: Theme.of(context).colorScheme.primary, ), Icon( DidvanIcons.angle_left_light, color: Theme.of(context).colorScheme.primary, ) ], ), ) ], ), ), const MainPageBanner( isFirst: false, ), ], ), ); } if (index > 3) { index--; } final list = state.content.lists[index]; return _MainPageSection( list: list, isLast: index == state.content.lists.length - 1, ); }, itemCount: state.content.lists.length + 2, ), ); } } class InfoTitle extends StatelessWidget { const InfoTitle({super.key}); @override Widget build(BuildContext context) { return Row( children: [ const Icon(DidvanIcons.infography_solid), const SizedBox(width: 4), DidvanText( "اینفوگرافی", style: Theme.of(context).textTheme.titleMedium, color: Theme.of(context).colorScheme.title, ), ], ); } } class _MainPageSection extends StatelessWidget { final MainPageList list; final bool isLast; const _MainPageSection({required this.list, required this.isLast}); void _moreHandler(BuildContext context) { if (list.link.startsWith('http')) { launchUrlString( '${list.link}?accessToken=${RequestService.token}', mode: LaunchMode.inAppWebView, ); return; } Navigator.of(context).pushNamed(list.link); } IconData? _generateIcon() { switch (list.type) { case 'news': return DidvanIcons.foolad_solid; case 'radar': return DidvanIcons.scanning_solid; case 'video': return DidvanIcons.video_solid; case 'podcast': return DidvanIcons.podcast_solid; case 'trend': return DidvanIcons.chart_solid; case 'technology': return DidvanIcons.technology_solid; case 'risk': return DidvanIcons.exclamation_triangle_solid; case 'startup': return DidvanIcons.startup_solid; case 'delphi': return DidvanIcons.saha_solid; default: return null; } } int _maxSublistCount() { int max = 1; for (var i = 0; i < list.contents.length; i++) { if (list.contents[i].subtitles.length > max) { max = list.contents[i].subtitles.length; } } return max - 1; } @override Widget build(BuildContext context) { final icon = _generateIcon(); return Column( children: [ Padding( padding: const EdgeInsets.only( left: 16, right: 16, bottom: 16, top: 28, ), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Row( children: [ if (icon != null) Icon(icon), const SizedBox(width: 4), DidvanText( list.header, style: Theme.of(context).textTheme.titleMedium, color: Theme.of(context).colorScheme.title, ), ], ), GestureDetector( onTap: () => _moreHandler(context), child: Row( children: [ DidvanText( list.more, color: Theme.of(context).colorScheme.primary, ), Icon( DidvanIcons.angle_left_light, color: Theme.of(context).colorScheme.primary, ) ], ), ) ], ), ), if (list.type != 'podcast') DidvanSlider( height: 260 + (_maxSublistCount() - (list.type == 'radar' ? 1 : 0)) * 20, itemCount: list.contents.length, viewportFraction: 0.65, itemBuilder: (context, index, realIndex) => Padding( padding: const EdgeInsets.symmetric(horizontal: 4), child: MainPageGeneralItem( content: list.contents[index], type: list.type, ), ), ), if (list.type == 'podcast') Padding( padding: const EdgeInsets.only(top: 28), child: Column( children: list.contents .map( (e) => Padding( padding: const EdgeInsets.only( bottom: 12, left: 28, right: 28, ), child: MainPagePodcastItem( content: e, ), ), ) .toList(), ), ), ], ); } }