import ' dart:collection ' ;
import ' dart:io ' ;
import ' package:device_calendar/device_calendar.dart ' ;
import ' package:diplomaticquarterapp/core/model/prescriptions/Prescriptions.dart ' ;
import ' package:diplomaticquarterapp/core/model/prescriptions/prescription_report.dart ' ;
import ' package:diplomaticquarterapp/core/viewModels/project_view_model.dart ' ;
import ' package:diplomaticquarterapp/extensions/string_extensions.dart ' ;
import ' package:diplomaticquarterapp/models/header_model.dart ' ;
import ' package:diplomaticquarterapp/pages/BookAppointment/widgets/reminder_dialog.dart ' ;
import ' package:diplomaticquarterapp/pages/medical/prescriptions/pharmacy_for_prescriptions_page.dart ' ;
import ' package:diplomaticquarterapp/uitl/CalendarUtils.dart ' ;
import ' package:diplomaticquarterapp/uitl/app_toast.dart ' ;
import ' package:diplomaticquarterapp/uitl/date_uitl.dart ' ;
import ' package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart ' ;
import ' package:diplomaticquarterapp/uitl/location_util.dart ' ;
import ' package:diplomaticquarterapp/uitl/translations_delegate_base.dart ' ;
import ' package:diplomaticquarterapp/uitl/utils.dart ' ;
import ' package:diplomaticquarterapp/uitl/utils_new.dart ' ;
import ' package:diplomaticquarterapp/widgets/buttons/defaultButton.dart ' ;
import ' package:diplomaticquarterapp/widgets/new_design/doctor_header.dart ' ;
import ' package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart ' ;
import ' package:diplomaticquarterapp/widgets/show_zoom_image_dialog.dart ' ;
import ' package:diplomaticquarterapp/widgets/transitions/fade_page.dart ' ;
import ' package:flutter/cupertino.dart ' ;
import ' package:flutter/material.dart ' ;
import ' package:jiffy/jiffy.dart ' ;
import ' package:provider/provider.dart ' ;
class PrescriptionDetailsPage extends StatefulWidget {
final PrescriptionReport ? prescriptionReport ;
final Prescriptions ? prescriptions ;
PrescriptionDetailsPage ( { Key ? key , this . prescriptionReport , this . prescriptions } ) ;
@ override
_PrescriptionDetailsPageState createState ( ) = > _PrescriptionDetailsPageState ( ) ;
}
class _PrescriptionDetailsPageState extends State < PrescriptionDetailsPage > {
bool hasReminder = false ;
late LocationUtils locationUtils ;
@ override
void initState ( ) {
checkIfHasReminder ( ) ;
locationUtils = new LocationUtils ( isShowConfirmDialog: true , context: context ) ;
WidgetsBinding . instance . addPostFrameCallback ( ( _ ) = > locationUtils . getCurrentLocation ( ) ) ;
super . initState ( ) ;
}
@ override
Widget build ( BuildContext context ) {
ProjectViewModel projectViewModel = Provider . of ( context ) ;
return AppScaffold (
isShowAppBar: true ,
showNewAppBar: true ,
showNewAppBarTitle: true ,
appBarTitle: TranslationBase . of ( context ) . prescriptions ,
body: Column (
crossAxisAlignment: CrossAxisAlignment . start ,
children: < Widget > [
DoctorHeader (
headerModel: HeaderModel (
widget . prescriptions ! . doctorName ! ,
widget . prescriptions ! . doctorID ! ,
widget . prescriptions ! . doctorImageURL ! ,
widget . prescriptions ! . speciality ? ? [ " " ] ,
" " ,
widget . prescriptions ! . name ! ,
DateUtil . convertStringToDate ( widget . prescriptions ! . appointmentDate ! ) ,
DateUtil . formatDateToTime ( DateUtil . convertStringToDate ( widget . prescriptions ! . appointmentDate ! ) ) ,
widget . prescriptions ! . nationalityFlagURL ! ,
widget . prescriptions ! . doctorRate ,
widget . prescriptions ! . actualDoctorRate ,
widget . prescriptions ! . noOfPatientsRate ,
" " ,
) ,
isNeedToShowButton: false ,
) ,
Expanded (
child: ListView (
physics: BouncingScrollPhysics ( ) ,
padding: EdgeInsets . all ( 21 ) ,
children: [
Container (
padding: EdgeInsets . all ( 14 ) ,
decoration: BoxDecoration (
color: Colors . white ,
borderRadius: BorderRadius . all ( Radius . circular ( 10.0 ) ) ,
boxShadow: [
BoxShadow (
color: Color ( 0xff000000 ) . withOpacity ( . 05 ) ,
//spreadRadius: 5,
blurRadius: 27 ,
offset: Offset ( 0 , - 3 ) ,
) ,
] ,
) ,
child: Column (
crossAxisAlignment: CrossAxisAlignment . start ,
mainAxisSize: MainAxisSize . min ,
children: [
Row (
children: < Widget > [
// InkWell(
// child: Stack(
// alignment: Alignment.center,
// children: [
// Container(
// child: Image.network(
// widget.prescriptionReport.imageSRCUrl,
// fit: BoxFit.cover,
// width: 48,
// height: 49,
// ),
// margin: EdgeInsets.zero,
// clipBehavior: Clip.antiAlias,
// decoration: cardRadius(2000),
// ),
// Container(
// child: Icon(
// Icons.search,
// size: 18,
// color: Colors.white,
// ),
// padding: EdgeInsets.all(6),
// decoration: containerRadius(Colors.black.withOpacity(0.3), 200),
// )
// ],
// ),
// onTap: () {
// showZoomImageDialog(context, widget.prescriptionReport.imageSRCUrl);
// },
// ),
// SizedBox(width: 12),
Expanded (
child: Text (
( widget . prescriptionReport ! . itemDescription ! . isNotEmpty ? widget . prescriptionReport ! . itemDescription : widget . prescriptionReport ! . itemDescriptionN ? ? ' ' ) !
. toLowerCase ( )
. capitalizeFirstofEach ,
style: TextStyle ( fontSize: 16 , fontWeight: FontWeight . w600 , color: Color ( 0xff2E303A ) , letterSpacing: - 0.64 ) ,
) ,
)
] ,
) ,
SizedBox ( height: 12 ) ,
Table ( border: TableBorder ( horizontalInside: BorderSide ( width: 1 , color: Colors . black , style: BorderStyle . solid ) ) , children: [
TableRow (
children: [
Utils . tableColumnTitle ( TranslationBase . of ( context ) . route , showDivider: false ) ,
Utils . tableColumnTitle ( TranslationBase . of ( context ) . frequency , showDivider: false ) ,
Utils . tableColumnTitle ( TranslationBase . of ( context ) . dailyDoses , showDivider: false ) ,
Utils . tableColumnTitle ( TranslationBase . of ( context ) . duration , showDivider: false )
] ,
) ,
TableRow (
children: [
Utils . tableColumnValue ( widget . prescriptionReport ? . routeN ? ? ' ' , isLast: true , mProjectViewModel: projectViewModel ) ,
Utils . tableColumnValue ( widget . prescriptionReport ? . frequencyN ? ? ' ' , isLast: true , mProjectViewModel: projectViewModel ) ,
Utils . tableColumnValue ( widget . prescriptionReport ? . doseDailyQuantity . toString ( ) ? ? ' ' , isLast: true , mProjectViewModel: projectViewModel ) ,
Utils . tableColumnValue ( widget . prescriptionReport ? . days . toString ( ) ? ? ' ' , isLast: true , mProjectViewModel: projectViewModel ) ,
] ,
) ,
] ) ,
Text (
TranslationBase . of ( context ) . remarks ,
style: TextStyle ( fontSize: 12 , fontWeight: FontWeight . w600 , color: Color ( 0xff2E303A ) , letterSpacing: - 0.48 ) ,
) ,
Text (
widget . prescriptionReport ! . remarks ! ,
style: TextStyle ( fontSize: 12 , fontWeight: FontWeight . w600 , color: Color ( 0xff575757 ) , letterSpacing: - 0.4 , height: 16 / 10 ) ,
) ,
] ,
) ,
) ,
] ,
) ,
) ,
Container (
color: Colors . white ,
padding: EdgeInsets . only ( top: 16 , bottom: 16 , right: 21 , left: 21 ) ,
child: Row (
mainAxisSize: MainAxisSize . min ,
children: [
Expanded (
child: DefaultButton (
TranslationBase . of ( context ) . availability ,
( ) {
Navigator . push (
context ,
FadePage (
page: PharmacyForPrescriptionsPage (
itemID: widget . prescriptionReport ! . itemID ,
prescriptionReport: widget . prescriptionReport ,
) ,
) ,
) ;
} ,
iconData: Icons . location_on ,
color: Color ( 0xff359846 ) ,
) ,
) ,
SizedBox ( width: 10 ) ,
Expanded (
child: DefaultButton (
hasReminder ? TranslationBase . of ( context ) . cancelReminder : TranslationBase . of ( context ) . addReminder ,
( ) {
if ( hasReminder ) {
cancelReminders ( ) ;
} else {
DateTime startDate = DateTime . now ( ) ;
DateTime endDate = DateTime ( startDate . year , startDate . month , startDate . day + widget . prescriptionReport ! . days ! ) ;
showReminderDialog (
context ,
endDate ,
" " ,
widget . prescriptionReport ! . itemID . toString ( ) ,
" " ,
" " ,
title: " ${ widget . prescriptionReport ! . itemDescriptionN } Prescription Reminder " ,
description: " ${ widget . prescriptionReport ! . itemDescriptionN } ${ widget . prescriptionReport ! . frequencyN } ${ widget . prescriptionReport ! . routeN } " ,
onSuccess: ( ) {
AppToast . showSuccessToast ( message: TranslationBase . of ( context ) . reminderSuccess ) ;
} ,
isMultiAllowed: true ,
onMultiDateSuccess: ( int selectedIndex ) {
setCalender ( context , widget . prescriptionReport ! . itemID . toString ( ) , selectedIndex ) ;
} ,
) ;
return ;
}
} ,
iconData: Icons . notifications_active ,
color: Color ( 0xffD02127 ) ,
fontSize: 13.0 ,
//textColor: Color(0xff2B353E),
) ,
) ,
] ,
) ,
) ,
] ,
) ,
) ;
}
checkIfHasReminder ( ) async {
CalendarUtils calendarUtils = await CalendarUtils . getInstance ( ) ;
print ( " If Has Reminder " ) ;
DateTime startEventsDate = Jiffy . parseFromDateTime ( DateTime . now ( ) ) . subtract ( days: 30 ) . dateTime ;
DateTime endEventsDate = Jiffy . parseFromDateTime ( DateTime . now ( ) ) . add ( days: 120 ) . dateTime ;
RetrieveEventsParams params = new RetrieveEventsParams ( startDate: startEventsDate , endDate: endEventsDate ) ;
if ( calendarUtils . calendars ! = null ) {
print ( calendarUtils . calendars ) ;
if ( Platform . isAndroid ) {
Future . forEach (
calendarUtils . calendars ,
( Calendar calender ) = > {
calendarUtils . retrieveEvents ( calender . id ! , params ) . then ( ( value ) {
Result < UnmodifiableListView < Event > > events = value ;
events . data ! . forEach ( ( element ) {
print ( widget . prescriptionReport ! . itemDescriptionN ! ) ;
if ( element . title ! . contains ( widget . prescriptionReport ! . itemDescriptionN ! ) )
setState ( ( ) {
hasReminder = true ;
} ) ;
} ) ;
} ) ,
} ) ;
} else {
Future . forEach (
calendarUtils . calendars ,
( List < Calendar > calender ) = > {
calendarUtils . retrieveEvents ( calender [ 0 ] . id ! , params ) . then ( ( value ) {
Result < UnmodifiableListView < Event > > events = value ;
events . data ! . forEach ( ( element ) {
print ( widget . prescriptionReport ! . itemDescriptionN ! ) ;
if ( element . title ! . contains ( widget . prescriptionReport ! . itemDescriptionN ! ) )
setState ( ( ) {
hasReminder = true ;
} ) ;
} ) ;
} ) ,
} ) ;
}
}
}
cancelReminders ( ) async {
CalendarUtils calendarUtils = await CalendarUtils . getInstance ( ) ;
DateTime startEventsDate = Jiffy . parseFromDateTime ( DateTime . now ( ) ) . subtract ( days: 30 ) . dateTime ;
DateTime endEventsDate = Jiffy . parseFromDateTime ( DateTime . now ( ) ) . add ( days: 120 ) . dateTime ;
RetrieveEventsParams params = RetrieveEventsParams ( startDate: startEventsDate , endDate: endEventsDate ) ;
if ( Platform . isAndroid ) {
Future . forEach (
calendarUtils . calendars ,
( Calendar calender ) = > {
calendarUtils . retrieveEvents ( calender . id ! , params ) . then ( ( value ) {
Result < UnmodifiableListView < Event > > events = value ;
events . data ! . forEach ( ( element ) {
print ( widget . prescriptionReport ! . itemDescriptionN ! ) ;
if ( element . title ! . contains ( widget . prescriptionReport ! . itemDescriptionN ! ) ) calendarUtils . deleteEvent ( calender , element ) ;
} ) ;
} ) ,
} ) ;
} else {
Future . forEach (
calendarUtils . calendars ,
( List < Calendar > calender ) = > {
calendarUtils . retrieveEvents ( calender [ 0 ] . id ! , params ) . then ( ( value ) {
Result < UnmodifiableListView < Event > > events = value ;
events . data ! . forEach ( ( element ) {
print ( widget . prescriptionReport ! . itemDescriptionN ! ) ;
if ( element . title ! . contains ( widget . prescriptionReport ! . itemDescriptionN ! ) ) calendarUtils . deleteEvent ( calender [ 0 ] , element ) ;
} ) ;
} ) ,
} ) ;
}
AppToast . showSuccessToast ( message: TranslationBase . of ( context ) . reminderCancelSuccess ) ;
setState ( ( ) {
hasReminder = false ;
} ) ;
}
setCalender ( BuildContext context , String eventId , int reminderIndex ) async {
DateTime actualDate = DateTime ( DateTime . now ( ) . year , DateTime . now ( ) . month , DateTime . now ( ) . day , 8 , 0 ) ;
if ( widget . prescriptionReport ? . frequencyNumber = = null ) widget . prescriptionReport ! . frequencyNumber = 2 ; //Some time frequency number is null so by default will be 2
int remainingDays = widget . prescriptionReport ! . days ! -
( Jiffy . parseFromDateTime ( DateTime . now ( ) ) . diff ( Jiffy . parseFromDateTime ( DateUtil . convertStringToDate ( widget . prescriptionReport ! . orderDate ! ) ) , unit: Unit . day ) as int ) ;
if ( remainingDays . isNegative ) {
Utils . showErrorToast ( " Prescription date has been already passed you can not add a reminder for this prescription. " ) ;
return ;
}
CalendarUtils calendarUtils = await CalendarUtils . getInstance ( ) ;
GifLoaderDialogUtils . showMyDialog ( context ) ;
try {
for ( int i = 0 ; i < remainingDays ; i + + ) {
//event for number of days.
for ( int j = 0 ; j < widget . prescriptionReport ! . frequencyNumber ! ; j + + ) {
// event for number of times per day.
if ( j ! = 0 ) {
actualDate . add ( new Duration ( hours: 8 ) ) ; // 8 hours addition for daily dose.
}
//Time subtraction from actual reminder time. like before 30, or 1 hour.
if ( reminderIndex = = 0 ) {
// Before 30 mints
actualDate = Jiffy . parseFromDateTime ( actualDate ) . subtract ( minutes: 30 ) . dateTime ;
// dateTime.add(new Duration(minutes: -30));
} else if ( reminderIndex = = 1 ) {
// Before 1 hour
// dateTime.add(new Duration(minutes: -60));
actualDate = Jiffy . parseFromDateTime ( actualDate ) . subtract ( hours: 1 ) . dateTime ;
} else if ( reminderIndex = = 2 ) {
// Before 1 hour and 30 mints
// dateTime.add(new Duration(minutes: -90));
actualDate = Jiffy . parseFromDateTime ( actualDate ) . subtract ( hours: 1 , minutes: 30 ) . dateTime ;
} else if ( reminderIndex = = 3 ) {
// Before 2 hours
// dateTime.add(new Duration(minutes: -120));
actualDate = Jiffy . parseFromDateTime ( actualDate ) . subtract ( hours: 2 ) . dateTime ;
}
calendarUtils . createOrUpdateEvent (
title: " ${ widget . prescriptionReport ! . itemDescriptionN } Prescription Reminder " ,
description: " ${ widget . prescriptionReport ! . itemDescriptionN } ${ widget . prescriptionReport ! . frequencyN } ${ widget . prescriptionReport ! . routeN } " ,
scheduleDateTime: actualDate ,
eventId: eventId + ( i . toString ( ) + j . toString ( ) ) , //event id with varitions
) ;
actualDate = DateTime ( actualDate . year , actualDate . month , actualDate . day , 8 , 0 ) ;
}
actualDate = Jiffy . parseFromDateTime ( actualDate ) . add ( days: 1 ) . dateTime ;
print ( actualDate ) ;
}
} catch ( ex ) {
print ( " catch: $ ex " ) ;
}
AppToast . showSuccessToast ( message: TranslationBase . of ( context ) . reminderSuccess ) ;
Future . delayed ( Duration ( seconds: 2 ) , ( ) {
GifLoaderDialogUtils . hideDialog ( context ) ;
} ) ;
setState ( ( ) {
hasReminder = true ;
} ) ;
}
}