lab implementation contd.
parent
89456bc2aa
commit
e044fc8c5e
@ -0,0 +1,3 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M11 1C5.47715 1 1 5.47715 1 11C1 16.5228 5.47715 21 11 21C13.4013 21 15.6049 20.1536 17.3287 18.7429L21.2929 22.7071C21.6834 23.0976 22.3166 23.0976 22.7071 22.7071C23.0976 22.3166 23.0976 21.6834 22.7071 21.2929L18.7429 17.3287C20.1536 15.6049 21 13.4013 21 11C21 5.47715 16.5228 1 11 1ZM3 11C3 6.58172 6.58172 3 11 3C15.4183 3 19 6.58172 19 11C19 15.4183 15.4183 19 11 19C6.58172 19 3 15.4183 3 11Z" fill="#2E3039"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 575 B |
@ -0,0 +1,9 @@
|
||||
import 'package:hmg_patient_app_new/core/exceptions/api_failure.dart';
|
||||
import 'package:hmg_patient_app_new/core/common_models/generic_api_model.dart';
|
||||
import 'package:dartz/dartz.dart';
|
||||
|
||||
abstract class AuthenticationRepo {
|
||||
Future<Either<Failure, GenericApiModel<dynamic>>> getPatientLabOrders({
|
||||
required String firebaseToken,
|
||||
});
|
||||
}
|
||||
@ -0,0 +1,13 @@
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
class LabViewModel extends ChangeNotifier {
|
||||
|
||||
bool isLabOrdersLoading = false;
|
||||
bool isLabResultsLoading = false;
|
||||
|
||||
initLabProvider() {
|
||||
isLabOrdersLoading = true;
|
||||
isLabResultsLoading = true;
|
||||
notifyListeners();
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,173 @@
|
||||
import 'dart:async';
|
||||
|
||||
import 'package:easy_localization/easy_localization.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_staggered_animations/flutter_staggered_animations.dart';
|
||||
import 'package:hmg_patient_app_new/core/app_assets.dart';
|
||||
import 'package:hmg_patient_app_new/core/utils/size_utils.dart';
|
||||
import 'package:hmg_patient_app_new/core/utils/utils.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/generated/locale_keys.g.dart';
|
||||
import 'package:hmg_patient_app_new/features/lab/lab_view_model.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/shimmer/movies_shimmer_widget.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
|
||||
class LabOrdersPage extends StatefulWidget {
|
||||
const LabOrdersPage({super.key});
|
||||
|
||||
@override
|
||||
State<LabOrdersPage> createState() => _LabOrdersPageState();
|
||||
}
|
||||
|
||||
class _LabOrdersPageState extends State<LabOrdersPage> {
|
||||
late LabViewModel labProvider;
|
||||
|
||||
int? expandedIndex;
|
||||
|
||||
// Sample data for demonstration
|
||||
final List<String> labOrders = [
|
||||
'Blood Test',
|
||||
'Urine Test',
|
||||
'X-Ray',
|
||||
'MRI',
|
||||
];
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
scheduleMicrotask(() {
|
||||
labProvider.initLabProvider();
|
||||
});
|
||||
super.initState();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
labProvider = Provider.of<LabViewModel>(context);
|
||||
return Scaffold(
|
||||
backgroundColor: AppColors.bgScaffoldColor,
|
||||
appBar: AppBar(
|
||||
title: const Text('Lab Results'),
|
||||
backgroundColor: AppColors.bgScaffoldColor,
|
||||
),
|
||||
body: Padding(
|
||||
padding: EdgeInsets.all(24.h),
|
||||
child: SingleChildScrollView(
|
||||
child: Consumer<LabViewModel>(
|
||||
builder: (context, model, child) {
|
||||
return Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
LocaleKeys.labResults.tr(context: context).toText24(isBold: true),
|
||||
Utils.buildSvgWithAssets(icon: AppAssets.search_icon),
|
||||
],
|
||||
),
|
||||
SizedBox(height: 16.h),
|
||||
// Build Tab Bar
|
||||
SizedBox(height: 16.h),
|
||||
// Expandable list
|
||||
ListView.builder(
|
||||
shrinkWrap: true,
|
||||
physics: NeverScrollableScrollPhysics(),
|
||||
itemCount: model.isLabOrdersLoading ? 5 : labOrders.length,
|
||||
itemBuilder: (context, index) {
|
||||
final isExpanded = expandedIndex == index;
|
||||
return model.isLabOrdersLoading
|
||||
? const MoviesShimmerWidget()
|
||||
: AnimationConfiguration.staggeredList(
|
||||
position: index,
|
||||
duration: const Duration(milliseconds: 500),
|
||||
child: SlideAnimation(
|
||||
verticalOffset: 100.0,
|
||||
child: FadeInAnimation(
|
||||
child: AnimatedContainer(
|
||||
duration: Duration(milliseconds: 300),
|
||||
curve: Curves.easeInOut,
|
||||
margin: EdgeInsets.symmetric(vertical: 8.h),
|
||||
decoration: RoundedRectangleBorder().toSmoothCornerDecoration(
|
||||
color: AppColors.whiteColor,
|
||||
borderRadius: 20.h,
|
||||
),
|
||||
child: InkWell(
|
||||
onTap: () {
|
||||
setState(() {
|
||||
expandedIndex = isExpanded ? null : index;
|
||||
});
|
||||
},
|
||||
child: Column(
|
||||
children: [
|
||||
Padding(
|
||||
padding: EdgeInsets.all(16.h),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
CustomButton(
|
||||
text: LocaleKeys.pending.tr(context: context),
|
||||
onPressed: () {},
|
||||
backgroundColor: getLabOrderStatusColor(44).withOpacity(0.15),
|
||||
borderColor: getLabOrderStatusColor(44).withOpacity(0.01),
|
||||
textColor: getLabOrderStatusColor(44),
|
||||
fontSize: 10,
|
||||
fontWeight: FontWeight.normal,
|
||||
borderRadius: 8,
|
||||
padding: EdgeInsets.fromLTRB(10, 0, 10, 0),
|
||||
height: 30.h,
|
||||
),
|
||||
Icon(isExpanded ? Icons.expand_less : Icons.expand_more),
|
||||
],
|
||||
),
|
||||
SizedBox(height: 8.h),
|
||||
Text(labOrders[index], style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold)),
|
||||
],
|
||||
),
|
||||
),
|
||||
AnimatedCrossFade(
|
||||
firstChild: SizedBox.shrink(),
|
||||
secondChild: Padding(
|
||||
padding: EdgeInsets.symmetric(horizontal: 16.h, vertical: 8.h),
|
||||
child: Text('Details for ${labOrders[index]}'),
|
||||
),
|
||||
crossFadeState: isExpanded ? CrossFadeState.showSecond : CrossFadeState.showFirst,
|
||||
duration: Duration(milliseconds: 300),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
],
|
||||
);
|
||||
},
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
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