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,86 @@
import 'dart:developer';
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/mobility/data/models/mobility_model.dart';
import 'package:krow/features/profile/mobility/data/staff_mobility_repository.dart';
part 'mobility_event.dart';
part 'mobility_state.dart';
class MobilityBloc extends Bloc<MobilityEvent, MobilityState> {
MobilityBloc() : super(const MobilityState()) {
on<InitializeMobilityEvent>((event, emit) async {
emit(
state.copyWith(
isInEditMode: event.isInEditMode,
status: event.isInEditMode ? StateStatus.loading : StateStatus.idle,
),
);
if (!state.isInEditMode) {
emit(
state.copyWith(
hasACar: true,
canRelocate: true,
),
);
return;
}
try {
await for (final mobilityData
in getIt<StaffMobilityRepository>().getStaffMobility()) {
emit(
state.copyWith(
hasACar: mobilityData.hasACar,
canRelocate: mobilityData.canRelocate,
status: StateStatus.idle,
),
);
}
} catch (except) {
log(except.toString());
}
emit(
state.copyWith(
hasACar: state.hasACar ?? true,
canRelocate: state.canRelocate ?? true,
status: state.status == StateStatus.loading
? StateStatus.idle
: state.status,
),
);
});
on<ToggleCarAvailability>((event, emit) {
emit(state.copyWith(hasACar: event.index == 0));
});
on<ToggleRelocationPossibility>((event, emit) {
emit(state.copyWith(canRelocate: event.index == 0));
});
on<SaveMobilityChanges>((event, emit) async {
emit(state.copyWith(status: StateStatus.loading));
try {
await getIt<StaffMobilityRepository>().updateStaffMobilityInfo(
MobilityModel(
hasACar: state.hasACar ?? false,
canRelocate: state.canRelocate ?? false,
),
);
//resave cached data
getIt<StaffMobilityRepository>().getStaffMobility();
} catch (except) {
emit(state.copyWith(status: StateStatus.idle));
log(except.toString());
}
emit(state.copyWith(status: StateStatus.success));
});
}
}

View File

@@ -0,0 +1,24 @@
part of 'mobility_bloc.dart';
@immutable
sealed class MobilityEvent {}
class InitializeMobilityEvent extends MobilityEvent {
InitializeMobilityEvent({required this.isInEditMode});
final bool isInEditMode;
}
class ToggleCarAvailability extends MobilityEvent {
ToggleCarAvailability(this.index);
final int index;
}
class ToggleRelocationPossibility extends MobilityEvent {
ToggleRelocationPossibility(this.index);
final int index;
}
class SaveMobilityChanges extends MobilityEvent {}

View File

@@ -0,0 +1,30 @@
part of 'mobility_bloc.dart';
@immutable
class MobilityState {
const MobilityState({
this.hasACar,
this.canRelocate,
this.isInEditMode = true,
this.status = StateStatus.idle,
});
final bool? hasACar;
final bool? canRelocate;
final bool isInEditMode;
final StateStatus status;
MobilityState copyWith({
bool? hasACar,
bool? canRelocate,
bool? isInEditMode,
StateStatus? status,
}) {
return MobilityState(
hasACar: hasACar ?? this.hasACar,
canRelocate: canRelocate ?? this.canRelocate,
isInEditMode: isInEditMode ?? this.isInEditMode,
status: status ?? this.status,
);
}
}

View File

@@ -0,0 +1,23 @@
import 'package:injectable/injectable.dart';
import 'package:krow/features/profile/mobility/data/models/mobility_model.dart';
import 'package:krow/features/profile/mobility/data/staff_mobility_api_provider.dart';
import 'package:krow/features/profile/mobility/data/staff_mobility_repository.dart';
@LazySingleton(as: StaffMobilityRepository)
class StaffMobilityRepositoryImpl extends StaffMobilityRepository {
StaffMobilityRepositoryImpl({
required StaffMobilityApiProvider apiProvider,
}) : _apiProvider = apiProvider;
final StaffMobilityApiProvider _apiProvider;
@override
Stream<MobilityModel> getStaffMobility() {
return _apiProvider.getStaffMobilityWithCache();
}
@override
Future<MobilityModel?> updateStaffMobilityInfo(MobilityModel data) {
return _apiProvider.updateStaffMobilityInfo(data);
}
}