feat: Refactor code structure and optimize performance across multiple modules

This commit is contained in:
Achintha Isuru
2025-11-17 23:29:28 -05:00
parent 831570f2e0
commit a64cbd9edf
1508 changed files with 105319 additions and 0 deletions

View File

@@ -0,0 +1,21 @@
import 'package:auto_route/auto_route.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:krow/features/profile/role_kit/domain/bloc/role_kit_bloc.dart';
import 'package:krow/features/profile/role_kit/domain/bloc/role_kit_event.dart';
import 'package:krow/features/profile/role_kit/domain/staff_role_kit_repository_impl.dart';
@RoutePage()
class RoleKitFlowScreen extends StatelessWidget {
final RoleKitType roleKitType;
const RoleKitFlowScreen({super.key, required this.roleKitType});
@override
Widget build(BuildContext context) {
return BlocProvider(
create: (context) =>
RoleKitBloc()..add(RoleKitEventFetch(type: roleKitType)),
child: const AutoRouter());
}
}

View File

@@ -0,0 +1,197 @@
import 'package:auto_route/auto_route.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:gap/gap.dart';
import 'package:krow/core/presentation/gen/assets.gen.dart';
import 'package:krow/core/presentation/styles/kw_box_decorations.dart';
import 'package:krow/core/presentation/styles/kw_text_styles.dart';
import 'package:krow/core/presentation/styles/theme.dart';
import 'package:krow/core/presentation/widgets/scroll_layout_helper.dart';
import 'package:krow/core/presentation/widgets/ui_kit/check_box_card.dart';
import 'package:krow/core/presentation/widgets/ui_kit/kw_app_bar.dart';
import 'package:krow/core/presentation/widgets/ui_kit/kw_button.dart';
import 'package:krow/core/presentation/widgets/uploud_image_card.dart';
import 'package:krow/features/profile/role_kit/domain/bloc/role_kit_bloc.dart';
import 'package:krow/features/profile/role_kit/domain/bloc/role_kit_event.dart';
import 'package:krow/features/profile/role_kit/domain/bloc/role_kit_state.dart';
import 'package:krow/features/profile/role_kit/domain/role_kit_entity.dart';
import 'package:krow/features/profile/role_kit/domain/staff_role_kit_repository_impl.dart';
import 'package:modal_progress_hud_nsn/modal_progress_hud_nsn.dart';
@RoutePage()
class RoleKitScreen extends StatelessWidget {
const RoleKitScreen({super.key});
@override
Widget build(BuildContext context) {
return BlocConsumer<RoleKitBloc, RoleKitState>(
listenWhen: (oldState, newState) =>
oldState.success != newState.success ||
oldState.apiError != newState.apiError,
listener: (context, state) {
if (state.success) {
context.router.maybePop();
}
if (state.apiError != null) {
ScaffoldMessenger.of(context).showSnackBar(SnackBar(
content: Text(state.apiError ?? ''),
));
}
},
builder: (context, state) {
return ModalProgressHUD(
inAsyncCall: state.loading,
child: Scaffold(
appBar: KwAppBar(
titleText: state.roleKitType == RoleKitType.uniform
? '${state.selectedRole?.skill?.name} ${'uniform'.tr()}'
: '${state.selectedRole?.skill?.name} ${'equipment'.tr()}',
),
body: ScrollLayoutHelper(
padding:
const EdgeInsets.symmetric(horizontal: 16, vertical: 16),
upperWidget: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
Text(
'${'please_indicate'.tr()} ${state.roleKitType == RoleKitType.uniform ? 'uniform'.tr().toLowerCase() : 'equipment'.tr().toLowerCase()}:',
style: AppTextStyles.bodyTinyReg
.copyWith(color: AppColors.blackGray),
),
if (state.showError) _buildErrorMessage(),
const Gap(24),
if (state.roleKitItems
.where((item) => item.isMandatory)
.isNotEmpty) ...[
_buildSectionLabel('mandatory_items'.tr()),
_buildItems(
context, state.roleKitItems, true, state.showError),
const Gap(4),
],
if (state.roleKitItems
.where((item) => !item.isMandatory)
.isNotEmpty) ...[
_buildSectionLabel('optional_items'.tr()),
_buildItems(
context, state.roleKitItems, false, state.showError),
],
if (state.roleKitItems
.where((item) => item.needPhoto)
.isNotEmpty) ...[
const Gap(32),
_buildSectionLabel('confirm_availability'.tr()),
_buildUploadProofItems(
context, state.roleKitItems, state.showError),
]
],
),
lowerWidget: KwButton.primary(
label: 'confirm'.tr(),
onPressed: () {
BlocProvider.of<RoleKitBloc>(context)
.add(RoleKitEventSubmit());
}),
),
),
);
});
}
Widget _buildSectionLabel(String text) {
return Padding(
padding: const EdgeInsets.only(bottom: 8.0),
child: Text(text.toUpperCase(),
style: AppTextStyles.captionReg.copyWith(
color: AppColors.blackCaptionGreen,
)),
);
}
_buildItems(
context, List<RoleKitEntity> items, bool required, bool showError) {
return Column(
children: items.where((item) => item.isMandatory == required).map((item) {
return CheckBoxCard(
isChecked: item.confirmed,
title: item.title,
errorMessage: showError && !item.confirmed && required
? 'please_confirm_availability'.tr()
: null,
message: item.confirmed
? 'availability_confirmed'.tr()
: item.needPhoto
? 'confirm_availability_photo'.tr()
: null,
onTap: () {
BlocProvider.of<RoleKitBloc>(context)
.add(RoleKiEventChangeState(item));
},
padding: const EdgeInsets.only(bottom: 8),
);
}).toList(),
);
}
_buildUploadProofItems(context, List<RoleKitEntity> items, bool showError) {
return Column(
children: items.where((item) => item.needPhoto).map((item) {
return UploadImageCard(
title: item.title,
onSelectImage: () {
BlocProvider.of<RoleKitBloc>(context)
.add(RoleKitEventUploadPhoto(item: item, photoPath: ''));
},
onDeleteTap: () {
BlocProvider.of<RoleKitBloc>(context)
.add(RoleKitEventDeletePhoto(item));
},
onTap: () {},
imageUrl: item.imageUrl,
localImagePath: item.localImage,
inUploading: item.uploading,
statusColor: item.imageUrl == null
? AppColors.statusError
: AppColors.statusSuccess,
message: (item.imageUrl == null)
? showError
? 'availability_requires_confirmation'.tr()
: null
: 'availability_confirmed'.tr(),
hasError: showError,
padding: const EdgeInsets.only(bottom: 8),
);
}).toList(),
);
}
Container _buildErrorMessage() {
return Container(
margin: const EdgeInsets.only(top: 12),
padding: const EdgeInsets.all(8),
decoration: KwBoxDecorations.primaryLight8,
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
height: 28,
width: 28,
decoration: const BoxDecoration(
shape: BoxShape.circle, color: AppColors.tintRed),
child: Center(
child: Assets.images.icons.alertCircle.svg(),
),
),
const Gap(8),
Expanded(
child: Text(
'item_checked_in_box'.tr(),
style: AppTextStyles.bodyTinyMed
.copyWith(color: AppColors.statusError),
),
),
],
),
);
}
}

View File

@@ -0,0 +1,95 @@
import 'package:auto_route/auto_route.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:gap/gap.dart';
import 'package:krow/core/data/models/staff_role.dart';
import 'package:krow/core/presentation/gen/assets.gen.dart';
import 'package:krow/core/application/routing/routes.gr.dart';
import 'package:krow/core/presentation/styles/kw_box_decorations.dart';
import 'package:krow/core/presentation/styles/kw_text_styles.dart';
import 'package:krow/core/presentation/styles/theme.dart';
import 'package:krow/core/presentation/widgets/ui_kit/kw_app_bar.dart';
import 'package:krow/core/presentation/widgets/scroll_layout_helper.dart';
import 'package:krow/features/profile/role_kit/domain/staff_role_kit_repository_impl.dart';
import 'package:krow/features/profile/role_kit/domain/bloc/role_kit_bloc.dart';
import 'package:krow/features/profile/role_kit/domain/bloc/role_kit_event.dart';
import 'package:krow/features/profile/role_kit/domain/bloc/role_kit_state.dart';
import 'package:modal_progress_hud_nsn/modal_progress_hud_nsn.dart';
@RoutePage()
class RolesKitListScreen extends StatefulWidget {
const RolesKitListScreen({super.key, });
@override
State<RolesKitListScreen> createState() => _RolesKitListScreenState();
}
class _RolesKitListScreenState extends State<RolesKitListScreen> {
@override
void initState() {
super.initState();
}
@override
Widget build(BuildContext context) {
return BlocBuilder<RoleKitBloc, RoleKitState>(
builder: (context, state) {
return Scaffold(
appBar: KwAppBar(
titleText: state.roleKitType == RoleKitType.uniform
? 'uniform'.tr()
: 'equipment'.tr(),
),
body: ModalProgressHUD(
inAsyncCall: state.loading,
child: ScrollLayoutHelper(
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 16),
upperWidget: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
Text(
'roles'.tr().toUpperCase(),
style: AppTextStyles.captionReg
.copyWith(color: AppColors.blackCaptionGreen),
),
...state.roles.map((role) => _buildKitWidget(role,state.roleKitType)),
const Gap(24),
]),
lowerWidget: const SizedBox.shrink(),
),
),
);
},
);
}
Widget _buildKitWidget(StaffRole role, RoleKitType roleKitType ) {
return GestureDetector(
onTap: () async{
context.read<RoleKitBloc>().add(RoleKitEventSelectRole(role: role));
await context.router.push(const RoleKitRoute());
context.read<RoleKitBloc>().add(RoleKitEventFetch(type: roleKitType));
},
child: Container(
height: 56,
padding: const EdgeInsets.all(12),
margin: const EdgeInsets.only(top: 8),
decoration: KwBoxDecorations.primaryLight8,
child: Row(
children: [
Expanded(
child: Text(
role.skill?.name ?? '',
style: AppTextStyles.headingH3,
),
),
const Gap(16),
Assets.images.icons.caretRight.svg()
],
),
),
);
}
}