Sample Network Provider

 avatar
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...