@ -1,27 +1,35 @@
import ' package:diplomaticquarterapp/core/enum/viewstate.dart ' ;
import ' package:diplomaticquarterapp/core/model/rate/appointment_details.dart ' ;
import ' package:diplomaticquarterapp/core/viewModels/appointment_rate_view_model.dart ' ;
import ' package:diplomaticquarterapp/core/viewModels/project_view_model.dart ' ;
import ' package:diplomaticquarterapp/pages/base/base_view.dart ' ;
import ' package:diplomaticquarterapp/pages/landing/landing_page.dart ' ;
import ' package:diplomaticquarterapp/theme/colors.dart ' ;
import ' package:diplomaticquarterapp/uitl/app_toast.dart ' ;
import ' package:diplomaticquarterapp/uitl/date_uitl.dart ' ;
import ' package:diplomaticquarterapp/uitl/translations_delegate_base.dart ' ;
import ' package:diplomaticquarterapp/uitl/utils_new.dart ' ;
import ' package:diplomaticquarterapp/widgets/avatar/large_avatar.dart ' ;
import ' package:diplomaticquarterapp/widgets/buttons/defaultButton.dart ' ;
import ' package:diplomaticquarterapp/widgets/buttons/secondary_button.dart ' ;
import ' package:diplomaticquarterapp/widgets/data_display/medical/doctor_card.dart ' ;
import ' package:diplomaticquarterapp/widgets/data_display/text.dart ' ;
import ' package:diplomaticquarterapp/widgets/drawer/app_drawer_widget.dart ' ;
import ' package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart ' ;
import ' package:diplomaticquarterapp/widgets/transitions/fade_page.dart ' ;
import ' package:flutter/cupertino.dart ' ;
import ' package:flutter/material.dart ' ;
import ' package:flutter_svg/flutter_svg.dart ' ;
import ' package:hexcolor/hexcolor.dart ' ;
import ' package:provider/provider.dart ' ;
class RateAppointmentClinic extends StatefulWidget {
final AppointmentDetails appointmentDetails ;
final String doctorNote ;
final int doctorRate ;
RateAppointmentClinic ( { this . appointmentDetails , this . doctorRate , this . doctorNote } ) ;
RateAppointmentClinic (
{ this . appointmentDetails , this . doctorRate , this . doctorNote } ) ;
@ override
_RateAppointmentClinicState createState ( ) = > _RateAppointmentClinicState ( ) ;
@ -34,164 +42,253 @@ class _RateAppointmentClinicState extends State<RateAppointmentClinic> {
@ override
Widget build ( BuildContext context ) {
ProjectViewModel projectViewModel = Provider . of ( context ) ;
return BaseView < AppointmentRateViewModel > (
builder: ( _ , model , w ) = > AppScaffold (
isShowAppBar: true ,
showNewAppBar: true ,
showNewAppBarTitle: true ,
baseViewModel: model ,
body: Scaffold (
backgroundColor: Colors . grey [ 200 ] ,
appBar: AppBar (
elevation: 0 ,
textTheme: TextTheme (
headline6: TextStyle ( color: Colors . white , fontWeight: FontWeight . bold ) ,
) ,
title: Text ( ' Rate ' ) ,
leading: Builder (
builder: ( BuildContext context ) {
return IconButton (
icon: Icon ( Icons . menu ) ,
color: Colors . white ,
onPressed: ( ) = > Scaffold . of ( context ) . openDrawer ( ) ,
) ;
} ,
) ,
centerTitle: true ,
) ,
drawer: SafeArea ( child: AppDrawer ( ) ) ,
body: FractionallySizedBox (
widthFactor: 1 ,
child: SingleChildScrollView (
child: Container (
padding: EdgeInsets . all ( 12 ) ,
child: Column (
children: < Widget > [
SizedBox (
height: 25 ,
) ,
Texts (
TranslationBase . of ( context ) . lastAppointment ,
bold: true ,
color: Colors . black ,
) ,
SizedBox (
height: 25 ,
appBarTitle: TranslationBase . of ( context ) . rateAppointment ,
body: SingleChildScrollView (
child: Container (
padding: EdgeInsets . all ( 12 ) ,
child: Column (
crossAxisAlignment: CrossAxisAlignment . start ,
children: < Widget > [
SizedBox (
height: 25 ,
) ,
Text (
TranslationBase . of ( context ) . lastAppointment ,
style: TextStyle (
fontSize: 16 ,
fontWeight: FontWeight . w600 ,
color: Color ( 0xff2B353E ) ,
letterSpacing: - 0.64 ,
height: 23 / 16 ) ,
) ,
SizedBox (
height: 25 ,
) ,
Card (
elevation: 0 ,
shape: cardRadius ( 10 ) ,
child: Padding (
padding: const EdgeInsets . only (
left: 12 , right: 12 , top: 12 , bottom: 12 ) ,
child: Column (
mainAxisSize: MainAxisSize . min ,
crossAxisAlignment: CrossAxisAlignment . start ,
children: [
Container (
margin: EdgeInsets . only ( bottom: 10.0 ) ,
child: Row (
mainAxisAlignment: MainAxisAlignment . spaceBetween ,
children: [
Text (
model . appointmentDetails . projectName ,
style: TextStyle (
fontSize: 16 ,
fontWeight: FontWeight . w600 ,
color: Color ( 0xff2E303A ) ,
letterSpacing: - 0.64 ,
height: 25 / 16 ) ,
) ,
Text (
model . appointmentDetails . startTime ,
style: TextStyle (
fontSize: 14 ,
fontWeight: FontWeight . w600 ,
color: Color ( 0xff2E303A ) ,
letterSpacing: - 0.64 ,
height: 25 / 16 ) ,
) ,
] ,
) ,
) ,
Row (
mainAxisSize: MainAxisSize . min ,
children: < Widget > [
LargeAvatar (
url:
' https://hmgwebservices.com/Images/Hospitals/ ' +
model . appointmentDetails . projectID
. toString ( ) +
' .jpg ' ,
width: 48 ,
height: 48 ,
) ,
SizedBox ( width: 11 ) ,
Expanded (
child: Column (
crossAxisAlignment: CrossAxisAlignment . start ,
mainAxisSize: MainAxisSize . min ,
children: < Widget > [
myRichText (
TranslationBase . of ( context ) . clinic + " : " ,
model . appointmentDetails . projectName ,
projectViewModel . isArabic ) ,
myRichText (
TranslationBase . of ( context ) . date + " : " ,
DateUtil . getMonthDayYearDateFormatted (
DateUtil . convertStringToDate ( model
. appointmentDetails
. appointmentDate ) ) ,
projectViewModel . isArabic ) ,
] ,
) ,
) ,
] ,
) ,
] ,
) ,
Container (
width: double . infinity ,
decoration: BoxDecoration (
borderRadius: BorderRadius . circular ( 15 ) ,
color: Colors . white ,
shape: BoxShape . rectangle ,
border: Border . all ( color: Colors . white , width: 0.5 ) ,
) ,
) ,
) ,
SizedBox (
height: 12 ,
) ,
Container (
width: double . infinity ,
child: Card (
elevation: 0 ,
shape: cardRadius ( 10 ) ,
child: Padding (
padding: const EdgeInsets . all ( 12.0 ) ,
child: Column (
children: < Widget > [
SizedBox (
height: 8 ,
) ,
LargeAvatar (
url: ' https://hmgwebservices.com/Images/Hospitals/ ' + model . appointmentDetails . projectID . toString ( ) + ' .jpg ' ,
name: model . appointmentDetails . clinicName ,
width: 110 ,
height: 110 ,
) ,
SizedBox (
height: 22 ,
) ,
Texts (
model . appointmentDetails . projectName ,
fontSize: 22 ,
fontWeight: FontWeight . bold ,
crossAxisAlignment: CrossAxisAlignment . start ,
children: [
Text (
TranslationBase . of ( context ) . rateClinic ,
style: TextStyle (
fontSize: 16 ,
fontWeight: FontWeight . w600 ,
color: Color ( 0xff2B353E ) ,
letterSpacing: - 0.64 ,
height: 23 / 16 ) ,
) ,
SizedBox (
height: 4 ,
height: 12 ,
) ,
Texts (
DateUtil . getMonthDayYearDateFormatted ( DateUtil . convertStringToDate ( model . appointmentDetails . appointmentDate ) ) ,
) ,
SizedBox (
height: 8 ,
Row (
mainAxisAlignment: MainAxisAlignment . center ,
children: < Widget > [
. . . List . generate (
5 ,
( index ) = > AnimatedSwitcher (
duration: Duration ( milliseconds: 300 ) ,
switchInCurve: Curves . elasticOut ,
switchOutCurve: Curves . elasticIn ,
transitionBuilder: ( Widget child ,
Animation < double > animation ) {
return ScaleTransition (
child: child , scale: animation ) ;
} ,
child: rating = = ( index + 1 )
? Container (
margin: EdgeInsets . only (
left: 3.0 , right: 3.0 ) ,
decoration: BoxDecoration (
borderRadius:
BorderRadius . circular ( 100 ) ,
border: Border . all (
width: 3 ,
color: CustomColors . green ) ) ,
key: ValueKey < int > ( rating ) ,
child: IconButton (
onPressed: ( ) {
setState ( ( ) {
rating = index + 1 ;
} ) ;
} ,
iconSize: 35 ,
icon: SvgPicture . asset (
' assets/images/new/appointment-rating/ ' +
( index + 1 ) . toString ( ) +
' .svg ' ) ,
) ,
)
: Container (
key: ValueKey < int > ( rating ) ,
child: IconButton (
onPressed: ( ) {
setState ( ( ) {
rating = index + 1 ;
} ) ;
} ,
iconSize: 35 ,
icon: SvgPicture . asset (
' assets/images/new/appointment-rating/ ' +
( index + 1 ) . toString ( ) +
' .svg ' ) ,
) ,
) ,
) ,
)
] ,
) ,
Texts ( model . appointmentDetails . startTime ) ,
SizedBox (
height: 8 ,
)
] ,
) ,
) ,
SizedBox (
height: 12 ,
) ,
Center (
child: Texts (
TranslationBase . of ( context ) . rateClinic ,
textAlign: TextAlign . center ,
) ) ,
SizedBox (
height: 12 ,
) ,
Row (
mainAxisAlignment: MainAxisAlignment . center ,
children: < Widget > [
. . . List . generate (
5 ,
( index ) = > AnimatedSwitcher (
duration: Duration ( milliseconds: 1000 ) ,
switchInCurve: Curves . elasticOut ,
switchOutCurve: Curves . elasticIn ,
transitionBuilder: ( Widget child , Animation < double > animation ) {
return ScaleTransition ( child: child , scale: animation ) ;
} ,
child: Container (
key: ValueKey < int > ( rating ) ,
child: IconButton (
/ / iconSize: 45.0 ,
onPressed: ( ) {
setState ( ( ) {
rating = index + 1 ;
} ) ;
} ,
iconSize: rating = = ( index + 1 ) ? 60 : 40 ,
/ / Theme . of ( context ) . hintColor ,
icon: Image . asset ( ' assets/images/ ' + ( index + 1 ) . toString ( ) + ' .png ' ) ) ,
) ,
) ,
)
] ,
) ,
SizedBox ( height: 12 ) ,
SizedBox (
height: 12 ,
) ,
] ,
) ,
) ,
) ,
SizedBox ( height: 12 ) ,
SizedBox (
height: 12 ,
) ,
] ,
) ,
) ,
bottomSheet: Container (
height: MediaQuery . of ( context ) . size . height * 0.15 ,
width: double . infinity ,
color: Colors . grey [ 200 ] ,
child: Column (
children: < Widget > [
Container (
width: MediaQuery . of ( context ) . size . width * 0.9 ,
child: SecondaryButton (
onTap: ( ) async {
if ( rating > 0 ) {
) ,
bottomSheet: 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 ) . later ,
( ) {
Navigator . pushReplacement (
context ,
FadePage (
page: LandingPage ( ) ,
) ,
) ;
} ,
color: Color ( 0xffEAEAEA ) ,
textColor: Color ( 0xff2B353E ) ,
) ,
) ,
SizedBox ( width: 10 ) ,
Expanded (
child: DefaultButton (
TranslationBase . of ( context ) . submit ,
rating < = 0
? null
: ( ) {
model
. sendAppointmentRate (
rating , widget . appointmentDetails . appointmentNo , widget . appointmentDetails . projectID , widget . appointmentDetails . doctorID , widget . appointmentDetails . clinicID , note )
rating ,
widget . appointmentDetails . appointmentNo ,
widget . appointmentDetails . projectID ,
widget . appointmentDetails . doctorID ,
widget . appointmentDetails . clinicID ,
note )
. then (
( value ) = > {
model
. sendDoctorRate (
widget . doctorRate ,
widget . appointmentDetails . appointmentNo ,
widget
. appointmentDetails . appointmentNo ,
widget . appointmentDetails . projectID ,
widget . appointmentDetails . doctorID ,
widget . appointmentDetails . clinicID ,
note ,
widget . appointmentDetails . appointmentDate ,
widget . appointmentDetails
. appointmentDate ,
widget . appointmentDetails . doctorName ,
widget . appointmentDetails . projectName ,
widget . appointmentDetails . clinicName )
@ -205,36 +302,12 @@ class _RateAppointmentClinicState extends State<RateAppointmentClinic> {
} ) ,
} ,
) ;
} else {
AppToast . showErrorToast ( message: ' please rate the clinic ' ) ;
}
} ,
label: TranslationBase . of ( context ) . submit ,
disabled: ( model . state = = ViewState . Busy | | rating = = 0 ) ,
/ / loading: model . state = = ViewState . BusyLocal ,
textColor: Theme . of ( context ) . backgroundColor ) ,
} ,
color: Color ( 0xff359846 ) ,
disabledColor: Colors . grey ,
) ,
SizedBox (
height: 12 ,
) ,
InkWell (
onTap: ( ) {
Navigator . pushReplacement (
context ,
FadePage (
page: LandingPage ( ) ,
) ,
) ;
} ,
child: Texts (
TranslationBase . of ( context ) . later ,
decoration: TextDecoration . underline ,
color: HexColor ( ' #151DFE ' ) ,
fontSize: 18 ,
) ,
)
] ,
) ,
) ,
] ,
) ,
) ,
) ,