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.
488 lines
20 KiB
Dart
488 lines
20 KiB
Dart
import 'package:auto_size_text/auto_size_text.dart';
|
|
import 'package:diplomaticquarterapp/analytics/google-analytics.dart';
|
|
import 'package:diplomaticquarterapp/config/config.dart';
|
|
import 'package:diplomaticquarterapp/config/shared_pref_kay.dart';
|
|
import 'package:diplomaticquarterapp/core/viewModels/medical/medical_view_model.dart';
|
|
import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart';
|
|
import 'package:diplomaticquarterapp/models/Appointments/AppoimentAllHistoryResultList.dart';
|
|
import 'package:diplomaticquarterapp/models/Authentication/select_device_imei_res.dart';
|
|
import 'package:diplomaticquarterapp/pages/MyAppointments/AppointmentDetails.dart';
|
|
import 'package:diplomaticquarterapp/pages/base/base_view.dart';
|
|
import 'package:diplomaticquarterapp/routes.dart';
|
|
import 'package:diplomaticquarterapp/services/authentication/auth_provider.dart' as auth;
|
|
import 'package:diplomaticquarterapp/theme/colors.dart';
|
|
import 'package:diplomaticquarterapp/uitl/date_uitl.dart';
|
|
import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.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/custom_text_button.dart';
|
|
import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart';
|
|
import 'package:equatable/equatable.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:flutter_svg/flutter_svg.dart';
|
|
import 'package:provider/provider.dart';
|
|
|
|
import '../../../theme/theme_value.dart';
|
|
|
|
class TimeLineView extends StatefulWidget {
|
|
bool isLogged, isArabic;
|
|
List<AppoitmentAllHistoryResultList> appoitmentAllHistoryResultList;
|
|
MedicalViewModel medicalViewModel;
|
|
|
|
TimeLineView(this.isLogged, this.isArabic, this.appoitmentAllHistoryResultList, this.medicalViewModel);
|
|
|
|
@override
|
|
_TimeLineViewState createState() => _TimeLineViewState();
|
|
}
|
|
|
|
class _TimeLineViewState extends State<TimeLineView> {
|
|
List<AppoitmentAllHistoryResultList> tempList = [];
|
|
List<DateObj> dateObjs = [];
|
|
|
|
DateObj? selectedDateObj;
|
|
|
|
final authService = auth.AuthProvider();
|
|
|
|
ProjectViewModel? projectViewModel;
|
|
|
|
@override
|
|
void dispose() {
|
|
super.dispose();
|
|
}
|
|
|
|
@override
|
|
void initState() {
|
|
super.initState();
|
|
dateObjs.add(new DateObj(0, 0, widget.isArabic ? "الكل" : "All"));
|
|
for (int i = 0; i < widget.medicalViewModel.appoitmentAllHistoryResultList.length; i++) {
|
|
tempList.add(widget.medicalViewModel.appoitmentAllHistoryResultList[i]);
|
|
dateObjs.add(new DateObj(
|
|
DateUtil.convertStringToDate(widget.medicalViewModel.appoitmentAllHistoryResultList[i].appointmentDate).month,
|
|
DateUtil.convertStringToDate(widget.medicalViewModel.appoitmentAllHistoryResultList[i].appointmentDate).year,
|
|
DateUtil.getMonthYearLangDateFormatted(
|
|
DateUtil.convertStringToDate(widget.medicalViewModel.appoitmentAllHistoryResultList[i].appointmentDate),
|
|
widget.isArabic ? "ar" : "en",
|
|
),
|
|
),
|
|
);
|
|
}
|
|
dateObjs = dateObjs.toSet().toList();
|
|
dateObjs.sort((a, b) => a.month.compareTo(b.month));
|
|
dateObjs.sort((a, b) => a.year.compareTo(b.year));
|
|
// logger.d(dateObjs);
|
|
|
|
for (int i = 0; i < dateObjs.length; i++) {
|
|
print(dateObjs[i].monthYear.toString());
|
|
}
|
|
}
|
|
|
|
applyFilter(bool isAll) {
|
|
tempList.clear();
|
|
if (isAll) {
|
|
for (int i = 0; i < widget.medicalViewModel.appoitmentAllHistoryResultList.length; i++) {
|
|
tempList.add(widget.medicalViewModel.appoitmentAllHistoryResultList[i]);
|
|
}
|
|
} else {
|
|
for (int i = 0; i < widget.medicalViewModel.appoitmentAllHistoryResultList.length; i++) {
|
|
if (DateUtil.getMonthYearLangDateFormatted(
|
|
DateUtil.convertStringToDate(widget.medicalViewModel.appoitmentAllHistoryResultList[i].appointmentDate),
|
|
widget.isArabic ? "ar" : "en",
|
|
) ==
|
|
selectedDateObj!.monthYear) {
|
|
tempList.add(widget.medicalViewModel.appoitmentAllHistoryResultList[i]);
|
|
}
|
|
}
|
|
}
|
|
setState(() {});
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
projectViewModel = Provider.of(context);
|
|
return Container(
|
|
width: double.infinity,
|
|
height: 210,
|
|
decoration: containerBottomRightRadiusWithGradientBorder(0, darkColor: Color(0xFFF2B353E), lightColor: Color(0xFFF2B353E)),
|
|
child: widget.isLogged && tempList.length > 0
|
|
? Column(
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
// mainAxisAlignment: MainAxisAlignment.spaceEvenly,
|
|
children: [
|
|
mFlex(2),
|
|
Padding(
|
|
padding: EdgeInsets.only(left: 12, right: 12),
|
|
child: Row(
|
|
children: [
|
|
Expanded(
|
|
child: Column(
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: [
|
|
Text(
|
|
TranslationBase.of(context).appointments,
|
|
style: TextStyle(
|
|
color: CustomColors.white,
|
|
fontSize: 12,
|
|
fontWeight: FontWeight.bold,
|
|
letterSpacing: -0.72,
|
|
),
|
|
),
|
|
Text(
|
|
TranslationBase.of(context).timeLine,
|
|
style: TextStyle(
|
|
color: CustomColors.white,
|
|
fontSize: 20,
|
|
fontWeight: FontWeight.bold,
|
|
letterSpacing: -1.44,
|
|
height: 1.2,
|
|
),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
widget.isLogged
|
|
? Container(
|
|
decoration: containerRadius(Color(0xFF2B2E31), 100),
|
|
height: 30,
|
|
child: DropdownButtonHideUnderline(
|
|
child: ButtonTheme(
|
|
alignedDropdown: true,
|
|
child: DropdownButton<DateObj>(
|
|
hint: Text(
|
|
TranslationBase.of(context).all,
|
|
style: TextStyle(color: CustomColors.grey2, fontSize: 10),
|
|
),
|
|
iconEnabledColor: CustomColors.grey2,
|
|
style: TextStyle(color: CustomColors.grey2, fontSize: 10),
|
|
dropdownColor: Color(0xFF2B2E31),
|
|
value: selectedDateObj,
|
|
items: dateObjs.map((DateObj value) {
|
|
return DropdownMenuItem<DateObj>(
|
|
value: value,
|
|
child: AutoSizeText(
|
|
'${value.monthYear}',
|
|
),
|
|
);
|
|
}).toList(),
|
|
onChanged: (DateObj? r) {
|
|
selectedDateObj = r!;
|
|
applyFilter(r.year == 0 ? true : false);
|
|
setState(() {});
|
|
},
|
|
underline: Container(
|
|
height: 0,
|
|
),
|
|
),
|
|
),
|
|
),
|
|
)
|
|
: Container()
|
|
],
|
|
),
|
|
),
|
|
mFlex(1),
|
|
widget.isLogged
|
|
? Row(
|
|
children: [
|
|
Container(
|
|
height: widget.isArabic ? 130 : 110,
|
|
// width: double.infinity,
|
|
width: MediaQuery.of(context).size.width,
|
|
child: ListView.separated(
|
|
itemBuilder: (context, index) => Padding(
|
|
padding: widget.isArabic
|
|
? EdgeInsets.only(left: index == 0 ? 0 : 12, right: (tempList.length - 1) == index ? 0 : 12)
|
|
: EdgeInsets.only(left: index == 0 ? 12 : 0, right: (tempList.length - 1) == index ? 12 : 0),
|
|
child: index < tempList.length
|
|
? TimelineNewWidget(
|
|
appoitmentAllHistoryResul: tempList[index],
|
|
isLast: tempList.length - 1 == index ? true : false,
|
|
)
|
|
: !projectViewModel!.isAllAppointmentsLoaded
|
|
? InkWell(
|
|
onTap: () async {
|
|
await sharedPref.remove(APPOINTMENT_HISTORY_MEDICAL);
|
|
widget.medicalViewModel.getAppointmentHistory(isForTimeLine: false);
|
|
projectViewModel!.setIsAllAppointmentsLoaded(true);
|
|
},
|
|
child: Row(
|
|
children: [
|
|
Column(
|
|
crossAxisAlignment: CrossAxisAlignment.center,
|
|
children: [
|
|
mHeight(22.0),
|
|
Container(
|
|
child: Icon(
|
|
Icons.arrow_forward_outlined,
|
|
color: CustomColors.white,
|
|
size: 30,
|
|
),
|
|
),
|
|
mHeight(6.0),
|
|
Text(
|
|
TranslationBase.of(context).loadMore,
|
|
style: TextStyle(
|
|
color: CustomColors.white,
|
|
fontSize: 10,
|
|
fontWeight: FontWeight.w600,
|
|
letterSpacing: -0.36,
|
|
),
|
|
),
|
|
],
|
|
),
|
|
mWidth(24.0)
|
|
],
|
|
),
|
|
)
|
|
: Container(),
|
|
),
|
|
itemCount: (tempList.length + 1),
|
|
scrollDirection: Axis.horizontal,
|
|
shrinkWrap: false,
|
|
physics: BouncingScrollPhysics(),
|
|
separatorBuilder: (BuildContext context, int index) {
|
|
return index < tempList.length ? mWidth(8) : Container();
|
|
},
|
|
),
|
|
),
|
|
],
|
|
)
|
|
: Container(),
|
|
],
|
|
)
|
|
: emptyView(widget.isLogged),
|
|
);
|
|
}
|
|
|
|
Widget emptyView(bool isLogged) {
|
|
return Padding(
|
|
padding: const EdgeInsets.all(12.0),
|
|
child: Row(
|
|
children: [
|
|
Flexible(
|
|
child: Column(
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: [
|
|
mFlex(2),
|
|
Column(
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: [
|
|
Text(
|
|
TranslationBase.of(context).appointments,
|
|
style: TextStyle(
|
|
color: CustomColors.white,
|
|
fontSize: 12,
|
|
fontWeight: FontWeight.w600,
|
|
letterSpacing: -0.72,
|
|
),
|
|
),
|
|
Text(
|
|
TranslationBase.of(context).timeLine,
|
|
style: TextStyle(
|
|
color: CustomColors.white,
|
|
fontSize: 22,
|
|
fontWeight: FontWeight.bold,
|
|
letterSpacing: -1.44,
|
|
height: 1.2,
|
|
),
|
|
),
|
|
],
|
|
),
|
|
mFlex(1),
|
|
Text(
|
|
isLogged ? TranslationBase.of(context).noAppointmentAvailable : TranslationBase.of(context).cantSeeProfile,
|
|
style: TextStyle(
|
|
color: Colors.white,
|
|
fontWeight: FontWeight.bold,
|
|
fontSize: 14,
|
|
letterSpacing: -0.42,
|
|
),
|
|
),
|
|
mHeight(4),
|
|
!isLogged
|
|
? Container(
|
|
height: MediaQuery.of(context).size.width / 14,
|
|
width: MediaQuery.of(context).size.width / (widget.isArabic ? 4 : 6),
|
|
child: CustomTextButton(
|
|
shape: cardRadiusNew(8),
|
|
elevation: 0,
|
|
backgroundColor: appColor,
|
|
onPressed: () {
|
|
// onLoginClick();
|
|
login();
|
|
},
|
|
child: Center(
|
|
child: AutoSizeText(
|
|
TranslationBase.of(context).login,
|
|
maxLines: 1,
|
|
style: TextStyle(
|
|
color: Colors.white,
|
|
fontSize: 12,
|
|
letterSpacing: -0.33,
|
|
height: 1,
|
|
),
|
|
),
|
|
),
|
|
),
|
|
)
|
|
: Container(
|
|
height: MediaQuery.of(context).size.width / 14,
|
|
),
|
|
mFlex(3),
|
|
],
|
|
),
|
|
),
|
|
SvgPicture.asset("assets/images/new/empty.svg"),
|
|
mWidth(20),
|
|
],
|
|
),
|
|
);
|
|
}
|
|
|
|
login() async {
|
|
var data = await sharedPref.getObject(IMEI_USER_DATA);
|
|
sharedPref.remove(REGISTER_DATA_FOR_LOGIIN);
|
|
if (data != null) {
|
|
Navigator.of(context).pushNamed(CONFIRM_LOGIN);
|
|
} else {
|
|
GifLoaderDialogUtils.showMyDialog(context);
|
|
authService.selectDeviceImei(DEVICE_TOKEN).then((SelectDeviceIMEIRES? value) {
|
|
GifLoaderDialogUtils.hideDialog(context);
|
|
if (value != null) {
|
|
sharedPref.setObject(IMEI_USER_DATA, value);
|
|
Navigator.of(context).pushNamed(CONFIRM_LOGIN);
|
|
} else {
|
|
Navigator.of(context).pushNamed(
|
|
LOGIN_TYPE,
|
|
);
|
|
}
|
|
}).catchError((err) {
|
|
GifLoaderDialogUtils.hideDialog(context);
|
|
Navigator.of(context).pushNamed(
|
|
LOGIN_TYPE,
|
|
);
|
|
});
|
|
}
|
|
}
|
|
}
|
|
|
|
class TimelineNewWidget extends StatelessWidget {
|
|
bool? isLast;
|
|
final AppoitmentAllHistoryResultList? appoitmentAllHistoryResul;
|
|
|
|
TimelineNewWidget({Key? key, this.appoitmentAllHistoryResul, this.isLast});
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
ProjectViewModel projectViewModel = Provider.of(context);
|
|
return Container(
|
|
width: isLast! ? MediaQuery.of(context).size.width / 3.5 : MediaQuery.of(context).size.width / 2.5,
|
|
child: Column(
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
mainAxisSize: MainAxisSize.min,
|
|
children: [
|
|
Container(
|
|
width: double.infinity,
|
|
child: Row(
|
|
children: [
|
|
Text(
|
|
DateUtil.getDayMonthYearLangDateFormatted(
|
|
DateUtil.convertStringToDate(appoitmentAllHistoryResul!.appointmentDate!),
|
|
projectViewModel.isArabic ? "ar" : "en",
|
|
),
|
|
style: TextStyle(
|
|
color: Colors.grey[200],
|
|
fontSize: 12,
|
|
height: 1.2,
|
|
),
|
|
),
|
|
mWidth(8),
|
|
isLast! ? Container() : barView(),
|
|
],
|
|
),
|
|
),
|
|
mHeight(10),
|
|
LargeAvatar(
|
|
onTap: () {
|
|
GAnalytics.APPOINTMENT_DETAIL_FLOW_TYPE = 'timeline';
|
|
Navigator.push(
|
|
context,
|
|
FadePage(
|
|
page: AppointmentDetails(
|
|
appo: appoitmentAllHistoryResul!,
|
|
parentIndex: 2,
|
|
)));
|
|
},
|
|
name: appoitmentAllHistoryResul!.doctorNameObj!,
|
|
disableProfileView: false,
|
|
url: appoitmentAllHistoryResul!.doctorImageURL!,
|
|
width: 30,
|
|
height: 30,
|
|
isAppointmentAvatar: true,
|
|
),
|
|
mHeight(6),
|
|
Text(
|
|
appoitmentAllHistoryResul!.doctorNameObj!,
|
|
style: TextStyle(
|
|
color: CustomColors.white,
|
|
fontSize: 10,
|
|
fontWeight: FontWeight.w600,
|
|
letterSpacing: -0.36,
|
|
),
|
|
),
|
|
Text(
|
|
appoitmentAllHistoryResul!.clinicName!,
|
|
style: TextStyle(
|
|
color: CustomColors.grey2,
|
|
fontSize: 10,
|
|
fontWeight: FontWeight.w600,
|
|
letterSpacing: -0.36,
|
|
),
|
|
),
|
|
],
|
|
),
|
|
);
|
|
}
|
|
|
|
Widget barView() {
|
|
return Flexible(
|
|
child: Container(
|
|
width: double.infinity,
|
|
child: Row(
|
|
children: [
|
|
Container(
|
|
width: 6,
|
|
height: 6,
|
|
decoration: containerColorRadiusBorderWidth(CustomColors.pharmacyGreyColor, 50, CustomColors.grey2, 1),
|
|
),
|
|
Expanded(
|
|
child: Container(
|
|
width: double.infinity,
|
|
height: 1,
|
|
color: CustomColors.grey2,
|
|
),
|
|
),
|
|
Container(
|
|
width: 6,
|
|
height: 6,
|
|
decoration: containerColorRadiusBorderWidth(CustomColors.pharmacyGreyColor, 50, CustomColors.grey2, 1),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
);
|
|
}
|
|
}
|
|
|
|
// ignore: must_be_immutable
|
|
class DateObj extends Equatable {
|
|
int month;
|
|
int year;
|
|
String monthYear;
|
|
|
|
DateObj(this.month, this.year, this.monthYear);
|
|
|
|
@override
|
|
List<Object> get props => [monthYear];
|
|
}
|