family file bottomsheet added
							parent
							
								
									030c2a1b8a
								
							
						
					
					
						commit
						0a653a61f2
					
				| @ -1,47 +1,136 @@ | ||||
| import 'package:flutter/material.dart'; | ||||
|   import 'package:flutter_svg/flutter_svg.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/string_extensions.dart'; | ||||
|   import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; | ||||
|   import 'package:hmg_patient_app_new/features/medical_file/models/family_file_response_model.dart'; | ||||
|   import 'package:hmg_patient_app_new/theme/colors.dart'; | ||||
|   import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; | ||||
| 
 | ||||
|   class ProfileSelector extends StatelessWidget { | ||||
|     final List<FamilyFileResponseModelLists> profiles; | ||||
|     final Function(FamilyFileResponseModelLists) onSelect; | ||||
| 
 | ||||
| 
 | ||||
|     const ProfileSelector({ | ||||
|       Key? key, | ||||
|       required this.profiles, | ||||
|       required this.onSelect, | ||||
|     }) : super(key: key); | ||||
| 
 | ||||
| 
 | ||||
|     @override | ||||
|     Widget build(BuildContext context) { | ||||
|     return Column( | ||||
|       final double screenHeight = MediaQuery.of(context).size.height; | ||||
|       int? activeProfileId = Utils.appState.getAuthenticatedUser()?.patientId; | ||||
|       return SizedBox( | ||||
|         height: screenHeight * 0.6, | ||||
|         child: SingleChildScrollView( | ||||
|           child: Column( | ||||
|             mainAxisSize: MainAxisSize.min, | ||||
|       children: profiles.map((profile) { | ||||
|         return ListTile( | ||||
|           leading: CircleAvatar( | ||||
|             radius: 22, | ||||
|             backgroundImage: profile.genderImage != null && | ||||
|                 profile.genderImage.toString().isNotEmpty | ||||
|                 ? NetworkImage(profile.genderImage!) | ||||
|                 : AssetImage( | ||||
|             children: [ | ||||
|               const Text( | ||||
|                 "Please select a profile", | ||||
|                 style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold), | ||||
|               ), | ||||
|               const SizedBox(height: 6), | ||||
|               const Text( | ||||
|                 "Switch from the below list of medical file", | ||||
|                 style: TextStyle(fontSize: 14, color: Colors.grey), | ||||
|                 textAlign: TextAlign.center, | ||||
|               ), | ||||
|               const SizedBox(height: 20), | ||||
| 
 | ||||
|               // ✅ GridView inside scroll | ||||
|               GridView.builder( | ||||
|                 shrinkWrap: true, | ||||
|                 physics: const NeverScrollableScrollPhysics(), | ||||
|                 itemCount: profiles.length, | ||||
|                 gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount( | ||||
|                   crossAxisCount: 2, | ||||
|                   crossAxisSpacing: 10, | ||||
|                   mainAxisSpacing: 10, | ||||
|                   childAspectRatio: 0.75, | ||||
|                 ), | ||||
|                 itemBuilder: (context, index) { | ||||
|                   final profile = profiles[index]; | ||||
|                   final isActive = | ||||
|                   (profile.responseId == activeProfileId); | ||||
|                   return Container( | ||||
|                     padding: const EdgeInsets.symmetric(vertical: 12, horizontal: 8), | ||||
|                     decoration: RoundedRectangleBorder().toSmoothCornerDecoration( | ||||
|                       color: isActive ? Colors.grey.shade100 : AppColors.whiteColor, // Lighter background for active | ||||
|                       borderRadius: 24, | ||||
|                     ), | ||||
|                     child: Opacity( | ||||
|                       opacity: isActive ? 0.5 : 1.0, // Fade all content if active | ||||
|                       child: Column( | ||||
|                         mainAxisSize: MainAxisSize.min, | ||||
|                         children: [ | ||||
|                           const SizedBox(height: 5), | ||||
|                           Container( | ||||
|                             height: 80, | ||||
|                             width: 78, | ||||
|                             decoration: BoxDecoration( | ||||
|                               shape: BoxShape.circle, | ||||
|                               image: DecorationImage( | ||||
|                                 image: AssetImage( | ||||
|                                   profile.gender == 1 | ||||
|                                       ? AppAssets.male_img | ||||
|                     : AppAssets.femaleImg) | ||||
|             as ImageProvider, | ||||
|                                       : AppAssets.femaleImg, | ||||
|                                 ), | ||||
|                                 fit: BoxFit.cover, | ||||
|                               ), | ||||
|           title: Text( | ||||
|             profile.patientName ?? "Unknown", | ||||
|             style: const TextStyle(fontWeight: FontWeight.w600), | ||||
|                             ), | ||||
|           subtitle: Text( | ||||
|             profile.relationship ?? "Self", | ||||
|             style: const TextStyle(color: Colors.grey), | ||||
|                           ), | ||||
|           trailing: const Icon(Icons.arrow_forward_ios, size: 16), | ||||
|           onTap: () => onSelect(profile), | ||||
|                           const SizedBox(height: 8), | ||||
|                           (profile.patientName ?? "Unknown").toText14( | ||||
|                             isBold: true, | ||||
|                             maxlines: 1, | ||||
|                             isCenter: true, | ||||
|                           ), | ||||
|                           const SizedBox(height: 4), | ||||
|                           Text( | ||||
|                             "Relation: ${profile.relationship ?? "N/A"}", | ||||
|                             style: const TextStyle( | ||||
|                               fontSize: 12, | ||||
|                               color: Colors.grey, | ||||
|                             ), | ||||
|                             textAlign: TextAlign.center, | ||||
|                           ), | ||||
|                           const SizedBox(height: 5), | ||||
|                           if (isActive) | ||||
|                             CustomButton( | ||||
|                               height: 36, | ||||
|                               onPressed: (){}, // Disabled | ||||
|                               text: 'Active', | ||||
|                               backgroundColor: Colors.grey.shade200, | ||||
|                               borderColor: Colors.grey.shade200, | ||||
|                               textColor: Colors.black, | ||||
|                               fontSize: 13, | ||||
|                             ).paddingOnly(top: 8, bottom: 4) | ||||
|                           else | ||||
|                             CustomButton( | ||||
|                               height: 36, | ||||
|                               onPressed: () => onSelect(profile), | ||||
|                               text: 'Select', | ||||
|                               backgroundColor: const Color(0xffFEE9EA), | ||||
|                               borderColor: const Color(0xffFEE9EA), | ||||
|                               textColor: const Color(0xffED1C2B), | ||||
|                               fontSize: 13, | ||||
|                             ).paddingOnly(top: 8, bottom: 4), | ||||
|                         ], | ||||
|                       ), | ||||
|                     ), | ||||
|                   ); | ||||
|       }).toList(), | ||||
|                 }, | ||||
|               ), | ||||
|             ], | ||||
|           ), | ||||
|         ), | ||||
|       ); | ||||
|     } | ||||
| 
 | ||||
|   } | ||||
|  | ||||
					Loading…
					
					
				
		Reference in New Issue