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.
		
		
		
		
		
			
		
			
				
	
	
		
			137 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			Dart
		
	
			
		
		
	
	
			137 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			Dart
		
	
| 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) {
 | |
|       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: [
 | |
|               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,
 | |
|                                 ),
 | |
|                                 fit: BoxFit.cover,
 | |
|                               ),
 | |
|                             ),
 | |
|                           ),
 | |
|                           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),
 | |
|                         ],
 | |
|                       ),
 | |
|                     ),
 | |
|                   );
 | |
|                 },
 | |
|               ),
 | |
|             ],
 | |
|           ),
 | |
|         ),
 | |
|       );
 | |
|     }
 | |
| 
 | |
|   }
 |