Sample Network Provider
unknown
dart
3 years ago
22 kB
9
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...