import 'package:diplomaticquarterapp/config/config.dart'; import 'package:diplomaticquarterapp/config/size_config.dart'; import 'package:diplomaticquarterapp/core/model/ImagesInfo.dart'; import 'package:diplomaticquarterapp/config/size_config.dart'; import 'package:diplomaticquarterapp/core/service/AuthenticatedUserObject.dart'; import 'package:diplomaticquarterapp/core/viewModels/base_view_model.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/routes.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/progress_indicator/app_loader_widget.dart'; import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; import 'package:diplomaticquarterapp/widgets/weather_slider/weather_slider.dart'; import 'package:diplomaticquarterapp/widgets/typewriter/typewiter.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 'package:diplomaticquarterapp/services/robo_search/event_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'; import 'package:diplomaticquarterapp/services/authentication/auth_provider.dart'; import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; class AppScaffold extends StatelessWidget { 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 String title; final String description; final String image; final bool isShowDecPage; final List infoList; final Color backgroundColor; final bool isHelp; final double preferredSize; final List appBarIcons; final PreferredSizeWidget appBarWidget; ProjectViewModel projectProvider; final List imagesInfo; AuthenticatedUserObject authenticatedUserObject = locator(); AppScaffold({ @required this.body, this.appBarTitle = '', this.isLoading = false, this.isShowAppBar = false, this.hasAppBarParam, this.bottomSheet, this.baseViewModel, this.floatingActionButton, this.isPharmacy = false, this.title, this.description, this.isShowDecPage = true, this.backgroundColor, this.isBottomBar, this.preferredSize = 0.0, this.appBarIcons, this.appBarWidget, this.image, this.infoList, this.isHelp = false, this.imagesInfo, }); @override Widget build(BuildContext context) { AppGlobal.context = context; PreferredSizeWidget appBar; if (this.appBarWidget == null) { PreferredSizeWidget appBarWidget = AppBarWidget( appBarTitle, appBarIcons, isShowAppBar, isPharmacy: isPharmacy, isShowDecPage: isShowDecPage, image: image, ); appBar = preferredSize == 0 ? appBarWidget : PreferredSize( child: appBarWidget, preferredSize: Size.fromHeight(preferredSize)); } else { appBar = this.appBarWidget; } return Scaffold( backgroundColor: backgroundColor ?? Theme.of(context).scaffoldBackgroundColor, appBar: appBar, body: (!Provider.of(context, listen: false).isLogin && isShowDecPage) ? NotAutPage( title: appBarTitle, description: description, infoList: infoList, imagesInfo: imagesInfo, ) : baseViewModel != null ? NetworkBaseView( child: buildBodyWidget(context), baseViewModel: baseViewModel, ) : buildBodyWidget(context), bottomSheet: bottomSheet //floatingActionButton: floatingActionButton ?? floatingActionButton, // bottomNavigationBar: // this.isBottomBar == true ? BottomBarSearch() : SizedBox() //floatingActionButton: FloatingSearchButton(), ); } buildAppLoaderWidget(bool isLoading) { return isLoading ? AppLoaderWidget() : Container(); } buildBodyWidget(context) { // return body; //Stack(children: [body, buildAppLoaderWidget(isLoading)]); //&& Provider.of(context, listen: false).havePrivilege(77) need to added return Stack( children: [body, isHelp == true ? RobotIcon() : Container()]); } } class AppBarWidget extends StatelessWidget with PreferredSizeWidget { final AuthenticatedUserObject authenticatedUserObject = locator(); final String appBarTitle; final List appBarIcons; final bool isShowAppBar; final bool isPharmacy; final bool isShowDecPage; final String image; AppBarWidget(this.appBarTitle, this.appBarIcons, this.isShowAppBar, {this.isPharmacy = true, this.isShowDecPage = true, this.image}); @override Widget build(BuildContext context) { return buildAppBar(context); } Widget buildAppBar(BuildContext context) { return isShowAppBar ? AppBar( elevation: 0, backgroundColor: isPharmacy ? Colors.green : Theme.of(context).appBarTheme.color, textTheme: TextTheme( headline6: TextStyle(color: Colors.white, fontWeight: FontWeight.bold), ), title: Texts( authenticatedUserObject.isLogin || !isShowDecPage ? appBarTitle.toUpperCase() : TranslationBase.of(context).serviceInformationTitle, color: Colors.white, bold: true, ), leading: Builder( builder: (BuildContext context) { return ArrowBack(); }, ), centerTitle: true, actions: [ isPharmacy ? IconButton( icon: Icon(Icons.shopping_cart), color: Colors.white, onPressed: () { Navigator.of(context) .popUntil(ModalRoute.withName('/')); }) : Container(), image != null ? InkWell( onTap: () => Navigator.push( context, FadePage( page: InsuranceUpdate(), ), ), child: Padding( padding: const EdgeInsets.all(8.0), child: Image.asset( image, height: SizeConfig.heightMultiplier * 5, width: SizeConfig.heightMultiplier * 5, color: Colors.white, ), ), ) : IconButton( icon: Icon(FontAwesomeIcons.home), color: Colors.white, onPressed: () { Navigator.pushAndRemoveUntil( context, MaterialPageRoute( builder: (context) => LandingPage()), (Route r) => false); }, ), if (appBarIcons != null) ...appBarIcons ], ) : Container( height: 0, width: 0, ); } @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') { setState(() { if (this.mounted) { this.isAnimation = false; } }); } }); setState(() { setAnimation(); }); 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: 50); } setAnimation() async { //await sharedPref.getBool(IS_ROBOT_VISIBLE) || var animation = await sharedPref.getBool(IS_ROBOT_INIT) == null ? true : false; setState(() { this.isAnimation = animation; }); } }