diff --git a/lib/assets/icons/sort2.svg b/lib/assets/icons/sort2.svg new file mode 100644 index 0000000..2b93659 --- /dev/null +++ b/lib/assets/icons/sort2.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/lib/views/home/media/media_page.dart b/lib/views/home/media/media_page.dart index 8bf0377..c037dfe 100644 --- a/lib/views/home/media/media_page.dart +++ b/lib/views/home/media/media_page.dart @@ -84,9 +84,10 @@ class _MediaPageState extends State { }); }, children: [ - const PodcastTabPage(), - const VideoCastTabPage(), + const PodcastTabPage(key: ValueKey('PodcastTabPage')), + const VideoCastTabPage(key: ValueKey('VideoCastTabPage')), const SingleChildScrollView( + key: ValueKey('MainPageBanner'), child: Padding( padding: EdgeInsets.symmetric( horizontal: 16.0, vertical: 16.0), @@ -94,6 +95,7 @@ class _MediaPageState extends State { ), ), Center( + key: const ValueKey('InfographyPage'), child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ diff --git a/lib/views/home/media/videocast_tab_page.dart b/lib/views/home/media/videocast_tab_page.dart index 988a8ec..cdbb3c5 100644 --- a/lib/views/home/media/videocast_tab_page.dart +++ b/lib/views/home/media/videocast_tab_page.dart @@ -1,3 +1,4 @@ +import 'dart:async'; import 'package:didvan/routes/routes.dart'; import 'package:didvan/views/home/media/widgets/featured_video_card.dart'; import 'package:didvan/views/home/media/widgets/videocast_grid_card.dart'; @@ -5,7 +6,9 @@ import 'package:didvan/views/podcasts/podcasts_state.dart'; import 'package:didvan/views/widgets/overview/podcast.dart'; import 'package:didvan/views/widgets/state_handlers/empty_result.dart'; import 'package:didvan/views/widgets/state_handlers/state_handler.dart'; +import 'package:didvan/views/widgets/item_title.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_svg/svg.dart'; import 'package:provider/provider.dart'; class VideoCastTabPage extends StatefulWidget { @@ -16,6 +19,9 @@ class VideoCastTabPage extends StatefulWidget { } class _VideoCastTabPageState extends State { + int _currentFeaturedIndex = 0; + Timer? _rotationTimer; + @override void initState() { super.initState(); @@ -25,6 +31,75 @@ class _VideoCastTabPageState extends State { }); } + void _startRotation() { + _rotationTimer?.cancel(); + _rotationTimer = Timer.periodic(const Duration(seconds: 5), (timer) { + final state = context.read(); + if (state.studios.isNotEmpty && mounted) { + setState(() { + _currentFeaturedIndex = + (_currentFeaturedIndex + 1) % state.studios.length; + }); + } + }); + } + + void _showSortDialog() { + final state = context.read(); + showModalBottomSheet( + backgroundColor: Colors.white, + context: context, + builder: (context) { + return Container( + padding: const EdgeInsets.all(16), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + ListTile( + title: const Text('تازه‌ترین‌ها'), + onTap: () { + state.selectedSortTypeIndex = 0; + state.getStudios(page: 1); + Navigator.pop(context); + }, + ), + ListTile( + title: const Text('قدیمی‌ترین‌ها'), + onTap: () { + state.selectedSortTypeIndex = 1; + state.getStudios(page: 1); + Navigator.pop(context); + }, + ), + ListTile( + title: const Text('پربازدیدترین‌ها'), + onTap: () { + state.selectedSortTypeIndex = 2; + state.getStudios(page: 1); + Navigator.pop(context); + }, + ), + ListTile( + title: const Text('پربحث‌ترین‌ها'), + onTap: () { + state.selectedSortTypeIndex = 3; + state.getStudios(page: 1); + Navigator.pop(context); + }, + ), + ], + ), + ); + }, + ); + } + + @override + void dispose() { + _rotationTimer?.cancel(); + super.dispose(); + } + @override Widget build(BuildContext context) { final state = context.watch(); @@ -41,38 +116,83 @@ class _VideoCastTabPageState extends State { return const SizedBox.shrink(); } + if (_rotationTimer == null || !_rotationTimer!.isActive) { + WidgetsBinding.instance.addPostFrameCallback((_) { + _startRotation(); + }); + } + return SingleChildScrollView( child: Column( children: [ - FeaturedVideoCard( - videocast: state.studios.first, - onTap: () { - Navigator.pushNamed( - context, - Routes.studioDetails, - arguments: { - 'id': state.studios.first.id, - 'type': state.studios.first.type, - }, - ); + AnimatedSwitcher( + duration: const Duration(milliseconds: 500), + transitionBuilder: (Widget child, Animation animation) { + return FadeTransition(opacity: animation, child: child); }, + child: FeaturedVideoCard( + key: ValueKey(state.studios[_currentFeaturedIndex].id), + videocast: state.studios[_currentFeaturedIndex], + onTap: () { + Navigator.pushNamed( + context, + Routes.studioDetails, + arguments: { + 'id': state.studios[_currentFeaturedIndex].id, + 'type': state.studios[_currentFeaturedIndex].type, + }, + ); + }, + ), ), - + + if (state.studios.length > 1) + Padding( + padding: + const EdgeInsets.symmetric(horizontal: 16, vertical: 4), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + const ItemTitle( + title: 'همه ویدیوکست‌ها', + color: Color.fromARGB(255, 0, 53, 70), + style: TextStyle(fontWeight: FontWeight.bold,fontSize: 18), + ), + Row( + children: [ + GestureDetector( + onTap: _showSortDialog, + child: Text( + state.orderString, + style: const TextStyle( + color: Color.fromARGB(255, 0, 53, 70)), + )), + IconButton( + onPressed: _showSortDialog, + icon: SvgPicture.asset( + 'lib/assets/icons/sort2.svg')), + ], + ), + ], + ), + ), + if (state.studios.length > 1) Padding( padding: const EdgeInsets.all(16), child: GridView.builder( shrinkWrap: true, physics: const NeverScrollableScrollPhysics(), - gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount( + gridDelegate: + const SliverGridDelegateWithFixedCrossAxisCount( crossAxisCount: 2, crossAxisSpacing: 12, mainAxisSpacing: 12, childAspectRatio: 0.75, ), - itemCount: state.studios.length - 1, + itemCount: state.studios.length, itemBuilder: (context, index) { - final videocast = state.studios[index + 1]; + final videocast = state.studios[index]; return VideocastGridCard( videocast: videocast, onTap: () { diff --git a/lib/views/home/media/widgets/featured_video_card.dart b/lib/views/home/media/widgets/featured_video_card.dart index d0cadf1..cdd5671 100644 --- a/lib/views/home/media/widgets/featured_video_card.dart +++ b/lib/views/home/media/widgets/featured_video_card.dart @@ -58,12 +58,25 @@ class FeaturedVideoCard extends StatelessWidget { ), ), + Container( + decoration: BoxDecoration( + gradient: LinearGradient( + begin: Alignment.bottomCenter, + end: Alignment.topCenter, + colors: [ + Colors.black.withOpacity(0.6), + Colors.transparent, + ], + ), + ), + ), + Positioned( bottom: 0, left: 0, right: 0, child: Container( - height: 200, + height: 450, decoration: BoxDecoration( gradient: LinearGradient( begin: Alignment.bottomCenter, @@ -137,7 +150,7 @@ class FeaturedVideoCard extends StatelessWidget { _formatDuration(videocast.duration).toPersianDigit(), style: Theme.of(context).textTheme.bodyMedium?.copyWith( color: Colors.white, - fontWeight: FontWeight.w600, + fontWeight: FontWeight.normal, ), ), ],