import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:go_router/go_router.dart'; import 'package:hadi_hoda_flutter/common_ui/resources/my_assets.dart'; import 'package:hadi_hoda_flutter/common_ui/resources/my_spaces.dart'; import 'package:hadi_hoda_flutter/common_ui/resources/my_text_style.dart'; import 'package:hadi_hoda_flutter/core/routers/my_routes.dart'; import 'package:hadi_hoda_flutter/core/status/base_status.dart'; import 'package:hadi_hoda_flutter/core/utils/convert_size.dart'; import 'package:hadi_hoda_flutter/core/utils/my_localization.dart'; import 'package:hadi_hoda_flutter/core/utils/screen_size.dart'; import 'package:hadi_hoda_flutter/core/widgets/error/error_state.dart'; import 'package:hadi_hoda_flutter/core/widgets/images/my_image.dart'; import 'package:hadi_hoda_flutter/features/download/domain/entities/download_entity.dart'; import 'package:hadi_hoda_flutter/features/download/presentation/bloc/download_bloc.dart'; import 'package:hadi_hoda_flutter/features/download/presentation/bloc/download_event.dart'; import 'package:hadi_hoda_flutter/features/download/presentation/bloc/download_state.dart'; import 'package:hadi_hoda_flutter/features/download/presentation/ui/widgets/download_loading_widget.dart'; /// Download page that supports downloading any combination of media types. /// /// Pass [config] to auto-start downloading specific types when the page opens. /// If [config] is null, the page assumes the download was already triggered /// externally and just shows the progress. class DownloadPage extends StatefulWidget { final DownloadPageConfig config; const DownloadPage({super.key,required this.config}); @override State createState() => _DownloadPageState(); } class _DownloadPageState extends State { @override void initState() { super.initState(); final bloc = context.read(); if (!bloc.isDownloading) { WidgetsBinding.instance.addPostFrameCallback((_) { if (mounted) { bloc.add(StartDownloadEvent(toLevel: widget.config.downloadToLevel)); } }); } } @override Widget build(BuildContext context) { return Scaffold( body: Container( height: context.heightScreen, width: context.widthScreen, decoration: BoxDecoration( gradient: const LinearGradient( begin: Alignment.topCenter, end: Alignment.bottomCenter, colors: [Color(0XFF00154C), Color(0XFF150532)], ), image: DecorationImage( image: const AssetImage(MyAssets.pattern), scale: 3, repeat: ImageRepeat.repeat, colorFilter: ColorFilter.mode( Colors.white.withValues(alpha: 0.2), BlendMode.srcIn, ), ), ), child: BlocConsumer( listener: (context, state) { if(state.status is BaseComplete) { if(widget.config.redirectTo == Routes.homePage) { context.goNamed(Routes.homePage); } else { context.pushNamed( widget.config.redirectTo, pathParameters: widget.config.routeParams, ); } } }, buildWhen: (previous, current) => previous.status != current.status, builder: (context, state) { if (state.status is BaseError) { return Padding( padding: EdgeInsets.symmetric( vertical: MediaQuery.viewPaddingOf(context).bottom + MySpaces.s16, horizontal: 60, ), child: ErrorState( onTap: () { context.read().add( StartDownloadEvent( toLevel: widget.config.downloadToLevel, ), ); }, ), ); } else { return Stack( alignment: Alignment.center, children: [_image(), _text(context), _loading(context)], ); } }, ), ), ); } Widget _image() { return const Stack( children: [ MyImage(image: MyAssets.hadiHoda), PositionedDirectional( start: MySpaces.s10, top: MySpaces.s40, child: MyImage(image: MyAssets.globe), ), ], ); } Widget _text(BuildContext context) { return PositionedDirectional( bottom: 130, child: Column( spacing: MySpaces.s6, children: [ Text(context.translate.please_wait, style: MYTextStyle.titr0), StreamBuilder( initialData: DownloadEntity.empty(), stream: context.read().loadingStream, builder: (context, snapshot) => Text( 'Downloading ...${snapshot.data?.downloadedLevels}/${widget.config.downloadToLevel}', style: MYTextStyle.matn3, ), ), ], ), ); } Positioned _loading(BuildContext context) { return Positioned( bottom: MySpaces.s40, child: DownloadLoadingWidget( loadingStream: context.read().loadingStream, ), ); } }