import ' package:badges/badges.dart ' ;
import ' package:barcode_scan_fix/barcode_scan.dart ' ;
import ' package:diplomaticquarterapp/config/config.dart ' ;
import ' package:diplomaticquarterapp/config/size_config.dart ' ;
import ' package:diplomaticquarterapp/config/size_config.dart ' ;
import ' package:diplomaticquarterapp/core/model/ImagesInfo.dart ' ;
import ' package:diplomaticquarterapp/core/model/pharmacies/PharmacyProduct.dart ' ;
import ' package:diplomaticquarterapp/core/service/AuthenticatedUserObject.dart ' ;
import ' package:diplomaticquarterapp/core/service/client/base_app_client.dart ' ;
import ' package:diplomaticquarterapp/core/viewModels/PharmacyPagesViewModel.dart ' ;
import ' package:diplomaticquarterapp/core/viewModels/base_view_model.dart ' ;
import ' package:diplomaticquarterapp/core/viewModels/pharmacyModule/OrderPreviewViewModel.dart ' ;
import ' package:diplomaticquarterapp/core/viewModels/project_view_model.dart ' ;
import ' package:diplomaticquarterapp/pages/insurance/insurance_update_screen.dart ' ;
import ' package:diplomaticquarterapp/pages/landing/landing_page.dart ' ;
import ' package:diplomaticquarterapp/pages/landing/landing_page_pharmcy.dart ' ;
import ' package:diplomaticquarterapp/pages/pharmacies/screens/cart-page/cart-order-page.dart ' ;
import ' package:diplomaticquarterapp/pages/pharmacies/screens/pharmacy_module_page.dart ' ;
import ' package:diplomaticquarterapp/pages/pharmacies/screens/product-details/product-detail.dart ' ;
import ' package:diplomaticquarterapp/pages/pharmacy/profile/profile.dart ' ;
import ' package:diplomaticquarterapp/pages/pharmacy_categorise.dart ' ;
import ' package:diplomaticquarterapp/pages/search_products_page.dart ' ;
import ' package:diplomaticquarterapp/routes.dart ' ;
import ' package:diplomaticquarterapp/services/robo_search/event_provider.dart ' ;
import ' package:diplomaticquarterapp/uitl/app_toast.dart ' ;
import ' package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart ' ;
import ' package:diplomaticquarterapp/uitl/navigation_service.dart ' ;
import ' package:diplomaticquarterapp/uitl/translations_delegate_base.dart ' ;
import ' package:diplomaticquarterapp/widgets/data_display/text.dart ' ;
import ' package:diplomaticquarterapp/widgets/others/bottom_bar.dart ' ;
import ' package:diplomaticquarterapp/widgets/pharmacy/bottom_nav_pharmacy_bar.dart ' ;
import ' package:diplomaticquarterapp/widgets/progress_indicator/app_loader_widget.dart ' ;
import ' package:diplomaticquarterapp/widgets/transitions/fade_page.dart ' ;
import ' package:diplomaticquarterapp/widgets/typewriter/typewiter.dart ' ;
import ' package:diplomaticquarterapp/widgets/weather_slider/weather_slider.dart ' ;
import ' package:flutter/material.dart ' ;
import ' package:flutter_svg/flutter_svg.dart ' ;
import ' package:font_awesome_flutter/font_awesome_flutter.dart ' ;
import ' package:provider/provider.dart ' ;
import ' ../../locator.dart ' ;
import ' floating_button_search.dart ' ;
import ' ../progress_indicator/app_loader_widget.dart ' ;
import ' arrow_back.dart ' ;
import ' network_base_view.dart ' ;
import ' not_auh_page.dart ' ;
VoidCallback _onCartClick ;
class AppScaffold extends StatefulWidget {
AppBarWidget appBar ;
final String appBarTitle ;
final Widget body ;
final Widget bottomSheet ;
final bool isLoading ;
final bool isShowAppBar ;
final bool hasAppBarParam ;
final BaseViewModel baseViewModel ;
final bool isBottomBar ;
final Widget floatingActionButton ;
final bool isPharmacy ;
final bool isMainPharmacyPages ;
final bool isOfferPackages ;
final bool showPharmacyCart ;
final bool showOfferPackagesCart ;
final bool extendBody ;
final String title ;
final String description ;
final bool isShowDecPage ;
final List < String > infoList ;
final Color backgroundColor ;
final double preferredSize ;
final bool showHomeAppBarIcon ;
final List < Widget > appBarIcons ;
final List < ImagesInfo > imagesInfo ;
final bool isHelp ;
final bool isLocalLoader ;
final Function backButtonTab ;
final ValueChanged < int > changeCurrentTab ;
final Widget customAppBar ;
final int currentTab ;
final bool isShowPharmacyAppbar ;
AppScaffold setOnAppBarCartClick ( VoidCallback onClick ) {
_onCartClick = onClick ;
return this ;
}
AppScaffold (
{ @ required this . body ,
this . appBarTitle = ' ' ,
this . isLoading = false ,
this . isShowAppBar = false ,
this . hasAppBarParam ,
this . bottomSheet ,
this . baseViewModel ,
this . floatingActionButton ,
this . isPharmacy = false ,
this . isMainPharmacyPages = false ,
this . showPharmacyCart = true ,
this . isOfferPackages = false ,
this . showOfferPackagesCart = false ,
this . extendBody = false ,
this . title ,
this . description ,
this . isShowDecPage = true ,
this . isBottomBar = false ,
this . backgroundColor ,
this . preferredSize = 0.0 ,
this . appBarIcons ,
this . infoList ,
this . isHelp = false ,
this . showHomeAppBarIcon = true ,
this . imagesInfo ,
appBar ,
this . customAppBar ,
this . isLocalLoader = false ,
this . backButtonTab ,
this . changeCurrentTab ,
this . currentTab ,
this . isShowPharmacyAppbar = false } ) ;
@ override
_AppScaffoldState createState ( ) = > _AppScaffoldState ( ) ;
}
class _AppScaffoldState extends State < AppScaffold > {
AuthenticatedUserObject authenticatedUserObject =
locator < AuthenticatedUserObject > ( ) ;
@ override
void initState ( ) {
super . initState ( ) ;
}
AppBar pharmacyAppbar ( ) {
return AppBar (
backgroundColor: Color ( 0xff5AB145 ) ,
elevation: 0 ,
title: Container (
height: MediaQuery . of ( context ) . size . height * 0.056 ,
decoration: BoxDecoration (
borderRadius: BorderRadius . circular ( 5.0 ) ,
color: Colors . white ,
) ,
child: InkWell (
child: Padding (
padding: EdgeInsets . all ( 5.0 ) ,
child: Row (
//crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment . start ,
children: [
Icon ( Icons . search , size: 25.0 ) ,
SizedBox (
width: 15.0 ,
) ,
Texts (
TranslationBase . of ( context ) . searchProductHere ,
fontSize: 13 ,
)
] ,
) ,
) ,
onTap: ( ) {
Navigator . push (
context ,
FadePage ( page: SearchProductsPage ( ) ) ,
) ;
} ,
) ,
) ,
leading: Builder (
builder: ( BuildContext context ) {
return InkWell (
onTap: ( ) {
Provider . of < PharmacyPagesViewModel > ( context , listen: false )
. changeCurrentTab ( 0 ) ;
} ,
child: Container (
height: 2.0 ,
width: 10.0 ,
child: Image . asset (
' assets/images/pharmacy_logo.png ' ,
) ,
) ,
) ;
} ,
) ,
actions: [
IconButton (
// iconSize: 70,
icon: Image . asset (
' assets/images/new-design/qr-code.png ' ,
) ,
onPressed: _scanQrAndGetProduct //do something,
)
] ,
centerTitle: true ,
) ;
}
@ override
Widget build ( BuildContext context ) {
PharmacyPagesViewModel pagesViewModel = Provider . of ( context ) ;
AppGlobal . context = context ;
return Scaffold (
backgroundColor:
widget . backgroundColor ? ? Theme . of ( context ) . scaffoldBackgroundColor ,
extendBody: widget . extendBody ,
appBar: widget . isShowPharmacyAppbar
? pharmacyAppbar ( )
: widget . isShowAppBar
? widget . customAppBar ! = null
? widget . customAppBar
: widget . appBar = AppBarWidget (
appBarTitle: widget . appBarTitle ,
appBarIcons: widget . appBarIcons ,
showHomeAppBarIcon: widget . showHomeAppBarIcon ,
isPharmacy: widget . isPharmacy ,
showPharmacyCart: widget . showPharmacyCart ,
isOfferPackages: widget . isOfferPackages ,
showOfferPackagesCart: widget . showOfferPackagesCart ,
isShowDecPage: widget . isShowDecPage ,
backButtonTab: widget . backButtonTab ,
)
: null ,
bottomSheet: widget . bottomSheet ,
body: ( ! Provider . of < ProjectViewModel > ( context , listen: false ) . isLogin & &
widget . isShowDecPage )
? NotAutPage (
title: widget . title ? ? widget . appBarTitle ,
description: widget . description ,
infoList: widget . infoList ,
imagesInfo: widget . imagesInfo ,
)
: widget . baseViewModel ! = null
? NetworkBaseView (
child: buildBodyWidget ( context ) ,
baseViewModel: widget . baseViewModel ,
)
: buildBodyWidget ( context ) ,
floatingActionButton: widget . floatingActionButton ,
bottomNavigationBar: widget . isBottomBar
? BottomNavPharmacyBar (
changeIndex: changeCurrentTab ,
index: widget . currentTab ,
)
: null ,
) ;
}
void changeCurrentTab ( int value ) {
if ( widget . isMainPharmacyPages ) {
widget . changeCurrentTab ( value ) ;
} else {
Navigator . pushAndRemoveUntil (
locator < NavigationService > ( ) . navigatorKey . currentContext ,
MaterialPageRoute (
builder: ( context ) = > LandingPagePharmacy ( currentTab: value ) ) ,
( Route < dynamic > r ) = > false ) ;
}
}
Widget mainBody ( ) {
return SafeArea (
top: true ,
bottom: true ,
child: ( ! Provider . of < ProjectViewModel > ( context , listen: false ) . isLogin & &
widget . isShowDecPage )
? NotAutPage (
title: widget . title ? ? widget . appBarTitle ,
description: widget . description ,
infoList: widget . infoList ,
imagesInfo: widget . imagesInfo ,
)
: widget . baseViewModel ! = null
? NetworkBaseView (
child: buildBodyWidget ( context ) ,
baseViewModel: widget . baseViewModel ,
)
: buildBodyWidget ( context ) ,
) ;
}
void _scanQrAndGetProduct ( ) async {
try {
String result = await BarcodeScanner . scan ( ) ;
try {
String barcode = result ;
GifLoaderDialogUtils . showMyDialog ( context ) ;
await BaseAppClient ( )
. getPharmacy ( " $ GET_PHARMACY_PRODUCTs_BY_SKU $ barcode " ,
onSuccess: ( dynamic response , int statusCode ) {
print ( response ) ;
var product = PharmacyProduct . fromJson ( response [ " products " ] [ 0 ] ) ;
GifLoaderDialogUtils . hideDialog ( context ) ;
Navigator . push ( context , FadePage ( page: ProductDetailPage ( product ) ) ) ;
} , onFailure: ( String error , int statusCode ) {
GifLoaderDialogUtils . hideDialog ( context ) ;
AppToast . showErrorToast ( message: " Product not found " ) ;
} ) ;
} catch ( apiEx ) {
AppToast . showErrorToast (
message: " Something went wrong, please try again " ) ;
}
} catch ( barcodeEx ) { }
}
buildAppLoaderWidget ( bool isLoading ) {
return isLoading ? AppLoaderWidget ( ) : Container ( ) ;
}
buildBodyWidget ( context ) {
return Stack ( children: < Widget > [
Center (
child: widget . isLoading
? CircularProgressIndicator (
backgroundColor: Colors . white ,
valueColor: AlwaysStoppedAnimation < Color > (
Colors . grey [ 500 ] ,
) ,
)
: widget . body ) ,
widget . isHelp = = true ? RobotIcon ( ) : Container ( )
] ) ;
}
}
class AppBarWidget extends StatefulWidget with PreferredSizeWidget {
final AuthenticatedUserObject authenticatedUserObject =
locator < AuthenticatedUserObject > ( ) ;
final String appBarTitle ;
final bool showHomeAppBarIcon ;
final List < Widget > appBarIcons ;
final bool isPharmacy ;
final bool isOfferPackages ;
final bool showPharmacyCart ;
final bool showOfferPackagesCart ;
final bool isShowDecPage ;
final Function backButtonTab ;
Function ( String ) badgeUpdater ;
AppBarWidget (
{ this . appBarTitle ,
this . showHomeAppBarIcon ,
this . appBarIcons ,
this . isPharmacy = true ,
this . showPharmacyCart = true ,
this . isOfferPackages = false ,
this . showOfferPackagesCart = false ,
this . backButtonTab ,
this . isShowDecPage = true } ) ;
@ override
State < StatefulWidget > createState ( ) = > AppBarWidgetState ( ) ;
@ override
Size get preferredSize = > Size ( double . maxFinite , 60 ) ;
}
String _badgeText = " 0 " ;
class AppBarWidgetState extends State < AppBarWidget > {
@ override
Widget build ( BuildContext context ) {
widget . badgeUpdater = badgeUpdateBlock ;
return buildAppBar ( context ) ;
}
badgeUpdateBlock ( String value ) {
setState ( ( ) {
_badgeText = value ;
} ) ;
}
Widget buildAppBar ( BuildContext context ) {
ProjectViewModel projectViewModel = Provider . of ( context ) ;
OrderPreviewViewModel orderPreviewViewModel = Provider . of ( context ) ;
return AppBar (
elevation: 0 ,
backgroundColor: widget . isPharmacy
? Colors . green
: Theme . of ( context ) . appBarTheme . color ,
textTheme: TextTheme (
headline6: TextStyle (
color: Theme . of ( context ) . textTheme . headline1 . color ,
fontWeight: FontWeight . bold ) ,
) ,
title: Text (
widget . authenticatedUserObject . isLogin | | ! widget . isShowDecPage
? widget . appBarTitle . toUpperCase ( )
: TranslationBase . of ( context ) . serviceInformationTitle ,
style: TextStyle (
fontWeight: FontWeight . bold ,
color: Theme . of ( context ) . textTheme . headline1 . color ,
fontFamily: projectViewModel . isArabic ? ' Cairo ' : ' WorkSans ' ) ) ,
leading: Builder (
builder: ( BuildContext context ) {
return ArrowBack (
onTap: widget . backButtonTab ,
) ;
} ,
) ,
centerTitle: true ,
actions: < Widget > [
// (widget.isPharmacy && widget.showPharmacyCart)
// ? Container()
// // ? IconButton(
// // icon: Badge(
// // shape: BadgeShape.circle,
// // badgeContent:
// // Text(_badgeText, style: TextStyle(color: Colors.white)),
// // child: Icon(Icons.shopping_cart)),
// // color: Colors.white,
// // onPressed: () {
// // Navigator.of(context).popUntil(ModalRoute.withName('/'));
// // })
// : Container(),
( widget . isOfferPackages & & widget . showOfferPackagesCart )
? IconButton (
icon: Badge (
position: BadgePosition . topStart ( top: - 15 , start: - 10 ) ,
badgeContent: Text (
orderPreviewViewModel . cartResponse . quantityCount
. toString ( ) /*_badgeText*/ ,
style: TextStyle (
fontSize: 9 ,
color: Colors . white ,
fontWeight: FontWeight . normal ) ,
) ,
child: Icon ( Icons . shopping_cart ) ) ,
color: Colors . white ,
onPressed: ( ) {
// Cart Click Event
if ( _onCartClick ! = null ) _onCartClick ( ) ;
} )
: Container ( ) ,
if ( widget . showHomeAppBarIcon )
IconButton (
icon: Icon ( FontAwesomeIcons . home ) ,
color: Colors . white ,
onPressed: ( ) {
Navigator . pushAndRemoveUntil (
context ,
MaterialPageRoute ( builder: ( context ) = > LandingPage ( ) ) ,
( Route < dynamic > r ) = > false ) ;
// Cart Click Event
if ( _onCartClick ! = null ) _onCartClick ( ) ;
} ,
) ,
if ( widget . appBarIcons ! = null ) . . . widget . appBarIcons
] ,
) ;
}
@ override
Size get preferredSize = > Size ( double . maxFinite , 60 ) ;
}
class RobotIcon extends StatefulWidget {
@ override
_RobotIcon createState ( ) = > _RobotIcon ( ) ;
}
class _RobotIcon extends State < RobotIcon > {
var event = RobotProvider ( ) ;
bool isAnimation = false ;
@ override
void initState ( ) {
event . controller . stream . listen ( ( p ) {
if ( p [ ' animationEnable ' ] = = ' false ' ) {
if ( this . mounted ) {
setState ( ( ) {
this . isAnimation = false ;
} ) ;
}
} else if ( p [ ' animationEnable ' ] = = ' true ' ) {
if ( this . mounted ) {
setState ( ( ) {
this . isAnimation = true ;
} ) ;
}
}
if ( p [ ' isRobotVisible ' ] = = ' false ' ) {
if ( this . mounted ) {
setState ( ( ) {
if ( IS_VOICE_COMMAND_CLOSED = = true ) {
this . isAnimation = false ;
}
} ) ;
}
}
} ) ;
super . initState ( ) ;
}
@ override
Widget build ( BuildContext context ) {
return Positioned (
child: Column (
children: [
isAnimation
? Container (
height: 150 ,
width: 200 ,
padding: EdgeInsets . all ( 5 ) ,
margin: EdgeInsets . only ( right: 35.0 , bottom: 0 ) ,
decoration: BoxDecoration (
borderRadius: BorderRadius . circular ( 10 ) ,
color: Colors . white ,
boxShadow: [
BoxShadow ( color: Colors . black , spreadRadius: 1 ) ,
] ,
) ,
child: TyperAnimatedTextKit (
text: Provider . of < ProjectViewModel > ( context ,
listen: false )
. isArabic = =
true
? " هذه الخدمة تم تصميمها لتتمكن من ربط الملفات الطبية للعائلة بملفك الطبي حتى تتمكن من إدارة سجلاتهم عن طريق تسجيل الدخول إلى ملفك الطبي. "
: " Through this service, you will be able to link your family medical files to your medical file so that you can manage their records by login to your medical file. " ,
textLength: Provider . of < ProjectViewModel > ( context ,
listen: false )
. isArabic = =
true
? " هذه الخدمة تم تصميمها لتتمكن من ربط الملفات الطبية للعائلة بملفك الطبي حتى تتمكن من إدارة سجلاتهم عن طريق تسجيل الدخول إلى ملفك الطبي. "
. length
: " Through this service, you will be able to link your family medical files to your medical file so that you can manage their records by login to your medical file. "
. length ) )
: Container ( ) ,
Stack (
children: [
isAnimation
? Positioned (
top: 0 ,
right: 40 ,
child: Container (
height: 0 ,
width: 0 ,
decoration: ShapeDecoration (
color: Colors . grey ,
shape: MessageBorder ( reverse: true ) ,
) ) )
: Container ( ) ,
FloatingSearchButton ( )
] ,
)
] ,
) ,
right: - 30 ,
bottom: - 15 ) ;
}
// setAnimation() async {
// /// await sharedPref.getBool(IS_ROBOT_VISIBLE) ||
// // var animation =
// // IS_TEXT_COMPLETED == ? true : false;
// }
}