diff --git a/lib/config/localized_values.dart b/lib/config/localized_values.dart index de0b836f..e5d512c1 100644 --- a/lib/config/localized_values.dart +++ b/lib/config/localized_values.dart @@ -1394,6 +1394,25 @@ const Map localizedValues = { "enter-passport-number": {"en": "Please confirm or update your passport number:", "ar": "الرجاء تأكيد أو تحديث رقم جواز السفر الخاص بك:"}, "valid-passport-number": {"en": "Please enter valid passport number", "ar": "الرجاء إدخال رقم جواز سفر صالح"}, "continue-plan": {"en": "Continue with the treatment plan?", "ar": "إكمال الخطة العلاجية؟"}, + "about-app": {"en": "About the app", "ar": "عن التطبيق"}, + "about-points": { + "length": {"en": "16", "ar": "16"}, + "1": {"en": "Online Appointment Booking & rescheduling", "ar": "حجز المواعيد إلكترونياً و إعادة جدولتها"}, + "2": {"en": "Insurance approval status", "ar": "موافقات شركات التأمين الطبية"}, + "3": {"en": "Find A doctor", "ar": "معلومات الأطباء والبحث عنهم وسؤالهم"}, + "4": {"en": "Ask your doctor", "ar": "اسأل طبيبك"}, + "5": {"en": "Medical prescriptions", "ar": "الوصفات الطبية"}, + "6": {"en": "Lab results", "ar": "نتائج التحاليل المخبرية"}, + "7": {"en": "Hospitals contact numbers", "ar": "أرقام هواتف جميع المستشفيات"}, + "8": {"en": "Doctor profiles", "ar": "ملف الطبيب"}, + "9": {"en": "Hospitals locations", "ar": "مواقع المستشفيات على الخريطة"}, + "10": {"en": "Pharmacies Locations", "ar": "مواقع الصيدليات على الخريطة"}, + "11": {"en": "Hospital's Virtual Tour", "ar": "جولة افتراضية داخل المستشفيات"}, + "12": {"en": "Official Social Media", "ar": "مواقع التواصل الاجتماعي الخاصة بالمجموعة"}, + "13": {"en": "Vaccines Schedule", "ar": "جدول التطعيمات"}, + "14": {"en": "Health Calculators", "ar": "حاسبات صحية"}, + "15": {"en": "Other Services", "ar": "خدمات أخرى"} + }, "dental-procedure-list": {"en": "Dental Procedures for this Appointment: ", "ar": "إجراءات الأسنان لهذا الموعد:"}, "time-needed": {"en": "Time Needed:", "ar": "الوقت اللازم:"}, "total-time-needed": {"en": "Total Appointment Time:", "ar": "وقت المواعيد الكلي:"}, diff --git a/lib/config/shared_pref_kay.dart b/lib/config/shared_pref_kay.dart index 4f83e7eb..50390ae2 100644 --- a/lib/config/shared_pref_kay.dart +++ b/lib/config/shared_pref_kay.dart @@ -32,3 +32,4 @@ const PHARMACY_AUTORZIE_TOKEN = 'PHARMACY_AUTORZIE_TOKEN'; const H2O_UNIT = 'H2O_UNIT'; const H2O_REMINDER = 'H2O_REMINDER'; const LIVECARE_CLINIC_DATA = 'LIVECARE_CLINIC_DATA'; +const DOCTOR_SCHEDULE_DATE_SEL = 'DOCTOR_SCHEDULE_DATE_SEL'; diff --git a/lib/core/service/medical/medical_service.dart b/lib/core/service/medical/medical_service.dart index a23519fa..5888fa0d 100644 --- a/lib/core/service/medical/medical_service.dart +++ b/lib/core/service/medical/medical_service.dart @@ -9,6 +9,7 @@ import 'package:diplomaticquarterapp/pages/MyAppointments/models/DoctorScheduleR class MedicalService extends BaseService { List appoitmentAllHistoryResultList = List(); List doctorScheduleResponse = List(); + List freeSlots = []; getAppointmentHistory({bool isActiveAppointment = false}) async { hasError = false; super.error = ""; @@ -46,7 +47,7 @@ class MedicalService extends BaseService { }, body: body); } - Future getSchedule(DoctorList doctorRequest) async { + getSchedule(DoctorList doctorRequest) async { Map request; request = { 'DoctorID': doctorRequest.doctorID, @@ -61,8 +62,29 @@ class MedicalService extends BaseService { }, onFailure: (String error, int statusCode) { throw error; }, body: request); - + doctorScheduleResponse.clear(); localRes['List_DoctorWorkingHoursTable'].forEach((item) => {doctorScheduleResponse.add(DoctorScheduleResponse.fromJson(item))}); } + + getFreeSlot(DoctorList doctorRequest) async { + Map request; + request = { + 'DoctorID': doctorRequest.doctorID, + 'ProjectID': doctorRequest.projectID, + 'ClinicID': doctorRequest.clinicID, + 'DoctorWorkingHoursDays': 7 + }; + dynamic localRes; + await baseAppClient.post(GET_DOCTOR_FREE_SLOTS, + onSuccess: (response, statusCode) async { + localRes = response; + }, onFailure: (String error, int statusCode) { + throw error; + }, body: request); + freeSlots.clear(); + localRes['FreeTimeSlots'].forEach((item) => freeSlots.add(item)); + // localRes['List_DoctorWorkingHoursTable'].forEach((item) => + // {doctorScheduleResponse.add(DoctorScheduleResponse.fromJson(item))}); + } } diff --git a/lib/core/viewModels/medical/medical_view_model.dart b/lib/core/viewModels/medical/medical_view_model.dart index b73e6a5f..647982d1 100644 --- a/lib/core/viewModels/medical/medical_view_model.dart +++ b/lib/core/viewModels/medical/medical_view_model.dart @@ -14,7 +14,7 @@ class MedicalViewModel extends BaseViewModel { _medicalService.appoitmentAllHistoryResultList; List get getDoctorScheduleList => _medicalService.doctorScheduleResponse; - + List get freeSlots => _medicalService.freeSlots; getAppointmentHistory() async { if (authenticatedUserObject.isLogin) { setState(ViewState.Busy); @@ -38,4 +38,16 @@ class MedicalViewModel extends BaseViewModel { setState(ViewState.Idle); } } + + getFreeSlots(DoctorList doctorRequest) async { + if (authenticatedUserObject.isLogin) { + setState(ViewState.Busy); + await _medicalService.getFreeSlot(doctorRequest); + if (_medicalService.hasError) { + error = _medicalService.error; + setState(ViewState.Error); + } else + setState(ViewState.Idle); + } + } } diff --git a/lib/pages/AlHabibMedicalService/health_converter/blood_cholesterol.dart b/lib/pages/AlHabibMedicalService/health_converter/blood_cholesterol.dart index 513b50ab..ac31b98c 100644 --- a/lib/pages/AlHabibMedicalService/health_converter/blood_cholesterol.dart +++ b/lib/pages/AlHabibMedicalService/health_converter/blood_cholesterol.dart @@ -64,6 +64,7 @@ class _BloodCholesterolState extends State { return AppScaffold( isShowAppBar: true, appBarTitle: TranslationBase.of(context).bloodCholesterol, + isShowDecPage: false, body: Padding( padding: const EdgeInsets.all(16.0), child: SingleChildScrollView( diff --git a/lib/pages/AlHabibMedicalService/health_converter/triglycerides.dart b/lib/pages/AlHabibMedicalService/health_converter/triglycerides.dart index 4c5f9a83..7c821055 100644 --- a/lib/pages/AlHabibMedicalService/health_converter/triglycerides.dart +++ b/lib/pages/AlHabibMedicalService/health_converter/triglycerides.dart @@ -66,6 +66,7 @@ class _TriglyceridesState extends State { return AppScaffold( isShowAppBar: true, appBarTitle: TranslationBase.of(context).triglycerides, + isShowDecPage: false, body: Padding( padding: const EdgeInsets.all(16.0), child: SingleChildScrollView( diff --git a/lib/pages/AlHabibMedicalService/my_web_view.dart b/lib/pages/AlHabibMedicalService/my_web_view.dart index c4841a24..9e8defc1 100644 --- a/lib/pages/AlHabibMedicalService/my_web_view.dart +++ b/lib/pages/AlHabibMedicalService/my_web_view.dart @@ -8,7 +8,8 @@ class MyWebView extends StatelessWidget { final String title; final String selectedUrl; - final Completer _controller = Completer(); + final Completer _controller = + Completer(); MyWebView({ @required this.title, @@ -20,6 +21,7 @@ class MyWebView extends StatelessWidget { return AppScaffold( isShowAppBar: true, appBarTitle: title, + isShowDecPage: false, body: WebView( initialUrl: selectedUrl, javascriptMode: JavascriptMode.unrestricted, diff --git a/lib/pages/BookAppointment/DoctorProfile.dart b/lib/pages/BookAppointment/DoctorProfile.dart index a78763ca..cc1239bf 100644 --- a/lib/pages/BookAppointment/DoctorProfile.dart +++ b/lib/pages/BookAppointment/DoctorProfile.dart @@ -119,7 +119,7 @@ class _DoctorProfileState extends State with TickerProviderStateM Navigator.push( context, FadePage( - page: SchedulePage(widget.doctor), + page: SchedulePage(doctorList: widget.doctor), ), ); }, diff --git a/lib/pages/BookAppointment/components/DocAvailableAppointments.dart b/lib/pages/BookAppointment/components/DocAvailableAppointments.dart index 05317e7e..afcbd646 100644 --- a/lib/pages/BookAppointment/components/DocAvailableAppointments.dart +++ b/lib/pages/BookAppointment/components/DocAvailableAppointments.dart @@ -23,8 +23,11 @@ class DocAvailableAppointments extends StatefulWidget { static String selectedDate; static String selectedTime; bool isLiveCareAppointment; - - DocAvailableAppointments({@required this.doctor, @required this.isLiveCareAppointment}); + final dynamic doctorSchedule; + DocAvailableAppointments( + {@required this.doctor, + this.doctorSchedule, + @required this.isLiveCareAppointment}); @override _DocAvailableAppointmentsState createState() => _DocAvailableAppointmentsState(); @@ -66,6 +69,7 @@ class _DocAvailableAppointmentsState extends State wit WidgetsBinding.instance.addPostFrameCallback((_) async { getCurrentLanguage(); + if (widget.isLiveCareAppointment) getDoctorScheduledFreeSlots(context, widget.doctor); else { @@ -334,9 +338,24 @@ class _DocAvailableAppointmentsState extends State wit freeSlotsResponse = res['FreeTimeSlots']; print("res['FreeTimeSlots']"); print(res['FreeTimeSlots'].length); - _getJSONSlots().then((value) => { - setState(() => {_events.clear(), _events = value}) - }); + + _getJSONSlots().then((value) { + setState(() => { + _events.clear(), + _events = value, + if (widget.doctorSchedule != null) + { + _calendarController.setSelectedDay( + DateUtil.convertStringToDate( + widget.doctorSchedule['Date']), + isProgrammatic: true), + _onDaySelected( + DateUtil.convertStringToDate( + widget.doctorSchedule['Date']), + List()) + } + }); + }); } else { DocAvailableAppointments.areAppointmentsAvailable = false; } diff --git a/lib/pages/ContactUs/contact_us_page.dart b/lib/pages/ContactUs/contact_us_page.dart index 39557e4e..8bb19b4c 100644 --- a/lib/pages/ContactUs/contact_us_page.dart +++ b/lib/pages/ContactUs/contact_us_page.dart @@ -1,5 +1,6 @@ import 'package:diplomaticquarterapp/pages/ContactUs/widgets/card_common_contat.dart'; import 'package:diplomaticquarterapp/uitl/location_util.dart'; +import 'package:diplomaticquarterapp/widgets/data_display/medical/medical_profile_item.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:flutter/material.dart'; @@ -31,48 +32,75 @@ class _ContactUsPageState extends State { showNewAppBar: true, showNewAppBarTitle: true, backgroundColor: Color(0xffF8F8F8), - body: Container( - margin: EdgeInsets.fromLTRB(10.0, 20.0, 10.0, 10.0), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - mainAxisSize: MainAxisSize.max, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Expanded( - child: CardCommonContact( - image: 'assets/images/new-design/find_us_icon.png', - text: TranslationBase.of(context).findUs, - subText: "", - type: 0, - ), - ), - Expanded( - child: CardCommonContact(image: 'assets/images/new-design/feedback_icon.png', text: TranslationBase.of(context).feedback, subText: "", type: 1), - ), - ], - ), - Row( - mainAxisSize: MainAxisSize.max, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Expanded( - child: CardCommonContact( - image: 'assets/images/new-design/live_chat_icon.png', - text: TranslationBase.of(context).liveChat, - subText: TranslationBase.of(context).service, - type: 2, - ), - ), - Expanded( - child: Container(), - ), - ], - ), - ], - ), + body: GridView( + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 2, crossAxisSpacing: 13, mainAxisSpacing: 9), + physics: NeverScrollableScrollPhysics(), + padding: EdgeInsets.only(top: 25), + shrinkWrap: true, + children: [ + CardCommonContact( + image: 'assets/images/new-design/find_us_icon.png', + text: TranslationBase.of(context).findUs, + subText: "", + type: 0, + ), + CardCommonContact( + image: 'assets/images/new-design/feedback_icon.png', + text: TranslationBase.of(context).feedback, + subText: "", + type: 1, + ), + CardCommonContact( + image: 'assets/images/new-design/live_chat_icon.png', + text: TranslationBase.of(context).liveChat, + subText: "", + type: 2, + ), + ], ), + + // Container( + // margin: EdgeInsets.fromLTRB(10.0, 20.0, 10.0, 10.0), + // child: Column( + // crossAxisAlignment: CrossAxisAlignment.start, + // children: [ + // Row( + // mainAxisSize: MainAxisSize.max, + // mainAxisAlignment: MainAxisAlignment.start, + // children: [ + // Expanded( + // child: CardCommonContact( + // image: 'assets/images/new-design/find_us_icon.png', + // text: TranslationBase.of(context).findUs, + // subText: "", + // type: 0, + // ), + // ), + // Expanded( + // child: CardCommonContact(image: 'assets/images/new-design/feedback_icon.png', text: TranslationBase.of(context).feedback, subText: "", type: 1), + // ), + // ], + // ), + // Row( + // mainAxisSize: MainAxisSize.max, + // mainAxisAlignment: MainAxisAlignment.start, + // children: [ + // Expanded( + // child: CardCommonContact( + // image: 'assets/images/new-design/live_chat_icon.png', + // text: TranslationBase.of(context).liveChat, + // subText: TranslationBase.of(context).service, + // type: 2, + // ), + // ), + // Expanded( + // child: Container(), + // ), + // ], + // ), + // ], + // ), + // ), ); } } diff --git a/lib/pages/ContactUs/findus/findus_page.dart b/lib/pages/ContactUs/findus/findus_page.dart index 80648292..8e3f3674 100644 --- a/lib/pages/ContactUs/findus/findus_page.dart +++ b/lib/pages/ContactUs/findus/findus_page.dart @@ -4,6 +4,7 @@ import 'package:diplomaticquarterapp/core/viewModels/contactus/findus_view_model import 'package:diplomaticquarterapp/pages/ContactUs/findus/hospitrals_page.dart'; import 'package:diplomaticquarterapp/pages/ContactUs/findus/pharmacies_page.dart'; import 'package:diplomaticquarterapp/pages/base/base_view.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; @@ -15,8 +16,7 @@ class FindUsPage extends StatefulWidget { _FindUsPageState createState() => _FindUsPageState(); } -class _FindUsPageState extends State - with SingleTickerProviderStateMixin { +class _FindUsPageState extends State with SingleTickerProviderStateMixin { TabController _tabController; @override void initState() { @@ -40,89 +40,42 @@ class _FindUsPageState extends State isShowAppBar: true, isShowDecPage: false, appBarTitle: 'Locations', + showNewAppBar: true, + showNewAppBarTitle: true, + backgroundColor: Color(0xffF8F8F8), baseViewModel: model, - body: Scaffold( - extendBodyBehindAppBar: true, - appBar: PreferredSize( - preferredSize: Size.fromHeight(65.0), - child: Stack( - children: [ - Positioned( - bottom: 1, - left: 0, - right: 0, - child: BackdropFilter( - filter: ImageFilter.blur(sigmaX: 10, sigmaY: 10), - child: Container( - color: Theme.of(context) - .scaffoldBackgroundColor - .withOpacity(0.8), - height: 70.0, - ), - ), - ), - Center( - child: Container( - height: 60.0, - margin: EdgeInsets.only(top: 10.0), - width: MediaQuery.of(context).size.width * 0.92, // 0.9, - decoration: BoxDecoration( - border: Border( - bottom: BorderSide( - color: Theme.of(context).dividerColor, - width: 0.9), //width: 0.7 - ), - color: Colors.white), - child: Center( - child: TabBar( - isScrollable: true, - controller: _tabController, - indicatorWeight: 5.0, - indicatorSize: TabBarIndicatorSize.tab, - labelColor: Theme.of(context).primaryColor, - labelPadding: - EdgeInsets.only(top: 4.0, left: 35.0, right: 35.0), - unselectedLabelColor: Colors.grey[800], - tabs: [ - Container( - width: MediaQuery.of(context).size.width * 0.30, - child: Center( - child: Texts(' Hospitals '), - ), - ), - Container( - width: MediaQuery.of(context).size.width * 0.30, - child: Center( - child: Texts(' Pharmacies '), - ), - ), - ], - ), - ), - ), - ), - ], + body: Column( + children: [ + TabBar( + controller: _tabController, + indicatorWeight: 3.0, + indicatorSize: TabBarIndicatorSize.tab, + labelColor: Color(0xff2B353E), + unselectedLabelColor: Color(0xff575757), + labelPadding: EdgeInsets.only(top: 15, bottom: 13, left: 20, right: 20), + labelStyle: TextStyle( + fontSize: 16, + fontWeight: FontWeight.w600, + letterSpacing: -0.48, + ), + unselectedLabelStyle: TextStyle( + fontSize: 16, + fontWeight: FontWeight.w600, + letterSpacing: -0.48, + ), + tabs: [Text(TranslationBase.of(context).hospitals), Text(TranslationBase.of(context).pharmacies)], ), - ), - body: Column( - children: [ - Expanded( - child: TabBarView( - physics: BouncingScrollPhysics(), - controller: _tabController, - children: [ - HospitalsPage( - findusHospitalModelList: model.FindusHospitalModelList, - ), //SendFeedbackPage(), - PharmaciesPage( - findusPharmaciesModelList: - model.FindusPharmaciesModelList, - ) //StatusFeedbackPage() - ], - ), - ) - ], - ), + Expanded( + child: TabBarView( + physics: BouncingScrollPhysics(), + controller: _tabController, + children: [ + HospitalsPage(findusHospitalModelList: model.FindusHospitalModelList), //SendFeedbackPage(), + PharmaciesPage(findusPharmaciesModelList: model.FindusPharmaciesModelList) //StatusFeedbackPage() + ], + ), + ) + ], ), ), ); diff --git a/lib/pages/ContactUs/findus/hospitrals_page.dart b/lib/pages/ContactUs/findus/hospitrals_page.dart index 2d257488..7d2bd31d 100644 --- a/lib/pages/ContactUs/findus/hospitrals_page.dart +++ b/lib/pages/ContactUs/findus/hospitrals_page.dart @@ -1,6 +1,7 @@ import 'package:diplomaticquarterapp/core/model/contactus/get_hmg_locations.dart'; import 'package:diplomaticquarterapp/core/viewModels/contactus/findus_view_model.dart'; import 'package:diplomaticquarterapp/pages/base/base_view.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/buttons/button.dart'; import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; @@ -22,7 +23,180 @@ class HospitalsPage extends StatefulWidget { class _HospitalsPageState extends State { @override Widget build(BuildContext context) { - return AppScaffold( + return SingleChildScrollView( + physics: BouncingScrollPhysics(), + padding: EdgeInsets.only(bottom: 21, top: 21, left: 21, right: 21), + child: Column( + children: [ + ListView.separated( + physics: NeverScrollableScrollPhysics(), + shrinkWrap: true, + padding: EdgeInsets.zero, + separatorBuilder: (context, index) => SizedBox(height: 14), + itemBuilder: (context, index) { + GetHMGLocationsModel _location = widget.findusHospitalModelList[index]; + return Container( + padding: const EdgeInsets.only(left: 12, right: 12, top: 12, bottom: 12), + decoration: BoxDecoration( + borderRadius: BorderRadius.all( + Radius.circular(10.0), + ), + boxShadow: [ + BoxShadow( + color: Color(0xff000000).withOpacity(.05), + //spreadRadius: 5, + blurRadius: 27, + offset: Offset(0, -3), + ), + ], + color: Colors.white), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + InkWell( + onTap: () { + showDialog( + context: context, + builder: (_) => AssetGiffyDialog( + title: Text( + _location.locationName, + style: TextStyle(fontSize: 22.0, fontWeight: FontWeight.w600), + ), + image: Image.network( + _location.projectImageURL.toString(), + fit: BoxFit.cover, + ), + buttonCancelText: Text(TranslationBase.of(context).cancel), + buttonCancelColor: Colors.grey, + onlyCancelButton: true, + ), + ); + }, + child: ClipRRect( + borderRadius: BorderRadius.circular(12), + child: Image.network( + _location.projectImageURL.toString(), + width: 48, + height: 48, + fit: BoxFit.cover, + ), + ), + ), + Expanded( + child: Padding( + padding: EdgeInsets.only(left: 12, right: 12), + child: Text( + _location.locationName?.trim() ?? "", + style: TextStyle( + fontSize: 14, + fontWeight: FontWeight.w600, + color: Color(0xff2E303A), + letterSpacing: -0.56, + ), + ), + ), + ), //model.cOCItemList[index].cOCTitl + IconButton( + icon: Icon( + Icons.location_on, + color: Color(0xff2B353E), + ), + constraints: BoxConstraints(), + padding: EdgeInsets.all(8), + tooltip: '', + onPressed: () { + setState(() { + MapsLauncher.launchCoordinates(double.parse(_location.latitude), double.parse(_location.longitude), _location.locationName); + }); + }, + ), + IconButton( + icon: Icon( + Icons.phone, + color: Color(0xff2B353E), + ), + constraints: BoxConstraints(), + padding: EdgeInsets.all(8), + tooltip: '', + onPressed: () { + setState(() { + launch("tel://" + _location.phoneNumber); + }); + }, + ), + ], + ), + ); + }, + itemCount: widget.findusHospitalModelList.length, + ), + Container( + margin: EdgeInsets.only(top: 14), + decoration: BoxDecoration( + borderRadius: BorderRadius.all( + Radius.circular(10.0), + ), + boxShadow: [ + BoxShadow( + color: Color(0xff000000).withOpacity(.05), + //spreadRadius: 5, + blurRadius: 27, + offset: Offset(0, -3), + ), + ], + color: Colors.white), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + IconButton( + icon: new Image.asset('assets/images/new-design/youtube.png'), + iconSize: 48, + tooltip: 'Youtube', + onPressed: () { + setState(() { + launch("https://www.youtube.com/c/DrsulaimanAlhabibHospitals"); + }); + }, + ), + IconButton( + icon: new Image.asset('assets/images/new-design/linkedin.png'), + tooltip: 'LinkedIn', + iconSize: 48, + onPressed: () { + setState(() { + launch("https://www.linkedin.com/company/drsulaiman-alhabib-medical-group"); + }); + }, + ), + IconButton( + icon: new Image.asset('assets/images/new-design/twitter.png'), + tooltip: 'Twitter', + iconSize: 48, + onPressed: () { + setState(() { + launch("https://twitter.com/HMG"); + }); + }, + ), + IconButton( + icon: new Image.asset('assets/images/new-design/facebook.png'), + tooltip: 'facebook', + iconSize: 48, + onPressed: () { + setState(() { + launch("https://www.facebook.com/DrSulaimanAlHabib?ref=tn_tnmn"); + }); + }, + ), + ], + ), + ), + ], + ), + ); + + AppScaffold( isShowDecPage: false, body: SingleChildScrollView( child: Container( @@ -46,65 +220,37 @@ class _HospitalsPageState extends State { mainAxisAlignment: MainAxisAlignment.center, children: [ Row( - mainAxisAlignment: - MainAxisAlignment.spaceBetween, + mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Expanded( child: Row( - mainAxisAlignment: - MainAxisAlignment.spaceBetween, - crossAxisAlignment: - CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, children: [ InkWell( onTap: () { showDialog( context: context, - builder: (_) => - AssetGiffyDialog( + builder: (_) => AssetGiffyDialog( title: Text( - widget - .findusHospitalModelList[ - index] - .locationName, - style: TextStyle( - fontSize: 22.0, - fontWeight: - FontWeight - .w600), + widget.findusHospitalModelList[index].locationName, + style: TextStyle(fontSize: 22.0, fontWeight: FontWeight.w600), ), image: Image.network( - widget - .findusHospitalModelList[ - index] - .projectImageURL - .toString(), + widget.findusHospitalModelList[index].projectImageURL.toString(), fit: BoxFit.cover, ), - buttonCancelText: - Text('cancel'), - buttonCancelColor: - Colors.grey, + buttonCancelText: Text('cancel'), + buttonCancelColor: Colors.grey, onlyCancelButton: true, )); }, - child: Container( - width: 70, - height: 70, - child: Image.network(widget - .findusHospitalModelList[ - index] - .projectImageURL - .toString())), + child: Container(width: 70, height: 70, child: Image.network(widget.findusHospitalModelList[index].projectImageURL.toString())), ), Expanded( flex: 4, child: Container( - margin: EdgeInsets.only( - left: 5, - right: 5, - top: 10, - bottom: 1), + margin: EdgeInsets.only(left: 5, right: 5, top: 10, bottom: 1), child: Texts( '${widget.findusHospitalModelList[index].locationName}', textAlign: TextAlign.start, @@ -112,14 +258,12 @@ class _HospitalsPageState extends State { Expanded( flex: 2, child: Row( - crossAxisAlignment: - CrossAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, children: [ IconButton( icon: Icon( Icons.location_on, - color: Theme.of(context) - .primaryColor, + color: Theme.of(context).primaryColor, size: 35, ), // icon: new Image.asset( @@ -127,27 +271,15 @@ class _HospitalsPageState extends State { tooltip: '', onPressed: () { setState(() { - MapsLauncher.launchCoordinates( - double.parse(widget - .findusHospitalModelList[ - index] - .latitude), - double.parse(widget - .findusHospitalModelList[ - index] - .longitude), - widget - .findusHospitalModelList[ - index] - .locationName); + MapsLauncher.launchCoordinates(double.parse(widget.findusHospitalModelList[index].latitude), + double.parse(widget.findusHospitalModelList[index].longitude), widget.findusHospitalModelList[index].locationName); }); }, ), IconButton( icon: Icon( Icons.phone, - color: Theme.of(context) - .primaryColor, + color: Theme.of(context).primaryColor, size: 35, ), // icon: new Image.asset( @@ -156,11 +288,7 @@ class _HospitalsPageState extends State { onPressed: () { setState(() { // _volume += 10; - launch("tel://" + - widget - .findusHospitalModelList[ - index] - .phoneNumber); + launch("tel://" + widget.findusHospitalModelList[index].phoneNumber); }); }, ), @@ -193,32 +321,27 @@ class _HospitalsPageState extends State { mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ IconButton( - icon: new Image.asset( - 'assets/images/new-design/youtube.png'), + icon: new Image.asset('assets/images/new-design/youtube.png'), iconSize: 70, tooltip: 'Youtube', onPressed: () { setState(() { - launch( - "https://www.youtube.com/c/DrsulaimanAlhabibHospitals"); + launch("https://www.youtube.com/c/DrsulaimanAlhabibHospitals"); }); }, ), IconButton( - icon: new Image.asset( - 'assets/images/new-design/linkedin.png'), + icon: new Image.asset('assets/images/new-design/linkedin.png'), tooltip: 'LinkedIn', iconSize: 70, onPressed: () { setState(() { - launch( - "https://www.linkedin.com/company/drsulaiman-alhabib-medical-group"); + launch("https://www.linkedin.com/company/drsulaiman-alhabib-medical-group"); }); }, ), IconButton( - icon: new Image.asset( - 'assets/images/new-design/twitter.png'), + icon: new Image.asset('assets/images/new-design/twitter.png'), tooltip: 'Twitter', iconSize: 70, onPressed: () { @@ -228,14 +351,12 @@ class _HospitalsPageState extends State { }, ), IconButton( - icon: new Image.asset( - 'assets/images/new-design/facebook.png'), + icon: new Image.asset('assets/images/new-design/facebook.png'), tooltip: 'facebook', iconSize: 70, onPressed: () { setState(() { - launch( - "https://www.facebook.com/DrSulaimanAlHabib?ref=tn_tnmn"); + launch("https://www.facebook.com/DrSulaimanAlHabib?ref=tn_tnmn"); }); }, ), diff --git a/lib/pages/ContactUs/findus/pharmacies_page.dart b/lib/pages/ContactUs/findus/pharmacies_page.dart index 6cf94728..58460e9c 100644 --- a/lib/pages/ContactUs/findus/pharmacies_page.dart +++ b/lib/pages/ContactUs/findus/pharmacies_page.dart @@ -2,6 +2,7 @@ import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; import 'package:diplomaticquarterapp/core/model/contactus/get_hmg_locations.dart'; import 'package:diplomaticquarterapp/core/viewModels/contactus/findus_view_model.dart'; import 'package:diplomaticquarterapp/pages/base/base_view.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/buttons/button.dart'; import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; @@ -22,239 +23,199 @@ class PharmaciesPage extends StatefulWidget { class _PharmaciesPageState extends State { @override Widget build(BuildContext context) { - return AppScaffold( - isShowDecPage: false, - body: SingleChildScrollView( - child: Container( - margin: EdgeInsets.only(left: 15, right: 15, top: 70), - child: Column( - children: [ - ...List.generate( - widget.findusPharmaciesModelList.length, - (index) => Container( - decoration: BoxDecoration( - shape: BoxShape.rectangle, - border: Border.all(color: Colors.white, width: 0.5), - borderRadius: BorderRadius.all(Radius.circular(5)), - color: Colors.white, - ), - child: Padding( - padding: const EdgeInsets.all(8.0), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - mainAxisAlignment: - MainAxisAlignment.spaceBetween, - children: [ - Expanded( - child: Row( - mainAxisAlignment: - MainAxisAlignment.spaceBetween, - crossAxisAlignment: - CrossAxisAlignment.center, - children: [ - InkWell( - onTap: () { - showDialog( - context: context, - builder: (_) => - AssetGiffyDialog( - title: Text( - widget - .findusPharmaciesModelList[ - index] - .locationName, - style: TextStyle( - fontSize: 22.0, - fontWeight: - FontWeight - .w600), - ), - image: widget - .findusPharmaciesModelList[ - index] - .projectImageURL != - null - ? Image.network( - widget - .findusPharmaciesModelList[ - index] - .projectImageURL, - fit: BoxFit.cover, - ) - : Image.network( - 'https://hmgwebservices.com/Images/Hospitals/15.jpg', - fit: BoxFit.cover, - ), - buttonCancelText: - Text('cancel'), - // buttonCancelText:Text(model.user.projectID) , - buttonCancelColor: - Colors.grey, - onlyCancelButton: true, - )); - }, - child: Container( - width: 70, - height: 70, - child: Image.network(widget - .findusPharmaciesModelList[ - index] - .projectImageURL != - null - ? widget - .findusPharmaciesModelList[ - index] - .projectImageURL - .toString() - : 'https://hmgwebservices.com/Images/Hospitals/15.jpg')), - ), - Expanded( - flex: 4, - child: Container( - margin: EdgeInsets.only( - left: 5, right: 5), - child: Column( - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - Texts( - '${widget.findusPharmaciesModelList[index].locationName}', - textAlign: TextAlign.start, - ), - SizedBox( - height: 4, - ), - Texts( - '${widget.findusPharmaciesModelList[index].cityName}', - textAlign: TextAlign.center, - ), - ], - ), - ), - ), - //model.cOCItemList[index].cOCTitl - Expanded( - flex: 2, - child: Row( - children: [ - IconButton( - icon: Icon(Icons.location_on,color: Theme.of(context).primaryColor,size: 35,), - tooltip: '', - onPressed: () { - setState(() { - MapsLauncher.launchCoordinates( - double.parse(widget - .findusPharmaciesModelList[ - index] - .latitude), - double.parse(widget - .findusPharmaciesModelList[ - index] - .longitude), - widget - .findusPharmaciesModelList[ - index] - .locationName); - }); - }, - ), - IconButton( - icon: Icon(Icons.phone,color: Theme.of(context).primaryColor,size: 35,), - tooltip: 'I', - onPressed: () { - setState(() { - - launch("tel://" + - widget - .findusPharmaciesModelList[ - index] - .phoneNumber); - }); - }, - ), - ], - ), - ), - ], - ), + return SingleChildScrollView( + physics: BouncingScrollPhysics(), + padding: EdgeInsets.only(bottom: 21, top: 21, left: 21, right: 21), + child: Column( + children: [ + ListView.separated( + physics: NeverScrollableScrollPhysics(), + shrinkWrap: true, + padding: EdgeInsets.zero, + separatorBuilder: (context, index) => SizedBox(height: 14), + itemBuilder: (context, index) { + GetHMGLocationsModel _location = widget.findusPharmaciesModelList[index]; + return Container( + padding: const EdgeInsets.only(left: 12, right: 12, top: 12, bottom: 12), + decoration: BoxDecoration( + borderRadius: BorderRadius.all( + Radius.circular(10.0), + ), + boxShadow: [ + BoxShadow( + color: Color(0xff000000).withOpacity(.05), + //spreadRadius: 5, + blurRadius: 27, + offset: Offset(0, -3), + ), + ], + color: Colors.white), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + InkWell( + onTap: () { + showDialog( + context: context, + builder: (_) => AssetGiffyDialog( + title: Text( + _location.locationName, + style: TextStyle(fontSize: 22.0, fontWeight: FontWeight.w600), + ), + image: _location.projectImageURL != null + ? Image.network( + _location.projectImageURL, + fit: BoxFit.cover, + ) + : Image.network( + 'https://hmgwebservices.com/Images/Hospitals/15.jpg', + fit: BoxFit.cover, ), - ], - ), - Divider( - height: 4.5, - color: Colors.grey[500], - ) - ], + buttonCancelText: Text(TranslationBase.of(context).cancel), + // buttonCancelText:Text(model.user.projectID) , + buttonCancelColor: Colors.grey, + onlyCancelButton: true, ), - ), - )), - SizedBox( - height: 8, - ), - Container( - width: double.infinity, - height: 100, - color: Colors.white, - child: Row( - mainAxisSize: MainAxisSize.max, - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - IconButton( - icon: new Image.asset( - 'assets/images/new-design/youtube.png'), - iconSize: 70, - tooltip: 'Youtube', - onPressed: () { - setState(() { - // _volume += 10; - launch( - "https://www.youtube.com/c/DrsulaimanAlhabibHospitals"); - }); + ); }, + child: ClipRRect( + borderRadius: BorderRadius.circular(12), + child: Image.network( + _location?.projectImageURL?.toString() ?? 'https://hmgwebservices.com/Images/Hospitals/15.jpg', + width: 48, + height: 48, + fit: BoxFit.cover, + ), + ), ), - IconButton( - icon: new Image.asset( - 'assets/images/new-design/linkedin.png'), - tooltip: 'LinkedIn', - iconSize: 70, - onPressed: () { - setState(() { - launch( - "https://www.linkedin.com/company/drsulaiman-alhabib-medical-group"); - }); - }, + Expanded( + child: Padding( + padding: EdgeInsets.only(left: 12, right: 12), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + _location.locationName?.trim() ?? "", + style: TextStyle( + fontSize: 14, + fontWeight: FontWeight.w600, + color: Color(0xff2E303A), + letterSpacing: -0.56, + ), + ), + SizedBox( + height: 4, + ), + Text( + _location.cityName?.trim() ?? "", + style: TextStyle( + fontSize: 14, + fontWeight: FontWeight.w600, + color: Color(0xff2E303A), + letterSpacing: -0.56, + ), + ), + ], + ), + ), ), IconButton( - icon: new Image.asset( - 'assets/images/new-design/twitter.png'), - tooltip: 'Twitter', - iconSize: 70, + icon: Icon( + Icons.location_on, + color: Color(0xff2B353E), + ), + constraints: BoxConstraints(), + padding: EdgeInsets.all(8), + tooltip: '', onPressed: () { setState(() { - launch("https://twitter.com/HMG"); + MapsLauncher.launchCoordinates(double.parse(_location.latitude), double.parse(_location.longitude), _location.locationName); }); }, ), IconButton( - icon: new Image.asset( - 'assets/images/new-design/facebook.png'), - tooltip: 'facebook', - iconSize: 70, + icon: Icon( + Icons.phone, + color: Color(0xff2B353E), + ), + constraints: BoxConstraints(), + padding: EdgeInsets.all(8), + tooltip: '', onPressed: () { setState(() { - launch( - "https://www.facebook.com/DrSulaimanAlHabib?ref=tn_tnmn"); + launch("tel://" + _location.phoneNumber); }); }, ), ], ), - ), - ], + ); + }, + itemCount: widget.findusPharmaciesModelList.length, + ), + Container( + margin: EdgeInsets.only(top: 14), + decoration: BoxDecoration( + borderRadius: BorderRadius.all( + Radius.circular(10.0), + ), + boxShadow: [ + BoxShadow( + color: Color(0xff000000).withOpacity(.05), + //spreadRadius: 5, + blurRadius: 27, + offset: Offset(0, -3), + ), + ], + color: Colors.white), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + IconButton( + icon: new Image.asset('assets/images/new-design/youtube.png'), + iconSize: 48, + tooltip: 'Youtube', + onPressed: () { + setState(() { + launch("https://www.youtube.com/c/DrsulaimanAlhabibHospitals"); + }); + }, + ), + IconButton( + icon: new Image.asset('assets/images/new-design/linkedin.png'), + tooltip: 'LinkedIn', + iconSize: 48, + onPressed: () { + setState(() { + launch("https://www.linkedin.com/company/drsulaiman-alhabib-medical-group"); + }); + }, + ), + IconButton( + icon: new Image.asset('assets/images/new-design/twitter.png'), + tooltip: 'Twitter', + iconSize: 48, + onPressed: () { + setState(() { + launch("https://twitter.com/HMG"); + }); + }, + ), + IconButton( + icon: new Image.asset('assets/images/new-design/facebook.png'), + tooltip: 'facebook', + iconSize: 48, + onPressed: () { + setState(() { + launch("https://www.facebook.com/DrSulaimanAlHabib?ref=tn_tnmn"); + }); + }, + ), + ], + ), ), - ), + ], ), ); } diff --git a/lib/pages/ContactUs/widgets/card_common_contat.dart b/lib/pages/ContactUs/widgets/card_common_contat.dart index 8848e2ff..0fde26cd 100644 --- a/lib/pages/ContactUs/widgets/card_common_contat.dart +++ b/lib/pages/ContactUs/widgets/card_common_contat.dart @@ -2,6 +2,7 @@ import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; import 'package:diplomaticquarterapp/pages/ContactUs/LiveChat/livechat_page.dart'; import 'package:diplomaticquarterapp/pages/ContactUs/findus/findus_page.dart'; import 'package:diplomaticquarterapp/pages/feedback/feedback_home_page.dart'; +import 'package:diplomaticquarterapp/widgets/data_display/medical/medical_profile_item.dart'; import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; import 'package:flutter/material.dart'; @@ -14,11 +15,7 @@ class CardCommonContact extends StatelessWidget { final text; final subText; final type; - const CardCommonContact( - {@required this.image, - @required this.text, - @required this.subText, - @required this.type}); + const CardCommonContact({@required this.image, @required this.text, @required this.subText, @required this.type}); @override Widget build(BuildContext context) { @@ -27,31 +24,37 @@ class CardCommonContact extends StatelessWidget { onTap: () { navigateToSearch(context, this.type); }, - child: Container( + child: + + // MedicalProfileItem( + // imagePath: image, + // title: text, + // subTitle: subText, + // isPngImage: true, + // ) + + Container( margin: EdgeInsets.fromLTRB(9.0, 9.0, 9.0, 9.0), - decoration: BoxDecoration(boxShadow: [ - BoxShadow(color: Colors.grey[400], blurRadius: 2.0, spreadRadius: 0.0) - ], borderRadius: BorderRadius.circular(10), color: Colors.white), + decoration: BoxDecoration(boxShadow: [BoxShadow(color: Colors.grey[400], blurRadius: 2.0, spreadRadius: 0.0)], borderRadius: BorderRadius.circular(10), color: Colors.white), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Container( margin: EdgeInsets.fromLTRB(10.0, 10.0, 10.0, 0.0), child: Texts(this.text, - // overflow: TextOverflow.clip, - color:secondaryColor, + // overflow: TextOverflow.clip, + color: secondaryColor, fontWeight: FontWeight.w700, fontSize: 20.0), ), Container( margin: EdgeInsets.fromLTRB(10.0, 0.0, 10.0, 0.0), - child: Texts(this.subText, - color: Colors.black, fontSize: 15.0), + child: Texts(this.subText, color: Colors.black, fontSize: 15.0), ), Align( - alignment: projectViewModel.isArabic? Alignment.bottomLeft:Alignment.bottomRight, + alignment: projectViewModel.isArabic ? Alignment.bottomLeft : Alignment.bottomRight, child: Container( - margin: EdgeInsets.fromLTRB(10.0, 0.0, 10.0, 8.0), + margin: EdgeInsets.fromLTRB(10.0, 0.0, 10.0, 8.0), child: Image.asset(this.image, width: 60.0, height: 60.0), ), ), @@ -62,7 +65,6 @@ class CardCommonContact extends StatelessWidget { } Future navigateToSearch(context, type) async { - if (type == 0) { Navigator.push(context, FadePage(page: FindUsPage())); } else if (type == 1) { @@ -70,7 +72,6 @@ class CardCommonContact extends StatelessWidget { } else if (type == 2) { //LiveChatPage Navigator.push(context, FadePage(page: LiveChatPage())); - } } } diff --git a/lib/pages/MyAppointments/AppointmentDetails.dart b/lib/pages/MyAppointments/AppointmentDetails.dart index 96c2b882..6045d771 100644 --- a/lib/pages/MyAppointments/AppointmentDetails.dart +++ b/lib/pages/MyAppointments/AppointmentDetails.dart @@ -21,17 +21,18 @@ import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:rating_bar/rating_bar.dart'; - +import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; import 'widgets/AppointmentActions.dart'; +import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; class AppointmentDetails extends StatefulWidget { AppoitmentAllHistoryResultList appo; static bool isLoading = false; - + final dynamic doctorSchedule; static bool showFooterButton = false; final int parentIndex; - AppointmentDetails({@required this.appo, this.parentIndex}); + AppointmentDetails({@required this.appo, this.parentIndex, this.doctorSchedule}); @override _AppointmentDetailsState createState() => _AppointmentDetailsState(); @@ -40,6 +41,7 @@ class AppointmentDetails extends StatefulWidget { class _AppointmentDetailsState extends State with SingleTickerProviderStateMixin { static TabController _tabController; + AppSharedPreferences sharedPref = AppSharedPreferences(); List doctorDetailsList = List(); ToDoCountProviderModel toDoProvider; @@ -48,13 +50,17 @@ class _AppointmentDetailsState extends State with SingleTick @override void initState() { - _tabController = new TabController(length: 2, vsync: this); AppointmentDetails.showFooterButton = false; - + if (widget.doctorSchedule != null) { + _tabController = new TabController(length: 2, vsync: this, initialIndex: 1); + widget.appo.appointmentDate = widget.doctorSchedule['Date']; + } else { + _tabController = new TabController(length: 2, vsync: this); + } doctorList.doctorID = widget.appo.doctorID; doctorList.clinicID = widget.appo.clinicID; doctorList.projectID = widget.appo.projectID; - + setTab(); super.initState(); } @@ -176,7 +182,7 @@ class _AppointmentDetailsState extends State with SingleTick Navigator.push( context, FadePage( - page: SchedulePage(doctorList), + page: SchedulePage(doctorList: doctorList), ), ); }, @@ -217,7 +223,7 @@ class _AppointmentDetailsState extends State with SingleTick physics: NeverScrollableScrollPhysics(), children: [ AppointmentActions(appo: widget.appo, tabController: _tabController, enableFooterButton: enableFooterButton), - DocAvailableAppointments(doctor: getDoctorObject(), isLiveCareAppointment: widget.appo.isLiveCareAppointment) + DocAvailableAppointments(doctor: getDoctorObject(), doctorSchedule: widget.doctorSchedule, isLiveCareAppointment: widget.appo.isLiveCareAppointment) ], controller: _tabController, ), @@ -580,7 +586,13 @@ class _AppointmentDetailsState extends State with SingleTick } void openSchedule() { - Navigator.push(context, FadePage(page: SchedulePage(getDoctorObject()))); + Navigator.push(context, FadePage(page: SchedulePage(doctorList: getDoctorObject()))); + } + + setTab() async { + var scheduleDoctor = await sharedPref.getObject(DOCTOR_SCHEDULE_DATE_SEL); + + widget.appo.appointmentDate = scheduleDoctor['Date']; } confirmAppointment() { diff --git a/lib/pages/MyAppointments/SchedulePage.dart b/lib/pages/MyAppointments/SchedulePage.dart index e83e8408..90ac8ae3 100644 --- a/lib/pages/MyAppointments/SchedulePage.dart +++ b/lib/pages/MyAppointments/SchedulePage.dart @@ -1,4 +1,5 @@ import 'package:diplomaticquarterapp/models/Appointments/DoctorListResponse.dart'; +import 'package:diplomaticquarterapp/pages/MyAppointments/AppointmentDetails.dart'; import 'package:diplomaticquarterapp/pages/MyAppointments/models/DoctorScheduleResponse.dart'; import 'package:diplomaticquarterapp/pages/MyAppointments/widgets/indicator.dart'; @@ -6,16 +7,22 @@ import 'package:diplomaticquarterapp/services/appointment_services/GetDoctorsLis import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; +import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; import 'package:flutter/material.dart'; -import 'package:hexcolor/hexcolor.dart'; import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; import 'package:diplomaticquarterapp/core/viewModels/medical/medical_view_model.dart'; import 'package:diplomaticquarterapp/pages/base/base_view.dart'; +import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; +import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; +import 'package:diplomaticquarterapp/models/Appointments/AppoimentAllHistoryResultList.dart'; class SchedulePage extends StatefulWidget { final DoctorList doctorList; - - SchedulePage(this.doctorList); + final AppoitmentAllHistoryResultList appo; + SchedulePage({ + this.appo, + this.doctorList, + }); @override _SchedulePageState createState() => _SchedulePageState(); } @@ -25,139 +32,226 @@ class _SchedulePageState extends State { PageController _pageController = PageController(); double currentPage = 0; int selectedindex = 0; - bool isLoading = true; + List weeks = []; List doctorScheduleResponse = []; - final List introWidgetsList = [ - Text('Hello'), - Text('Hi'), - Text('hey') - ]; + int weekMS = 604800 * 1000; + DoctorList doctorList; + List freeSlots = []; + bool isPageChange = false; + AppSharedPreferences sharedPref = AppSharedPreferences(); @override void initState() { - //getSchedule(widget.doctorList, context); - // _pageController.addListener(() { - // setState(() { - // currentPage = _pageController.page; - // }); - // }); + this.doctorList = widget.doctorList; + super.initState(); } @override Widget build(BuildContext context) { return BaseView( - onModelReady: (model) => model.getDoctorSchedule(widget.doctorList), - builder: (_, model, widget) => AppScaffold( - appBarTitle: TranslationBase.of(context).schedule, - isShowAppBar: true, - baseViewModel: model, - body: SizedBox( - height: MediaQuery.of(context).size.height, - child: Stack( - children: [ - Container( - child: PageView.builder( - controller: _pageController, - itemCount: 3, - onPageChanged: (index) { - setState(() { - this.currentPage = index.toDouble(); - }); - }, - itemBuilder: (context, index) { - return Container( - child: ListView.builder( - itemCount: model.getDoctorScheduleList.length, - itemBuilder: (context, index) => ClipRRect( - borderRadius: const BorderRadius.all( - Radius.circular(20.0)), - child: Container( - padding: EdgeInsets.only( - left: 10, - right: 10, - top: 20, - bottom: 20), - margin: EdgeInsets.only( - left: 20, - right: 20, - top: 7, - bottom: 7), - decoration: BoxDecoration( - boxShadow: [ - BoxShadow( - color: Colors.green, - offset: Offset(-10, 0)), - ], - borderRadius: - const BorderRadius.all( - Radius.circular(10.0)), - color: Colors.white), - child: Row( - children: [ - Expanded( - child: Row(children: [ - Column( - children: [ - Texts( - model - .getDoctorScheduleList[ - index] - .dayName, - color: - HexColor('#0bb690'), - ), - Texts( - DateUtil - .getDayMonthYearDateFormatted( - DateUtil - .convertStringToDate( - model - .getDoctorScheduleList[ - index] - .date, - ), + onModelReady: (model) => model.getDoctorSchedule(doctorList), + builder: (_, model, widget) => BaseView( + onModelReady: (model2) => model2.getFreeSlots(doctorList), + builder: (_, model2, widget2) { + if (model.freeSlots.length > 0 && isPageChange == false) { + this.freeSlots = model.freeSlots; + this.doctorScheduleResponse = model.getDoctorScheduleList; + + this.generateWeeksSchedules(); + } + return AppScaffold( + appBarTitle: TranslationBase.of(context).schedule, + isShowAppBar: true, + baseViewModel: model2, + body: SizedBox( + height: MediaQuery.of(context).size.height, + child: Stack( + children: [ + Container( + margin: EdgeInsets.only(top: 40), + child: PageView.builder( + controller: _pageController, + itemCount: weeks.length, + onPageChanged: (index) { + setState(() { + isPageChange = true; + this.currentPage = index.toDouble(); + }); + }, + itemBuilder: (context, index) { + return Container( + child: ListView.builder( + itemCount: weeks[index].length, + itemBuilder: (context, index2) => + InkWell( + onTap: () { + openBookAppointment( + weeks[index][index2]); + }, + child: Row( + children: [ + Expanded( + flex: 1, + child: Padding( + padding: + EdgeInsets.only( + left: 20), + child: Row( + children: [ + Column( + children: [ + Texts( + weeks[index][index2] + [ + 'DayName'], + fontSize: + 13, + ), + Texts( + getDayMonths( + DateUtil + .convertStringToDate( + weeks[index][index2]['Date'], + ), + ), + fontWeight: + FontWeight.bold, + fontSize: + 18, + ) + ], + ) + ])), ), - color: - HexColor('#0bb690'), - ) - ], - ) - ]), - ), - Expanded( - child: Texts( - model - .getDoctorScheduleList[ - index] - .workingHours, - color: HexColor('#0bb690'), - ), - ) - ], - ))))); - }, - )), - PageViewIndicator( - isActive: true, - currentPage: this.currentPage, - length: introWidgetsList.length, - ) - ], - )))); + Expanded( + flex: 3, + child: ClipRRect( + borderRadius: + const BorderRadius + .all( + Radius.circular( + 20.0)), + child: Container( + padding: + EdgeInsets.only( + left: + 10, + right: + 10, + top: 20, + bottom: + 20), + margin: EdgeInsets.only( + left: 20, + right: 20, + top: 7, + bottom: 7), + decoration: BoxDecoration( + boxShadow: [ + weeks[index][index2]['fullDay'] == + false + ? BoxShadow( + color: Colors.green, + offset: Offset(-5, 0)) + : BoxShadow(), + ], + borderRadius: + const BorderRadius.all(Radius.circular( + 10.0)), + color: Colors + .white), + child: Row( + children: [ + Expanded( + child: + Texts( + weeks[index][index2] + [ + 'WorkingHours'], + fontWeight: + FontWeight.w400, + ), + ) + ], + ))), + ) + ], + )))); + }, + )), + PageViewIndicator( + isActive: true, + currentPage: this.currentPage, + length: weeks.length, + ) + ], + ))); + })); + } + + generateWeeksSchedules() { + this.weeks.clear(); + for (var i = 0; i < 8; i++) { + var weekSchedule = generateNewWeekSchedule(i); + this.markWeekFreeDays(weekSchedule); + this.weeks.add(weekSchedule); + } + //print(this.weeks); + } + + markWeekFreeDays(schedule) { + for (var workDay in schedule) { + workDay['fullDay'] = !this.hasFreeSlot(workDay['Date']); + } + } + + generateNewWeekSchedule(weekIndex) { + var weekMSOffset = weekIndex * weekMS; + + var newWeekSchedule = []; + for (var workDay in this.doctorScheduleResponse) { + Map newWorkDay = Map(); + newWorkDay['Date'] = DateUtil.convertDateMSToJsonDate( + DateUtil.convertStringToDate(workDay.date).millisecondsSinceEpoch + + weekMSOffset); + newWorkDay['DayName'] = workDay.dayName; + newWorkDay['WorkingHours'] = workDay.workingHours; + newWeekSchedule.add(newWorkDay); + } + return newWeekSchedule; + } + + hasFreeSlot(String jsonDate) { + var date = DateUtil.convertStringToDate(jsonDate); + var scheduleDay = date; + for (var event in this.freeSlots) { + var date = DateUtil.convertStringToDate(event); + var nDate = DateTime(date.year, date.month, date.day); + + if (nDate.millisecondsSinceEpoch == scheduleDay.millisecondsSinceEpoch) { + return true; + } + } + return false; + } + + String getDayMonths(DateTime dateTime) { + String dateFormat = + '${dateTime.day} ${DateUtil.getMonth(dateTime.month).toString().substring(0, 3)}'; + return dateFormat; } - //getSchedule(DoctorList doctor, BuildContext context) { - //GifLoaderDialogUtils.showMyDialog(context); - //service = new DoctorsListService(); - // service.getSchedule(doctor).then((value) { - // doctorScheduleResponse.clear(); - // setState(() { - // value['List_DoctorWorkingHoursTable'].forEach((item) => { - // doctorScheduleResponse.add(DoctorScheduleResponse.fromJson(item)) - // }); - // GifLoaderDialogUtils.hideDialog(context); - // }); - // }); - // } + openBookAppointment(selectedDate) { + //sharedPref.setObject(DOCTOR_SCHEDULE_DATE_SEL, selectedDate); + Navigator.push( + context, + FadePage( + page: AppointmentDetails( + appo: widget.appo, + doctorSchedule: selectedDate, + ), + ), + ); + } } diff --git a/lib/pages/MyAppointments/widgets/indicator.dart b/lib/pages/MyAppointments/widgets/indicator.dart index a19993cf..5976042f 100644 --- a/lib/pages/MyAppointments/widgets/indicator.dart +++ b/lib/pages/MyAppointments/widgets/indicator.dart @@ -17,11 +17,11 @@ class PageViewIndicator extends StatelessWidget { Widget _indicator(bool isActive) { return Positioned( - bottom: 10, + top: 20, left: 0, right: 0, child: Container( - margin: EdgeInsets.only(bottom: 35), + margin: EdgeInsets.only(top: 0), child: Row( mainAxisSize: MainAxisSize.min, mainAxisAlignment: MainAxisAlignment.center, @@ -37,7 +37,7 @@ class PageViewIndicator extends StatelessWidget { Widget circleBar(bool isActive) { return AnimatedContainer( duration: Duration(milliseconds: 150), - margin: EdgeInsets.symmetric(horizontal: 8), + margin: EdgeInsets.symmetric(horizontal: 3), height: isActive ? 12 : 8, width: isActive ? 12 : 8, decoration: BoxDecoration( diff --git a/lib/pages/login/welcome.dart b/lib/pages/login/welcome.dart index 02c009a2..9d9a278d 100644 --- a/lib/pages/login/welcome.dart +++ b/lib/pages/login/welcome.dart @@ -41,13 +41,14 @@ class _WelcomeLogin extends State { physics: BouncingScrollPhysics(), children: [ SizedBox(height: 12), - Align( - alignment: Alignment.centerLeft, - child: SvgPicture.asset( - "assets/images/new/hmg_icon.svg", - height: 62, - width: 62, - ), + Row( + children: [ + SvgPicture.asset( + "assets/images/new/hmg_icon.svg", + height: 62, + width: 62, + ), + ], ), SizedBox(height: 24), Text( diff --git a/lib/pages/settings/InfoPage.dart b/lib/pages/settings/InfoPage.dart new file mode 100644 index 00000000..c835b10e --- /dev/null +++ b/lib/pages/settings/InfoPage.dart @@ -0,0 +1,10 @@ +import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; +import 'package:flutter/material.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; + +class AboutApp extends StatelessWidget { + @override + Widget build(BuildContext context) { + return AppScaffold(isShowAppBar: true, appBarTitle: TranslationBase.of(context).aboutApp, isShowDecPage: false, body: Container()); + } +} diff --git a/lib/pages/settings/settings.dart b/lib/pages/settings/settings.dart index b578eb3f..abfd022e 100644 --- a/lib/pages/settings/settings.dart +++ b/lib/pages/settings/settings.dart @@ -33,6 +33,14 @@ class _Settings extends State with TickerProviderStateMixin { AppGlobal.context = context; return Scaffold( appBar: AppBar( + actions: [ + IconButton( + icon: Icon(Icons.info, color: Colors.white), + onPressed: () { + //openInfoPage() + }, + ) + ], bottom: TabBar( // isScrollable: true, @@ -51,8 +59,7 @@ class _Settings extends State with TickerProviderStateMixin { controller: _tabController, ), title: Text(TranslationBase.of(context).settings, - style: - TextStyle(color: Theme.of(context).textTheme.bodyText2.color)), + style: TextStyle(color: Colors.white)), leading: Builder( builder: (BuildContext context) { return ArrowBack(); diff --git a/lib/uitl/date_uitl.dart b/lib/uitl/date_uitl.dart index c0a07cc5..35891e05 100644 --- a/lib/uitl/date_uitl.dart +++ b/lib/uitl/date_uitl.dart @@ -70,6 +70,15 @@ class DateUtil { return dateFormat; } + static String convertDateMSToJsonDate(utc) { + var dt = new DateTime.fromMicrosecondsSinceEpoch(utc); + + return "/Date(" + + (dt.millisecondsSinceEpoch * 1000).toString() + + '+0300' + + ")/"; + } + /// check Date /// [dateString] String we want to convert static String checkDate(DateTime checkedTime) { diff --git a/lib/uitl/translations_delegate_base.dart b/lib/uitl/translations_delegate_base.dart index f50f88bf..8a6a206d 100644 --- a/lib/uitl/translations_delegate_base.dart +++ b/lib/uitl/translations_delegate_base.dart @@ -2137,6 +2137,8 @@ class TranslationBase { String get validPassportNumber => localizedValues["valid-passport-number"][locale.languageCode]; String get continuePlan => localizedValues["continue-plan"][locale.languageCode]; String get dentalProcedureList => localizedValues["dental-procedure-list"][locale.languageCode]; + String get aboutApp => localizedValues["about-app"][locale.languageCode]; + String get aboutPointsLength => localizedValues["about-points"]['length'][locale.languageCode]; String get timeNeeded => localizedValues["time-needed"][locale.languageCode]; String get totalTimeNeeded => localizedValues["total-time-needed"][locale.languageCode]; } @@ -2156,6 +2158,6 @@ class TranslationBaseDelegate extends LocalizationsDelegate { bool shouldReload(TranslationBaseDelegate old) => false; } -extension xTranslationBase on TranslationBase{ +extension xTranslationBase on TranslationBase { isArabic() => locale.languageCode == "ar"; -} \ No newline at end of file +} diff --git a/lib/widgets/data_display/medical/medical_profile_item.dart b/lib/widgets/data_display/medical/medical_profile_item.dart index e4655a30..86fe85d4 100644 --- a/lib/widgets/data_display/medical/medical_profile_item.dart +++ b/lib/widgets/data_display/medical/medical_profile_item.dart @@ -16,10 +16,11 @@ class MedicalProfileItem extends StatelessWidget { final String title; final String subTitle; final bool hasBadge = false; + final bool isPngImage; bool isEnable; Color imgColor; - MedicalProfileItem({@required this.imagePath, @required this.title, @required this.subTitle, hasBadge, this.isEnable = true, this.imgColor}); + MedicalProfileItem({@required this.imagePath, @required this.title, @required this.subTitle, hasBadge, this.isEnable = true, this.imgColor, this.isPngImage = false}); @override Widget build(BuildContext context) { @@ -46,12 +47,19 @@ class MedicalProfileItem extends StatelessWidget { // ), // ), mFlex(1), - SvgPicture.asset( - "assets/images/new/services/$imagePath", - height: SizeConfig.widthMultiplier * 7, - width: SizeConfig.widthMultiplier * 7, - color: imgColor, - ), + isPngImage + ? Image.asset( + imagePath, + height: SizeConfig.widthMultiplier * 7, + width: SizeConfig.widthMultiplier * 7, + color: imgColor, + ) + : SvgPicture.asset( + "assets/images/new/services/$imagePath", + height: SizeConfig.widthMultiplier * 7, + width: SizeConfig.widthMultiplier * 7, + color: imgColor, + ), mFlex(2), Text( title,