Merge branch 'master' into haroon_dev
# Conflicts: # lib/extensions/widget_extensions.dartpull/28/head
commit
8df38ea6d1
@ -0,0 +1,103 @@
|
|||||||
|
import 'dart:ui';
|
||||||
|
|
||||||
|
import 'package:easy_localization/easy_localization.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:hmg_patient_app_new/core/app_assets.dart';
|
||||||
|
import 'package:hmg_patient_app_new/core/app_export.dart';
|
||||||
|
import 'package:hmg_patient_app_new/core/utils/utils.dart';
|
||||||
|
import 'package:hmg_patient_app_new/extensions/widget_extensions.dart';
|
||||||
|
import 'package:hmg_patient_app_new/generated/locale_keys.g.dart';
|
||||||
|
import 'package:hmg_patient_app_new/theme/colors.dart';
|
||||||
|
|
||||||
|
class CollapsingListView extends StatelessWidget {
|
||||||
|
final String title;
|
||||||
|
Widget? child;
|
||||||
|
VoidCallback? search;
|
||||||
|
Widget? bottomChild;
|
||||||
|
bool isClose;
|
||||||
|
|
||||||
|
CollapsingListView({required this.title, this.child, this.search, this.isClose = false, this.bottomChild});
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Scaffold(
|
||||||
|
backgroundColor: AppColors.bgScaffoldColor,
|
||||||
|
body: Column(
|
||||||
|
children: [
|
||||||
|
CustomScrollView(
|
||||||
|
slivers: [
|
||||||
|
SliverAppBar(
|
||||||
|
pinned: true,
|
||||||
|
expandedHeight: 100,
|
||||||
|
stretch: true,
|
||||||
|
backgroundColor: AppColors.bgScaffoldColor,
|
||||||
|
leading: IconButton(
|
||||||
|
icon: Utils.buildSvgWithAssets(icon: isClose ? AppAssets.closeBottomNav : AppAssets.arrow_back, width: 32.h, height: 32.h),
|
||||||
|
padding: EdgeInsets.only(left: 12),
|
||||||
|
onPressed: () => Navigator.pop(context),
|
||||||
|
),
|
||||||
|
flexibleSpace: LayoutBuilder(
|
||||||
|
builder: (context, constraints) {
|
||||||
|
final double maxHeight = 100;
|
||||||
|
final double minHeight = kToolbarHeight;
|
||||||
|
double t = (constraints.maxHeight - minHeight) / (maxHeight - minHeight);
|
||||||
|
t = t - 1;
|
||||||
|
if (t < 0.7) t = 0.7;
|
||||||
|
t = t.clamp(0.0, 1.0);
|
||||||
|
|
||||||
|
final double fontSize = lerpDouble(14, 18, t)!;
|
||||||
|
final double bottomPadding = lerpDouble(0, 0, t)!;
|
||||||
|
final double leftPadding = lerpDouble(150, 24, t)!;
|
||||||
|
|
||||||
|
return Stack(
|
||||||
|
children: [
|
||||||
|
Align(
|
||||||
|
alignment: Alignment.lerp(
|
||||||
|
Alignment.center,
|
||||||
|
Alignment.bottomLeft,
|
||||||
|
t,
|
||||||
|
)!,
|
||||||
|
child: Padding(
|
||||||
|
padding: EdgeInsets.only(
|
||||||
|
left: leftPadding,
|
||||||
|
bottom: bottomPadding,
|
||||||
|
),
|
||||||
|
child: Row(
|
||||||
|
spacing: 4.h,
|
||||||
|
children: [
|
||||||
|
Text(
|
||||||
|
title,
|
||||||
|
maxLines: 1,
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: (27 - (5 * (2 - t))).fSize,
|
||||||
|
fontWeight: FontWeight.lerp(
|
||||||
|
FontWeight.w300,
|
||||||
|
FontWeight.w600,
|
||||||
|
t,
|
||||||
|
)!,
|
||||||
|
color: AppColors.blackColor,
|
||||||
|
letterSpacing: -0.5),
|
||||||
|
).expanded,
|
||||||
|
if (search != null) Utils.buildSvgWithAssets(icon: AppAssets.search_icon).onPress(search!).paddingOnly(right: 24)
|
||||||
|
],
|
||||||
|
)),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
),
|
||||||
|
SliverList(
|
||||||
|
delegate: SliverChildBuilderDelegate(
|
||||||
|
(context, index) => child,
|
||||||
|
childCount: 1,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
).expanded,
|
||||||
|
if (bottomChild != null) bottomChild!
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,172 @@
|
|||||||
|
import 'package:easy_localization/easy_localization.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:hmg_patient_app_new/core/app_assets.dart';
|
||||||
|
import 'package:hmg_patient_app_new/core/app_export.dart';
|
||||||
|
import 'package:hmg_patient_app_new/core/utils/date_util.dart';
|
||||||
|
import 'package:hmg_patient_app_new/extensions/string_extensions.dart';
|
||||||
|
import 'package:hmg_patient_app_new/extensions/widget_extensions.dart';
|
||||||
|
import 'package:hmg_patient_app_new/features/lab/models/resp_models/patient_lab_orders_response_model.dart';
|
||||||
|
import 'package:hmg_patient_app_new/generated/locale_keys.g.dart';
|
||||||
|
import 'package:hmg_patient_app_new/theme/colors.dart';
|
||||||
|
import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart';
|
||||||
|
import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.dart';
|
||||||
|
|
||||||
|
class LabResultItemView extends StatelessWidget {
|
||||||
|
final VoidCallback onTap;
|
||||||
|
final int index;
|
||||||
|
final PatientLabOrdersResponseModel? labOrder;
|
||||||
|
final bool isLoading;
|
||||||
|
final bool isExpanded;
|
||||||
|
|
||||||
|
LabResultItemView({Key? key, required this.onTap, this.labOrder, required this.index, this.isLoading = false, this.isExpanded = false}) : super(key: key);
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return AnimatedContainer(
|
||||||
|
duration: Duration(milliseconds: 300),
|
||||||
|
curve: Curves.easeInOut,
|
||||||
|
margin: EdgeInsets.symmetric(vertical: 8.h),
|
||||||
|
decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 20.h, hasShadow: true),
|
||||||
|
child: InkWell(
|
||||||
|
onTap: () {
|
||||||
|
if (!isLoading) {
|
||||||
|
onTap();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
child: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
Padding(
|
||||||
|
padding: EdgeInsets.all(16.h),
|
||||||
|
child: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
|
children: [
|
||||||
|
AppCustomChipWidget(
|
||||||
|
labelText: getLabOrderStatusText(labOrder?.status ?? 0, context),
|
||||||
|
backgroundColor: getLabOrderStatusColor(labOrder?.status ?? 0).withOpacity(0.15),
|
||||||
|
textColor: getLabOrderStatusColor(labOrder?.status ?? 0),
|
||||||
|
).toShimmer2(isShow: isLoading, width: 100),
|
||||||
|
if (!isLoading) Icon(isExpanded ? Icons.expand_less : Icons.expand_more),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
SizedBox(height: 8.h),
|
||||||
|
Row(
|
||||||
|
children: [
|
||||||
|
Image.network(
|
||||||
|
isLoading ? "" : labOrder!.doctorImageURL!,
|
||||||
|
width: 24.h,
|
||||||
|
height: 24.h,
|
||||||
|
fit: BoxFit.fill,
|
||||||
|
errorBuilder: (cxt, child, tr) {
|
||||||
|
return SizedBox(height: 24, width: 24);
|
||||||
|
},
|
||||||
|
).toShimmer2(isShow: isLoading).circle(100),
|
||||||
|
SizedBox(width: 4.h),
|
||||||
|
(labOrder?.doctorName ?? "").toText16(isBold: true).toShimmer2(isShow: isLoading, width: 200)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
SizedBox(height: 8.h),
|
||||||
|
Wrap(
|
||||||
|
spacing: 8.h,
|
||||||
|
runSpacing: 0.h,
|
||||||
|
children: [
|
||||||
|
AppCustomChipWidget(labelText: isLoading ? "null" : DateUtil.formatDateToDate(DateUtil.convertStringToDate(labOrder!.createdOn), false)).toShimmer2(isShow: isLoading, width: 70),
|
||||||
|
AppCustomChipWidget(labelText: isLoading ? "null" : labOrder!.clinicDescription!).toShimmer2(isShow: isLoading, width: 100),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
AnimatedSwitcher(
|
||||||
|
duration: Duration(milliseconds: 300),
|
||||||
|
switchInCurve: Curves.easeIn,
|
||||||
|
switchOutCurve: Curves.easeOut,
|
||||||
|
transitionBuilder: (Widget child, Animation<double> animation) {
|
||||||
|
return FadeTransition(
|
||||||
|
opacity: animation,
|
||||||
|
child: SizeTransition(
|
||||||
|
sizeFactor: animation,
|
||||||
|
axisAlignment: 0.0,
|
||||||
|
child: child,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
child: isExpanded
|
||||||
|
? Container(
|
||||||
|
key: ValueKey<int>(index),
|
||||||
|
padding: EdgeInsets.symmetric(horizontal: 16.h, vertical: 8.h),
|
||||||
|
child: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
...labOrder!.testDetails!.map((detail) {
|
||||||
|
return Padding(
|
||||||
|
padding: EdgeInsets.only(bottom: 8.h),
|
||||||
|
child: '● ${detail.description}'.toText14(weight: FontWeight.w500),
|
||||||
|
);
|
||||||
|
}).toList(),
|
||||||
|
SizedBox(height: 16.h),
|
||||||
|
Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
|
children: [
|
||||||
|
SizedBox(),
|
||||||
|
CustomButton(
|
||||||
|
icon: AppAssets.view_report_icon,
|
||||||
|
iconColor: AppColors.primaryRedColor,
|
||||||
|
iconSize: 16.h,
|
||||||
|
text: LocaleKeys.viewReport.tr(context: context),
|
||||||
|
onPressed: () {},
|
||||||
|
backgroundColor: AppColors.secondaryLightRedColor,
|
||||||
|
borderColor: AppColors.secondaryLightRedColor,
|
||||||
|
textColor: AppColors.primaryRedColor,
|
||||||
|
fontSize: 14,
|
||||||
|
fontWeight: FontWeight.bold,
|
||||||
|
borderRadius: 12,
|
||||||
|
padding: EdgeInsets.fromLTRB(10, 0, 10, 0),
|
||||||
|
height: 40.h,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
)
|
||||||
|
: SizedBox.shrink(key: ValueKey<int>(-index)),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
String getLabOrderStatusText(num status, context) {
|
||||||
|
switch (status) {
|
||||||
|
case 44:
|
||||||
|
return LocaleKeys.resultsPending.tr(context: context);
|
||||||
|
case 45:
|
||||||
|
return LocaleKeys.resultsPending.tr(context: context);
|
||||||
|
case 16:
|
||||||
|
return LocaleKeys.resultsAvailable.tr(context: context);
|
||||||
|
case 17:
|
||||||
|
return LocaleKeys.resultsAvailable.tr(context: context);
|
||||||
|
default:
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Color getLabOrderStatusColor(num status) {
|
||||||
|
switch (status) {
|
||||||
|
case 44:
|
||||||
|
return AppColors.warningColorYellow;
|
||||||
|
case 45:
|
||||||
|
return AppColors.warningColorYellow;
|
||||||
|
case 16:
|
||||||
|
return AppColors.successColor;
|
||||||
|
case 17:
|
||||||
|
return AppColors.successColor;
|
||||||
|
default:
|
||||||
|
return AppColors.greyColor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue