import 'package:flutter/material.dart'; import 'package:stacked/stacked.dart'; import 'package:yimaru_app/ui/common/app_colors.dart'; import 'package:yimaru_app/ui/common/enmus.dart'; import 'package:yimaru_app/ui/common/ui_helpers.dart'; import 'package:yimaru_app/ui/widgets/profile_card.dart'; import 'package:yimaru_app/ui/widgets/profile_image.dart'; import 'package:yimaru_app/ui/widgets/view_profile_button.dart'; import '../../widgets/custom_elevated_button.dart'; import '../../widgets/image_picker_option.dart'; import 'profile_viewmodel.dart'; class ProfileView extends StackedView { const ProfileView({Key? key}) : super(key: key); Future _showImagePicker( {required BuildContext context, required ProfileViewModel viewModel}) async => await showDialog( context: context, builder: (context) => _showImagePickerDialog(context: context, viewModel: viewModel), ); AlertDialog _showImagePickerDialog( {required BuildContext context, required ProfileViewModel viewModel}) => AlertDialog( backgroundColor: Colors.transparent, content: _buildImagePicker(context: context, viewModel: viewModel), ); @override ProfileViewModel viewModelBuilder( BuildContext context, ) => ProfileViewModel(); @override Widget builder( BuildContext context, ProfileViewModel viewModel, Widget? child, ) => _buildScaffoldWrapper(context: context, viewModel: viewModel); Widget _buildScaffoldWrapper( {required BuildContext context, required ProfileViewModel viewModel}) => Scaffold( backgroundColor: kcBackgroundColor, body: _buildScaffold(context: context, viewModel: viewModel), ); Widget _buildScaffold( {required BuildContext context, required ProfileViewModel viewModel}) => SafeArea( child: _buildBodyWrapper(context: context, viewModel: viewModel)); Widget _buildBodyWrapper( {required BuildContext context, required ProfileViewModel viewModel}) => SingleChildScrollView( child: _buildBody(context: context, viewModel: viewModel), ); Widget _buildBody( {required BuildContext context, required ProfileViewModel viewModel}) => Padding( padding: const EdgeInsets.symmetric(horizontal: 15), child: _buildColumn(context: context, viewModel: viewModel), ); Widget _buildColumn( {required BuildContext context, required ProfileViewModel viewModel}) => Column( children: [ verticalSpaceMedium, _buildNotificationIconWrapper(), _buildProfileSection(context: context, viewModel: viewModel), verticalSpaceSmall, _buildViewProfileButton(viewModel), verticalSpaceLarge, _buildSettingsSection(viewModel), verticalSpaceLarge, _buildLogOutButton(viewModel), verticalSpaceLarge, ], ); Widget _buildNotificationIconWrapper() => Align(alignment: Alignment.bottomRight, child: _buildNotificationIcon()); Widget _buildNotificationIcon() => const Icon( Icons.notifications_none, color: kcDarkGrey, ); Widget _buildProfileSection( {required BuildContext context, required ProfileViewModel viewModel}) => Column( mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.center, children: _buildProfileSectionChildren( context: context, viewModel: viewModel), ); List _buildProfileSectionChildren( {required BuildContext context, required ProfileViewModel viewModel}) => [ _buildProfileImage(context: context, viewModel: viewModel), verticalSpaceSmall, _buildProfileName(viewModel), ]; Widget _buildProfileImage( {required BuildContext context, required ProfileViewModel viewModel}) => ProfileImage( profileImage: viewModel.user?.profilePicture, loading: viewModel.busy(StateObjects.profileImage) ? true : false, onTap: () async => await _showImagePicker(context: context, viewModel: viewModel), ); Widget _buildImagePicker( {required BuildContext context, required ProfileViewModel viewModel}) => ImagePickerOption( onCameraTap: () async => await viewModel.openCamera(), onGalleryTap: () async => await viewModel.openGallery(), ); Widget _buildProfileName(ProfileViewModel viewModel) => Text( 'Hi, ${viewModel.user?.firstName ?? ''} 👋', style: style25DG600, ); Widget _buildViewProfileButton(ProfileViewModel viewModel) => ViewProfileButton( onTap: () async => await viewModel.navigateToProfileDetail(), ); Widget _buildSettingsSection(ProfileViewModel viewModel) => GridView( shrinkWrap: true, physics: const NeverScrollableScrollPhysics(), gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount( crossAxisCount: 2, mainAxisSpacing: 15, crossAxisSpacing: 15), children: _buildSettingsChildren(viewModel)); List _buildSettingsChildren(ProfileViewModel viewModel) => [ _buildDownloadsCard(viewModel), _buildProgressCard(viewModel), _buildAccountCard(viewModel), _buildSupportCard(viewModel) ]; Widget _buildDownloadsCard(ProfileViewModel viewModel) => ProfileCard( icon: Icons.download, title: 'My Downloads', subTitle: 'Access offline lessons and saved videos', onTap: () async => await viewModel.navigateToDownloads(), ); Widget _buildProgressCard(ProfileViewModel viewModel) => ProfileCard( title: 'My Progress', icon: Icons.stacked_bar_chart, subTitle: 'Track your achievements and learning streak', onTap: () async => await viewModel.navigateToProgress(), ); Widget _buildAccountCard(ProfileViewModel viewModel) => ProfileCard( title: 'Account & Privacy', icon: Icons.privacy_tip_outlined, subTitle: 'Manage setting and app preference', onTap: () async => await viewModel.navigateToAccountPrivacy(), ); Widget _buildSupportCard(ProfileViewModel viewModel) => ProfileCard( title: 'Support', icon: Icons.headphones, subTitle: 'Get help through phone or Telegram', onTap: () async => await viewModel.navigateToSupport(), ); Widget _buildLogOutButton(ProfileViewModel viewModel) => CustomElevatedButton( height: 55, text: 'Log Out', borderRadius: 12, foregroundColor: kcRed, backgroundColor: kcRed.withOpacity(0.25), onTap: () async => await viewModel.logOut(), ); }