import 'package:flutter/material.dart'; import 'package:stacked/stacked.dart'; import 'package:yimaru_app/ui/widgets/custom_linear_progress_indicator.dart'; import 'package:yimaru_app/ui/widgets/download_card.dart'; import '../../common/app_colors.dart'; import '../../common/ui_helpers.dart'; import '../../widgets/custom_elevated_button.dart'; import '../../widgets/small_app_bar.dart'; import 'downloads_viewmodel.dart'; class DownloadsView extends StackedView { const DownloadsView({Key? key}) : super(key: key); @override DownloadsViewModel viewModelBuilder( BuildContext context, ) => DownloadsViewModel(); @override Widget builder( BuildContext context, DownloadsViewModel viewModel, Widget? child, ) => _buildScaffoldWrapper(viewModel); Widget _buildScaffoldWrapper(DownloadsViewModel viewModel) => Scaffold( backgroundColor: kcBackgroundColor, body: _buildScaffold(viewModel), ); Widget _buildScaffold(DownloadsViewModel viewModel) => SafeArea(child: _buildBodyWrapper(viewModel)); Widget _buildBodyWrapper(DownloadsViewModel viewModel) => _buildBody(viewModel); Widget _buildBody(DownloadsViewModel viewModel) => Padding( padding: const EdgeInsets.symmetric(horizontal: 15), child: _buildColumn(viewModel), ); Widget _buildColumn(DownloadsViewModel viewModel) => Column( crossAxisAlignment: CrossAxisAlignment.start, children: _buildColumnChildren(viewModel), ); List _buildColumnChildren(DownloadsViewModel viewModel) => [ verticalSpaceMedium, _buildAppbar(viewModel), _buildContentWrapper(viewModel) ]; Widget _buildAppbar(DownloadsViewModel viewModel) => SmallAppBar( title: 'Offline Downloads', onTap: viewModel.pop, ); Widget _buildContentWrapper(DownloadsViewModel viewModel) => viewModel.showDownload ? _buildEmptyContent(viewModel) : _buildContent(viewModel); Widget _buildContent(DownloadsViewModel viewModel) => Column( mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: _buildContentChildren(viewModel), ); List _buildContentChildren(DownloadsViewModel viewModel) => [ verticalSpaceMedium, _buildStorageSection(viewModel), verticalSpaceLarge, _buildDownloads(viewModel) ]; Widget _buildStorageSection(DownloadsViewModel viewModel) => Column( mainAxisSize: MainAxisSize.min, children: _buildStorageSectionChildren(viewModel), ); List _buildStorageSectionChildren(DownloadsViewModel viewModel) => [ _buildStorageInfoWrapper(viewModel), _buildStorageIndicator(), ]; Widget _buildStorageInfoWrapper(DownloadsViewModel viewModel) => Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: _buildStorageInfoChildren(viewModel), ); List _buildStorageInfoChildren(DownloadsViewModel viewModel) => [_buildStorageInfo(), _buildManageButton(viewModel)]; Widget _buildStorageInfo() => const Text.rich( TextSpan( text: '1.2GB', style: TextStyle( color: kcPrimaryColor, fontWeight: FontWeight.w600, ), children: [ TextSpan( text: ' used of 2GB', style: TextStyle( color: kcDarkGrey, fontWeight: FontWeight.w600, ), ) ]), ); Widget _buildManageButton(DownloadsViewModel viewModel) => TextButton( onPressed: viewModel.setShowDownload, child: _buildManageText()); Widget _buildManageText() => const Text( 'Manage Storage', style: TextStyle( color: kcPrimaryColor, fontWeight: FontWeight.w600, ), ); Widget _buildStorageIndicator() => const CustomLinearProgressIndicator( progress: 0.75, activeColor: kcPrimaryColor, backgroundColor: kcVeryLightGrey, ); Widget _buildDownloads(DownloadsViewModel viewModel) => ListView.builder( shrinkWrap: true, itemCount: viewModel.downloads.length, physics: const NeverScrollableScrollPhysics(), itemBuilder: (context, index) => _buildDownload( size: viewModel.downloads[index]['size'], title: viewModel.downloads[index]['title'], duration: viewModel.downloads[index]['duration'], thumbnail: viewModel.downloads[index]['thumbnail']), ); Widget _buildDownload( {required String title, required String size, required String duration, required String thumbnail}) => DownloadCard( size: size, title: title, duration: duration, thumbnail: thumbnail, ); Widget _buildEmptyContent(DownloadsViewModel viewModel) => Expanded( child: Column( mainAxisSize: MainAxisSize.max, crossAxisAlignment: CrossAxisAlignment.center, children: _buildEmptyContentChildren(viewModel), ), ); List _buildEmptyContentChildren(DownloadsViewModel viewModel) => [_buildUpperEmptyContent(viewModel), _buildGoButtonWrapper(viewModel)]; Widget _buildUpperEmptyContent(DownloadsViewModel viewModel) => Expanded( child: Column( mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.center, children: _buildUpperEmptyContentChildren(viewModel), ), ); List _buildUpperEmptyContentChildren(DownloadsViewModel viewModel) => [ verticalSpaceMassive, _buildEmptyIcon(), verticalSpaceMedium, _buildEmptyTitle(), verticalSpaceSmall, _buildEmptySubTitle(), ]; Widget _buildEmptyIcon() => const Icon( Icons.hourglass_empty, size: 100, color: kcPrimaryColor, ); Widget _buildEmptyTitle() => const Text( 'Looking for something to download?', textAlign: TextAlign.center, style: TextStyle( fontSize: 25, color: kcDarkGrey, fontWeight: FontWeight.w600, ), ); Widget _buildEmptySubTitle() => const Text( 'Start by exploring your learning materials and save them for offline access.', textAlign: TextAlign.center, style: TextStyle(color: kcMediumGrey), ); Widget _buildGoButtonWrapper(DownloadsViewModel viewModel) => Padding( padding: const EdgeInsets.only(bottom: 50), child: _buildGoButton(viewModel), ); Widget _buildGoButton(DownloadsViewModel viewModel) => CustomElevatedButton( height: 55, borderRadius: 12, text: 'Go to Learn Section', onTap: viewModel.setShowDownload, foregroundColor: kcWhite, backgroundColor: kcPrimaryColor, ); }