You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
doctor_app_flutter/lib/widgets/patients/patient_card/PatientCard.dart

480 lines
25 KiB
Dart

import 'package:cached_network_image/cached_network_image.dart';
import 'package:doctor_app_flutter/config/config.dart';
import 'package:doctor_app_flutter/config/size_config.dart';
import 'package:doctor_app_flutter/core/model/patient/patiant_info_model.dart';
import 'package:doctor_app_flutter/core/viewModel/project_view_model.dart';
import 'package:doctor_app_flutter/utils/date-utils.dart';
import 'package:doctor_app_flutter/utils/extenstions_utils.dart';
import 'package:doctor_app_flutter/utils/translations_delegate_base_utils.dart';
import 'package:doctor_app_flutter/utils/utils.dart';
import 'package:doctor_app_flutter/widgets/shared/app_texts_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/card_with_bg_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/user-guid/CusomRow.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:provider/provider.dart';
import 'ShowTimer.dart';
class PatientCard extends StatelessWidget {
final PatiantInformtion? patientInfo;
final Function() onTap;
final String patientType;
final String arrivalType;
final bool isInpatient;
final bool isMyPatient;
final bool isFromSearch;
final bool isFromLiveCare;
PatientCard(
{Key? key,
this.patientInfo,
required this.onTap,
this.patientType = '',
this.arrivalType = '',
this.isInpatient = false,
this.isMyPatient = false,
this.isFromSearch = false,
this.isFromLiveCare = false})
: super(key: key);
@override
Widget build(BuildContext context) {
ProjectViewModel projectViewModel = Provider.of(context);
String nationalityName = patientInfo!.nationalityName != null
? patientInfo!.nationalityName!.trim()
: patientInfo!.nationality != null
? patientInfo!.nationality!.trim()
: patientInfo!.nationalityId != null
? patientInfo!.nationalityId!
: "";
return Container(
width: SizeConfig.screenWidth! * 0.9,
margin: EdgeInsets.all(6),
padding: EdgeInsets.only(left: projectViewModel.isArabic ? 5 : 0, right: projectViewModel.isArabic ? 0 : 5, bottom: 0, top: 0),
decoration: Utils.getCardBoxDecoration(),
child: CardWithBgWidget(
padding: 0,
marginLeft: (!isMyPatient && isInpatient) || isFromLiveCare ? 0 : 10,
marginSymmetric: isFromSearch ? 10 : 0.0,
hasBorder: false,
bgColor: isFromLiveCare
? Colors.white
: (isMyPatient && !isFromSearch)
? AppGlobal.appGreenColor
: patientInfo!.patientStatusType == 43
? AppGlobal.appGreenColor
: isMyPatient
? AppGlobal.appGreenColor
: isInpatient
? Colors.white
: !isFromSearch
? Colors.red[800]!
: Colors.white,
widget: Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(10),
color: Colors.white,
),
// padding: EdgeInsets.only(left: 10, right: 0, bottom: 0),
child: InkWell(
child: Column(
children: [
SizedBox(
height: 10,
),
!(isInpatient && !isFromSearch)
? Padding(
padding: EdgeInsets.only(left: 12.0),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
patientInfo!.patientStatusType == 43
? Row(
children: [
PatientStatus(
label: TranslationBase.of(context).arrivedP,
color: AppGlobal.appGreenColor,
),
SizedBox(
width: 8,
),
SizedBox(
height: 12,
width: 1.5,
child: Container(
color: Colors.grey,
),
),
SizedBox(
width: 8,
),
PatientStatus(
label: patientInfo!.status == 2 ? 'Confirmed' : 'Booked',
color: patientInfo!.status == 2 ? AppGlobal.appGreenColor : Colors.grey,
),
],
)
: patientInfo!.patientStatusType == 42
? Row(
children: [
PatientStatus(
label: TranslationBase.of(context).notArrived,
color: Colors.red[800]!,
),
SizedBox(
width: 8,
),
SizedBox(
height: 12,
width: 1.5,
child: Container(
color: Colors.grey,
),
),
SizedBox(
width: 8,
),
PatientStatus(
label: patientInfo!.status == 2 ? 'Confirmed' : 'Booked',
color: patientInfo!.status == 2 ? AppGlobal.appGreenColor : Colors.grey,
)
],
)
: !isFromSearch && !isFromLiveCare && patientInfo!.patientStatusType == null
? Row(
children: [
PatientStatus(
label: TranslationBase.of(context).notArrived,
color: Colors.red[800],
),
SizedBox(
width: 8,
),
SizedBox(
height: 12,
width: 1.5,
child: Container(
color: Colors.grey,
),
),
SizedBox(
width: 8,
),
PatientStatus(
label: patientInfo!.status == 2 ? 'Booked' : 'Confirmed',
color: patientInfo!.status == 2 ? Colors.grey : AppGlobal.appGreenColor,
)
],
)
: SizedBox(),
this.arrivalType == '1'
? AppText(
patientInfo!.startTime != null ? patientInfo!.startTime! : patientInfo!.startTimes!,
fontFamily: 'Poppins',
fontWeight: FontWeight.w400,
)
: patientInfo!.arrivedOn != null
? Container(
padding: EdgeInsets.only(right: 9),
child: AppText(
"${AppDateUtils.getStartTime(patientInfo!.startTime!)}",
fontFamily: 'Poppins',
fontWeight: FontWeight.w600,
fontSize: 11,
letterSpacing: -0.64,
),
)
: (patientInfo!.appointmentDate != null && patientInfo!.appointmentDate!.isNotEmpty)
? Container(
padding: EdgeInsets.only(right: 9),
child: AppText(
" ${AppDateUtils.getStartTime(patientInfo!.startTime!)}",
fontFamily: 'Poppins',
fontWeight: FontWeight.w600,
fontSize: 11,
letterSpacing: -0.64,
),
)
: SizedBox()
],
))
: SizedBox(),
if (isInpatient && isMyPatient && !isFromSearch)
Row(
children: [
SizedBox(
width: 12,
),
PatientStatus(
label: 'My Patient',
),
],
),
Padding(
padding: EdgeInsets.only(left: 12.0),
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Expanded(
flex: 2,
child: Row(crossAxisAlignment: CrossAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.start, children: [
AppText(
isFromLiveCare ? Utils.capitalize(patientInfo!.fullName) : (Utils.capitalize(patientInfo!.firstName) + " " + Utils.capitalize(patientInfo!.lastName)),
fontSize: 16,
color: Color(0xFF2E303A),
fontWeight: FontWeight.w600,
fontFamily: 'Poppins',
letterSpacing: -0.64,
textOverflow: TextOverflow.ellipsis,
),
if (patientInfo!.gender == 1)
Container(
padding: EdgeInsets.symmetric(horizontal: 4, vertical: 2),
child: SvgPicture.asset("assets/images/svgs/male.svg"),
)
else
Container(
padding: EdgeInsets.symmetric(horizontal: 4, vertical: 2),
child: SvgPicture.asset("assets/images/svgs/female.svg"),
),
if (isFromLiveCare)
ShowTimer(
patientInfo: patientInfo!,
),
]),
),
if (nationalityName.isNotEmpty)
Expanded(
child: Row(
mainAxisAlignment: MainAxisAlignment.end,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Expanded(
child: Container(
padding: EdgeInsets.only(top: 5),
alignment: Alignment.centerRight,
child: AppText(
nationalityName.truncate(14),
fontWeight: FontWeight.w600,
fontSize: 10,
color: Color(0xFF2E303A),
textOverflow: TextOverflow.ellipsis,
),
),
),
patientInfo!.nationality != null || patientInfo!.nationalityId != null
? Container(
padding: EdgeInsets.only(right: 7, top: 5),
child: ClipRRect(
borderRadius: BorderRadius.circular(20.0),
child: CachedNetworkImage(
imageUrl: patientInfo!.nationalityFlagURL != null ? patientInfo!.nationalityFlagURL! : '',
height: 16,
width: 22,
errorWidget: (context, url, error) => AppText(
'No Image',
fontSize: 10,
),
)),
)
: SizedBox()
],
),
)
],
)),
SizedBox(
height: 10,
),
Row(crossAxisAlignment: CrossAxisAlignment.start, children: <Widget>[
Padding(
padding: EdgeInsets.only(left: 12.0, top: 5),
child: Container(
width: 60,
height: 60,
//TODO Elham* create widget for this to make it use every where
child: SvgPicture.asset(
patientInfo!.gender == 1 ? 'assets/images/svgs/male avatar.svg' : 'assets/images/svgs/female avatar.svg',
fit: BoxFit.cover,
),
),
),
SizedBox(
width: 10,
),
Expanded(
child: Row(
children: [
Expanded(
child: Column(crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.center, children: [
// SizedBox(height: 10,),
CustomRow(
label: TranslationBase.of(context).fileNumber,
value: patientInfo!.patientId.toString(),
),
CustomRow(
label: TranslationBase.of(context).age + " : ",
value: "${AppDateUtils.getAgeByBirthday(patientInfo!.dateofBirth!, context, isServerFormat: !isFromLiveCare)}",
),
patientInfo!.arrivedOn != null
? Column(
crossAxisAlignment: CrossAxisAlignment.end,
mainAxisAlignment: MainAxisAlignment.start,
children: [
// AppText(
// AppDateUtils
// .getDayMonthYearDateFormatted(
// AppDateUtils
// .convertStringToDate(
// patientInfo!.arrivedOn,
// ),
// isMonthShort: true,
// ),
// fontFamily: 'Poppins',
// fontWeight: FontWeight.w600,
// fontSize: 11,
// letterSpacing: -0.64,
// ),
CustomRow(
label: TranslationBase.of(context).arrivedP + " : ",
value: AppDateUtils.getDayMonthYearDateFormatted(
AppDateUtils.convertStringToDate(
patientInfo!.arrivedOn!,
),
isMonthShort: true,
),
),
],
)
: (patientInfo!.appointmentDate != null && patientInfo!.appointmentDate!.isNotEmpty)
? Column(
crossAxisAlignment: CrossAxisAlignment.end,
mainAxisAlignment: MainAxisAlignment.start,
children: [
CustomRow(
label: TranslationBase.of(context).appointmentDate + " : ",
value: "${AppDateUtils.getDayMonthYearDateFormatted(AppDateUtils.convertStringToDate(
patientInfo!.appointmentDate!,
), isMonthShort: true)}",
),
],
)
: SizedBox(),
if (isInpatient)
CustomRow(
label: patientInfo!.admissionDate == null ? "" : TranslationBase.of(context).admissionDate + " : ",
value: patientInfo!.admissionDate == null
? ""
: "${AppDateUtils.getDayMonthYearDateFormatted(AppDateUtils.getDateTimeFromServerFormat(patientInfo!.admissionDate.toString()), isMonthShort: true)}",
),
if (patientInfo!.admissionDate != null)
CustomRow(
label: TranslationBase.of(context).numOfDays + " : ",
value: "${DateTime.now().difference(AppDateUtils.getDateTimeFromServerFormat(patientInfo!.admissionDate!)).inDays + 1}",
),
if (patientInfo!.admissionDate != null)
CustomRow(
label: TranslationBase.of(context).clinicName + " : ",
value: "${patientInfo!.clinicDescription}",
),
if (patientInfo!.admissionDate != null)
CustomRow(
label: TranslationBase.of(context).roomNo + " : ",
value: "${patientInfo!.roomId}",
),
if (isFromLiveCare)
Column(
children: [
CustomRow(
label: TranslationBase.of(context).clinic + " : ",
value: patientInfo!.clinicName!,
),
],
),
]),
),
Padding(
padding: const EdgeInsets.only(right: 8),
child: Icon(
Icons.arrow_forward,
size: 24,
),
),
],
))
]),
isFromLiveCare
? Row(
mainAxisAlignment: MainAxisAlignment.end,
children: [
Container(
padding: EdgeInsets.only(left: 9, right: 9, bottom: 9),
child: SvgPicture.asset(
'assets/images/svgs/profile_screen/livecare.svg',
height: 20,
width: 20,
// color: Colors.grey.shade700,
)),
],
)
: !isInpatient && !isFromSearch
? Row(mainAxisAlignment: MainAxisAlignment.end, crossAxisAlignment: CrossAxisAlignment.start, children: [
Container(
padding: EdgeInsets.only(left: 9, right: 9, bottom: 9),
child: SvgPicture.asset(
patientInfo!.appointmentType == 'Regular' && patientInfo!.visitTypeId == 100
? 'assets/images/svgs/profile_screen/livecare.svg'
: patientInfo!.appointmentType == 'Walkin'
? 'assets/images/svgs/profile_screen/walkin.svg'
: 'assets/images/svgs/profile_screen/booked.svg',
height: 25,
width: 35,
)),
])
: (isInpatient == true)
? Row(mainAxisAlignment: MainAxisAlignment.end, crossAxisAlignment: CrossAxisAlignment.start, children: [
Container(
padding: EdgeInsets.only(left: 9, right: 9, bottom: 9),
child: SvgPicture.asset(
'assets/images/svgs/inpatient.svg',
height: 25,
width: 35,
)),
])
: SizedBox()
],
),
onTap: onTap,
)),
));
}
}
class PatientStatus extends StatelessWidget {
PatientStatus({
Key? key,
required this.label,
this.color,
}) : super(key: key);
final String label;
final Color? color;
@override
Widget build(BuildContext context) {
return AppText(
label,
color: color ?? AppGlobal.appGreenColor,
fontWeight: FontWeight.w600,
fontFamily: 'Poppins',
fontSize: 10,
);
}
}