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/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.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 const Padding( padding: EdgeInsets.only(top: 32), child: 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 _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')) { launchUrl(Uri.parse(list.link)); return; } Navigator.of(context).pushNamed(list.link); } IconData? _generateIcon() { switch (list.type) { case 'news': return DidvanIcons.news_solid; case 'radar': return DidvanIcons.radar_solid; case 'video': return DidvanIcons.video_solid; case 'podcast': return DidvanIcons.podcast_solid; default: return null; } } @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, 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 == 'radar') // DidvanSlider( // height: 260, // itemCount: list.contents.length, // viewportFraction: 0.65, // itemBuilder: (context, index, realIndex) => Padding( // padding: const EdgeInsets.symmetric(horizontal: 4), // child: MainPageGeneralItem( // content: list.contents[index], // ), // ), // ), // if (list.type == 'video') // DidvanSlider( // height: 260, // itemCount: list.contents.length, // viewportFraction: 0.65, // itemBuilder: (context, index, realIndex) => Padding( // padding: const EdgeInsets.symmetric(horizontal: 4), // child: MainPageGeneralItem( // content: list.contents[index], // ), // ), // ), 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(), ), ), // if (list.type != 'news' && // list.type != 'radar' && // list.type != 'video' && // list.type != 'podcast') // DidvanSlider( // itemBuilder: (context, index, realIndex) => Padding( // padding: const EdgeInsets.symmetric(horizontal: 4), // child: MainPageGeneralItem( // content: list.contents[index], // ), // ), // itemCount: list.contents.length, // viewportFraction: 0.65, // height: 260 + _maxSublistCount() * 20, // ), // if (!isLast) const _MainPageDivider(), ], ); } } // class _MainPageDivider extends StatelessWidget { // const _MainPageDivider(); // @override // Widget build(BuildContext context) { // return Container( // height: 2, // margin: const EdgeInsets.only( // top: 8, // left: 20, // right: 20, // ), // width: double.infinity, // decoration: BoxDecoration( // borderRadius: DesignConfig.highBorderRadius, // color: Theme.of(context).colorScheme.border, // ), // ); // } // }