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