feat: Refactor context reading in emergency contact and FAQs widgets

- Updated the context reading method in `EmergencyContactAddButton` and `EmergencyContactFormItem` to use `ReadContext`.
- Modified the `FaqsWidget` to utilize `ReadContext` for fetching FAQs.
- Adjusted the `PrivacySectionWidget` to read from `PrivacySecurityBloc` using `ReadContext`.

feat: Implement Firebase Auth isolation pattern

- Introduced `FirebaseAuthService` and `FirebaseAuthServiceImpl` to abstract Firebase Auth operations.
- Ensured features do not directly import `firebase_auth`, adhering to architecture rules.

feat: Create repository interfaces for billing and coverage

- Added `BillingRepositoryInterface` for billing-related operations.
- Created `CoverageRepositoryInterface` for coverage data access.

feat: Add use cases for order management

- Implemented use cases for fetching hubs, managers, and roles related to orders.
- Created `GetHubsUseCase`, `GetManagersByHubUseCase`, and `GetRolesByVendorUseCase`.

feat: Develop report use cases for client reports

- Added use cases for fetching various reports including coverage, daily operations, forecast, no-show, performance, and spend reports.
- Implemented `GetCoverageReportUseCase`, `GetDailyOpsReportUseCase`, `GetForecastReportUseCase`, `GetNoShowReportUseCase`, `GetPerformanceReportUseCase`, and `GetSpendReportUseCase`.

feat: Establish profile repository and use cases

- Created `ProfileRepositoryInterface` for staff profile data access.
- Implemented use cases for retrieving staff profile and section statuses: `GetStaffProfileUseCase` and `GetProfileSectionsUseCase`.
- Added `SignOutUseCase` for signing out the current user.
This commit is contained in:
Achintha Isuru
2026-03-19 01:10:27 -04:00
parent a45a3f6af1
commit 843eec5692
123 changed files with 2102 additions and 1087 deletions

View File

@@ -3,7 +3,7 @@ import 'package:krow_core/core.dart';
import 'package:krow_domain/krow_domain.dart';
import 'package:client_coverage/src/data/repositories_impl/coverage_repository_impl.dart';
import 'package:client_coverage/src/domain/repositories/coverage_repository.dart';
import 'package:client_coverage/src/domain/repositories/coverage_repository_interface.dart';
import 'package:client_coverage/src/domain/usecases/cancel_late_worker_usecase.dart';
import 'package:client_coverage/src/domain/usecases/get_coverage_stats_usecase.dart';
import 'package:client_coverage/src/domain/usecases/get_shifts_for_date_usecase.dart';
@@ -21,8 +21,8 @@ class CoverageModule extends Module {
@override
void binds(Injector i) {
// Repositories
i.addLazySingleton<CoverageRepository>(
() => CoverageRepositoryImpl(apiService: i.get<BaseApiService>()),
i.addLazySingleton<CoverageRepositoryInterface>(
() => CoverageRepositoryInterfaceImpl(apiService: i.get<BaseApiService>()),
);
// Use Cases

View File

@@ -1,14 +1,14 @@
import 'package:krow_core/core.dart';
import 'package:krow_domain/krow_domain.dart';
import 'package:client_coverage/src/domain/repositories/coverage_repository.dart';
import 'package:client_coverage/src/domain/repositories/coverage_repository_interface.dart';
/// V2 API implementation of [CoverageRepository].
/// V2 API implementation of [CoverageRepositoryInterface].
///
/// Uses [BaseApiService] with [ClientEndpoints] for all backend access.
class CoverageRepositoryImpl implements CoverageRepository {
/// Creates a [CoverageRepositoryImpl].
CoverageRepositoryImpl({required BaseApiService apiService})
class CoverageRepositoryInterfaceImpl implements CoverageRepositoryInterface {
/// Creates a [CoverageRepositoryInterfaceImpl].
CoverageRepositoryInterfaceImpl({required BaseApiService apiService})
: _apiService = apiService;
final BaseApiService _apiService;

View File

@@ -4,7 +4,7 @@ import 'package:krow_domain/krow_domain.dart';
///
/// Defines the contract for accessing coverage data via the V2 REST API,
/// acting as a boundary between the Domain and Data layers.
abstract interface class CoverageRepository {
abstract interface class CoverageRepositoryInterface {
/// Fetches shifts with assigned workers for a specific [date].
Future<List<ShiftWithWorkers>> getShiftsForDate({required DateTime date});

View File

@@ -1,17 +1,17 @@
import 'package:krow_core/core.dart';
import 'package:client_coverage/src/domain/arguments/cancel_late_worker_arguments.dart';
import 'package:client_coverage/src/domain/repositories/coverage_repository.dart';
import 'package:client_coverage/src/domain/repositories/coverage_repository_interface.dart';
/// Use case for cancelling a late worker's assignment.
///
/// Delegates to [CoverageRepository] to cancel the assignment via V2 API.
/// Delegates to [CoverageRepositoryInterface] to cancel the assignment via V2 API.
class CancelLateWorkerUseCase
implements UseCase<CancelLateWorkerArguments, void> {
/// Creates a [CancelLateWorkerUseCase].
CancelLateWorkerUseCase(this._repository);
final CoverageRepository _repository;
final CoverageRepositoryInterface _repository;
@override
Future<void> call(CancelLateWorkerArguments arguments) {

View File

@@ -2,17 +2,17 @@ import 'package:krow_core/core.dart';
import 'package:krow_domain/krow_domain.dart';
import 'package:client_coverage/src/domain/arguments/get_coverage_stats_arguments.dart';
import 'package:client_coverage/src/domain/repositories/coverage_repository.dart';
import 'package:client_coverage/src/domain/repositories/coverage_repository_interface.dart';
/// Use case for fetching aggregated coverage statistics for a specific date.
///
/// Delegates to [CoverageRepository] and returns a [CoverageStats] entity.
/// Delegates to [CoverageRepositoryInterface] and returns a [CoverageStats] entity.
class GetCoverageStatsUseCase
implements UseCase<GetCoverageStatsArguments, CoverageStats> {
/// Creates a [GetCoverageStatsUseCase].
GetCoverageStatsUseCase(this._repository);
final CoverageRepository _repository;
final CoverageRepositoryInterface _repository;
@override
Future<CoverageStats> call(GetCoverageStatsArguments arguments) {

View File

@@ -2,17 +2,17 @@ import 'package:krow_core/core.dart';
import 'package:krow_domain/krow_domain.dart';
import 'package:client_coverage/src/domain/arguments/get_shifts_for_date_arguments.dart';
import 'package:client_coverage/src/domain/repositories/coverage_repository.dart';
import 'package:client_coverage/src/domain/repositories/coverage_repository_interface.dart';
/// Use case for fetching shifts with workers for a specific date.
///
/// Delegates to [CoverageRepository] and returns V2 [ShiftWithWorkers] entities.
/// Delegates to [CoverageRepositoryInterface] and returns V2 [ShiftWithWorkers] entities.
class GetShiftsForDateUseCase
implements UseCase<GetShiftsForDateArguments, List<ShiftWithWorkers>> {
/// Creates a [GetShiftsForDateUseCase].
GetShiftsForDateUseCase(this._repository);
final CoverageRepository _repository;
final CoverageRepositoryInterface _repository;
@override
Future<List<ShiftWithWorkers>> call(GetShiftsForDateArguments arguments) {

View File

@@ -1,17 +1,17 @@
import 'package:krow_core/core.dart';
import 'package:client_coverage/src/domain/arguments/submit_worker_review_arguments.dart';
import 'package:client_coverage/src/domain/repositories/coverage_repository.dart';
import 'package:client_coverage/src/domain/repositories/coverage_repository_interface.dart';
/// Use case for submitting a worker review from the coverage page.
///
/// Validates the rating range and delegates to [CoverageRepository].
/// Validates the rating range and delegates to [CoverageRepositoryInterface].
class SubmitWorkerReviewUseCase
implements UseCase<SubmitWorkerReviewArguments, void> {
/// Creates a [SubmitWorkerReviewUseCase].
SubmitWorkerReviewUseCase(this._repository);
final CoverageRepository _repository;
final CoverageRepositoryInterface _repository;
@override
Future<void> call(SubmitWorkerReviewArguments arguments) async {

View File

@@ -128,6 +128,9 @@ class _CoveragePageState extends State<CoveragePage> {
],
flexibleSpace: Container(
decoration: const BoxDecoration(
// Intentional gradient: the second stop is a darker
// variant of UiColors.primary used only for the
// coverage header visual effect.
gradient: LinearGradient(
colors: <Color>[
UiColors.primary,

View File

@@ -8,6 +8,11 @@ import 'package:client_coverage/src/presentation/blocs/coverage_bloc.dart';
import 'package:client_coverage/src/presentation/blocs/coverage_event.dart';
import 'package:client_coverage/src/presentation/blocs/coverage_state.dart';
/// Semantic color for the "favorite" toggle, representing a pink/heart accent.
/// No matching token in [UiColors] — kept as a local constant intentionally.
const Color _kFavoriteColor = Color(0xFFE91E63);
/// Bottom sheet for submitting a worker review with rating, feedback, and flags.
class WorkerReviewSheet extends StatefulWidget {
const WorkerReviewSheet({required this.worker, super.key});
@@ -201,7 +206,7 @@ class _WorkerReviewSheetState extends State<WorkerReviewSheet> {
icon: Icons.favorite,
label: l10n.favorite_label,
isActive: _isFavorite,
activeColor: const Color(0xFFE91E63),
activeColor: _kFavoriteColor,
onTap: () => setState(() => _isFavorite = !_isFavorite),
),
),