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/PatientCard.dart

459 lines
24 KiB
Dart

import 'package:doctor_app_flutter/config/size_config.dart';
import 'package:doctor_app_flutter/icons_app/doctor_app_icons.dart';
import 'package:doctor_app_flutter/models/patient/patiant_info_model.dart';
import 'package:doctor_app_flutter/util/date-utils.dart';
import 'package:doctor_app_flutter/util/helpers.dart';
import 'package:doctor_app_flutter/util/translations_delegate_base.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:flutter/cupertino.dart';
import 'package:flutter/material.dart';
class PatientCard extends StatelessWidget {
final PatiantInformtion patientInfo;
final GestureTapCallback onTap;
final String patientType;
final String arrivalType;
final bool isInpatient;
final bool isMyPatient;
final bool isFromSearch;
final bool isFromLiveCare;
const PatientCard(
{Key? key,
required this.patientInfo,
required this.onTap,
required this.patientType,
required this.arrivalType,
required this.isInpatient,
this.isMyPatient = false,
this.isFromSearch = false,
this.isFromLiveCare = false})
: super(key: key);
@override
Widget build(BuildContext context) {
return Container(
width: SizeConfig.screenWidth * 0.9,
margin: EdgeInsets.all(6),
padding: EdgeInsets.only(left: 0, right: 5, bottom: 0, top: 0),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(10),
color: Colors.white,
),
child: CardWithBgWidget(
padding: 0,
marginLeft: (!isMyPatient && isInpatient) ? 0 : 10,
marginSymmetric: isFromSearch ? 10 : 0.0,
hasBorder: false,
bgColor: isFromLiveCare
? Colors.white
: (isMyPatient && !isFromSearch)
? Colors.green[500]!
: patientInfo.patientStatusType == 43
? Colors.green[500]!
: isMyPatient
? Colors.green[500]!
: isInpatient
? Colors.white!
: !isFromSearch
? Colors.red[800]!
: Colors.white!,
widget: Container(
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,
children: [
patientInfo.patientStatusType == 43
? Row(
children: [
AppText(
TranslationBase.of(context).arrivedP,
color: Colors.green,
fontWeight: FontWeight.bold,
fontFamily: 'Poppins',
fontSize: 10,
),
SizedBox(
width: 8,
),
SizedBox(
height: 12,
width: 1.5,
child: Container(
color: Colors.grey,
),
),
SizedBox(
width: 8,
),
AppText(
patientInfo.status == 2 ? 'Confirmed' : 'Booked',
color: patientInfo.status == 2 ? Colors.green : Colors.grey,
fontWeight: FontWeight.bold,
fontFamily: 'Poppins',
fontSize: 10,
),
],
)
: patientInfo.patientStatusType == 42
? Row(
children: [
AppText(
TranslationBase.of(context).notArrived,
color: Colors.red[800],
fontWeight: FontWeight.bold,
fontFamily: 'Poppins',
fontSize: 10,
),
SizedBox(
width: 8,
),
SizedBox(
height: 12,
width: 1.5,
child: Container(
color: Colors.grey,
),
),
SizedBox(
width: 8,
),
AppText(
patientInfo.status == 2 ? 'Confirmed' : 'Booked',
color: patientInfo.status == 2 ? Colors.green : Colors.grey,
fontWeight: FontWeight.bold,
fontFamily: 'Poppins',
fontSize: 10,
),
],
)
: !isFromSearch && !isFromLiveCare && patientInfo.patientStatusType == null
? Row(
children: [
AppText(
TranslationBase.of(context).notArrived,
color: Colors.red[800],
fontWeight: FontWeight.bold,
fontFamily: 'Poppins',
fontSize: 12,
),
SizedBox(
width: 8,
),
SizedBox(
height: 12,
width: 1.5,
child: Container(
color: Colors.grey,
),
),
SizedBox(
width: 8,
),
AppText(
patientInfo.status == 2 ? 'Booked' : 'Confirmed',
color: patientInfo.status == 2 ? Colors.grey : Colors.green,
fontWeight: FontWeight.bold,
fontFamily: 'Poppins',
fontSize: 12,
)
],
)
: SizedBox(),
this.arrivalType == '1'
? AppText(
patientInfo.startTime != null ? patientInfo.startTime : patientInfo.startTimes,
fontFamily: 'Poppins',
fontWeight: FontWeight.w400,
)
: patientInfo.arrivedOn != null
? AppText(
AppDateUtils.getDayMonthYearDate(AppDateUtils.convertStringToDate(
patientInfo.arrivedOn ?? "",
)) +
" " +
"${AppDateUtils.getStartTime(patientInfo.startTime ?? "")}",
fontFamily: 'Poppins',
fontWeight: FontWeight.w400,
fontSize: 15,
)
: (patientInfo.appointmentDate != null &&
patientInfo.appointmentDate!.isNotEmpty)
? AppText(
"${AppDateUtils.getDayMonthYearDate(AppDateUtils.convertStringToDate(
patientInfo.appointmentDate ?? "",
))} ${AppDateUtils.getStartTime(patientInfo.startTime ?? "")}",
fontFamily: 'Poppins',
fontWeight: FontWeight.w400,
fontSize: 15,
)
: SizedBox()
],
))
: SizedBox(),
if (isInpatient && isMyPatient && !isFromSearch)
Row(
children: [
SizedBox(
width: 12,
),
AppText(
'My Patient',
color: Colors.green,
fontWeight: FontWeight.bold,
fontFamily: 'Poppins',
fontSize: 12,
),
],
),
Padding(
padding: EdgeInsets.only(left: 12.0),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Expanded(
child: Row(children: [
Expanded(
// width: MediaQuery.of(context).size.width*0.51,
child: AppText(
isFromLiveCare
? Helpers.capitalize(patientInfo.fullName)
: (Helpers.capitalize(patientInfo.firstName) +
" " +
Helpers.capitalize(patientInfo.lastName)),
fontSize: 16,
color: Color(0xff2e303a),
fontWeight: FontWeight.w700,
fontFamily: 'Poppins',
textOverflow: TextOverflow.ellipsis,
),
),
if (patientInfo.gender == 1)
Icon(
DoctorApp.male_2,
color: Colors.blue,
)
else
Icon(
DoctorApp.female_1,
color: Colors.pink,
),
]),
),
Row(
children: [
AppText(
patientInfo.nationalityName != null
? patientInfo.nationalityName!.trim()
: patientInfo.nationality != null
? patientInfo.nationality!.trim()
: patientInfo.nationalityId != null
? patientInfo.nationalityId
: "",
fontWeight: FontWeight.bold,
fontSize: 14,
textOverflow: TextOverflow.ellipsis,
),
patientInfo.nationality != null || patientInfo.nationalityId != null
? ClipRRect(
borderRadius: BorderRadius.circular(20.0),
child: Image.network(
patientInfo.nationalityFlagURL != null ? patientInfo.nationalityFlagURL! : '',
height: 25,
width: 30,
errorBuilder:
(BuildContext context, Object exception, StackTrace? stackTrace) {
return AppText(
'No Image',
fontSize: 10,
);
},
))
: SizedBox()
],
)
],
)),
Row(children: <Widget>[
Column(
mainAxisAlignment: MainAxisAlignment.start,
children: <Widget>[
Padding(
padding: EdgeInsets.only(left: 12.0),
child: Container(
width: 60,
height: 60,
child: Image.asset(
patientInfo.gender == 1
? 'assets/images/male_avatar.png'
: 'assets/images/female_avatar.png',
fit: BoxFit.cover,
),
),
),
],
),
SizedBox(
width: 10,
),
Expanded(
child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [
Container(
child: RichText(
text: new TextSpan(
style: new TextStyle(fontSize: 2.0 * SizeConfig.textMultiplier, color: Colors.black),
children: <TextSpan>[
new TextSpan(
text: TranslationBase.of(context).fileNumber,
style: TextStyle(fontSize: 12, fontFamily: 'Poppins')),
new TextSpan(
text: patientInfo.patientId.toString(),
style: TextStyle(fontWeight: FontWeight.w700, fontFamily: 'Poppins', fontSize: 13)),
],
),
),
),
//if (isInpatient)
Container(
child: RichText(
text: new TextSpan(
style: new TextStyle(
fontSize: 2.0 * SizeConfig.textMultiplier,
color: Colors.black,
fontFamily: 'Poppins',
),
children: <TextSpan>[
new TextSpan(
text: TranslationBase.of(context).age ?? "" + " : ",
style: TextStyle(fontSize: 12)),
new TextSpan(
text:
"${AppDateUtils.getAgeByBirthday(patientInfo.dateofBirth ?? "", context, isServerFormat: !isFromLiveCare)}",
style: TextStyle(fontWeight: FontWeight.w700, fontSize: 13)),
],
),
),
),
if (isInpatient)
Container(
child: RichText(
text: new TextSpan(
style: new TextStyle(
fontSize: 2.0 * SizeConfig.textMultiplier,
color: Colors.black,
fontFamily: 'Poppins',
),
children: <TextSpan>[
new TextSpan(
text: patientInfo.admissionDate == null
? ""
: TranslationBase.of(context).admissionDate ?? "" + " : ",
style: TextStyle(fontSize: 12)),
new TextSpan(
text: patientInfo.admissionDate == null
? ""
: "${AppDateUtils.convertDateFromServerFormat(patientInfo.admissionDate.toString(), 'yyyy-MM-dd')}",
style: TextStyle(fontWeight: FontWeight.w700, fontSize: 13)),
]))),
if (patientInfo.admissionDate != null)
Container(
child: RichText(
text: new TextSpan(
style: new TextStyle(
fontSize: 2.0 * SizeConfig.textMultiplier,
color: Colors.black,
fontFamily: 'Poppins',
),
children: <TextSpan>[
new TextSpan(
text: TranslationBase.of(context).numOfDays ?? "" + " : ",
style: TextStyle(fontSize: 12)),
new TextSpan(
text:
"${DateTime.now().difference(AppDateUtils.getDateTimeFromServerFormat(patientInfo.admissionDate ?? "")).inDays + 1}",
style: TextStyle(fontWeight: FontWeight.w700, fontSize: 13)),
]))),
if (isFromLiveCare)
Column(
children: [
Container(
child: RichText(
text: new TextSpan(
style: new TextStyle(
fontSize: 2.0 * SizeConfig.textMultiplier,
color: Colors.black,
fontFamily: 'Poppins',
),
children: <TextSpan>[
new TextSpan(
text: TranslationBase.of(context).clinic ?? "" + " : ",
style: TextStyle(fontSize: 12)),
new TextSpan(
text: patientInfo.clinicName,
style: TextStyle(fontWeight: FontWeight.w700, fontSize: 13)),
],
),
),
),
],
),
]))
]),
isFromLiveCare
? Row(
mainAxisAlignment: MainAxisAlignment.end,
children: [
Container(
padding: EdgeInsets.all(4),
child: Image.asset(
'assets/images/livecare.png',
height: 25,
width: 35,
color: Colors.grey.shade700,
)),
],
)
: !isInpatient && !isFromSearch
? Row(mainAxisAlignment: MainAxisAlignment.end, children: [
Container(
padding: EdgeInsets.all(4),
child: Image.asset(
patientInfo.appointmentType == 'Regular' && patientInfo.visitTypeId == 100
? 'assets/images/livecare.png'
: patientInfo.appointmentType == 'Walkin'
? 'assets/images/walkin.png'
: 'assets/images/booked.png',
height: 25,
width: 35,
)),
])
: (isInpatient == true)
? Row(mainAxisAlignment: MainAxisAlignment.end, children: [
Container(
padding: EdgeInsets.all(4),
child: Image.asset(
'assets/images/inpatient.png',
height: 25,
width: 35,
)),
])
: SizedBox()
],
),
onTap: onTap,
)),
));
}
}