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 infoList; final Color backgroundColor; final double preferredSize; final bool showHomeAppBarIcon; final List appBarIcons; final List imagesInfo; final bool isHelp; final bool isLocalLoader; final Function backButtonTab; final ValueChanged 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 { AuthenticatedUserObject authenticatedUserObject = locator(); @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(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(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().navigatorKey.currentContext, MaterialPageRoute( builder: (context) => LandingPagePharmacy(currentTab: value)), (Route r) => false); } } Widget mainBody() { return SafeArea( top: true, bottom: true, child: (!Provider.of(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: [ Center( child: widget.isLoading ? CircularProgressIndicator( backgroundColor: Colors.white, valueColor: AlwaysStoppedAnimation( Colors.grey[500], ), ) : widget.body), widget.isHelp == true ? RobotIcon() : Container() ]); } } class AppBarWidget extends StatefulWidget with PreferredSizeWidget { final AuthenticatedUserObject authenticatedUserObject = locator(); final String appBarTitle; final bool showHomeAppBarIcon; final List 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 createState() => AppBarWidgetState(); @override Size get preferredSize => Size(double.maxFinite, 60); } String _badgeText = "0"; class AppBarWidgetState extends State { @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.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 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 { 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(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(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; // } }