feat: Implement GetMyShiftsData use case and integrate it into ShiftsBloc for improved shift data handling
This commit is contained in:
@@ -0,0 +1,23 @@
|
|||||||
|
import 'package:krow_domain/krow_domain.dart';
|
||||||
|
|
||||||
|
/// Combined result from loading all My Shifts tab data sources.
|
||||||
|
///
|
||||||
|
/// Holds assigned shifts, pending assignments, and cancelled shifts
|
||||||
|
/// fetched in parallel from the V2 API.
|
||||||
|
class MyShiftsData {
|
||||||
|
/// Creates a [MyShiftsData] instance.
|
||||||
|
const MyShiftsData({
|
||||||
|
required this.assignedShifts,
|
||||||
|
required this.pendingAssignments,
|
||||||
|
required this.cancelledShifts,
|
||||||
|
});
|
||||||
|
|
||||||
|
/// Assigned shifts for the requested date range.
|
||||||
|
final List<AssignedShift> assignedShifts;
|
||||||
|
|
||||||
|
/// Pending assignments awaiting worker acceptance.
|
||||||
|
final List<PendingAssignment> pendingAssignments;
|
||||||
|
|
||||||
|
/// Cancelled shift assignments.
|
||||||
|
final List<CancelledShift> cancelledShifts;
|
||||||
|
}
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
import 'package:krow_core/core.dart';
|
||||||
|
import 'package:krow_domain/krow_domain.dart';
|
||||||
|
|
||||||
|
import 'package:staff_shifts/src/domain/arguments/get_my_shifts_arguments.dart';
|
||||||
|
import 'package:staff_shifts/src/domain/models/my_shifts_data.dart';
|
||||||
|
import 'package:staff_shifts/src/domain/repositories/shifts_repository_interface.dart';
|
||||||
|
|
||||||
|
/// Fetches all data needed for the My Shifts tab in a single call.
|
||||||
|
///
|
||||||
|
/// Calls [ShiftsRepositoryInterface.getAssignedShifts],
|
||||||
|
/// [ShiftsRepositoryInterface.getPendingAssignments], and
|
||||||
|
/// [ShiftsRepositoryInterface.getCancelledShifts] in parallel and returns
|
||||||
|
/// a unified [MyShiftsData].
|
||||||
|
class GetMyShiftsDataUseCase
|
||||||
|
extends UseCase<GetAssignedShiftsArguments, MyShiftsData> {
|
||||||
|
/// Creates a [GetMyShiftsDataUseCase].
|
||||||
|
GetMyShiftsDataUseCase(this._repository);
|
||||||
|
|
||||||
|
/// The shifts repository.
|
||||||
|
final ShiftsRepositoryInterface _repository;
|
||||||
|
|
||||||
|
/// Loads assigned, pending, and cancelled shifts for the given date range.
|
||||||
|
@override
|
||||||
|
Future<MyShiftsData> call(GetAssignedShiftsArguments arguments) async {
|
||||||
|
final List<Object> results = await Future.wait(<Future<Object>>[
|
||||||
|
_repository.getAssignedShifts(
|
||||||
|
start: arguments.start,
|
||||||
|
end: arguments.end,
|
||||||
|
),
|
||||||
|
_repository.getPendingAssignments(),
|
||||||
|
_repository.getCancelledShifts(),
|
||||||
|
]);
|
||||||
|
|
||||||
|
return MyShiftsData(
|
||||||
|
assignedShifts: results[0] as List<AssignedShift>,
|
||||||
|
pendingAssignments: results[1] as List<PendingAssignment>,
|
||||||
|
cancelledShifts: results[2] as List<CancelledShift>,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -8,9 +8,11 @@ import 'package:staff_shifts/src/domain/arguments/get_available_shifts_arguments
|
|||||||
import 'package:staff_shifts/src/domain/arguments/get_my_shifts_arguments.dart';
|
import 'package:staff_shifts/src/domain/arguments/get_my_shifts_arguments.dart';
|
||||||
import 'package:staff_shifts/src/domain/usecases/accept_shift_usecase.dart';
|
import 'package:staff_shifts/src/domain/usecases/accept_shift_usecase.dart';
|
||||||
import 'package:staff_shifts/src/domain/usecases/decline_shift_usecase.dart';
|
import 'package:staff_shifts/src/domain/usecases/decline_shift_usecase.dart';
|
||||||
|
import 'package:staff_shifts/src/domain/models/my_shifts_data.dart';
|
||||||
import 'package:staff_shifts/src/domain/usecases/get_available_shifts_usecase.dart';
|
import 'package:staff_shifts/src/domain/usecases/get_available_shifts_usecase.dart';
|
||||||
import 'package:staff_shifts/src/domain/usecases/get_cancelled_shifts_usecase.dart';
|
import 'package:staff_shifts/src/domain/usecases/get_cancelled_shifts_usecase.dart';
|
||||||
import 'package:staff_shifts/src/domain/usecases/get_history_shifts_usecase.dart';
|
import 'package:staff_shifts/src/domain/usecases/get_history_shifts_usecase.dart';
|
||||||
|
import 'package:staff_shifts/src/domain/usecases/get_my_shifts_data_usecase.dart';
|
||||||
import 'package:staff_shifts/src/domain/usecases/get_my_shifts_usecase.dart';
|
import 'package:staff_shifts/src/domain/usecases/get_my_shifts_usecase.dart';
|
||||||
import 'package:staff_shifts/src/domain/usecases/get_pending_assignments_usecase.dart';
|
import 'package:staff_shifts/src/domain/usecases/get_pending_assignments_usecase.dart';
|
||||||
import 'package:staff_shifts/src/domain/usecases/get_profile_completion_usecase.dart';
|
import 'package:staff_shifts/src/domain/usecases/get_profile_completion_usecase.dart';
|
||||||
@@ -34,6 +36,7 @@ class ShiftsBloc extends Bloc<ShiftsEvent, ShiftsState>
|
|||||||
required this.acceptShift,
|
required this.acceptShift,
|
||||||
required this.declineShift,
|
required this.declineShift,
|
||||||
required this.submitForApproval,
|
required this.submitForApproval,
|
||||||
|
required this.getMyShiftsData,
|
||||||
}) : super(const ShiftsState()) {
|
}) : super(const ShiftsState()) {
|
||||||
on<LoadShiftsEvent>(_onLoadShifts);
|
on<LoadShiftsEvent>(_onLoadShifts);
|
||||||
on<LoadHistoryShiftsEvent>(_onLoadHistoryShifts);
|
on<LoadHistoryShiftsEvent>(_onLoadHistoryShifts);
|
||||||
@@ -74,6 +77,9 @@ class ShiftsBloc extends Bloc<ShiftsEvent, ShiftsState>
|
|||||||
/// Use case for submitting a shift for timesheet approval.
|
/// Use case for submitting a shift for timesheet approval.
|
||||||
final SubmitForApprovalUseCase submitForApproval;
|
final SubmitForApprovalUseCase submitForApproval;
|
||||||
|
|
||||||
|
/// Use case that loads assigned, pending, and cancelled shifts in parallel.
|
||||||
|
final GetMyShiftsDataUseCase getMyShiftsData;
|
||||||
|
|
||||||
Future<void> _onLoadShifts(
|
Future<void> _onLoadShifts(
|
||||||
LoadShiftsEvent event,
|
LoadShiftsEvent event,
|
||||||
Emitter<ShiftsState> emit,
|
Emitter<ShiftsState> emit,
|
||||||
@@ -86,29 +92,16 @@ class ShiftsBloc extends Bloc<ShiftsEvent, ShiftsState>
|
|||||||
emit: emit.call,
|
emit: emit.call,
|
||||||
action: () async {
|
action: () async {
|
||||||
final List<DateTime> days = getCalendarDaysForOffset(0);
|
final List<DateTime> days = getCalendarDaysForOffset(0);
|
||||||
|
final MyShiftsData data = await getMyShiftsData(
|
||||||
// Load assigned, pending, and cancelled shifts in parallel.
|
GetAssignedShiftsArguments(start: days.first, end: days.last),
|
||||||
final List<Object> results = await Future.wait(<Future<Object>>[
|
);
|
||||||
getAssignedShifts(
|
|
||||||
GetAssignedShiftsArguments(start: days.first, end: days.last),
|
|
||||||
),
|
|
||||||
getPendingAssignments(),
|
|
||||||
getCancelledShifts(),
|
|
||||||
]);
|
|
||||||
|
|
||||||
final List<AssignedShift> myShiftsResult =
|
|
||||||
results[0] as List<AssignedShift>;
|
|
||||||
final List<PendingAssignment> pendingResult =
|
|
||||||
results[1] as List<PendingAssignment>;
|
|
||||||
final List<CancelledShift> cancelledResult =
|
|
||||||
results[2] as List<CancelledShift>;
|
|
||||||
|
|
||||||
emit(
|
emit(
|
||||||
state.copyWith(
|
state.copyWith(
|
||||||
status: ShiftsStatus.loaded,
|
status: ShiftsStatus.loaded,
|
||||||
myShifts: myShiftsResult,
|
myShifts: data.assignedShifts,
|
||||||
pendingShifts: pendingResult,
|
pendingShifts: data.pendingAssignments,
|
||||||
cancelledShifts: cancelledResult,
|
cancelledShifts: data.cancelledShifts,
|
||||||
availableShifts: const <OpenShift>[],
|
availableShifts: const <OpenShift>[],
|
||||||
historyShifts: const <CompletedShift>[],
|
historyShifts: const <CompletedShift>[],
|
||||||
availableLoading: false,
|
availableLoading: false,
|
||||||
@@ -250,18 +243,23 @@ class ShiftsBloc extends Bloc<ShiftsEvent, ShiftsState>
|
|||||||
LoadShiftsForRangeEvent event,
|
LoadShiftsForRangeEvent event,
|
||||||
Emitter<ShiftsState> emit,
|
Emitter<ShiftsState> emit,
|
||||||
) async {
|
) async {
|
||||||
emit(state.copyWith(myShifts: const <AssignedShift>[], myShiftsLoaded: false));
|
emit(state.copyWith(
|
||||||
|
myShifts: const <AssignedShift>[],
|
||||||
|
myShiftsLoaded: false,
|
||||||
|
));
|
||||||
await handleError(
|
await handleError(
|
||||||
emit: emit.call,
|
emit: emit.call,
|
||||||
action: () async {
|
action: () async {
|
||||||
final List<AssignedShift> myShiftsResult = await getAssignedShifts(
|
final MyShiftsData data = await getMyShiftsData(
|
||||||
GetAssignedShiftsArguments(start: event.start, end: event.end),
|
GetAssignedShiftsArguments(start: event.start, end: event.end),
|
||||||
);
|
);
|
||||||
|
|
||||||
emit(
|
emit(
|
||||||
state.copyWith(
|
state.copyWith(
|
||||||
status: ShiftsStatus.loaded,
|
status: ShiftsStatus.loaded,
|
||||||
myShifts: myShiftsResult,
|
myShifts: data.assignedShifts,
|
||||||
|
pendingShifts: data.pendingAssignments,
|
||||||
|
cancelledShifts: data.cancelledShifts,
|
||||||
myShiftsLoaded: true,
|
myShiftsLoaded: true,
|
||||||
clearErrorMessage: true,
|
clearErrorMessage: true,
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import 'package:staff_shifts/src/domain/usecases/apply_for_shift_usecase.dart';
|
|||||||
import 'package:staff_shifts/src/domain/usecases/get_available_shifts_usecase.dart';
|
import 'package:staff_shifts/src/domain/usecases/get_available_shifts_usecase.dart';
|
||||||
import 'package:staff_shifts/src/domain/usecases/get_cancelled_shifts_usecase.dart';
|
import 'package:staff_shifts/src/domain/usecases/get_cancelled_shifts_usecase.dart';
|
||||||
import 'package:staff_shifts/src/domain/usecases/get_history_shifts_usecase.dart';
|
import 'package:staff_shifts/src/domain/usecases/get_history_shifts_usecase.dart';
|
||||||
|
import 'package:staff_shifts/src/domain/usecases/get_my_shifts_data_usecase.dart';
|
||||||
import 'package:staff_shifts/src/domain/usecases/get_my_shifts_usecase.dart';
|
import 'package:staff_shifts/src/domain/usecases/get_my_shifts_usecase.dart';
|
||||||
import 'package:staff_shifts/src/domain/usecases/get_pending_assignments_usecase.dart';
|
import 'package:staff_shifts/src/domain/usecases/get_pending_assignments_usecase.dart';
|
||||||
import 'package:staff_shifts/src/domain/usecases/get_profile_completion_usecase.dart';
|
import 'package:staff_shifts/src/domain/usecases/get_profile_completion_usecase.dart';
|
||||||
@@ -52,6 +53,7 @@ class StaffShiftsModule extends Module {
|
|||||||
i.addLazySingleton(
|
i.addLazySingleton(
|
||||||
() => SubmitForApprovalUseCase(i.get<ShiftsRepositoryInterface>()),
|
() => SubmitForApprovalUseCase(i.get<ShiftsRepositoryInterface>()),
|
||||||
);
|
);
|
||||||
|
i.addLazySingleton(GetMyShiftsDataUseCase.new);
|
||||||
i.addLazySingleton(GetAvailableOrdersUseCase.new);
|
i.addLazySingleton(GetAvailableOrdersUseCase.new);
|
||||||
i.addLazySingleton(BookOrderUseCase.new);
|
i.addLazySingleton(BookOrderUseCase.new);
|
||||||
|
|
||||||
@@ -67,6 +69,7 @@ class StaffShiftsModule extends Module {
|
|||||||
acceptShift: i.get(),
|
acceptShift: i.get(),
|
||||||
declineShift: i.get(),
|
declineShift: i.get(),
|
||||||
submitForApproval: i.get(),
|
submitForApproval: i.get(),
|
||||||
|
getMyShiftsData: i.get(),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
i.add(
|
i.add(
|
||||||
|
|||||||
Reference in New Issue
Block a user