Sample Network Provider
unknown
dart
2 years ago
22 kB
6
Indexable
import 'package:cached_network_image/cached_network_image.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:muslim/common/api/sso/sso.dart'; import 'package:muslim/common/helper/helper.dart'; import 'package:muslim/common/provider/network.dart'; import 'package:muslim/common/resources/resources.dart'; import 'package:muslim/common/tools/hex_color.dart'; import 'package:muslim/common/tools/utils.dart'; import 'package:muslim/global.dart'; import 'package:muslim/models/models.dart'; import 'package:muslim/pages/home/home.dart'; import 'package:muslim/pages/home/qurban/qurban.dart'; import 'package:muslim/pages/widgets/widgets.dart'; import 'package:phoenix_widgets/phoenix_widgets.dart'; import 'package:provider/provider.dart'; class QurbanPage extends StatefulWidget { const QurbanPage({Key? key}) : super(key: key); @override State<QurbanPage> createState() => _QurbanPageState(); } class _QurbanPageState extends State<QurbanPage> { final _scrollController = ScrollController(); final PhoenixBottomSheet _bottomSheetHowItWorks = PhoenixBottomSheet(); bool _isExpand = false; bool _isICNumError = false; final TextEditingController _conICNumber = TextEditingController(); @override void initState() { super.initState(); WidgetsBinding.instance.addPostFrameCallback((_) { Provider.of<QurbanProvider>(context, listen: false).getQurbanHomePage( context.locale.languageCode.toFormattedLocale(), ); }); } @override Widget build(BuildContext context) { final qurbanProvider = Provider.of<QurbanProvider>(context); if (context.watch<NetworkProvider>().isOnline && qurbanProvider.qurbanHomePage == null) { Provider.of<QurbanProvider>(context, listen: false).getQurbanHomePage( context.locale.languageCode.toFormattedLocale(), ); } return Scaffold( appBar: const QurbanAppBar(), backgroundColor: isOnline(context.watch<NetworkProvider>().isOnline, Palette.primaryLight, Palette.primaryLight), body: isOnline( context.watch<NetworkProvider>().isOnline, isOnlineView(), const NoConnectionPage( pageToNavigate: 'qurban', ), ), ); } Widget isOnlineView() { return (context.watch<QurbanProvider>().qurbanHomePage != null ? SingleChildScrollView( physics: const ClampingScrollPhysics(), controller: _scrollController, child: Column( children: [ QurbanHeader( listSlider: qurbanProvider.qurbanHomePage!.heroBanners!, ), SpacerV( value: isOnline(context.watch<NetworkProvider>().isOnline, Dimens.space24, Dimens.space24)), Padding( padding: EdgeInsets.all(Dimens.space16), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( qurbanProvider.qurbanHomePage!.usps!.heading!, style: TextStyleMs.black1M_20, ), SpacerV(value: Dimens.space16), GridView.count( padding: EdgeInsets.zero, physics: const NeverScrollableScrollPhysics(), shrinkWrap: true, crossAxisCount: 2, mainAxisSpacing: Dimens.space8, crossAxisSpacing: Dimens.space8, childAspectRatio: 2 / 1, children: List.generate( qurbanProvider.qurbanHomePage!.usps!.usps!.length, (index) { return Container( padding: EdgeInsets.symmetric( horizontal: Dimens.space16, ), decoration: BoxDecoration( borderRadius: BorderRadius.circular( Dimens.buttonRadius, ), color: HexColor( qurbanProvider.qurbanHomePage!.usps! .usps![index].backgroundColor!, ), ), alignment: Alignment.center, child: Text( qurbanProvider.qurbanHomePage!.usps! .usps![index].description!, style: TextStyleMs.white_14, textAlign: TextAlign.center, ), ); }, ), ), SpacerV(value: Dimens.space16), PhoenixButton( onPressed: () => _howItWorksBottomSheet(qurbanProvider), borderSide: const BorderSide(color: Palette.primary), buttonElevation: 1, radius: Dimens.buttonRadius, padding: EdgeInsets.symmetric( vertical: Dimens.space10, ), content: Text( qurbanProvider.qurbanHomePage!.howItWorks!.heading!, style: TextStyleMs.baseM_16, ), ), SpacerV(value: Dimens.space40), _checkQurbanStatus(qurbanProvider), SpacerV(value: Dimens.space40), Text( qurbanProvider.qurbanHomePage?.productAbroad?.header ?? "", style: TextStyleMs.black1M_20, ), Text( qurbanProvider .qurbanHomePage?.productAbroad?.description ?? "", style: TextStyleMs.black1_16, ), SpacerV(value: Dimens.space16), GridView.count( padding: EdgeInsets.zero, physics: const NeverScrollableScrollPhysics(), shrinkWrap: true, crossAxisCount: 2, crossAxisSpacing: Dimens.space8, mainAxisSpacing: Dimens.space8, childAspectRatio: 2 / 3.5, children: List.generate( qurbanProvider.qurbanHomePage?.productAbroad ?.productConnection?.edgesProduct?.length ?? 0, (index) { return QurbanBodiesItem( itemsQurbanBodies: qurbanProvider .qurbanHomePage ?.productAbroad ?.productConnection ?.edgesProduct?[index] .nodeProduct, ); }, ), ), SpacerV(value: Dimens.space40), Text( qurbanProvider.qurbanHomePage?.productLocal?.header ?? "", style: TextStyleMs.black1M_20, ), Text( qurbanProvider .qurbanHomePage?.productLocal?.description ?? "", style: TextStyleMs.black1_16, ), SpacerV(value: Dimens.space16), GridView.count( padding: EdgeInsets.zero, physics: const NeverScrollableScrollPhysics(), shrinkWrap: true, crossAxisCount: 2, crossAxisSpacing: Dimens.space8, mainAxisSpacing: Dimens.space8, childAspectRatio: 2 / 3.7, children: List.generate( qurbanProvider.qurbanHomePage?.productLocal ?.productConnection?.edgesProduct?.length ?? 0, (index) { return QurbanBodiesItem( itemsQurbanBodies: qurbanProvider .qurbanHomePage ?.productLocal ?.productConnection ?.edgesProduct?[index] .nodeProduct, ); }, ), ), SpacerV(value: Dimens.space40), InkWell( onTap: () { Utils.directToWhatsApp( number: Global.globalLanguages!.qurban!.waContact!, message: Global.globalLanguages!.qurban!.waMessage!, ); }, child: Container( width: double.maxFinite, padding: EdgeInsets.all(Dimens.space16), decoration: BoxDecoration( borderRadius: BorderRadius.circular( Dimens.buttonRadius, ), color: Palette.waColor.withOpacity(0.16), ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( Global.globalLanguages!.qurban!.waTitle!, style: TextStyleMs.black1M_20, textAlign: TextAlign.center, ), Text( Global.globalLanguages!.qurban!.waDesc!, style: TextStyleMs.black1_16, ), SpacerV(value: Dimens.space16), Container( decoration: BoxDecoration( color: Palette.waColor, borderRadius: BorderRadius.circular( Dimens.buttonRadius, ), ), padding: EdgeInsets.symmetric( vertical: Dimens.space10, ), child: Row( mainAxisAlignment: MainAxisAlignment.center, children: [ SvgPicture.asset(Images.icWa), const SpacerH(), Text( Global.globalLanguages!.qurban!.waButton!, style: TextStyleMs.whiteM_16, ) ], ), ) ], ), ), ), SpacerV(value: Dimens.space60), ], ), ), ], ), ) : Center( child: SizedBox( width: Dimens.space50, height: Dimens.space50, child: const CircularProgressIndicator( strokeWidth: 1.5, valueColor: AlwaysStoppedAnimation(Palette.primary), ), ), )); } void _howItWorksBottomSheet(QurbanProvider qurbanProvider) { _bottomSheetHowItWorks( context, title: qurbanProvider.qurbanHomePage!.howItWorks!.heading!, children: [ Padding( padding: EdgeInsets.symmetric( vertical: Dimens.space12, horizontal: Dimens.space20, ), child: Text( qurbanProvider.qurbanHomePage!.howItWorks!.howToOrder!.heading!, style: TextStyleMs.black1M_20, textAlign: TextAlign.center, ), ), for (final item in qurbanProvider.qurbanHomePage!.howItWorks!.howToOrder!.steps!) Padding( padding: EdgeInsets.symmetric( vertical: Dimens.space12, horizontal: Dimens.space20, ), child: Row( children: [ Image.network( item.icon!.files![0].node!.url!, width: Dimens.space64, ), SpacerH(value: Dimens.space16), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( item.title!, style: TextStyleMs.black1M_16, ), Text( item.description!, style: TextStyleMs.black1_14, ), ], ), ) ], ), ), Padding( padding: EdgeInsets.symmetric( vertical: Dimens.space12, horizontal: Dimens.space20, ), child: Text( qurbanProvider .qurbanHomePage!.howItWorks!.howToCheckStatus!.heading!, style: TextStyleMs.black1M_20, textAlign: TextAlign.center, ), ), for (final item in qurbanProvider .qurbanHomePage!.howItWorks!.howToCheckStatus!.steps!) Padding( padding: EdgeInsets.symmetric( vertical: Dimens.space12, horizontal: Dimens.space20, ), child: Row( children: [ Image.network( item.icon!.files![0].node!.url!, width: Dimens.space64, ), SpacerH(value: Dimens.space16), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( item.title!, style: TextStyleMs.black1M_16, ), Text( item.description!, style: TextStyleMs.black1_14, ), ], ), ) ], ), ) ], ); } Widget _checkQurbanStatus(QurbanProvider qurbanProvider) { return AnimatedContainer( duration: const Duration(milliseconds: 300), padding: EdgeInsets.only( top: Dimens.space16, bottom: _isExpand ? Dimens.none : Dimens.space8, ), decoration: BoxDecoration( color: Palette.prayerBgColor, borderRadius: BorderRadius.circular(Dimens.buttonRadius), ), child: Column( children: [ Padding( padding: EdgeInsets.symmetric( horizontal: Dimens.space16, ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( qurbanProvider.qurbanHomePage!.checkStatus!.heading!, style: TextStyleMs.black1M_20, ), Text( qurbanProvider.qurbanHomePage!.checkStatus!.subheading!, style: TextStyleMs.black1_16, ), if (!_isExpand) TextButton( onPressed: () { setState(() { _isExpand = true; }); }, style: TextButton.styleFrom( padding: EdgeInsets.zero, ), child: Row( children: [ Text( qurbanProvider .qurbanHomePage!.checkStatus!.expandText!, style: TextStyleMs.black1_16, ), SpacerH(value: Dimens.space16), CircleAvatar( backgroundColor: Palette.white, maxRadius: Dimens.space10, child: Icon( Icons.keyboard_arrow_down_rounded, size: Dimens.space16, color: Palette.black, ), ) ], ), ), if (_isExpand) ...{ SpacerV(value: Dimens.space16), PhoenixTextField( textEditingController: _conICNumber, label: qurbanProvider.qurbanHomePage!.checkStatus!.inputLabel!, isError: _isICNumError, errorMessage: _conICNumber.text.isEmpty ? Global.globalLanguages!.qurban!.errorEmpty! : Global.globalLanguages!.qurban!.errorICNumber, validator: () { setState(() { _isICNumError = !_conICNumber.text.isNotEmpty; }); }, ), const SpacerV(), PhoenixDropdown<QurbanTypes>( value: qurbanProvider.selectedQurbanType, onChanged: (body) { if (body != null) { qurbanProvider.selectedQurbanType = body; } }, items: qurbanProvider.qurbanHomePage!.checkStatus! .qurbanTypeConnection!.qurbanTypes! .map((body) { return DropdownMenuItem( alignment: Alignment.centerLeft, value: body, child: Text(body.qurbanType!.title!), ); }).toList(), ), PhoenixButton( buttonElevation: Dimens.space1, buttonColor: Palette.primary, radius: Dimens.buttonRadius, padding: EdgeInsets.symmetric( vertical: Dimens.space12, ), content: Text( qurbanProvider.qurbanHomePage!.checkStatus!.cta!, style: TextStyleMs.whiteM_16, ), onPressed: () async { setState(() { _isICNumError = !_conICNumber.text.isNotEmpty; }); if (_conICNumber.text.isNotEmpty) { /// check ic number only for /// Qurban Local & Abroad if ((qurbanProvider .selectedQurbanType.qurbanType?.link ?? "") == "orders/") { bool isValid = await qurbanProvider.isValidIC( context, _conICNumber.text, ); if (!isValid) { setState(() { _isICNumError = true; }); return; } } if (mounted) { onCheckStatus(qurbanProvider); } } }, ), } ], ), ), if (_isExpand) ...{ SpacerV(value: Dimens.space16), CachedNetworkImage( imageUrl: qurbanProvider.qurbanHomePage!.checkStatus! .imageConnection!.edges![0].node!.url!, ), } ], ), ); } void onCheckStatus(QurbanProvider qurbanProvider) { String? qurbanPath = Global.staticConfiguration!.configuration!.qurbanPath; String href = qurbanProvider.selectedQurbanType.qurbanType?.link ?? ""; String externalAuth = StorageHelper().isLogin ? "&externalAuth=${SSOHelper.constructSSOAuth()}" : ""; String languageCode = context.locale.languageCode.toFormattedLocaleSlash(); String baseUrlQurban = "$qurbanPath/$languageCode/"; String url; if (href == "orders/") { url = "$baseUrlQurban$href?ic=${_conICNumber.text}&layout=0$externalAuth"; } else { url = "https://aqiqah.ikhlas.com/status.php?ic=${_conICNumber.text}&step=2&layout=0"; } Navigator.of(context).pushNamed( "nt_webview", arguments: { "url": url, "title": qurbanProvider.selectedQurbanType.qurbanType?.appbarTitle ?? "", "icNumber": _conICNumber.text, }, ); } }
Editor is loading...