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,7 @@
import 'package:krow/features/profile/benefits/domain/entities/benefit_entity.dart';
abstract interface class BenefitsRepository {
Future<List<BenefitEntity>> getStaffBenefits();
Future<BenefitEntity?> requestBenefit({required BenefitEntity benefit});
}

View File

@@ -0,0 +1,51 @@
import 'dart:async';
import 'package:flutter/foundation.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:krow/core/application/di/injectable.dart';
import 'package:krow/core/data/enums/state_status.dart';
import 'package:krow/features/profile/benefits/domain/benefits_repository.dart';
import 'package:krow/features/profile/benefits/domain/entities/benefit_entity.dart';
part 'benefits_event.dart';
part 'benefits_state.dart';
class BenefitsBloc extends Bloc<BenefitsEvent, BenefitsState> {
BenefitsBloc() : super(const BenefitsState()) {
on<InitializeBenefits>((event, emit) async {
emit(state.copyWith(status: StateStatus.loading));
final benefits = await _repository.getStaffBenefits();
emit(state.copyWith(status: StateStatus.idle, benefits: benefits));
});
on<SendBenefitRequest>((event, emit) async {
emit(state.copyWith(status: StateStatus.loading));
final result = await _repository.requestBenefit(benefit: event.benefit);
int index = -1;
List<BenefitEntity>? updatedBenefits;
if (result != null) {
index = state.benefits.indexWhere(
(benefit) => benefit.name == result.name,
);
if (index >= 0) {
updatedBenefits = List.from(state.benefits)..[index] = result;
}
}
emit(
state.copyWith(
benefits: updatedBenefits,
status: StateStatus.idle,
),
);
event.requestCompleter.complete(result ?? event.benefit);
});
}
final BenefitsRepository _repository = getIt<BenefitsRepository>();
}

View File

@@ -0,0 +1,20 @@
part of 'benefits_bloc.dart';
@immutable
sealed class BenefitsEvent {
const BenefitsEvent();
}
class InitializeBenefits extends BenefitsEvent {
const InitializeBenefits();
}
class SendBenefitRequest extends BenefitsEvent {
const SendBenefitRequest({
required this.benefit,
required this.requestCompleter,
});
final BenefitEntity benefit;
final Completer<BenefitEntity> requestCompleter;
}

View File

@@ -0,0 +1,26 @@
part of 'benefits_bloc.dart';
@immutable
class BenefitsState {
const BenefitsState({
this.status = StateStatus.idle,
this.benefits = const [],
this.exception,
});
final StateStatus status;
final List<BenefitEntity> benefits;
final Exception? exception;
BenefitsState copyWith({
StateStatus? status,
List<BenefitEntity>? benefits,
Exception? exception,
}) {
return BenefitsState(
status: status ?? this.status,
benefits: benefits ?? this.benefits,
exception: exception,
);
}
}

View File

@@ -0,0 +1,48 @@
import 'package:flutter/foundation.dart';
import 'package:krow/features/profile/benefits/domain/entities/benefit_record_entity.dart';
@immutable
class BenefitEntity {
const BenefitEntity({
required this.name,
required this.requirement,
required this.requiredHours,
required this.currentHours,
required this.isClaimed,
required this.info,
required this.history,
});
final String name;
final String requirement;
final int requiredHours;
final int currentHours;
final bool isClaimed;
final String info;
final List<BenefitRecordEntity> history;
double get progress {
final progress = currentHours / requiredHours;
return progress > 1 ? 1 : progress;
}
BenefitEntity copyWith({
String? name,
String? requirement,
int? requiredHours,
int? currentHours,
bool? isClaimed,
String? info,
List<BenefitRecordEntity>? history,
}) {
return BenefitEntity(
name: name ?? this.name,
requirement: requirement ?? this.requirement,
requiredHours: requiredHours ?? this.requiredHours,
currentHours: currentHours ?? this.currentHours,
isClaimed: isClaimed ?? this.isClaimed,
info: info ?? this.info,
history: history ?? this.history,
);
}
}

View File

@@ -0,0 +1,11 @@
import 'package:flutter/foundation.dart';
@immutable
class BenefitRecordEntity {
const BenefitRecordEntity({required this.createdAt, required this.status});
final DateTime createdAt;
final RecordStatus status;
}
enum RecordStatus { pending, submitted }