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: () {}, |  | ||||||
|      ); |  | ||||||
|    } |  | ||||||
|  } |  | ||||||