family screen & widgets
| After Width: | Height: | Size: 137 KiB | 
| After Width: | Height: | Size: 127 KiB | 
| Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 130 KiB | 
| Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 161 KiB | 
| @ -0,0 +1,3 @@ | ||||
| <svg width="14" height="15" viewBox="0 0 14 15" fill="none" xmlns="http://www.w3.org/2000/svg"> | ||||
| <path fill-rule="evenodd" clip-rule="evenodd" d="M11.5525 2.46209C9.79631 1.38751 8.20843 1.81413 7.24747 2.53374L7.24696 2.53412L6.99967 2.71856L6.75249 2.53412C5.79154 1.81445 4.20322 1.38747 2.44697 2.46209C1.21445 3.21625 0.537796 4.77917 0.775779 6.54921C1.01526 8.33035 2.16771 10.3232 4.57364 12.0996L4.64687 12.1537C5.46216 12.7562 6.04566 13.1875 6.99985 13.1875C7.95405 13.1875 8.53754 12.7562 9.35283 12.1537L9.42606 12.0996C10.3581 11.4114 11.1012 10.6918 11.6765 9.96419C11.6797 9.96013 11.6828 9.95603 11.6859 9.95191C14.0531 6.94717 13.5653 3.69371 11.5525 2.46209ZM7.74698 6.53198L10.4778 9.62245C10.0168 10.1444 9.44544 10.6701 8.74767 11.1853C7.83876 11.8564 7.54669 12.05 6.99985 12.05C6.45302 12.05 6.16095 11.8564 5.25204 11.1853C3.02962 9.54441 2.09491 7.80338 1.90596 6.39801C1.71551 4.98153 2.26916 3.90531 3.0432 3.43169C4.33507 2.64121 5.40954 2.95773 6.05358 3.43314L4.70267 4.46071C3.88293 5.08424 3.8086 6.28812 4.54542 7.00729C4.86355 7.31779 5.27961 7.48142 5.70118 7.48816C5.71901 7.48845 5.73685 7.48845 5.75469 7.48818C6.05478 7.48357 6.3557 7.39938 6.62418 7.232L7.74698 6.53198Z" fill="#2E3039"/> | ||||
| </svg> | ||||
| After Width: | Height: | Size: 1.2 KiB | 
| @ -0,0 +1,197 @@ | ||||
| import 'package:easy_localization/easy_localization.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/dependencies.dart'; | ||||
| import 'package:hmg_patient_app_new/core/enums.dart'; | ||||
| import 'package:hmg_patient_app_new/core/utils/utils.dart'; | ||||
| import 'package:hmg_patient_app_new/core/utils/validation_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/authentication/authentication_view_model.dart'; | ||||
| import 'package:hmg_patient_app_new/features/medical_file/models/family_file_response_model.dart'; | ||||
| import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; | ||||
| import 'package:hmg_patient_app_new/presentation/my_family/widget/family_cards.dart'; | ||||
| import 'package:hmg_patient_app_new/services/dialog_service.dart'; | ||||
| import 'package:hmg_patient_app_new/theme/colors.dart'; | ||||
| import 'package:hmg_patient_app_new/widgets/appbar/app_bar_widget.dart'; | ||||
| import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; | ||||
| import 'package:hmg_patient_app_new/widgets/common_bottom_sheet.dart'; | ||||
| import 'package:hmg_patient_app_new/widgets/custom_tab_bar.dart'; | ||||
| import 'package:hmg_patient_app_new/widgets/dropdown/country_dropdown_widget.dart'; | ||||
| import 'package:hmg_patient_app_new/widgets/input_widget.dart'; | ||||
| 
 | ||||
| class FamilyMedicalScreen extends StatefulWidget { | ||||
|   final List<FamilyFileResponseModelLists> profiles; | ||||
|   final Function(FamilyFileResponseModelLists) onSelect; | ||||
| 
 | ||||
|   const FamilyMedicalScreen({ | ||||
|     Key? key, | ||||
|     required this.profiles, | ||||
|     required this.onSelect, | ||||
|   }) : super(key: key); | ||||
| 
 | ||||
|   @override | ||||
|   State<FamilyMedicalScreen> createState() => _FamilyMedicalScreenState(); | ||||
| } | ||||
| 
 | ||||
| class _FamilyMedicalScreenState extends State<FamilyMedicalScreen> { | ||||
|   List<CustomTabBarModel> tabs = [CustomTabBarModel("", LocaleKeys.medicalFile.tr()), CustomTabBarModel("", LocaleKeys.request.tr())]; | ||||
| 
 | ||||
|   @override | ||||
|   Widget build(BuildContext context) { | ||||
|     return Scaffold( | ||||
|       backgroundColor: AppColors.scaffoldBgColor, | ||||
|       appBar: CustomAppBar( | ||||
|         onBackPressed: () { | ||||
|           Navigator.of(context).pop(); | ||||
|         }, | ||||
|         onLanguageChanged: (lang) {}, | ||||
|         hideLogoAndLang: true, | ||||
|       ), | ||||
|       body: SingleChildScrollView( | ||||
|         child: Column( | ||||
|           mainAxisSize: MainAxisSize.min, | ||||
|           crossAxisAlignment: CrossAxisAlignment.start, | ||||
|           children: [ | ||||
|             LocaleKeys.myMedicalFile.tr().toText26(color: AppColors.textColor, weight: FontWeight.w600, letterSpacing: -2), | ||||
|             SizedBox(height: 25.h), | ||||
|             CustomTabBar( | ||||
|               tabs: tabs, | ||||
|               onTabChange: (int index) {}, | ||||
|             ), | ||||
|             SizedBox(height: 25.h), | ||||
|             FamilyCards(profiles: widget.profiles, onSelect: widget.onSelect, isShowDetails: true), | ||||
|             SizedBox(height: 20.h), | ||||
|           ], | ||||
|         ), | ||||
|       ).paddingSymmetrical(20, 0), | ||||
|       bottomSheet: Container( | ||||
|           decoration: RoundedRectangleBorder().toSmoothCornerDecoration( | ||||
|             color: AppColors.whiteColor, | ||||
|             customBorder: BorderRadius.only(topLeft: Radius.circular(24), topRight: Radius.circular(24)), | ||||
|           ), | ||||
|           padding: EdgeInsets.symmetric(vertical: 10.h, horizontal: 20.h), | ||||
|           child: CustomButton( | ||||
|             text: "Add a new family member", | ||||
|             onPressed: () { | ||||
|               showModelSheet(); | ||||
|             }, | ||||
|             icon: AppAssets.add_icon, | ||||
|             height: 56.h, | ||||
|             fontWeight: FontWeight.w600, | ||||
|           )), | ||||
|     ); | ||||
|   } | ||||
| 
 | ||||
|   void showModelSheet() { | ||||
|     AuthenticationViewModel authVm = getIt.get<AuthenticationViewModel>(); | ||||
|     return showCommonBottomSheetWithoutHeight(context, | ||||
|         title: "Add Family Member", | ||||
|         child: Column( | ||||
|           crossAxisAlignment: CrossAxisAlignment.start, | ||||
|           mainAxisAlignment: MainAxisAlignment.start, | ||||
|           children: [ | ||||
|             "Please fill the below field to add a new family member to your profile".toText16(color: AppColors.textColor, weight: FontWeight.w500), | ||||
|             SizedBox(height: 20.h), | ||||
|             Container( | ||||
|               decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(24)), | ||||
|               padding: EdgeInsets.symmetric(horizontal: 16.h, vertical: 8.h), | ||||
|               child: Column( | ||||
|                 children: [ | ||||
|                   CustomCountryDropdown( | ||||
|                     countryList: CountryEnum.values, | ||||
|                     onCountryChange: authVm.onCountryChange, | ||||
|                   ).paddingOnly(top: 8.h, bottom: 16.h), | ||||
|                   Divider( | ||||
|                     height: 1.h, | ||||
|                     color: AppColors.spacerLineColor, | ||||
|                   ), | ||||
|                   TextInputWidget( | ||||
|                     labelText: LocaleKeys.nationalIdNumber.tr(), | ||||
|                     hintText: "xxxxxxxxx", | ||||
|                     controller: authVm.nationalIdController, | ||||
|                     // focusNode: _nationalIdFocusNode, | ||||
|                     isEnable: true, | ||||
|                     prefix: null, | ||||
|                     isAllowRadius: true, | ||||
|                     isBorderAllowed: false, | ||||
|                     isAllowLeadingIcon: true, | ||||
|                     autoFocus: true, | ||||
|                     keyboardType: TextInputType.number, | ||||
|                     padding: EdgeInsets.symmetric(vertical: 8.h), | ||||
|                     leadingIcon: AppAssets.student_card, | ||||
|                   ).paddingOnly(top: 8.h, bottom: 8.h), | ||||
|                   Divider( | ||||
|                     height: 1.h, | ||||
|                     color: AppColors.spacerLineColor, | ||||
|                   ), | ||||
|                   TextInputWidget( | ||||
|                     labelText: LocaleKeys.phoneNumber.tr(), | ||||
|                     hintText: "574345434", | ||||
|                     controller: authVm.phoneNumberController, | ||||
|                     isEnable: true, | ||||
|                     prefix: authVm.selectedCountrySignup.countryCode, | ||||
|                     isAllowRadius: true, | ||||
|                     isBorderAllowed: false, | ||||
|                     isAllowLeadingIcon: true, | ||||
|                     autoFocus: true, | ||||
|                     keyboardType: TextInputType.number, | ||||
|                     padding: EdgeInsets.symmetric(vertical: 8.h), | ||||
|                     leadingIcon: AppAssets.smart_phone, | ||||
|                   ).paddingOnly(top: 8.h, bottom: 4), | ||||
| 
 | ||||
|                   //TextInputWidget( | ||||
|                   //                           labelText: widget.isForEmail ? LocaleKeys.email.tr() : LocaleKeys.phoneNumber.tr(), | ||||
|                   //                           hintText: widget.isForEmail ? "demo@gmail.com" : "5xxxxxxxx", | ||||
|                   //                           controller: widget.textController!, | ||||
|                   //                           focusNode: _textFieldFocusNode, | ||||
|                   //                           autoFocus: widget.autoFocus, | ||||
|                   //                           padding: EdgeInsets.all(8.h), | ||||
|                   //                           keyboardType: widget.isForEmail ? TextInputType.emailAddress : TextInputType.number, | ||||
|                   //                           onChange: (value) { | ||||
|                   //                             if (widget.onChange != null) { | ||||
|                   //                               widget.onChange!(value); | ||||
|                   //                             } | ||||
|                   //                           }, | ||||
|                   //                           onCountryChange: (value) { | ||||
|                   //                             if (widget.onCountryChange != null) { | ||||
|                   //                               widget.onCountryChange!(value); | ||||
|                   //                             } | ||||
|                   //                           }, | ||||
|                   //                           isEnable: true, | ||||
|                   //                           isReadOnly: widget.isFromSavedLogin, | ||||
|                   //                           prefix: widget.isForEmail ? null : widget.countryCode, | ||||
|                   //                           isBorderAllowed: false, | ||||
|                   //                           isAllowLeadingIcon: true, | ||||
|                   //                           fontSize: 13.h, | ||||
|                   //                           isCountryDropDown: widget.isEnableCountryDropdown, | ||||
|                   //                           leadingIcon: widget.isForEmail ? AppAssets.email : AppAssets.smart_phone, | ||||
|                   //                         ) | ||||
|                 ], | ||||
|               ), | ||||
|             ), | ||||
|             SizedBox(height: 20.h), | ||||
|             CustomButton( | ||||
|                 text: "Verify the member", | ||||
|                 onPressed: () { | ||||
|                   FocusScope.of(context).unfocus(); | ||||
|                   if (ValidationUtils.isValidatedIdAndPhoneWithCountryValidation( | ||||
|                     nationalId: authVm.nationalIdController.text, | ||||
|                     selectedCountry: authVm.selectedCountrySignup, | ||||
|                     phoneNumber: authVm.phoneNumberController.text, | ||||
|                     onOkPress: () { | ||||
|                       Navigator.of(context).pop(); | ||||
|                     }, | ||||
|                   )) {} | ||||
|                 }, | ||||
|                 icon: AppAssets.add_icon, | ||||
|                 height: 56.h, | ||||
|                 fontWeight: FontWeight.w600), | ||||
|             SizedBox(height: 20.h), | ||||
|           ], | ||||
|         ), | ||||
|         callBackFunc: () {}); | ||||
|   } | ||||
| } | ||||
| @ -0,0 +1,116 @@ | ||||
| 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/app_state.dart'; | ||||
| import 'package:hmg_patient_app_new/core/dependencies.dart'; | ||||
| import 'package:hmg_patient_app_new/core/enums.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/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/custom_chip_widget.dart'; | ||||
| 
 | ||||
| class FamilyCards extends StatefulWidget { | ||||
|   final List<FamilyFileResponseModelLists> profiles; | ||||
|   final Function(FamilyFileResponseModelLists) onSelect; | ||||
|   final bool isShowDetails; | ||||
|   final bool isBottomSheet; | ||||
| 
 | ||||
|   const FamilyCards({super.key, required this.profiles, required this.onSelect, this.isShowDetails = false, this.isBottomSheet = false}); | ||||
| 
 | ||||
|   @override | ||||
|   State<FamilyCards> createState() => _FamilyCardsState(); | ||||
| } | ||||
| 
 | ||||
| class _FamilyCardsState extends State<FamilyCards> { | ||||
|   AppState appState = getIt<AppState>(); | ||||
| 
 | ||||
|   @override | ||||
|   Widget build(BuildContext context) { | ||||
|     return GridView.builder( | ||||
|       shrinkWrap: true, | ||||
|       physics: const NeverScrollableScrollPhysics(), | ||||
|       itemCount: widget.profiles.length, | ||||
|       gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( | ||||
|         crossAxisCount: 2, | ||||
|         crossAxisSpacing: 10.h, | ||||
|         mainAxisSpacing: 10.h, | ||||
|         childAspectRatio: widget.isShowDetails ? 0.56.h : 0.74.h, | ||||
|       ), | ||||
|       itemBuilder: (context, index) { | ||||
|         final profile = widget.profiles[index]; | ||||
|         final isActive = (profile.responseId == appState | ||||
|             .getAuthenticatedUser() | ||||
|             ?.patientId); | ||||
|         return Container( | ||||
|           padding: EdgeInsets.symmetric(vertical: 15.h, horizontal: 15.h), | ||||
|           decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24), | ||||
|           child: Opacity( | ||||
|             opacity: isActive ? 0.4 : 1.0, // Fade all content if active | ||||
|             child: Column( | ||||
|               mainAxisSize: MainAxisSize.min, | ||||
|               children: [ | ||||
|                 SizedBox(height: 5.h), | ||||
|                 Utils.buildImgWithAssets( | ||||
|                     icon: profile.gender == 1 ? ((profile.age ?? 0) < 7 ? AppAssets.babyBoyImg : AppAssets.male_img) : (profile.age! < 7 ? AppAssets.babyGirlImg : AppAssets.femaleImg), | ||||
|                     width: 80.h, | ||||
|                     height: 78.h), | ||||
|                 SizedBox(height: 8.h), | ||||
|                 (profile.patientName ?? "Unknown").toText16(isBold: false, isCenter: true, maxlines: 1, weight: FontWeight.w600), | ||||
|                 SizedBox(height: 4.h), | ||||
|                 CustomChipWidget( | ||||
|                     chipType: ChipTypeEnum.alert, | ||||
|                     backgroundColor: AppColors.lightGrayBGColor, | ||||
|                     chipText: "Relation: ${profile.relationship ?? "N/A"}", | ||||
|                     iconAsset: AppAssets.heart, | ||||
|                     isShowBorder: false, | ||||
|                     borderRadius: 8.h, | ||||
|                     textColor: AppColors.textColor), | ||||
|                 widget.isShowDetails ? SizedBox(height: 4.h) : SizedBox(), | ||||
|                 widget.isShowDetails | ||||
|                     ? CustomChipWidget( | ||||
|                   chipType: ChipTypeEnum.alert, | ||||
|                   backgroundColor: AppColors.lightGrayBGColor, | ||||
|                   chipText: "Age: ${profile.age ?? "N/A"} Years", | ||||
|                   isShowBorder: false, | ||||
|                   borderRadius: 8.h, | ||||
|                   textColor: AppColors.textColor, | ||||
|                 ) | ||||
|                     : SizedBox(), | ||||
|                 widget.isShowDetails ? SizedBox(height: 8.h) : SizedBox(), | ||||
|                 Spacer(), | ||||
|                 if (isActive) | ||||
|                   CustomButton( | ||||
|                     height: 40.h, | ||||
|                     onPressed: () {}, | ||||
|                     text: LocaleKeys.active.tr(), | ||||
|                     backgroundColor: Colors.grey.shade200, | ||||
|                     borderColor: Colors.grey.shade200, | ||||
|                     textColor: AppColors.greyTextColor, | ||||
|                     fontSize: 13.h, | ||||
|                   ).paddingOnly(top: 0, bottom: 0) | ||||
|                 else | ||||
|                   CustomButton( | ||||
|                     height: 40.h, | ||||
|                     onPressed: () => widget.onSelect(profile), | ||||
|                     text: LocaleKeys.select.tr(), | ||||
|                     backgroundColor: AppColors.secondaryLightRedColor, | ||||
|                     borderColor: AppColors.secondaryLightRedColor, | ||||
|                     textColor: AppColors.primaryRedColor, | ||||
|                     fontSize: 13.h, | ||||
|                     icon: widget.isBottomSheet ? null :  AppAssets.heart, | ||||
|                     iconColor: AppColors.primaryRedColor, | ||||
|                     padding: EdgeInsets.symmetric(vertical: 0, horizontal: 0), | ||||
|                   ).paddingOnly(top: 0, bottom: 0), | ||||
|               ], | ||||
|             ), | ||||
|           ), | ||||
|         ); | ||||
|       }, | ||||
|     ); | ||||
|   } | ||||
| } | ||||
| @ -0,0 +1,31 @@ | ||||
| import 'package:flutter/material.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/features/medical_file/models/family_file_response_model.dart'; | ||||
| import 'package:hmg_patient_app_new/presentation/my_family/my_Family.dart'; | ||||
| import 'package:hmg_patient_app_new/presentation/my_family/widget/family_cards.dart'; | ||||
| import 'package:hmg_patient_app_new/theme/colors.dart'; | ||||
| import 'package:hmg_patient_app_new/widgets/common_bottom_sheet.dart'; | ||||
| 
 | ||||
| class MyFamilySheet { | ||||
|   static void show(BuildContext context, List<FamilyFileResponseModelLists> familyLists, Function(FamilyFileResponseModelLists) onSelect) { | ||||
|     return showCommonBottomSheetWithoutHeight( | ||||
|       context, | ||||
|       titleWidget: Column( | ||||
|         crossAxisAlignment: CrossAxisAlignment.start, | ||||
|         children: [ | ||||
|           'Please select a profile'.toText21(isBold: true), | ||||
|           'switch from the below list of medical file'.toText16(weight: FontWeight.w100, color: AppColors.greyTextColor), | ||||
|         ], | ||||
|       ), | ||||
|       child: FamilyCards( | ||||
|           profiles: familyLists, | ||||
|           onSelect: (profile) { | ||||
|             Navigator.of(context).pop(); // Close the bottom sheet | ||||
|             onSelect(profile); // Call the onSelect callback | ||||
|           }, | ||||
|           isBottomSheet: true), | ||||
|       callBackFunc: () {}, | ||||
|     ); | ||||
|   } | ||||
| } | ||||
| @ -1,137 +0,0 @@ | ||||
| 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: AppColors.greyTextColor, | ||||
|                               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), | ||||
|                         ], | ||||
|                       ), | ||||
|                     ), | ||||
|                   ); | ||||
|                 }, | ||||
|               ), | ||||
|             ], | ||||
|           ), | ||||
|         ), | ||||
|       ); | ||||
|     } | ||||
| 
 | ||||
|   } | ||||
| @ -1,26 +0,0 @@ | ||||
| import 'package:flutter/material.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/features/medical_file/models/family_file_response_model.dart'; | ||||
| import 'package:hmg_patient_app_new/theme/colors.dart'; | ||||
| import '../common_bottom_sheet.dart'; | ||||
| import 'my_Family.dart'; | ||||
|  class MyFamilySheet { | ||||
|    static void show(BuildContext context, List<FamilyFileResponseModelLists> familyLists, Function(FamilyFileResponseModelLists) onSelect) { | ||||
|      showCommonBottomSheetWithoutHeight( | ||||
|        context, | ||||
|       titleWidget: Column( | ||||
|         crossAxisAlignment: CrossAxisAlignment.start, | ||||
|         children: [ | ||||
|         'Please select a profile'.toText21(isBold: true), | ||||
|         'switch from the below list of medical file'.toText16(weight: FontWeight.w100, color: AppColors.greyTextColor), | ||||
|       ],), | ||||
| 
 | ||||
|        child: ProfileSelector(profiles: familyLists, onSelect: (profile) { | ||||
| 
 | ||||
|          Navigator.of(context).pop(); // Close the bottom sheet | ||||
|          onSelect(profile); // Call the onSelect callback | ||||
|        }), callBackFunc: () {}, | ||||
|      ); | ||||
|    } | ||||
|  } | ||||