From 7570ffa3b9c2ae5d217b4de5d7b4a96cdcc23860 Mon Sep 17 00:00:00 2001 From: Suriya Date: Tue, 10 Feb 2026 19:12:01 +0530 Subject: [PATCH] Fix: Resolve critical linting issues and bugs (concurrency, syntax, dead code) --- apps/mobile/analysis.txt | Bin 0 -> 310508 bytes apps/mobile/analysis_2.txt | Bin 0 -> 274588 bytes apps/mobile/analysis_3.txt | Bin 0 -> 269630 bytes apps/mobile/analysis_utf8.txt | 832 ++++++++++++++++++ apps/mobile/analysis_utf8_2.txt | 735 ++++++++++++++++ apps/mobile/analysis_utf8_3.txt | 695 +++++++++++++++ .../mixins/bloc_error_handler.dart | 4 +- apps/mobile/packages/core/pubspec.yaml | 2 + .../lib/src/l10n/es.i18n.json | 214 ++--- .../design_system/lib/src/ui_icons.dart | 3 + .../src/presentation/blocs/billing_bloc.dart | 138 +-- .../src/presentation/blocs/coverage_bloc.dart | 57 +- .../client_create_order_repository_impl.dart | 4 +- .../blocs/client_create_order_bloc.dart | 15 +- .../blocs/client_create_order_state.dart | 10 + .../blocs/one_time_order_bloc.dart | 221 ++--- .../presentation/blocs/rapid_order_bloc.dart | 26 +- .../presentation/blocs/client_home_bloc.dart | 55 +- .../blocs/client_settings_bloc.dart | 20 +- .../presentation/blocs/view_orders_cubit.dart | 158 ++-- .../lib/src/presentation/blocs/auth_bloc.dart | 92 +- .../profile_setup/profile_setup_bloc.dart | 43 +- .../presentation/blocs/availability_bloc.dart | 185 ++-- .../src/presentation/bloc/clock_in_bloc.dart | 222 ++--- .../presentation/blocs/clock_in_cubit.dart | 2 +- .../src/presentation/blocs/home_cubit.dart | 48 +- .../home_page/recommended_shift_card.dart | 2 +- .../blocs/payments/payments_bloc.dart | 64 +- .../src/presentation/blocs/profile_cubit.dart | 55 +- .../pages/staff_profile_page.dart | 21 + .../language_selector_bottom_sheet.dart | 106 +++ .../certificates/certificates_cubit.dart | 38 +- .../documents_repository_impl.dart | 2 + .../blocs/documents/documents_cubit.dart | 34 +- .../presentation/blocs/i9/form_i9_cubit.dart | 151 ++-- .../blocs/tax_forms/tax_forms_cubit.dart | 29 +- .../presentation/blocs/w4/form_w4_cubit.dart | 128 +-- .../presentation/pages/tax_forms_page.dart | 4 +- .../blocs/bank_account_cubit.dart | 101 ++- .../presentation/blocs/time_card_bloc.dart | 61 +- .../src/presentation/blocs/attire_cubit.dart | 163 ++-- .../blocs/emergency_contact_bloc.dart | 62 +- .../presentation/blocs/experience_bloc.dart | 82 +- .../blocs/personal_info_bloc.dart | 126 +-- .../shift_details/shift_details_bloc.dart | 71 +- .../blocs/shifts/shifts_bloc.dart | 275 +++--- 46 files changed, 4057 insertions(+), 1299 deletions(-) create mode 100644 apps/mobile/analysis.txt create mode 100644 apps/mobile/analysis_2.txt create mode 100644 apps/mobile/analysis_3.txt create mode 100644 apps/mobile/analysis_utf8.txt create mode 100644 apps/mobile/analysis_utf8_2.txt create mode 100644 apps/mobile/analysis_utf8_3.txt create mode 100644 apps/mobile/packages/features/staff/profile/lib/src/presentation/widgets/language_selector_bottom_sheet.dart diff --git a/apps/mobile/analysis.txt b/apps/mobile/analysis.txt new file mode 100644 index 0000000000000000000000000000000000000000..fe23f674e6e0cfa2a07af5f80f8befde3cfb9b9a GIT binary patch literal 310508 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 DBN6@c literal 0 HcmV?d00001 diff --git a/apps/mobile/analysis_2.txt b/apps/mobile/analysis_2.txt new file mode 100644 index 0000000000000000000000000000000000000000..986bb3d61429c1430ddcef2c25d00b367cd4fed2 GIT binary patch literal 274588 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 Rd6cJq-A;_*=8#eU`TyNi') - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\data\mappers\tax_form_mapper.dart:47:23 - unrelated_type_equality_checks + info - Statements in an if should be enclosed in a block - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\data\repositories\tax_forms_repository_impl.dart:194:41 - curly_braces_in_flow_control_structures + info - Statements in an if should be enclosed in a block - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\data\repositories\tax_forms_repository_impl.dart:195:47 - curly_braces_in_flow_control_structures + info - Statements in an if should be enclosed in a block - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\data\repositories\tax_forms_repository_impl.dart:196:44 - curly_braces_in_flow_control_structures + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\domain\usecases\get_tax_forms_usecase.dart:7:3 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\domain\usecases\save_i9_form_usecase.dart:7:3 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\domain\usecases\save_w4_form_usecase.dart:7:3 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\domain\usecases\submit_i9_form_usecase.dart:7:3 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\domain\usecases\submit_w4_form_usecase.dart:7:3 - sort_constructors_first + error - Target of URI doesn't exist: 'package:krow_core/krow_core.dart' - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\blocs\i9\form_i9_cubit.dart:2:8 - uri_does_not_exist + info - The imported package 'uuid' isn't a dependency of the importing package - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\blocs\i9\form_i9_cubit.dart:4:8 - depend_on_referenced_packages + error - Classes can only mix in mixins and classes - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\blocs\i9\form_i9_cubit.dart:9:51 - mixin_of_non_class + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\blocs\i9\form_i9_cubit.dart:13:3 - sort_constructors_first + error - The method 'handleError' isn't defined for the type 'FormI9Cubit' - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\blocs\i9\form_i9_cubit.dart:99:11 - undefined_method +warning - Missing type annotation - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\blocs\i9\form_i9_cubit.dart:102:47 - always_specify_types + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\blocs\i9\form_i9_state.dart:38:9 - sort_constructors_first +warning - Missing type annotation - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\blocs\i9\form_i9_state.dart:117:30 - always_specify_types + error - Target of URI doesn't exist: 'package:krow_core/krow_core.dart' - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\blocs\tax_forms\tax_forms_cubit.dart:2:8 - uri_does_not_exist + error - Classes can only mix in mixins and classes - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\blocs\tax_forms\tax_forms_cubit.dart:8:10 - mixin_of_non_class + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\blocs\tax_forms\tax_forms_cubit.dart:11:3 - sort_constructors_first + error - The method 'handleError' isn't defined for the type 'TaxFormsCubit' - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\blocs\tax_forms\tax_forms_cubit.dart:15:11 - undefined_method + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\blocs\tax_forms\tax_forms_state.dart:11:9 - sort_constructors_first + error - Target of URI doesn't exist: 'package:krow_core/krow_core.dart' - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\blocs\w4\form_w4_cubit.dart:2:8 - uri_does_not_exist + info - The imported package 'uuid' isn't a dependency of the importing package - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\blocs\w4\form_w4_cubit.dart:4:8 - depend_on_referenced_packages + error - Classes can only mix in mixins and classes - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\blocs\w4\form_w4_cubit.dart:9:51 - mixin_of_non_class + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\blocs\w4\form_w4_cubit.dart:13:3 - sort_constructors_first + error - The method 'handleError' isn't defined for the type 'FormW4Cubit' - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\blocs\w4\form_w4_cubit.dart:92:11 - undefined_method +warning - Missing type annotation - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\blocs\w4\form_w4_cubit.dart:95:47 - always_specify_types + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\blocs\w4\form_w4_state.dart:32:9 - sort_constructors_first +warning - Missing type annotation - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\blocs\w4\form_w4_state.dart:92:30 - always_specify_types + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\form_i9_page.dart:12:9 - sort_constructors_first + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\form_i9_page.dart:212:81 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\form_i9_page.dart:232:50 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\form_i9_page.dart:249:77 - deprecated_member_use + info - 'value' is deprecated and shouldn't be used. Use initialValue instead. This will set the initial value for the form field. This feature was deprecated after v3.33.0-1.0.pre - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\form_i9_page.dart:465:21 - deprecated_member_use + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\form_w4_page.dart:12:9 - sort_constructors_first +warning - The value of the field '_usStates' isn't used - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\form_w4_page.dart:27:22 - unused_field + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\form_w4_page.dart:258:81 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\form_w4_page.dart:278:50 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\form_w4_page.dart:295:77 - deprecated_member_use + info - Use 'const' with the constructor to improve performance - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\form_w4_page.dart:446:18 - prefer_const_constructors + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\tax_forms_page.dart:40:47 - deprecated_member_use +warning - Missing type annotation - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\tax_forms_page.dart:148:11 - always_specify_types + info - Missing an 'await' for the 'Future' computed by this expression - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\tax_forms_page.dart:150:53 - unawaited_futures +warning - Missing type annotation - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\tax_forms_page.dart:153:11 - always_specify_types + info - Missing an 'await' for the 'Future' computed by this expression - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\tax_forms_page.dart:155:53 - unawaited_futures + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\tax_forms_page.dart:174:41 - deprecated_member_use + info - Library names are not necessary - packages\features\staff\profile_sections\compliance\tax_forms\lib\staff_tax_forms.dart:1:9 - unnecessary_library_name + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\domain\arguments\add_bank_account_params.dart:9:9 - sort_constructors_first +warning - Missing type annotation - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\domain\arguments\add_bank_account_params.dart:12:30 - always_specify_types + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\domain\usecases\add_bank_account_usecase.dart:9:3 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\domain\usecases\get_bank_accounts_usecase.dart:9:3 - sort_constructors_first + error - Target of URI doesn't exist: 'package:krow_core/krow_core.dart' - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\presentation\blocs\bank_account_cubit.dart:2:8 - uri_does_not_exist + error - Classes can only mix in mixins and classes - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\presentation\blocs\bank_account_cubit.dart:10:10 - mixin_of_non_class + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\presentation\blocs\bank_account_cubit.dart:14:3 - sort_constructors_first + error - The method 'handleError' isn't defined for the type 'BankAccountCubit' - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\presentation\blocs\bank_account_cubit.dart:23:11 - undefined_method + error - The method 'handleError' isn't defined for the type 'BankAccountCubit' - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\presentation\blocs\bank_account_cubit.dart:73:11 - undefined_method + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\presentation\blocs\bank_account_state.dart:12:9 - sort_constructors_first +warning - Missing type annotation - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\presentation\blocs\bank_account_state.dart:14:21 - always_specify_types +warning - Missing type annotation - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\presentation\blocs\bank_account_state.dart:34:30 - always_specify_types +warning - Unused import: 'package:krow_core/core.dart' - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\presentation\pages\bank_account_page.dart:11:8 - unused_import + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\presentation\pages\bank_account_page.dart:146:33 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\presentation\pages\bank_account_page.dart:202:39 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\presentation\pages\bank_account_page.dart:242:37 - deprecated_member_use +warning - Unused import: 'package:flutter_modular/flutter_modular.dart' - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\presentation\widgets\add_account_form.dart:2:8 - unused_import +warning - Unused import: '../blocs/bank_account_cubit.dart' - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\presentation\widgets\add_account_form.dart:4:8 - unused_import + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\presentation\widgets\add_account_form.dart:11:9 - sort_constructors_first + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\presentation\widgets\add_account_form.dart:125:34 - deprecated_member_use + info - Library names are not necessary - packages\features\staff\profile_sections\finances\staff_bank_account\lib\staff_bank_account.dart:1:9 - unnecessary_library_name + info - The imported package 'firebase_auth' isn't a dependency of the importing package - packages\features\staff\profile_sections\finances\time_card\lib\src\data\repositories_impl\time_card_repository_impl.dart:1:8 - depend_on_referenced_packages + info - The imported package 'firebase_data_connect' isn't a dependency of the importing package - packages\features\staff\profile_sections\finances\time_card\lib\src\data\repositories_impl\time_card_repository_impl.dart:2:8 - depend_on_referenced_packages + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\time_card\lib\src\data\repositories_impl\time_card_repository_impl.dart:17:3 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\time_card\lib\src\domain\arguments\get_time_cards_arguments.dart:8:9 - sort_constructors_first +warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\domain\arguments\get_time_cards_arguments.dart:11:30 - always_specify_types + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\time_card\lib\src\domain\usecases\get_time_cards_usecase.dart:10:3 - sort_constructors_first + error - Target of URI doesn't exist: 'package:krow_core/krow_core.dart' - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\blocs\time_card_bloc.dart:3:8 - uri_does_not_exist + error - Classes can only mix in mixins and classes - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\blocs\time_card_bloc.dart:13:10 - mixin_of_non_class + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\blocs\time_card_bloc.dart:16:3 - sort_constructors_first + error - The method 'handleError' isn't defined for the type 'TimeCardBloc' - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\blocs\time_card_bloc.dart:27:11 - undefined_method +warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\blocs\time_card_event.dart:6:30 - always_specify_types + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\blocs\time_card_event.dart:11:9 - sort_constructors_first +warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\blocs\time_card_event.dart:14:30 - always_specify_types + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\blocs\time_card_event.dart:19:9 - sort_constructors_first +warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\blocs\time_card_event.dart:22:30 - always_specify_types +warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\blocs\time_card_state.dart:6:30 - always_specify_types + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\blocs\time_card_state.dart:17:9 - sort_constructors_first +warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\blocs\time_card_state.dart:25:30 - always_specify_types + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\blocs\time_card_state.dart:29:9 - sort_constructors_first +warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\blocs\time_card_state.dart:31:30 - always_specify_types +warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\pages\time_card_page.dart:30:12 - always_specify_types +warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\pages\time_card_page.dart:53:21 - always_specify_types +warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\pages\time_card_page.dart:53:30 - always_specify_types +warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\pages\time_card_page.dart:65:29 - always_specify_types + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\month_selector.dart:11:9 - sort_constructors_first +warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\month_selector.dart:29:19 - always_specify_types + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\shift_history_list.dart:11:9 - sort_constructors_first +warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\shift_history_list.dart:17:17 - always_specify_types +warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\shift_history_list.dart:30:27 - always_specify_types +warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\shift_history_list.dart:42:30 - always_specify_types + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\time_card_summary.dart:10:9 - sort_constructors_first +warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\time_card_summary.dart:19:17 - always_specify_types + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\time_card_summary.dart:45:9 - sort_constructors_first +warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\time_card_summary.dart:62:19 - always_specify_types +warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\time_card_summary.dart:64:23 - always_specify_types + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\timesheet_card.dart:11:9 - sort_constructors_first +warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\timesheet_card.dart:15:5 - always_specify_types + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\timesheet_card.dart:22:41 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\timesheet_card.dart:27:41 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\timesheet_card.dart:32:37 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\timesheet_card.dart:37:41 - deprecated_member_use +warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\timesheet_card.dart:43:5 - always_specify_types +warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\timesheet_card.dart:54:19 - always_specify_types +warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\timesheet_card.dart:58:23 - always_specify_types +warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\timesheet_card.dart:61:27 - always_specify_types +warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\timesheet_card.dart:98:23 - always_specify_types +warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\timesheet_card.dart:116:25 - always_specify_types +warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\timesheet_card.dart:139:7 - always_specify_types +warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\timesheet_card.dart:141:9 - always_specify_types + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\timesheet_card.dart:155:9 - sort_constructors_first +warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\timesheet_card.dart:161:17 - always_specify_types + info - Library names are not necessary - packages\features\staff\profile_sections\finances\time_card\lib\src\staff_time_card_module.dart:1:9 - unnecessary_library_name + info - The imported package 'firebase_auth' isn't a dependency of the importing package - packages\features\staff\profile_sections\finances\time_card\lib\src\staff_time_card_module.dart:3:8 - depend_on_referenced_packages +warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\staff_time_card_module.dart:45:15 - always_specify_types + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\onboarding\attire\lib\src\data\repositories_impl\attire_repository_impl.dart:15:3 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\onboarding\attire\lib\src\domain\arguments\save_attire_arguments.dart:12:9 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\onboarding\attire\lib\src\domain\arguments\upload_attire_photo_arguments.dart:12:9 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\onboarding\attire\lib\src\domain\usecases\get_attire_options_usecase.dart:11:3 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\onboarding\attire\lib\src\domain\usecases\save_attire_usecase.dart:11:3 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\onboarding\attire\lib\src\domain\usecases\upload_attire_photo_usecase.dart:10:3 - sort_constructors_first + error - Target of URI doesn't exist: 'package:krow_core/krow_core.dart' - packages\features\staff\profile_sections\onboarding\attire\lib\src\presentation\blocs\attire_cubit.dart:2:8 - uri_does_not_exist + error - Classes can only mix in mixins and classes - packages\features\staff\profile_sections\onboarding\attire\lib\src\presentation\blocs\attire_cubit.dart:13:10 - mixin_of_non_class + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\onboarding\attire\lib\src\presentation\blocs\attire_cubit.dart:18:3 - sort_constructors_first + error - The method 'handleError' isn't defined for the type 'AttireCubit' - packages\features\staff\profile_sections\onboarding\attire\lib\src\presentation\blocs\attire_cubit.dart:28:11 - undefined_method + error - The method 'handleError' isn't defined for the type 'AttireCubit' - packages\features\staff\profile_sections\onboarding\attire\lib\src\presentation\blocs\attire_cubit.dart:89:11 - undefined_method + error - The method 'handleError' isn't defined for the type 'AttireCubit' - packages\features\staff\profile_sections\onboarding\attire\lib\src\presentation\blocs\attire_cubit.dart:141:11 - undefined_method + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\onboarding\attire\lib\src\presentation\blocs\attire_state.dart:15:9 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\onboarding\attire\lib\src\presentation\widgets\attestation_checkbox.dart:9:9 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\onboarding\attire\lib\src\presentation\widgets\attire_bottom_bar.dart:12:9 - sort_constructors_first + info - The imported package 'lucide_icons' isn't a dependency of the importing package - packages\features\staff\profile_sections\onboarding\attire\lib\src\presentation\widgets\attire_grid.dart:3:8 - depend_on_referenced_packages + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\onboarding\attire\lib\src\presentation\widgets\attire_grid.dart:15:9 - sort_constructors_first + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\onboarding\attire\lib\src\presentation\widgets\attire_grid.dart:56:46 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\onboarding\attire\lib\src\presentation\widgets\attire_grid.dart:156:46 - deprecated_member_use + info - The imported package 'lucide_icons' isn't a dependency of the importing package - packages\features\staff\profile_sections\onboarding\attire\lib\src\presentation\widgets\attire_info_card.dart:3:8 - depend_on_referenced_packages + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\onboarding\attire\lib\src\presentation\widgets\attire_info_card.dart:14:33 - deprecated_member_use + info - Library names are not necessary - packages\features\staff\profile_sections\onboarding\attire\lib\staff_attire.dart:1:9 - unnecessary_library_name + error - Target of URI doesn't exist: 'package:krow_core/krow_core.dart' - packages\features\staff\profile_sections\onboarding\emergency_contact\lib\src\presentation\blocs\emergency_contact_bloc.dart:2:8 - uri_does_not_exist + error - Classes can only mix in mixins and classes - packages\features\staff\profile_sections\onboarding\emergency_contact\lib\src\presentation\blocs\emergency_contact_bloc.dart:17:10 - mixin_of_non_class + error - The method 'handleError' isn't defined for the type 'EmergencyContactBloc' - packages\features\staff\profile_sections\onboarding\emergency_contact\lib\src\presentation\blocs\emergency_contact_bloc.dart:39:11 - undefined_method + error - The method 'handleError' isn't defined for the type 'EmergencyContactBloc' - packages\features\staff\profile_sections\onboarding\emergency_contact\lib\src\presentation\blocs\emergency_contact_bloc.dart:91:11 - undefined_method + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\onboarding\emergency_contact\lib\src\presentation\widgets\emergency_contact_info_banner.dart:12:32 - deprecated_member_use + info - Constructors in '@immutable' classes should be declared as 'const' - packages\features\staff\profile_sections\onboarding\experience\lib\src\domain\arguments\save_experience_arguments.dart:7:3 - prefer_const_constructors_in_immutables + error - Target of URI doesn't exist: 'package:krow_core/krow_core.dart' - packages\features\staff\profile_sections\onboarding\experience\lib\src\presentation\blocs\experience_bloc.dart:3:8 - uri_does_not_exist + error - Classes can only mix in mixins and classes - packages\features\staff\profile_sections\onboarding\experience\lib\src\presentation\blocs\experience_bloc.dart:97:10 - mixin_of_non_class + error - The method 'handleError' isn't defined for the type 'ExperienceBloc' - packages\features\staff\profile_sections\onboarding\experience\lib\src\presentation\blocs\experience_bloc.dart:126:11 - undefined_method + error - The method 'handleError' isn't defined for the type 'ExperienceBloc' - packages\features\staff\profile_sections\onboarding\experience\lib\src\presentation\blocs\experience_bloc.dart:191:11 - undefined_method +warning - The declaration '_buildCustomSkillsList' isn't referenced - packages\features\staff\profile_sections\onboarding\experience\lib\src\presentation\pages\experience_page.dart:140:10 - unused_element + info - Library names are not necessary - packages\features\staff\profile_sections\onboarding\experience\lib\staff_profile_experience.dart:1:9 - unnecessary_library_name + error - Target of URI doesn't exist: 'package:krow_core/krow_core.dart' - packages\features\staff\profile_sections\onboarding\profile_info\lib\src\presentation\blocs\personal_info_bloc.dart:3:8 - uri_does_not_exist + error - Classes can only mix in mixins and classes - packages\features\staff\profile_sections\onboarding\profile_info\lib\src\presentation\blocs\personal_info_bloc.dart:17:10 - mixin_of_non_class + error - The method 'handleError' isn't defined for the type 'PersonalInfoBloc' - packages\features\staff\profile_sections\onboarding\profile_info\lib\src\presentation\blocs\personal_info_bloc.dart:44:11 - undefined_method +warning - Missing type annotation - packages\features\staff\profile_sections\onboarding\profile_info\lib\src\presentation\blocs\personal_info_bloc.dart:82:48 - always_specify_types + error - The method 'handleError' isn't defined for the type 'PersonalInfoBloc' - packages\features\staff\profile_sections\onboarding\profile_info\lib\src\presentation\blocs\personal_info_bloc.dart:95:11 - undefined_method + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\onboarding\profile_info\lib\src\presentation\widgets\profile_photo_widget.dart:44:43 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\onboarding\profile_info\lib\src\presentation\widgets\profile_photo_widget.dart:74:53 - deprecated_member_use + info - The imported package 'firebase_auth' isn't a dependency of the importing package - packages\features\staff\shifts\lib\src\data\repositories_impl\shifts_repository_impl.dart:4:8 - depend_on_referenced_packages + info - The imported package 'firebase_data_connect' isn't a dependency of the importing package - packages\features\staff\shifts\lib\src\data\repositories_impl\shifts_repository_impl.dart:5:8 - depend_on_referenced_packages + info - The imported package 'bloc' isn't a dependency of the importing package - packages\features\staff\shifts\lib\src\presentation\blocs\shift_details\shift_details_bloc.dart:1:8 - depend_on_referenced_packages + error - Target of URI doesn't exist: 'package:krow_core/krow_core.dart' - packages\features\staff\shifts\lib\src\presentation\blocs\shift_details\shift_details_bloc.dart:2:8 - uri_does_not_exist + error - Classes can only mix in mixins and classes - packages\features\staff\shifts\lib\src\presentation\blocs\shift_details\shift_details_bloc.dart:11:10 - mixin_of_non_class + error - The method 'handleError' isn't defined for the type 'ShiftDetailsBloc' - packages\features\staff\shifts\lib\src\presentation\blocs\shift_details\shift_details_bloc.dart:31:11 - undefined_method + error - The method 'handleError' isn't defined for the type 'ShiftDetailsBloc' - packages\features\staff\shifts\lib\src\presentation\blocs\shift_details\shift_details_bloc.dart:51:11 - undefined_method + error - The method 'handleError' isn't defined for the type 'ShiftDetailsBloc' - packages\features\staff\shifts\lib\src\presentation\blocs\shift_details\shift_details_bloc.dart:71:11 - undefined_method + info - The imported package 'bloc' isn't a dependency of the importing package - packages\features\staff\shifts\lib\src\presentation\blocs\shifts\shifts_bloc.dart:1:8 - depend_on_referenced_packages + error - Target of URI doesn't exist: 'package:krow_core/krow_core.dart' - packages\features\staff\shifts\lib\src\presentation\blocs\shifts\shifts_bloc.dart:3:8 - uri_does_not_exist + info - The imported package 'meta' isn't a dependency of the importing package - packages\features\staff\shifts\lib\src\presentation\blocs\shifts\shifts_bloc.dart:5:8 - depend_on_referenced_packages + error - Classes can only mix in mixins and classes - packages\features\staff\shifts\lib\src\presentation\blocs\shifts\shifts_bloc.dart:19:10 - mixin_of_non_class + error - The method 'handleError' isn't defined for the type 'ShiftsBloc' - packages\features\staff\shifts\lib\src\presentation\blocs\shifts\shifts_bloc.dart:49:11 - undefined_method + error - The method 'handleError' isn't defined for the type 'ShiftsBloc' - packages\features\staff\shifts\lib\src\presentation\blocs\shifts\shifts_bloc.dart:85:11 - undefined_method + error - The method 'handleError' isn't defined for the type 'ShiftsBloc' - packages\features\staff\shifts\lib\src\presentation\blocs\shifts\shifts_bloc.dart:114:11 - undefined_method + error - The method 'handleError' isn't defined for the type 'ShiftsBloc' - packages\features\staff\shifts\lib\src\presentation\blocs\shifts\shifts_bloc.dart:162:11 - undefined_method + error - The method 'handleError' isn't defined for the type 'ShiftsBloc' - packages\features\staff\shifts\lib\src\presentation\blocs\shifts\shifts_bloc.dart:202:11 - undefined_method + error - The method 'handleError' isn't defined for the type 'ShiftsBloc' - packages\features\staff\shifts\lib\src\presentation\blocs\shifts\shifts_bloc.dart:248:13 - undefined_method + info - Don't invoke 'print' in production code - packages\features\staff\shifts\lib\src\presentation\pages\shifts_page.dart:32:5 - avoid_print + info - Don't invoke 'print' in production code - packages\features\staff\shifts\lib\src\presentation\pages\shifts_page.dart:40:7 - avoid_print + info - Don't invoke 'print' in production code - packages\features\staff\shifts\lib\src\presentation\pages\shifts_page.dart:44:7 - avoid_print + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\shifts\lib\src\presentation\widgets\my_shift_card.dart:128:35 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\shifts\lib\src\presentation\widgets\my_shift_card.dart:183:57 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\shifts\lib\src\presentation\widgets\my_shift_card.dart:208:48 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\shifts\lib\src\presentation\widgets\my_shift_card.dart:209:48 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\shifts\lib\src\presentation\widgets\my_shift_card.dart:216:53 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\shifts\lib\src\presentation\widgets\shift_assignment_card.dart:74:33 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\shifts\lib\src\presentation\widgets\shift_assignment_card.dart:100:46 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\shifts\lib\src\presentation\widgets\shift_assignment_card.dart:101:46 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\shifts\lib\src\presentation\widgets\shift_assignment_card.dart:108:51 - deprecated_member_use + info - The imported package 'lucide_icons' isn't a dependency of the importing package - packages\features\staff\shifts\lib\src\presentation\widgets\tabs\my_shifts_tab.dart:4:8 - depend_on_referenced_packages + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\shifts\lib\src\presentation\widgets\tabs\my_shifts_tab.dart:316:54 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\shifts\lib\src\presentation\widgets\tabs\my_shifts_tab.dart:507:47 - deprecated_member_use + info - The imported package 'krow_core' isn't a dependency of the importing package - packages\features\staff\staff_main\lib\src\presentation\blocs\staff_main_cubit.dart:2:8 - depend_on_referenced_packages + info - The imported package 'krow_core' isn't a dependency of the importing package - packages\features\staff\staff_main\lib\src\staff_main_module.dart:3:8 - depend_on_referenced_packages + diff --git a/apps/mobile/analysis_utf8_2.txt b/apps/mobile/analysis_utf8_2.txt new file mode 100644 index 00000000..e65ca897 --- /dev/null +++ b/apps/mobile/analysis_utf8_2.txt @@ -0,0 +1,735 @@ +Resolving dependencies... +Downloading packages... + _fe_analyzer_shared 91.0.0 (94.0.0 available) + analyzer 8.4.1 (10.0.2 available) + archive 3.6.1 (4.0.7 available) + bloc 8.1.4 (9.2.0 available) + bloc_test 9.1.7 (10.0.0 available) + build_runner 2.10.5 (2.11.0 available) + characters 1.4.0 (1.4.1 available) + code_assets 0.19.10 (1.0.0 available) + dart_style 3.1.3 (3.1.5 available) + fl_chart 0.66.2 (1.1.1 available) + flutter_bloc 8.1.6 (9.1.1 available) + geolocator 10.1.1 (14.0.2 available) + geolocator_android 4.6.2 (5.0.2 available) + geolocator_web 2.2.1 (4.1.3 available) + get_it 7.7.0 (9.2.0 available) + google_fonts 7.0.2 (8.0.1 available) + googleapis_auth 1.6.0 (2.0.0 available) + grpc 3.2.4 (5.1.0 available) + hooks 0.20.5 (1.0.1 available) + image 4.3.0 (4.7.2 available) + json_annotation 4.9.0 (4.10.0 available) + lints 6.0.0 (6.1.0 available) + matcher 0.12.17 (0.12.18 available) + material_color_utilities 0.11.1 (0.13.0 available) + melos 7.3.0 (7.4.0 available) + meta 1.17.0 (1.18.1 available) + native_toolchain_c 0.17.2 (0.17.4 available) + objective_c 9.2.2 (9.3.0 available) + permission_handler 11.4.0 (12.0.1 available) + permission_handler_android 12.1.0 (13.0.1 available) + protobuf 3.1.0 (6.0.0 available) + shared_preferences_android 2.4.18 (2.4.20 available) + slang 4.12.0 (4.12.1 available) + slang_build_runner 4.12.0 (4.12.1 available) + slang_flutter 4.12.0 (4.12.1 available) + source_span 1.10.1 (1.10.2 available) + test 1.26.3 (1.29.0 available) + test_api 0.7.7 (0.7.9 available) + test_core 0.6.12 (0.6.15 available) + url_launcher_ios 6.3.6 (6.4.0 available) +Got dependencies! +40 packages have newer versions incompatible with dependency constraints. +Try `flutter pub outdated` for more information. +Analyzing mobile... + + info - Library names are not necessary - packages\core\lib\core.dart:1:9 - unnecessary_library_name + info - The imported package 'flutter_bloc' isn't a dependency of the importing package - packages\core\lib\src\presentation\mixins\bloc_error_handler.dart:2:8 - depend_on_referenced_packages + info - The imported package 'krow_domain' isn't a dependency of the importing package - packages\core\lib\src\presentation\mixins\bloc_error_handler.dart:3:8 - depend_on_referenced_packages + info - The imported package 'flutter_bloc' isn't a dependency of the importing package - packages\core\lib\src\presentation\observers\core_bloc_observer.dart:2:8 - depend_on_referenced_packages + info - Constructor declarations should be before non-constructor declarations - packages\core\lib\src\presentation\observers\core_bloc_observer.dart:31:3 - sort_constructors_first +warning - Missing type annotation - packages\core\lib\src\presentation\observers\core_bloc_observer.dart:37:17 - always_specify_types +warning - Missing type annotation - packages\core\lib\src\presentation\observers\core_bloc_observer.dart:46:16 - always_specify_types +warning - Missing type annotation - packages\core\lib\src\presentation\observers\core_bloc_observer.dart:57:17 - always_specify_types +warning - Missing type annotation - packages\core\lib\src\presentation\observers\core_bloc_observer.dart:57:32 - always_specify_types +warning - Missing type annotation - packages\core\lib\src\presentation\observers\core_bloc_observer.dart:68:16 - always_specify_types +warning - Missing type annotation - packages\core\lib\src\presentation\observers\core_bloc_observer.dart:98:16 - always_specify_types +warning - Missing type annotation - packages\core\lib\src\presentation\observers\core_bloc_observer.dart:107:21 - always_specify_types +warning - Missing type annotation - packages\core\lib\src\presentation\observers\core_bloc_observer.dart:107:32 - always_specify_types + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\core\lib\src\presentation\widgets\web_mobile_frame.dart:99:47 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\core\lib\src\presentation\widgets\web_mobile_frame.dart:128:51 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\core\lib\src\presentation\widgets\web_mobile_frame.dart:244:55 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\core\lib\src\presentation\widgets\web_mobile_frame.dart:246:64 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\core\lib\src\presentation\widgets\web_mobile_frame.dart:249:49 - deprecated_member_use + info - Dangling library doc comment - packages\core\lib\src\routing\routing.dart:1:1 - dangling_library_doc_comments + info - The imported package 'krow_domain' isn't a dependency of the importing package - packages\core\lib\src\routing\staff\navigator.dart:2:8 - depend_on_referenced_packages + info - Constructor declarations should be before non-constructor declarations - packages\core_localization\lib\src\bloc\locale_event.dart:15:9 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\core_localization\lib\src\data\datasources\locale_local_data_source.dart:18:3 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\core_localization\lib\src\domain\usecases\get_default_locale_use_case.dart:9:3 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\core_localization\lib\src\domain\usecases\get_locale_use_case.dart:13:3 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\core_localization\lib\src\domain\usecases\get_supported_locales_use_case.dart:9:3 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\core_localization\lib\src\domain\usecases\set_locale_use_case.dart:13:3 - sort_constructors_first + info - The imported package 'firebase_core' isn't a dependency of the importing package - packages\data_connect\lib\src\mixins\data_error_handler.dart:4:8 - depend_on_referenced_packages + info - Constructor declarations should be before non-constructor declarations - packages\data_connect\lib\src\session\client_session_store.dart:11:9 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\data_connect\lib\src\session\client_session_store.dart:26:9 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\data_connect\lib\src\session\client_session_store.dart:48:3 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\data_connect\lib\src\session\staff_session_store.dart:8:9 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\data_connect\lib\src\session\staff_session_store.dart:30:3 - sort_constructors_first + info - Statements in an if should be enclosed in a block - packages\design_system\lib\src\ui_theme.dart:85:19 - curly_braces_in_flow_control_structures +warning - Missing type annotation - packages\design_system\lib\src\ui_theme.dart:258:27 - always_specify_types + info - Constructor declarations should be before non-constructor declarations - packages\design_system\lib\src\widgets\ui_app_bar.dart:39:9 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\design_system\lib\src\widgets\ui_button.dart:43:9 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\design_system\lib\src\widgets\ui_button.dart:61:3 - sort_constructors_first + info - Constructors in '@immutable' classes should be declared as 'const' - packages\design_system\lib\src\widgets\ui_button.dart:61:3 - prefer_const_constructors_in_immutables + info - Constructor declarations should be before non-constructor declarations - packages\design_system\lib\src\widgets\ui_button.dart:79:3 - sort_constructors_first + info - Constructors in '@immutable' classes should be declared as 'const' - packages\design_system\lib\src\widgets\ui_button.dart:79:3 - prefer_const_constructors_in_immutables + info - Constructor declarations should be before non-constructor declarations - packages\design_system\lib\src\widgets\ui_button.dart:97:3 - sort_constructors_first + info - Constructors in '@immutable' classes should be declared as 'const' - packages\design_system\lib\src\widgets\ui_button.dart:97:3 - prefer_const_constructors_in_immutables + info - Constructor declarations should be before non-constructor declarations - packages\design_system\lib\src\widgets\ui_button.dart:115:3 - sort_constructors_first + info - Constructors in '@immutable' classes should be declared as 'const' - packages\design_system\lib\src\widgets\ui_button.dart:115:3 - prefer_const_constructors_in_immutables + info - Type could be non-nullable - packages\design_system\lib\src\widgets\ui_button.dart:135:24 - unnecessary_nullable_for_final_variable_declarations + info - Constructor declarations should be before non-constructor declarations - packages\design_system\lib\src\widgets\ui_chip.dart:57:9 - sort_constructors_first +warning - Missing type annotation - packages\design_system\lib\src\widgets\ui_error_snackbar.dart:38:21 - always_specify_types +warning - Missing type annotation - packages\design_system\lib\src\widgets\ui_error_snackbar.dart:45:27 - always_specify_types +warning - Missing type annotation - packages\design_system\lib\src\widgets\ui_error_snackbar.dart:50:45 - always_specify_types +warning - Missing type annotation - packages\design_system\lib\src\widgets\ui_error_snackbar.dart:82:5 - always_specify_types + info - Constructor declarations should be before non-constructor declarations - packages\design_system\lib\src\widgets\ui_icon_button.dart:30:9 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\design_system\lib\src\widgets\ui_icon_button.dart:42:9 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\design_system\lib\src\widgets\ui_icon_button.dart:53:3 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\design_system\lib\src\widgets\ui_step_indicator.dart:18:9 - sort_constructors_first +warning - Missing type annotation - packages\design_system\lib\src\widgets\ui_step_indicator.dart:38:19 - always_specify_types +warning - Missing type annotation - packages\design_system\lib\src\widgets\ui_success_snackbar.dart:30:21 - always_specify_types + info - Use 'const' with the constructor to improve performance - packages\design_system\lib\src\widgets\ui_success_snackbar.dart:31:13 - prefer_const_constructors + info - Constructor declarations should be before non-constructor declarations - packages\design_system\lib\src\widgets\ui_text_field.dart:59:9 - sort_constructors_first +warning - Missing type annotation - packages\domain\lib\src\adapters\availability\availability_adapter.dart:5:68 - always_specify_types +warning - Missing type annotation - packages\domain\lib\src\adapters\availability\availability_adapter.dart:6:16 - always_specify_types +warning - Missing type annotation - packages\domain\lib\src\adapters\availability\availability_adapter.dart:11:18 - always_specify_types +warning - Missing type annotation - packages\domain\lib\src\adapters\availability\availability_adapter.dart:16:16 - always_specify_types +warning - Missing type annotation - packages\domain\lib\src\adapters\availability\availability_adapter.dart:25:5 - always_specify_types +warning - Unused import: '../../entities/shifts/shift.dart' - packages\domain\lib\src\adapters\clock_in\clock_in_adapter.dart:1:8 - unused_import +warning - Missing type annotation - packages\domain\lib\src\adapters\profile\bank_account_adapter.dart:34:10 - always_specify_types + info - Angle brackets will be interpreted as HTML - packages\domain\lib\src\adapters\profile\experience_adapter.dart:3:62 - unintended_html_in_doc_comment +warning - Unnecessary cast - packages\domain\lib\src\adapters\profile\tax_form_adapter.dart:21:53 - unnecessary_cast +warning - Missing type annotation - packages\domain\lib\src\adapters\profile\tax_form_adapter.dart:21:65 - always_specify_types + info - The imported package 'intl' isn't a dependency of the importing package - packages\domain\lib\src\adapters\shifts\shift_adapter.dart:1:8 - depend_on_referenced_packages + info - Constructor declarations should be before non-constructor declarations - packages\domain\lib\src\entities\availability\availability_slot.dart:10:9 - sort_constructors_first +warning - Missing type annotation - packages\domain\lib\src\entities\availability\availability_slot.dart:32:30 - always_specify_types + info - Constructor declarations should be before non-constructor declarations - packages\domain\lib\src\entities\availability\day_availability.dart:11:9 - sort_constructors_first +warning - Missing type annotation - packages\domain\lib\src\entities\availability\day_availability.dart:14:18 - always_specify_types +warning - Missing type annotation - packages\domain\lib\src\entities\availability\day_availability.dart:30:30 - always_specify_types + info - Constructor declarations should be before non-constructor declarations - packages\domain\lib\src\entities\clock_in\attendance_status.dart:11:9 - sort_constructors_first +warning - Missing type annotation - packages\domain\lib\src\entities\clock_in\attendance_status.dart:20:30 - always_specify_types + info - Constructor declarations should be before non-constructor declarations - packages\domain\lib\src\entities\financial\payment_summary.dart:10:9 - sort_constructors_first +warning - Missing type annotation - packages\domain\lib\src\entities\financial\payment_summary.dart:18:30 - always_specify_types + info - Constructor declarations should be before non-constructor declarations - packages\domain\lib\src\entities\financial\time_card.dart:50:9 - sort_constructors_first +warning - Missing type annotation - packages\domain\lib\src\entities\financial\time_card.dart:65:30 - always_specify_types + info - Constructor declarations should be before non-constructor declarations - packages\domain\lib\src\entities\profile\attire_item.dart:23:9 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\domain\lib\src\entities\profile\experience_skill.dart:21:9 - sort_constructors_first +warning - Missing type annotation - packages\domain\lib\src\entities\profile\experience_skill.dart:25:49 - always_specify_types + info - Constructor declarations should be before non-constructor declarations - packages\domain\lib\src\entities\profile\industry.dart:12:9 - sort_constructors_first +warning - Missing type annotation - packages\domain\lib\src\entities\profile\industry.dart:16:42 - always_specify_types + info - Constructor declarations should be before non-constructor declarations - packages\domain\lib\src\entities\profile\staff_document.dart:38:9 - sort_constructors_first +warning - Missing type annotation - packages\domain\lib\src\entities\profile\staff_document.dart:50:30 - always_specify_types + info - Constructor declarations should be before non-constructor declarations - packages\domain\lib\src\entities\profile\tax_form.dart:19:9 - sort_constructors_first +warning - Missing type annotation - packages\domain\lib\src\entities\profile\tax_form.dart:26:21 - always_specify_types +warning - Missing type annotation - packages\domain\lib\src\entities\profile\tax_form.dart:32:30 - always_specify_types + info - Constructor declarations should be before non-constructor declarations - packages\domain\lib\src\entities\shifts\shift.dart:33:9 - sort_constructors_first +warning - Missing type annotation - packages\domain\lib\src\entities\shifts\shift.dart:65:30 - always_specify_types + info - Constructor declarations should be before non-constructor declarations - packages\domain\lib\src\entities\shifts\shift.dart:102:9 - sort_constructors_first +warning - Missing type annotation - packages\domain\lib\src\entities\shifts\shift.dart:105:30 - always_specify_types + info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:35:9 - use_super_parameters + info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:44:9 - use_super_parameters + info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:53:9 - use_super_parameters + info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:62:9 - use_super_parameters + info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:71:9 - use_super_parameters + info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:80:9 - use_super_parameters + info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:89:9 - use_super_parameters + info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:98:9 - use_super_parameters + info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:107:9 - use_super_parameters + info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:116:9 - use_super_parameters + info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:134:9 - use_super_parameters + info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:143:9 - use_super_parameters + info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:152:9 - use_super_parameters + info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:170:9 - use_super_parameters + info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:179:9 - use_super_parameters + info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:188:9 - use_super_parameters + info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:197:9 - use_super_parameters + info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:206:9 - use_super_parameters + info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:224:9 - use_super_parameters + info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:233:9 - use_super_parameters + info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:242:9 - use_super_parameters + info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:260:9 - use_super_parameters + info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:269:9 - use_super_parameters + info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:278:9 - use_super_parameters + info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:291:9 - use_super_parameters + info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:300:9 - use_super_parameters + info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:309:9 - use_super_parameters + info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:318:9 - use_super_parameters + info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:327:9 - use_super_parameters +warning - The name GoogleOnlyAccountException is shown, but isn't used - packages\features\client\authentication\lib\src\data\repositories_impl\auth_repository_impl.dart:16:9 - unused_shown_name +warning - The value of the local variable 'newUserData' isn't used - packages\features\client\authentication\lib\src\data\repositories_impl\auth_repository_impl.dart:266:35 - unused_local_variable + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\authentication\lib\src\presentation\pages\client_get_started_page.dart:137:35 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\authentication\lib\src\presentation\pages\client_get_started_page.dart:152:43 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\authentication\lib\src\presentation\pages\client_get_started_page.dart:200:35 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\authentication\lib\src\presentation\pages\client_get_started_page.dart:210:47 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\authentication\lib\src\presentation\pages\client_get_started_page.dart:241:35 - deprecated_member_use +warning - Missing type annotation - packages\features\client\authentication\lib\src\presentation\pages\client_sign_up_page.dart:44:12 - always_specify_types +warning - The value of the local variable 'currentBill' isn't used - packages\features\client\billing\lib\src\presentation\blocs\billing_bloc.dart:57:22 - unused_local_variable + error - Expected a method, getter, setter or operator declaration - packages\features\client\billing\lib\src\presentation\blocs\billing_bloc.dart:172:1 - expected_executable + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\pages\coverage_page.dart:76:59 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\pages\coverage_page.dart:108:61 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\pages\coverage_page.dart:156:64 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\pages\coverage_page.dart:171:48 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\pages\coverage_page.dart:189:48 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\coverage_calendar_selector.dart:110:52 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\coverage_calendar_selector.dart:135:58 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\coverage_calendar_selector.dart:173:45 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\coverage_header.dart:76:59 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\coverage_header.dart:112:60 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\coverage_header.dart:130:49 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\coverage_header.dart:142:59 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\coverage_header.dart:159:59 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\coverage_shift_list.dart:320:35 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\coverage_shift_list.dart:322:39 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\coverage_shift_list.dart:331:37 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\coverage_shift_list.dart:333:41 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\coverage_shift_list.dart:341:31 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\coverage_shift_list.dart:343:35 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\coverage_shift_list.dart:352:35 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\coverage_shift_list.dart:354:39 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\coverage_shift_list.dart:362:29 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\coverage_shift_list.dart:364:33 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\coverage_shift_list.dart:372:35 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\coverage_shift_list.dart:374:39 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\coverage_shift_list.dart:382:35 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\coverage_shift_list.dart:384:39 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\coverage_shift_list.dart:394:29 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\coverage_shift_list.dart:396:33 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\late_workers_alert.dart:22:37 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\late_workers_alert.dart:25:39 - deprecated_member_use + info - The imported package 'krow_core' isn't a dependency of the importing package - packages\features\client\client_main\lib\src\client_main_module.dart:6:8 - depend_on_referenced_packages + info - The imported package 'krow_core' isn't a dependency of the importing package - packages\features\client\client_main\lib\src\presentation\blocs\client_main_cubit.dart:3:8 - depend_on_referenced_packages +warning - Missing type annotation - packages\features\client\create_order\lib\src\data\repositories_impl\client_create_order_repository_impl.dart:30:12 - always_specify_types + info - Don't invoke 'print' in production code - packages\features\client\create_order\lib\src\data\repositories_impl\client_create_order_repository_impl.dart:131:7 - avoid_print +warning - The member 'emit' can only be used within 'package:bloc/src/bloc.dart' or a test - packages\features\client\create_order\lib\src\presentation\blocs\one_time_order_bloc.dart:71:23 - invalid_use_of_visible_for_testing_member +warning - The member 'emit' can only be used within 'package:bloc/src/bloc.dart' or a test - packages\features\client\create_order\lib\src\presentation\blocs\one_time_order_bloc.dart:75:7 - invalid_use_of_visible_for_testing_member + info - Don't invoke 'print' in production code - packages\features\client\create_order\lib\src\presentation\widgets\rapid_order\rapid_order_view.dart:292:21 - avoid_print +warning - Missing type annotation - packages\features\client\home\lib\src\presentation\widgets\coverage_dashboard.dart:25:10 - always_specify_types +warning - Missing type annotation - packages\features\client\home\lib\src\presentation\widgets\coverage_dashboard.dart:42:17 - always_specify_types +warning - Missing type annotation - packages\features\client\home\lib\src\presentation\widgets\coverage_dashboard.dart:42:29 - always_specify_types +warning - Missing type annotation - packages\features\client\home\lib\src\presentation\widgets\coverage_dashboard.dart:45:17 - always_specify_types +warning - Missing type annotation - packages\features\client\home\lib\src\presentation\widgets\coverage_dashboard.dart:45:29 - always_specify_types +warning - The name HubCreationFailedException is shown, but isn't used - packages\features\client\hubs\lib\src\data\repositories_impl\hub_repository_impl.dart:12:9 - unused_shown_name + info - Constructor declarations should be before non-constructor declarations - packages\features\client\settings\lib\src\domain\usecases\sign_out_usecase.dart:13:3 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\client\settings\lib\src\presentation\blocs\client_settings_bloc.dart:14:3 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\client\settings\lib\src\presentation\blocs\client_settings_state.dart:25:9 - sort_constructors_first + info - Use 'const' with the constructor to improve performance - packages\features\client\settings\lib\src\presentation\widgets\client_settings_page\settings_profile_header.dart:80:23 - prefer_const_constructors + info - Constructor declarations should be before non-constructor declarations - packages\features\client\settings\lib\src\presentation\widgets\client_settings_page\settings_quick_links.dart:69:9 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\client\view_orders\lib\src\data\repositories\view_orders_repository_impl.dart:15:3 - sort_constructors_first + info - Don't invoke 'print' in production code - packages\features\client\view_orders\lib\src\data\repositories\view_orders_repository_impl.dart:43:5 - avoid_print + info - Don't invoke 'print' in production code - packages\features\client\view_orders\lib\src\data\repositories\view_orders_repository_impl.dart:66:7 - avoid_print + info - Don't invoke 'print' in production code - packages\features\client\view_orders\lib\src\data\repositories\view_orders_repository_impl.dart:118:5 - avoid_print + info - Don't invoke 'print' in production code - packages\features\client\view_orders\lib\src\data\repositories\view_orders_repository_impl.dart:124:7 - avoid_print + info - Constructor declarations should be before non-constructor declarations - packages\features\client\view_orders\lib\src\domain\usecases\get_orders_use_case.dart:15:3 - sort_constructors_first + error - The argument type 'Null Function(ViewOrdersState)' can't be assigned to the parameter type 'Emitter'. - packages\features\client\view_orders\lib\src\presentation\blocs\view_orders_cubit.dart:42:13 - argument_type_not_assignable + info - Don't invoke 'print' in production code - packages\features\client\view_orders\lib\src\presentation\blocs\view_orders_cubit.dart:248:7 - avoid_print + info - Don't invoke 'print' in production code - packages\features\client\view_orders\lib\src\presentation\blocs\view_orders_cubit.dart:257:7 - avoid_print + info - Don't invoke 'print' in production code - packages\features\client\view_orders\lib\src\presentation\blocs\view_orders_cubit.dart:266:7 - avoid_print +warning - The declaration '_applyApplications' isn't referenced - packages\features\client\view_orders\lib\src\presentation\blocs\view_orders_cubit.dart:323:19 - unused_element +warning - The declaration '_isSameDay' isn't referenced - packages\features\client\view_orders\lib\src\presentation\blocs\view_orders_cubit.dart:357:8 - unused_element +warning - The declaration '_calculateCalendarDays' isn't referenced - packages\features\client\view_orders\lib\src\presentation\blocs\view_orders_cubit.dart:361:18 - unused_element +warning - The declaration '_calculateFilteredOrders' isn't referenced - packages\features\client\view_orders\lib\src\presentation\blocs\view_orders_cubit.dart:376:19 - unused_element + info - Don't invoke 'print' in production code - packages\features\client\view_orders\lib\src\presentation\blocs\view_orders_cubit.dart:402:7 - avoid_print + info - Don't invoke 'print' in production code - packages\features\client\view_orders\lib\src\presentation\blocs\view_orders_cubit.dart:410:7 - avoid_print + info - Don't invoke 'print' in production code - packages\features\client\view_orders\lib\src\presentation\blocs\view_orders_cubit.dart:418:7 - avoid_print +warning - The declaration '_calculateCategoryCount' isn't referenced - packages\features\client\view_orders\lib\src\presentation\blocs\view_orders_cubit.dart:426:7 - unused_element + error - Undefined name 'state' - packages\features\client\view_orders\lib\src\presentation\blocs\view_orders_cubit.dart:427:9 - undefined_identifier + error - Undefined name 'state' - packages\features\client\view_orders\lib\src\presentation\blocs\view_orders_cubit.dart:431:14 - undefined_identifier + error - Undefined name 'state' - packages\features\client\view_orders\lib\src\presentation\blocs\view_orders_cubit.dart:434:14 - undefined_identifier + error - Undefined name 'state' - packages\features\client\view_orders\lib\src\presentation\blocs\view_orders_cubit.dart:438:14 - undefined_identifier +warning - The declaration '_calculateUpNextCount' isn't referenced - packages\features\client\view_orders\lib\src\presentation\blocs\view_orders_cubit.dart:445:7 - unused_element + error - Undefined name 'state' - packages\features\client\view_orders\lib\src\presentation\blocs\view_orders_cubit.dart:446:9 - undefined_identifier + error - Undefined name 'state' - packages\features\client\view_orders\lib\src\presentation\blocs\view_orders_cubit.dart:450:14 - undefined_identifier + error - Undefined name 'state' - packages\features\client\view_orders\lib\src\presentation\blocs\view_orders_cubit.dart:452:12 - undefined_identifier + error - Expected a method, getter, setter or operator declaration - packages\features\client\view_orders\lib\src\presentation\blocs\view_orders_cubit.dart:461:1 - expected_executable +warning - The declaration '_formatDate' isn't referenced - packages\features\client\view_orders\lib\src\presentation\widgets\view_order_card.dart:84:10 - unused_element +warning - The receiver can't be null, so the null-aware operator '?.' is unnecessary - packages\features\client\view_orders\lib\src\presentation\widgets\view_order_card.dart:833:55 - invalid_null_aware_operator + info - Type could be non-nullable - packages\features\client\view_orders\lib\src\presentation\widgets\view_order_card.dart:872:7 - unnecessary_nullable_for_final_variable_declarations + info - Don't use 'BuildContext's across async gaps, guarded by an unrelated 'mounted' check - packages\features\client\view_orders\lib\src\presentation\widgets\view_order_card.dart:1615:39 - use_build_context_synchronously + info - Don't use 'BuildContext's across async gaps, guarded by an unrelated 'mounted' check - packages\features\client\view_orders\lib\src\presentation\widgets\view_order_card.dart:1635:39 - use_build_context_synchronously + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\data\repositories_impl\place_repository_impl.dart:9:3 - sort_constructors_first +warning - Missing type annotation - packages\features\staff\authentication\lib\src\data\repositories_impl\place_repository_impl.dart:13:31 - always_specify_types +warning - Missing type annotation - packages\features\staff\authentication\lib\src\data\repositories_impl\place_repository_impl.dart:40:21 - always_specify_types + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\data\repositories_impl\profile_setup_repository_impl.dart:11:3 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\domain\arguments\sign_in_with_phone_arguments.dart:13:9 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\domain\arguments\verify_otp_arguments.dart:21:9 - sort_constructors_first +warning - Unused import: 'package:krow_domain/krow_domain.dart' - packages\features\staff\authentication\lib\src\domain\repositories\profile_setup_repository.dart:1:8 - unused_import + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\domain\usecases\search_cities_usecase.dart:6:3 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\domain\usecases\sign_in_with_phone_usecase.dart:15:3 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\domain\usecases\submit_profile_setup_usecase.dart:6:3 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\domain\usecases\verify_otp_usecase.dart:15:3 - sort_constructors_first + info - The imported package 'bloc' isn't a dependency of the importing package - packages\features\staff\authentication\lib\src\presentation\blocs\auth_bloc.dart:3:8 - depend_on_referenced_packages + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\blocs\auth_bloc.dart:29:3 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\blocs\auth_event.dart:19:9 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\blocs\auth_event.dart:39:9 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\blocs\auth_event.dart:57:9 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\blocs\auth_event.dart:67:9 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\blocs\auth_event.dart:78:9 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\blocs\auth_event.dart:89:9 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\blocs\auth_state.dart:49:9 - sort_constructors_first +warning - Missing type annotation - packages\features\staff\authentication\lib\src\presentation\blocs\profile_setup\profile_setup_bloc.dart:117:48 - always_specify_types +warning - Missing type annotation - packages\features\staff\authentication\lib\src\presentation\blocs\profile_setup\profile_setup_bloc.dart:124:7 - always_specify_types +warning - Missing type annotation - packages\features\staff\authentication\lib\src\presentation\blocs\profile_setup\profile_setup_bloc.dart:128:48 - always_specify_types +warning - Missing type annotation - packages\features\staff\authentication\lib\src\presentation\blocs\profile_setup\profile_setup_bloc.dart:136:46 - always_specify_types + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\blocs\profile_setup\profile_setup_event.dart:17:9 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\blocs\profile_setup\profile_setup_event.dart:29:9 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\blocs\profile_setup\profile_setup_event.dart:41:9 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\blocs\profile_setup\profile_setup_event.dart:53:9 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\blocs\profile_setup\profile_setup_event.dart:65:9 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\blocs\profile_setup\profile_setup_event.dart:77:9 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\blocs\profile_setup\profile_setup_event.dart:89:9 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\blocs\profile_setup\profile_setup_state.dart:36:9 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\pages\phone_verification_page.dart:23:9 - sort_constructors_first + info - 'WillPopScope' is deprecated and shouldn't be used. Use PopScope instead. The Android predictive back feature will not work with WillPopScope. This feature was deprecated after v3.12.0-1.0.pre - packages\features\staff\authentication\lib\src\presentation\pages\phone_verification_page.dart:138:24 - deprecated_member_use + info - Use 'const' with the constructor to improve performance - packages\features\staff\authentication\lib\src\presentation\pages\profile_setup_page.dart:157:27 - prefer_const_constructors + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\widgets\common\section_title_subtitle.dart:12:9 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\widgets\get_started_page\get_started_actions.dart:9:9 - sort_constructors_first + info - Unnecessary instance of 'Container' - packages\features\staff\authentication\lib\src\presentation\widgets\get_started_page\get_started_background.dart:9:12 - avoid_unnecessary_containers +warning - Missing type annotation - packages\features\staff\authentication\lib\src\presentation\widgets\get_started_page\get_started_background.dart:11:19 - always_specify_types + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\authentication\lib\src\presentation\widgets\get_started_page\get_started_background.dart:25:50 - deprecated_member_use +warning - Missing type annotation - packages\features\staff\authentication\lib\src\presentation\widgets\get_started_page\get_started_background.dart:32:36 - always_specify_types +warning - Missing type annotation - packages\features\staff\authentication\lib\src\presentation\widgets\get_started_page\get_started_background.dart:32:45 - always_specify_types +warning - Missing type annotation - packages\features\staff\authentication\lib\src\presentation\widgets\get_started_page\get_started_background.dart:32:52 - always_specify_types +warning - Missing type annotation - packages\features\staff\authentication\lib\src\presentation\widgets\get_started_page\get_started_background.dart:43:23 - always_specify_types + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\authentication\lib\src\presentation\widgets\get_started_page\get_started_background.dart:57:43 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\authentication\lib\src\presentation\widgets\get_started_page\get_started_background.dart:66:43 - deprecated_member_use + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\widgets\phone_verification_page\otp_verification.dart:24:9 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\widgets\phone_verification_page\otp_verification\otp_input_field.dart:20:9 - sort_constructors_first +warning - Missing type annotation - packages\features\staff\authentication\lib\src\presentation\widgets\phone_verification_page\otp_verification\otp_input_field.dart:31:52 - always_specify_types +warning - Missing type annotation - packages\features\staff\authentication\lib\src\presentation\widgets\phone_verification_page\otp_verification\otp_input_field.dart:35:39 - always_specify_types +warning - Missing type annotation - packages\features\staff\authentication\lib\src\presentation\widgets\phone_verification_page\otp_verification\otp_input_field.dart:75:21 - always_specify_types + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\widgets\phone_verification_page\otp_verification\otp_resend_section.dart:14:9 - sort_constructors_first +warning - Missing type annotation - packages\features\staff\authentication\lib\src\presentation\widgets\phone_verification_page\otp_verification\otp_resend_section.dart:35:5 - always_specify_types + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\widgets\phone_verification_page\otp_verification\otp_verification_actions.dart:18:9 - sort_constructors_first + info - Use 'const' with the constructor to improve performance - packages\features\staff\authentication\lib\src\presentation\widgets\phone_verification_page\otp_verification\otp_verification_actions.dart:38:17 - prefer_const_constructors + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\widgets\phone_verification_page\otp_verification\otp_verification_header.dart:11:9 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\widgets\phone_verification_page\phone_input\phone_input_actions.dart:15:9 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\widgets\phone_verification_page\phone_input\phone_input_form_field.dart:20:9 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\widgets\profile_setup_page\profile_setup_basic_info.dart:21:9 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\widgets\profile_setup_page\profile_setup_experience.dart:22:9 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\widgets\profile_setup_page\profile_setup_header.dart:17:9 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\widgets\profile_setup_page\profile_setup_location.dart:24:9 - sort_constructors_first +warning - Missing type annotation - packages\features\staff\authentication\lib\src\presentation\widgets\profile_setup_page\profile_setup_location.dart:92:23 - always_specify_types +warning - Missing type annotation - packages\features\staff\authentication\lib\src\presentation\widgets\profile_setup_page\profile_setup_location.dart:92:33 - always_specify_types +warning - Missing type annotation - packages\features\staff\authentication\lib\src\presentation\widgets\profile_setup_page\profile_setup_location.dart:94:21 - always_specify_types +warning - Missing type annotation - packages\features\staff\authentication\lib\src\presentation\widgets\profile_setup_page\profile_setup_location.dart:94:30 - always_specify_types +warning - Missing type annotation - packages\features\staff\authentication\lib\src\presentation\widgets\profile_setup_page\profile_setup_location.dart:104:28 - always_specify_types + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\authentication\lib\src\presentation\widgets\profile_setup_page\profile_setup_location.dart:106:41 - deprecated_member_use +warning - Missing type annotation - packages\features\staff\authentication\lib\src\presentation\widgets\profile_setup_page\profile_setup_location.dart:116:36 - always_specify_types +warning - Missing type annotation - packages\features\staff\authentication\lib\src\presentation\widgets\profile_setup_page\profile_setup_location.dart:116:45 - always_specify_types +warning - Missing type annotation - packages\features\staff\authentication\lib\src\presentation\widgets\profile_setup_page\profile_setup_location.dart:117:31 - always_specify_types +warning - Missing type annotation - packages\features\staff\authentication\lib\src\presentation\widgets\profile_setup_page\profile_setup_location.dart:117:40 - always_specify_types +warning - Missing type annotation - packages\features\staff\authentication\lib\src\presentation\widgets\profile_setup_page\profile_setup_location.dart:118:19 - always_specify_types + info - Library names are not necessary - packages\features\staff\authentication\lib\staff_authentication.dart:1:9 - unnecessary_library_name + info - Statements in an if should be enclosed in a block - packages\features\staff\availability\lib\src\data\repositories_impl\availability_repository_impl.dart:148:28 - curly_braces_in_flow_control_structures + info - Statements in an if should be enclosed in a block - packages\features\staff\availability\lib\src\data\repositories_impl\availability_repository_impl.dart:149:35 - curly_braces_in_flow_control_structures + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\availability\lib\src\presentation\pages\availability_page.dart:100:45 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\availability\lib\src\presentation\pages\availability_page.dart:122:35 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\availability\lib\src\presentation\pages\availability_page.dart:192:30 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\availability\lib\src\presentation\pages\availability_page.dart:193:38 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\availability\lib\src\presentation\pages\availability_page.dart:224:33 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\availability\lib\src\presentation\pages\availability_page.dart:310:49 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\availability\lib\src\presentation\pages\availability_page.dart:341:42 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\availability\lib\src\presentation\pages\availability_page.dart:383:33 - deprecated_member_use + info - 'activeColor' is deprecated and shouldn't be used. Use activeThumbColor instead. This feature was deprecated after v3.31.0-2.0.pre - packages\features\staff\availability\lib\src\presentation\pages\availability_page.dart:418:17 - deprecated_member_use + info - Unnecessary use of 'toList' in a spread - packages\features\staff\availability\lib\src\presentation\pages\availability_page.dart:431:14 - unnecessary_to_list_in_spreads + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\availability\lib\src\presentation\pages\availability_page.dart:484:36 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\availability\lib\src\presentation\pages\availability_page.dart:485:40 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\availability\lib\src\presentation\pages\availability_page.dart:587:35 - deprecated_member_use + info - Library names are not necessary - packages\features\staff\availability\lib\staff_availability.dart:1:9 - unnecessary_library_name +warning - Missing type annotation - packages\features\staff\clock_in\lib\src\data\repositories_impl\clock_in_repository_impl.dart:109:78 - always_specify_types + info - Missing an 'await' for the 'Future' computed by this expression - packages\features\staff\clock_in\lib\src\presentation\bloc\clock_in_bloc.dart:105:11 - unawaited_futures + info - Missing an 'await' for the 'Future' computed by this expression - packages\features\staff\clock_in\lib\src\presentation\blocs\clock_in_cubit.dart:89:7 - unawaited_futures +warning - Missing type annotation - packages\features\staff\clock_in\lib\src\presentation\blocs\clock_in_cubit.dart:130:11 - always_specify_types +warning - Missing type annotation - packages\features\staff\clock_in\lib\src\presentation\blocs\clock_in_cubit.dart:147:11 - always_specify_types +warning - The value of the local variable 'checkInStr' isn't used - packages\features\staff\clock_in\lib\src\presentation\pages\clock_in_page.dart:68:24 - unused_local_variable +warning - The value of the local variable 'checkOutStr' isn't used - packages\features\staff\clock_in\lib\src\presentation\pages\clock_in_page.dart:71:24 - unused_local_variable +warning - The declaration '_buildModeTab' isn't referenced - packages\features\staff\clock_in\lib\src\presentation\pages\clock_in_page.dart:465:10 - unused_element + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\clock_in\lib\src\presentation\pages\clock_in_page.dart:483:43 - deprecated_member_use +warning - Missing type annotation - packages\features\staff\clock_in\lib\src\presentation\pages\clock_in_page.dart:523:43 - always_specify_types +warning - Missing type annotation - packages\features\staff\clock_in\lib\src\presentation\pages\clock_in_page.dart:573:33 - always_specify_types + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\clock_in\lib\src\presentation\widgets\attendance_card.dart:34:33 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\clock_in\lib\src\presentation\widgets\attendance_card.dart:100:44 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\clock_in\lib\src\presentation\widgets\attendance_card.dart:106:44 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\clock_in\lib\src\presentation\widgets\attendance_card.dart:112:44 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\clock_in\lib\src\presentation\widgets\attendance_card.dart:118:33 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\clock_in\lib\src\presentation\widgets\commute_tracker.dart:175:33 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\clock_in\lib\src\presentation\widgets\commute_tracker.dart:273:33 - deprecated_member_use +warning - Missing type annotation - packages\features\staff\clock_in\lib\src\presentation\widgets\commute_tracker.dart:375:23 - always_specify_types + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\clock_in\lib\src\presentation\widgets\commute_tracker.dart:386:53 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\clock_in\lib\src\presentation\widgets\commute_tracker.dart:427:49 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\clock_in\lib\src\presentation\widgets\commute_tracker.dart:430:51 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\clock_in\lib\src\presentation\widgets\commute_tracker.dart:461:51 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\clock_in\lib\src\presentation\widgets\commute_tracker.dart:464:53 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\clock_in\lib\src\presentation\widgets\commute_tracker.dart:512:56 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\clock_in\lib\src\presentation\widgets\commute_tracker.dart:541:33 - deprecated_member_use +warning - Missing type annotation - packages\features\staff\clock_in\lib\src\presentation\widgets\date_selector.dart:19:34 - always_specify_types + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\clock_in\lib\src\presentation\widgets\date_selector.dart:44:60 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\clock_in\lib\src\presentation\widgets\date_selector.dart:70:44 - deprecated_member_use + info - Unnecessary use of multiple underscores - packages\features\staff\clock_in\lib\src\presentation\widgets\location_map_placeholder.dart:30:24 - unnecessary_underscores + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\clock_in\lib\src\presentation\widgets\location_map_placeholder.dart:59:41 - deprecated_member_use +warning - The value of the field '_tookLunch' isn't used - packages\features\staff\clock_in\lib\src\presentation\widgets\lunch_break_modal.dart:15:9 - unused_field +warning - Missing type annotation - packages\features\staff\clock_in\lib\src\presentation\widgets\lunch_break_modal.dart:187:60 - always_specify_types +warning - Missing type annotation - packages\features\staff\clock_in\lib\src\presentation\widgets\lunch_break_modal.dart:200:60 - always_specify_types + info - 'groupValue' is deprecated and shouldn't be used. Use a RadioGroup ancestor to manage group value instead. This feature was deprecated after v3.32.0-0.0.pre - packages\features\staff\clock_in\lib\src\presentation\widgets\lunch_break_modal.dart:242:16 - deprecated_member_use + info - 'onChanged' is deprecated and shouldn't be used. Use RadioGroup to handle value change instead. This feature was deprecated after v3.32.0-0.0.pre - packages\features\staff\clock_in\lib\src\presentation\widgets\lunch_break_modal.dart:243:16 - deprecated_member_use +warning - Missing type annotation - packages\features\staff\clock_in\lib\src\presentation\widgets\swipe_to_check_in.dart:59:7 - always_specify_types +warning - Missing type annotation - packages\features\staff\clock_in\lib\src\presentation\widgets\swipe_to_check_in.dart:84:11 - always_specify_types + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\clock_in\lib\src\presentation\widgets\swipe_to_check_in.dart:99:34 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\clock_in\lib\src\presentation\widgets\swipe_to_check_in.dart:152:37 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\clock_in\lib\src\presentation\widgets\swipe_to_check_in.dart:168:43 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\clock_in\lib\src\presentation\widgets\swipe_to_check_in.dart:200:47 - deprecated_member_use + error - The argument type 'void Function(HomeState)' can't be assigned to the parameter type 'Emitter'. - packages\features\staff\home\lib\src\presentation\blocs\home_cubit.dart:25:13 - argument_type_not_assignable + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\home\lib\src\presentation\widgets\home_page\home_header.dart:36:41 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\home\lib\src\presentation\widgets\home_page\home_header.dart:41:49 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\home\lib\src\presentation\widgets\home_page\pending_payment_card.dart:24:39 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\home\lib\src\presentation\widgets\home_page\pending_payment_card.dart:24:75 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\home\lib\src\presentation\widgets\home_page\pending_payment_card.dart:29:54 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\home\lib\src\presentation\widgets\home_page\placeholder_banner.dart:32:44 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\home\lib\src\presentation\widgets\home_page\quick_action_item.dart:34:46 - deprecated_member_use +warning - Dead code - packages\features\staff\home\lib\src\presentation\widgets\home_page\recommended_shift_card.dart:193:45 - dead_code +warning - The left operand can't be null, so the right operand is never executed - packages\features\staff\home\lib\src\presentation\widgets\home_page\recommended_shift_card.dart:193:48 - dead_null_aware_expression + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\home\lib\src\presentation\widgets\home_page\section_header.dart:52:43 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\home\lib\src\presentation\widgets\home_page\section_header.dart:55:45 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\home\lib\src\presentation\widgets\worker\auto_match_toggle.dart:32:43 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\home\lib\src\presentation\widgets\worker\auto_match_toggle.dart:42:34 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\home\lib\src\presentation\widgets\worker\auto_match_toggle.dart:61:42 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\home\lib\src\presentation\widgets\worker\auto_match_toggle.dart:62:37 - deprecated_member_use + info - 'background' is deprecated and shouldn't be used. Use surface instead. This feature was deprecated after v3.18.0-0.1.pre - packages\features\staff\home\lib\src\presentation\widgets\worker\benefits_widget.dart:20:46 - deprecated_member_use + info - 'onBackground' is deprecated and shouldn't be used. Use onSurface instead. This feature was deprecated after v3.18.0-0.1.pre - packages\features\staff\home\lib\src\presentation\widgets\worker\benefits_widget.dart:25:50 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\home\lib\src\presentation\widgets\worker\benefits_widget.dart:25:63 - deprecated_member_use + info - 'background' is deprecated and shouldn't be used. Use surface instead. This feature was deprecated after v3.18.0-0.1.pre - packages\features\staff\home\lib\src\presentation\widgets\worker\improve_yourself_widget.dart:56:48 - deprecated_member_use + info - 'onBackground' is deprecated and shouldn't be used. Use onSurface instead. This feature was deprecated after v3.18.0-0.1.pre - packages\features\staff\home\lib\src\presentation\widgets\worker\improve_yourself_widget.dart:61:52 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\home\lib\src\presentation\widgets\worker\improve_yourself_widget.dart:61:65 - deprecated_member_use + info - 'surfaceVariant' is deprecated and shouldn't be used. Use surfaceContainerHighest instead. This feature was deprecated after v3.18.0-0.1.pre - packages\features\staff\home\lib\src\presentation\widgets\worker\improve_yourself_widget.dart:78:56 - deprecated_member_use + info - 'background' is deprecated and shouldn't be used. Use surface instead. This feature was deprecated after v3.18.0-0.1.pre - packages\features\staff\home\lib\src\presentation\widgets\worker\more_ways_widget.dart:55:48 - deprecated_member_use + info - 'onBackground' is deprecated and shouldn't be used. Use onSurface instead. This feature was deprecated after v3.18.0-0.1.pre - packages\features\staff\home\lib\src\presentation\widgets\worker\more_ways_widget.dart:60:52 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\home\lib\src\presentation\widgets\worker\more_ways_widget.dart:60:65 - deprecated_member_use + info - 'surfaceVariant' is deprecated and shouldn't be used. Use surfaceContainerHighest instead. This feature was deprecated after v3.18.0-0.1.pre - packages\features\staff\home\lib\src\presentation\widgets\worker\more_ways_widget.dart:77:56 - deprecated_member_use + info - Import of a library in the 'lib/src' directory of another package - packages\features\staff\payments\lib\src\payments_module.dart:1:8 - implementation_imports + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\payments\lib\src\presentation\pages\payments_page.dart:114:41 - deprecated_member_use +warning - The value of the local variable 'maxX' isn't used - packages\features\staff\payments\lib\src\presentation\widgets\earnings_graph.dart:36:18 - unused_local_variable + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\payments\lib\src\presentation\widgets\earnings_graph.dart:47:33 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\payments\lib\src\presentation\widgets\earnings_graph.dart:105:54 - deprecated_member_use +warning - Missing type annotation - packages\features\staff\payments\lib\src\presentation\widgets\earnings_graph.dart:124:12 - always_specify_types + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\payments\lib\src\presentation\widgets\payment_history_item.dart:37:33 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\payments\lib\src\presentation\widgets\payment_stats_card.dart:26:33 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\payments\lib\src\presentation\widgets\pending_pay_card.dart:27:33 - deprecated_member_use +warning - Missing type annotation - packages\features\staff\profile\lib\src\data\repositories\profile_repository_impl.dart:34:5 - always_specify_types +warning - Missing type annotation - packages\features\staff\profile\lib\src\data\repositories\profile_repository_impl.dart:39:5 - always_specify_types + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile\lib\src\domain\usecases\get_profile_usecase.dart:18:9 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile\lib\src\domain\usecases\sign_out_usecase.dart:19:9 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile\lib\src\presentation\blocs\profile_cubit.dart:16:3 - sort_constructors_first + error - The argument type 'void Function(ProfileState)' can't be assigned to the parameter type 'Emitter'. - packages\features\staff\profile\lib\src\presentation\blocs\profile_cubit.dart:28:13 - argument_type_not_assignable +warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\blocs\profile_cubit.dart:30:9 - always_specify_types + error - The argument type 'void Function(ProfileState)' can't be assigned to the parameter type 'Emitter'. - packages\features\staff\profile\lib\src\presentation\blocs\profile_cubit.dart:51:13 - argument_type_not_assignable + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile\lib\src\presentation\blocs\profile_state.dart:36:9 - sort_constructors_first +warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\blocs\profile_state.dart:56:30 - always_specify_types +warning - Duplicate import - packages\features\staff\profile\lib\src\presentation\pages\staff_profile_page.dart:17:8 - duplicate_import +warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\pages\staff_profile_page.dart:64:20 - always_specify_types +warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\pages\staff_profile_page.dart:64:29 - always_specify_types +warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\pages\staff_profile_page.dart:69:19 - always_specify_types +warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\pages\staff_profile_page.dart:69:28 - always_specify_types +warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\pages\staff_profile_page.dart:86:11 - always_specify_types +warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\pages\staff_profile_page.dart:94:25 - always_specify_types +warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\pages\staff_profile_page.dart:108:33 - always_specify_types +warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\pages\staff_profile_page.dart:125:37 - always_specify_types +warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\pages\staff_profile_page.dart:146:37 - always_specify_types +warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\pages\staff_profile_page.dart:150:41 - always_specify_types +warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\pages\staff_profile_page.dart:164:37 - always_specify_types +warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\pages\staff_profile_page.dart:188:37 - always_specify_types + error - The getter 'globe' isn't defined for the type 'UiIcons' - packages\features\staff\profile\lib\src\presentation\pages\staff_profile_page.dart:190:45 - undefined_getter +warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\pages\staff_profile_page.dart:195:45 - always_specify_types +warning - Unused import: 'package:flutter_bloc/flutter_bloc.dart' - packages\features\staff\profile\lib\src\presentation\widgets\language_selector_bottom_sheet.dart:4:8 - unused_import + info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\language_selector_bottom_sheet.dart:18:16 - prefer_const_constructors + error - The getter 'surface' isn't defined for the type 'UiColors' - packages\features\staff\profile\lib\src\presentation\widgets\language_selector_bottom_sheet.dart:20:25 - undefined_getter + error - The argument type 'BorderRadius' can't be assigned to the parameter type 'double'. - packages\features\staff\profile\lib\src\presentation\widgets\language_selector_bottom_sheet.dart:21:66 - argument_type_not_assignable +warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\language_selector_bottom_sheet.dart:26:19 - always_specify_types + error - The getter 'headline4b' isn't defined for the type 'UiTypography' - packages\features\staff\profile\lib\src\presentation\widgets\language_selector_bottom_sheet.dart:29:33 - undefined_getter + info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\language_selector_bottom_sheet.dart:32:11 - prefer_const_constructors + info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\language_selector_bottom_sheet.dart:38:11 - prefer_const_constructors + info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\language_selector_bottom_sheet.dart:44:11 - prefer_const_constructors + error - The argument type 'BorderRadius' can't be assigned to the parameter type 'double'. - packages\features\staff\profile\lib\src\presentation\widgets\language_selector_bottom_sheet.dart:72:43 - argument_type_not_assignable + info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\language_selector_bottom_sheet.dart:74:18 - prefer_const_constructors + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile\lib\src\presentation\widgets\language_selector_bottom_sheet.dart:79:48 - deprecated_member_use + error - The argument type 'BorderRadius' can't be assigned to the parameter type 'double'. - packages\features\staff\profile\lib\src\presentation\widgets\language_selector_bottom_sheet.dart:80:47 - argument_type_not_assignable +warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\language_selector_bottom_sheet.dart:88:21 - always_specify_types + error - The getter 'iconSizeMd' isn't defined for the type 'UiConstants' - packages\features\staff\profile\lib\src\presentation\widgets\language_selector_bottom_sheet.dart:99:35 - undefined_getter + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile\lib\src\presentation\widgets\logout_button.dart:12:9 - sort_constructors_first +warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\logout_button.dart:16:5 - always_specify_types + info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\logout_button.dart:31:22 - prefer_const_constructors +warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\logout_button.dart:34:25 - always_specify_types + info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\logout_button.dart:36:17 - prefer_const_constructors + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:23:9 - sort_constructors_first +warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:33:5 - always_specify_types + info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:37:16 - prefer_const_constructors + info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:43:19 - prefer_const_constructors + info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:45:23 - prefer_const_constructors + info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:46:19 - prefer_const_constructors +warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:52:21 - always_specify_types +warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:56:25 - always_specify_types + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:68:57 - deprecated_member_use + info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:74:13 - prefer_const_constructors +warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:78:25 - always_specify_types + info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:82:28 - prefer_const_constructors +warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:88:31 - always_specify_types + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:90:41 - deprecated_member_use +warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:94:32 - always_specify_types + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:96:52 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:106:59 - deprecated_member_use +warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:124:43 - always_specify_types + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:126:53 - deprecated_member_use +warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:149:32 - always_specify_types + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:151:52 - deprecated_member_use + info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:164:13 - prefer_const_constructors + info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:171:13 - prefer_const_constructors + info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:173:24 - prefer_const_constructors + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:178:40 - deprecated_member_use + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile\lib\src\presentation\widgets\profile_menu_grid.dart:10:9 - sort_constructors_first +warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\profile_menu_grid.dart:22:17 - always_specify_types +warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\profile_menu_grid.dart:22:26 - always_specify_types +warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\profile_menu_grid.dart:23:9 - always_specify_types +warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\profile_menu_grid.dart:24:9 - always_specify_types +warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\profile_menu_grid.dart:25:9 - always_specify_types +warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\profile_menu_grid.dart:32:35 - always_specify_types + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile\lib\src\presentation\widgets\profile_menu_item.dart:13:9 - sort_constructors_first + info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\profile_menu_item.dart:31:18 - prefer_const_constructors +warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\profile_menu_item.dart:35:23 - always_specify_types +warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\profile_menu_item.dart:40:29 - always_specify_types + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile\lib\src\presentation\widgets\profile_menu_item.dart:45:49 - deprecated_member_use + info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\profile_menu_item.dart:51:21 - prefer_const_constructors + info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\profile_menu_item.dart:53:32 - prefer_const_constructors + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile\lib\src\presentation\widgets\profile_menu_item.dart:79:46 - deprecated_member_use + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile\lib\src\presentation\widgets\reliability_score_bar.dart:11:9 - sort_constructors_first +warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\reliability_score_bar.dart:18:5 - always_specify_types +warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\reliability_score_bar.dart:19:5 - always_specify_types + info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\reliability_score_bar.dart:22:16 - prefer_const_constructors + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile\lib\src\presentation\widgets\reliability_score_bar.dart:24:33 - deprecated_member_use +warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\reliability_score_bar.dart:29:19 - always_specify_types +warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\reliability_score_bar.dart:32:23 - always_specify_types + info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\reliability_score_bar.dart:47:11 - prefer_const_constructors + info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\reliability_score_bar.dart:58:22 - prefer_const_constructors + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile\lib\src\presentation\widgets\reliability_stats_card.dart:15:9 - sort_constructors_first + info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\reliability_stats_card.dart:27:16 - prefer_const_constructors +warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\reliability_stats_card.dart:32:20 - always_specify_types + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile\lib\src\presentation\widgets\reliability_stats_card.dart:34:40 - deprecated_member_use +warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\reliability_stats_card.dart:42:19 - always_specify_types +warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\reliability_stats_card.dart:86:19 - always_specify_types + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile\lib\src\presentation\widgets\reliability_stats_card.dart:91:39 - deprecated_member_use + info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\reliability_stats_card.dart:97:11 - prefer_const_constructors + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile\lib\src\presentation\widgets\section_title.dart:10:9 - sort_constructors_first + info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\section_title.dart:16:16 - prefer_const_constructors + info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\section_title.dart:17:15 - prefer_const_constructors + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\certificates\lib\src\data\repositories_impl\certificates_repository_impl.dart:23:3 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\certificates\lib\src\domain\usecases\get_certificates_usecase.dart:15:3 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\certificates\lib\src\presentation\blocs\certificates\certificates_cubit.dart:11:3 - sort_constructors_first + error - The argument type 'void Function(CertificatesState)' can't be assigned to the parameter type 'Emitter'. - packages\features\staff\profile_sections\compliance\certificates\lib\src\presentation\blocs\certificates\certificates_cubit.dart:19:13 - argument_type_not_assignable + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\certificates\lib\src\presentation\blocs\certificates\certificates_state.dart:11:9 - sort_constructors_first +warning - Missing type annotation - packages\features\staff\profile_sections\compliance\certificates\lib\src\presentation\blocs\certificates\certificates_state.dart:30:30 - always_specify_types +warning - Missing type annotation - packages\features\staff\profile_sections\compliance\certificates\lib\src\presentation\blocs\certificates\certificates_state.dart:34:15 - always_specify_types + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\certificates\lib\src\presentation\widgets\add_certificate_card.dart:8:9 - sort_constructors_first + info - The imported package 'intl' isn't a dependency of the importing package - packages\features\staff\profile_sections\compliance\certificates\lib\src\presentation\widgets\certificate_card.dart:3:8 - depend_on_referenced_packages + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\certificates\lib\src\presentation\widgets\certificate_card.dart:14:9 - sort_constructors_first + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\compliance\certificates\lib\src\presentation\widgets\certificate_card.dart:48:35 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\compliance\certificates\lib\src\presentation\widgets\certificate_card.dart:62:48 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\compliance\certificates\lib\src\presentation\widgets\certificate_card.dart:99:46 - deprecated_member_use + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\certificates\lib\src\presentation\widgets\certificate_card.dart:416:3 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\certificates\lib\src\presentation\widgets\certificate_upload_modal.dart:15:9 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\certificates\lib\src\presentation\widgets\certificates_header.dart:10:9 - sort_constructors_first + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\compliance\certificates\lib\src\presentation\widgets\certificates_header.dart:42:43 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\compliance\certificates\lib\src\presentation\widgets\certificates_header.dart:73:55 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\compliance\certificates\lib\src\presentation\widgets\certificates_header.dart:103:45 - deprecated_member_use + info - Library names are not necessary - packages\features\staff\profile_sections\compliance\certificates\lib\staff_certificates.dart:1:9 - unnecessary_library_name + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\documents\lib\src\data\repositories_impl\documents_repository_impl.dart:14:3 - sort_constructors_first +warning - Missing type annotation - packages\features\staff\profile_sections\compliance\documents\lib\src\data\repositories_impl\documents_repository_impl.dart:29:12 - always_specify_types +warning - Dead code - packages\features\staff\profile_sections\compliance\documents\lib\src\data\repositories_impl\documents_repository_impl.dart:52:5 - dead_code + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\documents\lib\src\domain\usecases\get_documents_usecase.dart:11:3 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\documents\lib\src\presentation\blocs\documents\documents_cubit.dart:11:3 - sort_constructors_first + error - The argument type 'void Function(DocumentsState)' can't be assigned to the parameter type 'Emitter'. - packages\features\staff\profile_sections\compliance\documents\lib\src\presentation\blocs\documents\documents_cubit.dart:16:13 - argument_type_not_assignable + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\documents\lib\src\presentation\blocs\documents\documents_state.dart:11:9 - sort_constructors_first +warning - Unused import: 'package:krow_core/core.dart' - packages\features\staff\profile_sections\compliance\documents\lib\src\presentation\pages\documents_page.dart:11:8 - unused_import + info - Constructors for public widgets should have a named 'key' parameter - packages\features\staff\profile_sections\compliance\documents\lib\src\presentation\pages\documents_page.dart:15:7 - use_key_in_widget_constructors + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\documents\lib\src\presentation\widgets\document_card.dart:12:9 - sort_constructors_first + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\compliance\documents\lib\src\presentation\widgets\document_card.dart:35:39 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\compliance\documents\lib\src\presentation\widgets\document_card.dart:117:35 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\compliance\documents\lib\src\presentation\widgets\document_card.dart:122:35 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\compliance\documents\lib\src\presentation\widgets\document_card.dart:127:33 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\compliance\documents\lib\src\presentation\widgets\document_card.dart:132:33 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\compliance\documents\lib\src\presentation\widgets\document_card.dart:137:33 - deprecated_member_use + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\documents\lib\src\presentation\widgets\documents_progress_card.dart:17:9 - sort_constructors_first + info - Library names are not necessary - packages\features\staff\profile_sections\compliance\documents\lib\staff_documents.dart:1:9 - unnecessary_library_name +warning - Missing type annotation - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\data\mappers\tax_form_mapper.dart:9:43 - always_specify_types + info - The type of the right operand ('TaxFormType') isn't a subtype or a supertype of the left operand ('EnumValue') - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\data\mappers\tax_form_mapper.dart:47:23 - unrelated_type_equality_checks + info - Statements in an if should be enclosed in a block - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\data\repositories\tax_forms_repository_impl.dart:194:41 - curly_braces_in_flow_control_structures + info - Statements in an if should be enclosed in a block - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\data\repositories\tax_forms_repository_impl.dart:195:47 - curly_braces_in_flow_control_structures + info - Statements in an if should be enclosed in a block - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\data\repositories\tax_forms_repository_impl.dart:196:44 - curly_braces_in_flow_control_structures + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\domain\usecases\get_tax_forms_usecase.dart:7:3 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\domain\usecases\save_i9_form_usecase.dart:7:3 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\domain\usecases\save_w4_form_usecase.dart:7:3 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\domain\usecases\submit_i9_form_usecase.dart:7:3 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\domain\usecases\submit_w4_form_usecase.dart:7:3 - sort_constructors_first + info - The imported package 'uuid' isn't a dependency of the importing package - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\blocs\i9\form_i9_cubit.dart:4:8 - depend_on_referenced_packages + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\blocs\i9\form_i9_cubit.dart:13:3 - sort_constructors_first + error - The argument type 'void Function(FormI9State)' can't be assigned to the parameter type 'Emitter'. - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\blocs\i9\form_i9_cubit.dart:100:13 - argument_type_not_assignable +warning - Missing type annotation - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\blocs\i9\form_i9_cubit.dart:102:47 - always_specify_types + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\blocs\i9\form_i9_state.dart:38:9 - sort_constructors_first +warning - Missing type annotation - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\blocs\i9\form_i9_state.dart:117:30 - always_specify_types + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\blocs\tax_forms\tax_forms_cubit.dart:11:3 - sort_constructors_first + error - The argument type 'void Function(TaxFormsState)' can't be assigned to the parameter type 'Emitter'. - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\blocs\tax_forms\tax_forms_cubit.dart:16:13 - argument_type_not_assignable + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\blocs\tax_forms\tax_forms_state.dart:11:9 - sort_constructors_first + info - The imported package 'uuid' isn't a dependency of the importing package - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\blocs\w4\form_w4_cubit.dart:4:8 - depend_on_referenced_packages + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\blocs\w4\form_w4_cubit.dart:13:3 - sort_constructors_first + error - The argument type 'void Function(FormW4State)' can't be assigned to the parameter type 'Emitter'. - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\blocs\w4\form_w4_cubit.dart:93:13 - argument_type_not_assignable +warning - Missing type annotation - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\blocs\w4\form_w4_cubit.dart:95:47 - always_specify_types + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\blocs\w4\form_w4_state.dart:32:9 - sort_constructors_first +warning - Missing type annotation - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\blocs\w4\form_w4_state.dart:92:30 - always_specify_types + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\form_i9_page.dart:12:9 - sort_constructors_first + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\form_i9_page.dart:212:81 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\form_i9_page.dart:232:50 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\form_i9_page.dart:249:77 - deprecated_member_use + info - 'value' is deprecated and shouldn't be used. Use initialValue instead. This will set the initial value for the form field. This feature was deprecated after v3.33.0-1.0.pre - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\form_i9_page.dart:465:21 - deprecated_member_use + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\form_w4_page.dart:12:9 - sort_constructors_first +warning - The value of the field '_usStates' isn't used - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\form_w4_page.dart:27:22 - unused_field + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\form_w4_page.dart:258:81 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\form_w4_page.dart:278:50 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\form_w4_page.dart:295:77 - deprecated_member_use + info - Use 'const' with the constructor to improve performance - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\form_w4_page.dart:446:18 - prefer_const_constructors + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\tax_forms_page.dart:40:47 - deprecated_member_use +warning - Missing type annotation - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\tax_forms_page.dart:148:11 - always_specify_types + info - Missing an 'await' for the 'Future' computed by this expression - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\tax_forms_page.dart:150:53 - unawaited_futures +warning - Missing type annotation - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\tax_forms_page.dart:153:11 - always_specify_types + info - Missing an 'await' for the 'Future' computed by this expression - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\tax_forms_page.dart:155:53 - unawaited_futures + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\tax_forms_page.dart:174:41 - deprecated_member_use + info - Library names are not necessary - packages\features\staff\profile_sections\compliance\tax_forms\lib\staff_tax_forms.dart:1:9 - unnecessary_library_name + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\domain\arguments\add_bank_account_params.dart:9:9 - sort_constructors_first +warning - Missing type annotation - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\domain\arguments\add_bank_account_params.dart:12:30 - always_specify_types + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\domain\usecases\add_bank_account_usecase.dart:9:3 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\domain\usecases\get_bank_accounts_usecase.dart:9:3 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\presentation\blocs\bank_account_cubit.dart:14:3 - sort_constructors_first + error - The argument type 'void Function(BankAccountState)' can't be assigned to the parameter type 'Emitter'. - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\presentation\blocs\bank_account_cubit.dart:24:13 - argument_type_not_assignable + error - The argument type 'void Function(BankAccountState)' can't be assigned to the parameter type 'Emitter'. - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\presentation\blocs\bank_account_cubit.dart:74:13 - argument_type_not_assignable + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\presentation\blocs\bank_account_state.dart:12:9 - sort_constructors_first +warning - Missing type annotation - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\presentation\blocs\bank_account_state.dart:14:21 - always_specify_types +warning - Missing type annotation - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\presentation\blocs\bank_account_state.dart:34:30 - always_specify_types +warning - Unused import: 'package:krow_core/core.dart' - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\presentation\pages\bank_account_page.dart:11:8 - unused_import + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\presentation\pages\bank_account_page.dart:146:33 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\presentation\pages\bank_account_page.dart:202:39 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\presentation\pages\bank_account_page.dart:242:37 - deprecated_member_use +warning - Unused import: 'package:flutter_modular/flutter_modular.dart' - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\presentation\widgets\add_account_form.dart:2:8 - unused_import +warning - Unused import: '../blocs/bank_account_cubit.dart' - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\presentation\widgets\add_account_form.dart:4:8 - unused_import + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\presentation\widgets\add_account_form.dart:11:9 - sort_constructors_first + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\presentation\widgets\add_account_form.dart:125:34 - deprecated_member_use + info - Library names are not necessary - packages\features\staff\profile_sections\finances\staff_bank_account\lib\staff_bank_account.dart:1:9 - unnecessary_library_name + info - The imported package 'firebase_auth' isn't a dependency of the importing package - packages\features\staff\profile_sections\finances\time_card\lib\src\data\repositories_impl\time_card_repository_impl.dart:1:8 - depend_on_referenced_packages + info - The imported package 'firebase_data_connect' isn't a dependency of the importing package - packages\features\staff\profile_sections\finances\time_card\lib\src\data\repositories_impl\time_card_repository_impl.dart:2:8 - depend_on_referenced_packages + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\time_card\lib\src\data\repositories_impl\time_card_repository_impl.dart:17:3 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\time_card\lib\src\domain\arguments\get_time_cards_arguments.dart:8:9 - sort_constructors_first +warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\domain\arguments\get_time_cards_arguments.dart:11:30 - always_specify_types + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\time_card\lib\src\domain\usecases\get_time_cards_usecase.dart:10:3 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\blocs\time_card_bloc.dart:16:3 - sort_constructors_first +warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\blocs\time_card_event.dart:6:30 - always_specify_types + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\blocs\time_card_event.dart:11:9 - sort_constructors_first +warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\blocs\time_card_event.dart:14:30 - always_specify_types + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\blocs\time_card_event.dart:19:9 - sort_constructors_first +warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\blocs\time_card_event.dart:22:30 - always_specify_types +warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\blocs\time_card_state.dart:6:30 - always_specify_types + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\blocs\time_card_state.dart:17:9 - sort_constructors_first +warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\blocs\time_card_state.dart:25:30 - always_specify_types + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\blocs\time_card_state.dart:29:9 - sort_constructors_first +warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\blocs\time_card_state.dart:31:30 - always_specify_types +warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\pages\time_card_page.dart:30:12 - always_specify_types +warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\pages\time_card_page.dart:53:21 - always_specify_types +warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\pages\time_card_page.dart:53:30 - always_specify_types +warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\pages\time_card_page.dart:65:29 - always_specify_types + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\month_selector.dart:11:9 - sort_constructors_first +warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\month_selector.dart:29:19 - always_specify_types + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\shift_history_list.dart:11:9 - sort_constructors_first +warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\shift_history_list.dart:17:17 - always_specify_types +warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\shift_history_list.dart:30:27 - always_specify_types +warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\shift_history_list.dart:42:30 - always_specify_types + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\time_card_summary.dart:10:9 - sort_constructors_first +warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\time_card_summary.dart:19:17 - always_specify_types + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\time_card_summary.dart:45:9 - sort_constructors_first +warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\time_card_summary.dart:62:19 - always_specify_types +warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\time_card_summary.dart:64:23 - always_specify_types + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\timesheet_card.dart:11:9 - sort_constructors_first +warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\timesheet_card.dart:15:5 - always_specify_types + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\timesheet_card.dart:22:41 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\timesheet_card.dart:27:41 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\timesheet_card.dart:32:37 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\timesheet_card.dart:37:41 - deprecated_member_use +warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\timesheet_card.dart:43:5 - always_specify_types +warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\timesheet_card.dart:54:19 - always_specify_types +warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\timesheet_card.dart:58:23 - always_specify_types +warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\timesheet_card.dart:61:27 - always_specify_types +warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\timesheet_card.dart:98:23 - always_specify_types +warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\timesheet_card.dart:116:25 - always_specify_types +warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\timesheet_card.dart:139:7 - always_specify_types +warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\timesheet_card.dart:141:9 - always_specify_types + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\timesheet_card.dart:155:9 - sort_constructors_first +warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\timesheet_card.dart:161:17 - always_specify_types + info - Library names are not necessary - packages\features\staff\profile_sections\finances\time_card\lib\src\staff_time_card_module.dart:1:9 - unnecessary_library_name + info - The imported package 'firebase_auth' isn't a dependency of the importing package - packages\features\staff\profile_sections\finances\time_card\lib\src\staff_time_card_module.dart:3:8 - depend_on_referenced_packages +warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\staff_time_card_module.dart:45:15 - always_specify_types + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\onboarding\attire\lib\src\data\repositories_impl\attire_repository_impl.dart:15:3 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\onboarding\attire\lib\src\domain\arguments\save_attire_arguments.dart:12:9 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\onboarding\attire\lib\src\domain\arguments\upload_attire_photo_arguments.dart:12:9 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\onboarding\attire\lib\src\domain\usecases\get_attire_options_usecase.dart:11:3 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\onboarding\attire\lib\src\domain\usecases\save_attire_usecase.dart:11:3 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\onboarding\attire\lib\src\domain\usecases\upload_attire_photo_usecase.dart:10:3 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\onboarding\attire\lib\src\presentation\blocs\attire_cubit.dart:18:3 - sort_constructors_first + error - The argument type 'void Function(AttireState)' can't be assigned to the parameter type 'Emitter'. - packages\features\staff\profile_sections\onboarding\attire\lib\src\presentation\blocs\attire_cubit.dart:29:13 - argument_type_not_assignable + error - The argument type 'void Function(AttireState)' can't be assigned to the parameter type 'Emitter'. - packages\features\staff\profile_sections\onboarding\attire\lib\src\presentation\blocs\attire_cubit.dart:90:13 - argument_type_not_assignable + error - The argument type 'void Function(AttireState)' can't be assigned to the parameter type 'Emitter'. - packages\features\staff\profile_sections\onboarding\attire\lib\src\presentation\blocs\attire_cubit.dart:142:13 - argument_type_not_assignable + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\onboarding\attire\lib\src\presentation\blocs\attire_state.dart:15:9 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\onboarding\attire\lib\src\presentation\widgets\attestation_checkbox.dart:9:9 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\onboarding\attire\lib\src\presentation\widgets\attire_bottom_bar.dart:12:9 - sort_constructors_first + info - The imported package 'lucide_icons' isn't a dependency of the importing package - packages\features\staff\profile_sections\onboarding\attire\lib\src\presentation\widgets\attire_grid.dart:3:8 - depend_on_referenced_packages + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\onboarding\attire\lib\src\presentation\widgets\attire_grid.dart:15:9 - sort_constructors_first + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\onboarding\attire\lib\src\presentation\widgets\attire_grid.dart:56:46 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\onboarding\attire\lib\src\presentation\widgets\attire_grid.dart:156:46 - deprecated_member_use + info - The imported package 'lucide_icons' isn't a dependency of the importing package - packages\features\staff\profile_sections\onboarding\attire\lib\src\presentation\widgets\attire_info_card.dart:3:8 - depend_on_referenced_packages + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\onboarding\attire\lib\src\presentation\widgets\attire_info_card.dart:14:33 - deprecated_member_use + info - Library names are not necessary - packages\features\staff\profile_sections\onboarding\attire\lib\staff_attire.dart:1:9 - unnecessary_library_name + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\onboarding\emergency_contact\lib\src\presentation\widgets\emergency_contact_info_banner.dart:12:32 - deprecated_member_use + info - Constructors in '@immutable' classes should be declared as 'const' - packages\features\staff\profile_sections\onboarding\experience\lib\src\domain\arguments\save_experience_arguments.dart:7:3 - prefer_const_constructors_in_immutables +warning - The declaration '_buildCustomSkillsList' isn't referenced - packages\features\staff\profile_sections\onboarding\experience\lib\src\presentation\pages\experience_page.dart:140:10 - unused_element + info - Library names are not necessary - packages\features\staff\profile_sections\onboarding\experience\lib\staff_profile_experience.dart:1:9 - unnecessary_library_name +warning - Missing type annotation - packages\features\staff\profile_sections\onboarding\profile_info\lib\src\presentation\blocs\personal_info_bloc.dart:82:48 - always_specify_types + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\onboarding\profile_info\lib\src\presentation\widgets\profile_photo_widget.dart:44:43 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\onboarding\profile_info\lib\src\presentation\widgets\profile_photo_widget.dart:74:53 - deprecated_member_use + info - The imported package 'firebase_auth' isn't a dependency of the importing package - packages\features\staff\shifts\lib\src\data\repositories_impl\shifts_repository_impl.dart:4:8 - depend_on_referenced_packages + info - The imported package 'firebase_data_connect' isn't a dependency of the importing package - packages\features\staff\shifts\lib\src\data\repositories_impl\shifts_repository_impl.dart:5:8 - depend_on_referenced_packages + info - The imported package 'bloc' isn't a dependency of the importing package - packages\features\staff\shifts\lib\src\presentation\blocs\shift_details\shift_details_bloc.dart:1:8 - depend_on_referenced_packages + info - The imported package 'bloc' isn't a dependency of the importing package - packages\features\staff\shifts\lib\src\presentation\blocs\shifts\shifts_bloc.dart:1:8 - depend_on_referenced_packages + info - The imported package 'meta' isn't a dependency of the importing package - packages\features\staff\shifts\lib\src\presentation\blocs\shifts\shifts_bloc.dart:5:8 - depend_on_referenced_packages + info - Don't invoke 'print' in production code - packages\features\staff\shifts\lib\src\presentation\pages\shifts_page.dart:32:5 - avoid_print + info - Don't invoke 'print' in production code - packages\features\staff\shifts\lib\src\presentation\pages\shifts_page.dart:40:7 - avoid_print + info - Don't invoke 'print' in production code - packages\features\staff\shifts\lib\src\presentation\pages\shifts_page.dart:44:7 - avoid_print + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\shifts\lib\src\presentation\widgets\my_shift_card.dart:128:35 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\shifts\lib\src\presentation\widgets\my_shift_card.dart:183:57 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\shifts\lib\src\presentation\widgets\my_shift_card.dart:208:48 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\shifts\lib\src\presentation\widgets\my_shift_card.dart:209:48 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\shifts\lib\src\presentation\widgets\my_shift_card.dart:216:53 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\shifts\lib\src\presentation\widgets\shift_assignment_card.dart:74:33 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\shifts\lib\src\presentation\widgets\shift_assignment_card.dart:100:46 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\shifts\lib\src\presentation\widgets\shift_assignment_card.dart:101:46 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\shifts\lib\src\presentation\widgets\shift_assignment_card.dart:108:51 - deprecated_member_use + info - The imported package 'lucide_icons' isn't a dependency of the importing package - packages\features\staff\shifts\lib\src\presentation\widgets\tabs\my_shifts_tab.dart:4:8 - depend_on_referenced_packages + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\shifts\lib\src\presentation\widgets\tabs\my_shifts_tab.dart:316:54 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\shifts\lib\src\presentation\widgets\tabs\my_shifts_tab.dart:507:47 - deprecated_member_use + info - The imported package 'krow_core' isn't a dependency of the importing package - packages\features\staff\staff_main\lib\src\presentation\blocs\staff_main_cubit.dart:2:8 - depend_on_referenced_packages + info - The imported package 'krow_core' isn't a dependency of the importing package - packages\features\staff\staff_main\lib\src\staff_main_module.dart:3:8 - depend_on_referenced_packages + diff --git a/apps/mobile/analysis_utf8_3.txt b/apps/mobile/analysis_utf8_3.txt new file mode 100644 index 00000000..8fb19646 --- /dev/null +++ b/apps/mobile/analysis_utf8_3.txt @@ -0,0 +1,695 @@ +Analyzing mobile... + + info - Library names are not necessary - packages\core\lib\core.dart:1:9 - unnecessary_library_name + info - The imported package 'flutter_bloc' isn't a dependency of the importing package - packages\core\lib\src\presentation\observers\core_bloc_observer.dart:2:8 - depend_on_referenced_packages + info - Constructor declarations should be before non-constructor declarations - packages\core\lib\src\presentation\observers\core_bloc_observer.dart:31:3 - sort_constructors_first +warning - Missing type annotation - packages\core\lib\src\presentation\observers\core_bloc_observer.dart:37:17 - always_specify_types +warning - Missing type annotation - packages\core\lib\src\presentation\observers\core_bloc_observer.dart:46:16 - always_specify_types +warning - Missing type annotation - packages\core\lib\src\presentation\observers\core_bloc_observer.dart:57:17 - always_specify_types +warning - Missing type annotation - packages\core\lib\src\presentation\observers\core_bloc_observer.dart:57:32 - always_specify_types +warning - Missing type annotation - packages\core\lib\src\presentation\observers\core_bloc_observer.dart:68:16 - always_specify_types +warning - Missing type annotation - packages\core\lib\src\presentation\observers\core_bloc_observer.dart:98:16 - always_specify_types +warning - Missing type annotation - packages\core\lib\src\presentation\observers\core_bloc_observer.dart:107:21 - always_specify_types +warning - Missing type annotation - packages\core\lib\src\presentation\observers\core_bloc_observer.dart:107:32 - always_specify_types + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\core\lib\src\presentation\widgets\web_mobile_frame.dart:99:47 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\core\lib\src\presentation\widgets\web_mobile_frame.dart:128:51 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\core\lib\src\presentation\widgets\web_mobile_frame.dart:244:55 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\core\lib\src\presentation\widgets\web_mobile_frame.dart:246:64 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\core\lib\src\presentation\widgets\web_mobile_frame.dart:249:49 - deprecated_member_use + info - Dangling library doc comment - packages\core\lib\src\routing\routing.dart:1:1 - dangling_library_doc_comments + info - Constructor declarations should be before non-constructor declarations - packages\core_localization\lib\src\bloc\locale_event.dart:15:9 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\core_localization\lib\src\data\datasources\locale_local_data_source.dart:18:3 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\core_localization\lib\src\domain\usecases\get_default_locale_use_case.dart:9:3 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\core_localization\lib\src\domain\usecases\get_locale_use_case.dart:13:3 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\core_localization\lib\src\domain\usecases\get_supported_locales_use_case.dart:9:3 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\core_localization\lib\src\domain\usecases\set_locale_use_case.dart:13:3 - sort_constructors_first + info - The imported package 'firebase_core' isn't a dependency of the importing package - packages\data_connect\lib\src\mixins\data_error_handler.dart:4:8 - depend_on_referenced_packages + info - Constructor declarations should be before non-constructor declarations - packages\data_connect\lib\src\session\client_session_store.dart:11:9 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\data_connect\lib\src\session\client_session_store.dart:26:9 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\data_connect\lib\src\session\client_session_store.dart:48:3 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\data_connect\lib\src\session\staff_session_store.dart:8:9 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\data_connect\lib\src\session\staff_session_store.dart:30:3 - sort_constructors_first + info - Statements in an if should be enclosed in a block - packages\design_system\lib\src\ui_theme.dart:85:19 - curly_braces_in_flow_control_structures +warning - Missing type annotation - packages\design_system\lib\src\ui_theme.dart:258:27 - always_specify_types + info - Constructor declarations should be before non-constructor declarations - packages\design_system\lib\src\widgets\ui_app_bar.dart:39:9 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\design_system\lib\src\widgets\ui_button.dart:43:9 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\design_system\lib\src\widgets\ui_button.dart:61:3 - sort_constructors_first + info - Constructors in '@immutable' classes should be declared as 'const' - packages\design_system\lib\src\widgets\ui_button.dart:61:3 - prefer_const_constructors_in_immutables + info - Constructor declarations should be before non-constructor declarations - packages\design_system\lib\src\widgets\ui_button.dart:79:3 - sort_constructors_first + info - Constructors in '@immutable' classes should be declared as 'const' - packages\design_system\lib\src\widgets\ui_button.dart:79:3 - prefer_const_constructors_in_immutables + info - Constructor declarations should be before non-constructor declarations - packages\design_system\lib\src\widgets\ui_button.dart:97:3 - sort_constructors_first + info - Constructors in '@immutable' classes should be declared as 'const' - packages\design_system\lib\src\widgets\ui_button.dart:97:3 - prefer_const_constructors_in_immutables + info - Constructor declarations should be before non-constructor declarations - packages\design_system\lib\src\widgets\ui_button.dart:115:3 - sort_constructors_first + info - Constructors in '@immutable' classes should be declared as 'const' - packages\design_system\lib\src\widgets\ui_button.dart:115:3 - prefer_const_constructors_in_immutables + info - Type could be non-nullable - packages\design_system\lib\src\widgets\ui_button.dart:135:24 - unnecessary_nullable_for_final_variable_declarations + info - Constructor declarations should be before non-constructor declarations - packages\design_system\lib\src\widgets\ui_chip.dart:57:9 - sort_constructors_first +warning - Missing type annotation - packages\design_system\lib\src\widgets\ui_error_snackbar.dart:38:21 - always_specify_types +warning - Missing type annotation - packages\design_system\lib\src\widgets\ui_error_snackbar.dart:45:27 - always_specify_types +warning - Missing type annotation - packages\design_system\lib\src\widgets\ui_error_snackbar.dart:50:45 - always_specify_types +warning - Missing type annotation - packages\design_system\lib\src\widgets\ui_error_snackbar.dart:82:5 - always_specify_types + info - Constructor declarations should be before non-constructor declarations - packages\design_system\lib\src\widgets\ui_icon_button.dart:30:9 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\design_system\lib\src\widgets\ui_icon_button.dart:42:9 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\design_system\lib\src\widgets\ui_icon_button.dart:53:3 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\design_system\lib\src\widgets\ui_step_indicator.dart:18:9 - sort_constructors_first +warning - Missing type annotation - packages\design_system\lib\src\widgets\ui_step_indicator.dart:38:19 - always_specify_types +warning - Missing type annotation - packages\design_system\lib\src\widgets\ui_success_snackbar.dart:30:21 - always_specify_types + info - Use 'const' with the constructor to improve performance - packages\design_system\lib\src\widgets\ui_success_snackbar.dart:31:13 - prefer_const_constructors + info - Constructor declarations should be before non-constructor declarations - packages\design_system\lib\src\widgets\ui_text_field.dart:59:9 - sort_constructors_first +warning - Missing type annotation - packages\domain\lib\src\adapters\availability\availability_adapter.dart:5:68 - always_specify_types +warning - Missing type annotation - packages\domain\lib\src\adapters\availability\availability_adapter.dart:6:16 - always_specify_types +warning - Missing type annotation - packages\domain\lib\src\adapters\availability\availability_adapter.dart:11:18 - always_specify_types +warning - Missing type annotation - packages\domain\lib\src\adapters\availability\availability_adapter.dart:16:16 - always_specify_types +warning - Missing type annotation - packages\domain\lib\src\adapters\availability\availability_adapter.dart:25:5 - always_specify_types +warning - Unused import: '../../entities/shifts/shift.dart' - packages\domain\lib\src\adapters\clock_in\clock_in_adapter.dart:1:8 - unused_import +warning - Missing type annotation - packages\domain\lib\src\adapters\profile\bank_account_adapter.dart:34:10 - always_specify_types + info - Angle brackets will be interpreted as HTML - packages\domain\lib\src\adapters\profile\experience_adapter.dart:3:62 - unintended_html_in_doc_comment +warning - Unnecessary cast - packages\domain\lib\src\adapters\profile\tax_form_adapter.dart:21:53 - unnecessary_cast +warning - Missing type annotation - packages\domain\lib\src\adapters\profile\tax_form_adapter.dart:21:65 - always_specify_types + info - The imported package 'intl' isn't a dependency of the importing package - packages\domain\lib\src\adapters\shifts\shift_adapter.dart:1:8 - depend_on_referenced_packages + info - Constructor declarations should be before non-constructor declarations - packages\domain\lib\src\entities\availability\availability_slot.dart:10:9 - sort_constructors_first +warning - Missing type annotation - packages\domain\lib\src\entities\availability\availability_slot.dart:32:30 - always_specify_types + info - Constructor declarations should be before non-constructor declarations - packages\domain\lib\src\entities\availability\day_availability.dart:11:9 - sort_constructors_first +warning - Missing type annotation - packages\domain\lib\src\entities\availability\day_availability.dart:14:18 - always_specify_types +warning - Missing type annotation - packages\domain\lib\src\entities\availability\day_availability.dart:30:30 - always_specify_types + info - Constructor declarations should be before non-constructor declarations - packages\domain\lib\src\entities\clock_in\attendance_status.dart:11:9 - sort_constructors_first +warning - Missing type annotation - packages\domain\lib\src\entities\clock_in\attendance_status.dart:20:30 - always_specify_types + info - Constructor declarations should be before non-constructor declarations - packages\domain\lib\src\entities\financial\payment_summary.dart:10:9 - sort_constructors_first +warning - Missing type annotation - packages\domain\lib\src\entities\financial\payment_summary.dart:18:30 - always_specify_types + info - Constructor declarations should be before non-constructor declarations - packages\domain\lib\src\entities\financial\time_card.dart:50:9 - sort_constructors_first +warning - Missing type annotation - packages\domain\lib\src\entities\financial\time_card.dart:65:30 - always_specify_types + info - Constructor declarations should be before non-constructor declarations - packages\domain\lib\src\entities\profile\attire_item.dart:23:9 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\domain\lib\src\entities\profile\experience_skill.dart:21:9 - sort_constructors_first +warning - Missing type annotation - packages\domain\lib\src\entities\profile\experience_skill.dart:25:49 - always_specify_types + info - Constructor declarations should be before non-constructor declarations - packages\domain\lib\src\entities\profile\industry.dart:12:9 - sort_constructors_first +warning - Missing type annotation - packages\domain\lib\src\entities\profile\industry.dart:16:42 - always_specify_types + info - Constructor declarations should be before non-constructor declarations - packages\domain\lib\src\entities\profile\staff_document.dart:38:9 - sort_constructors_first +warning - Missing type annotation - packages\domain\lib\src\entities\profile\staff_document.dart:50:30 - always_specify_types + info - Constructor declarations should be before non-constructor declarations - packages\domain\lib\src\entities\profile\tax_form.dart:19:9 - sort_constructors_first +warning - Missing type annotation - packages\domain\lib\src\entities\profile\tax_form.dart:26:21 - always_specify_types +warning - Missing type annotation - packages\domain\lib\src\entities\profile\tax_form.dart:32:30 - always_specify_types + info - Constructor declarations should be before non-constructor declarations - packages\domain\lib\src\entities\shifts\shift.dart:33:9 - sort_constructors_first +warning - Missing type annotation - packages\domain\lib\src\entities\shifts\shift.dart:65:30 - always_specify_types + info - Constructor declarations should be before non-constructor declarations - packages\domain\lib\src\entities\shifts\shift.dart:102:9 - sort_constructors_first +warning - Missing type annotation - packages\domain\lib\src\entities\shifts\shift.dart:105:30 - always_specify_types + info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:35:9 - use_super_parameters + info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:44:9 - use_super_parameters + info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:53:9 - use_super_parameters + info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:62:9 - use_super_parameters + info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:71:9 - use_super_parameters + info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:80:9 - use_super_parameters + info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:89:9 - use_super_parameters + info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:98:9 - use_super_parameters + info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:107:9 - use_super_parameters + info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:116:9 - use_super_parameters + info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:134:9 - use_super_parameters + info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:143:9 - use_super_parameters + info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:152:9 - use_super_parameters + info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:170:9 - use_super_parameters + info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:179:9 - use_super_parameters + info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:188:9 - use_super_parameters + info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:197:9 - use_super_parameters + info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:206:9 - use_super_parameters + info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:224:9 - use_super_parameters + info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:233:9 - use_super_parameters + info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:242:9 - use_super_parameters + info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:260:9 - use_super_parameters + info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:269:9 - use_super_parameters + info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:278:9 - use_super_parameters + info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:291:9 - use_super_parameters + info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:300:9 - use_super_parameters + info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:309:9 - use_super_parameters + info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:318:9 - use_super_parameters + info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:327:9 - use_super_parameters +warning - The name GoogleOnlyAccountException is shown, but isn't used - packages\features\client\authentication\lib\src\data\repositories_impl\auth_repository_impl.dart:16:9 - unused_shown_name +warning - The value of the local variable 'newUserData' isn't used - packages\features\client\authentication\lib\src\data\repositories_impl\auth_repository_impl.dart:266:35 - unused_local_variable + info - Implicit tear-off of the 'call' method - packages\features\client\authentication\lib\src\presentation\blocs\client_auth_bloc.dart:58:13 - implicit_call_tearoffs + info - Implicit tear-off of the 'call' method - packages\features\client\authentication\lib\src\presentation\blocs\client_auth_bloc.dart:80:13 - implicit_call_tearoffs + info - Implicit tear-off of the 'call' method - packages\features\client\authentication\lib\src\presentation\blocs\client_auth_bloc.dart:106:13 - implicit_call_tearoffs + info - Implicit tear-off of the 'call' method - packages\features\client\authentication\lib\src\presentation\blocs\client_auth_bloc.dart:128:13 - implicit_call_tearoffs + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\authentication\lib\src\presentation\pages\client_get_started_page.dart:137:35 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\authentication\lib\src\presentation\pages\client_get_started_page.dart:152:43 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\authentication\lib\src\presentation\pages\client_get_started_page.dart:200:35 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\authentication\lib\src\presentation\pages\client_get_started_page.dart:210:47 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\authentication\lib\src\presentation\pages\client_get_started_page.dart:241:35 - deprecated_member_use +warning - Missing type annotation - packages\features\client\authentication\lib\src\presentation\pages\client_sign_up_page.dart:44:12 - always_specify_types + info - Implicit tear-off of the 'call' method - packages\features\client\billing\lib\src\presentation\blocs\billing_bloc.dart:46:13 - implicit_call_tearoffs +warning - The value of the local variable 'currentBill' isn't used - packages\features\client\billing\lib\src\presentation\blocs\billing_bloc.dart:57:22 - unused_local_variable + info - Implicit tear-off of the 'call' method - packages\features\client\billing\lib\src\presentation\blocs\billing_bloc.dart:98:13 - implicit_call_tearoffs + error - Expected a method, getter, setter or operator declaration - packages\features\client\billing\lib\src\presentation\blocs\billing_bloc.dart:172:1 - expected_executable + info - Implicit tear-off of the 'call' method - packages\features\client\client_coverage\lib\src\presentation\blocs\coverage_bloc.dart:46:13 - implicit_call_tearoffs + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\pages\coverage_page.dart:76:59 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\pages\coverage_page.dart:108:61 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\pages\coverage_page.dart:156:64 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\pages\coverage_page.dart:171:48 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\pages\coverage_page.dart:189:48 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\coverage_calendar_selector.dart:110:52 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\coverage_calendar_selector.dart:135:58 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\coverage_calendar_selector.dart:173:45 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\coverage_header.dart:76:59 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\coverage_header.dart:112:60 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\coverage_header.dart:130:49 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\coverage_header.dart:142:59 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\coverage_header.dart:159:59 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\coverage_shift_list.dart:320:35 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\coverage_shift_list.dart:322:39 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\coverage_shift_list.dart:331:37 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\coverage_shift_list.dart:333:41 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\coverage_shift_list.dart:341:31 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\coverage_shift_list.dart:343:35 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\coverage_shift_list.dart:352:35 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\coverage_shift_list.dart:354:39 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\coverage_shift_list.dart:362:29 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\coverage_shift_list.dart:364:33 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\coverage_shift_list.dart:372:35 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\coverage_shift_list.dart:374:39 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\coverage_shift_list.dart:382:35 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\coverage_shift_list.dart:384:39 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\coverage_shift_list.dart:394:29 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\coverage_shift_list.dart:396:33 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\late_workers_alert.dart:22:37 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\late_workers_alert.dart:25:39 - deprecated_member_use + info - The imported package 'krow_core' isn't a dependency of the importing package - packages\features\client\client_main\lib\src\client_main_module.dart:6:8 - depend_on_referenced_packages + info - The imported package 'krow_core' isn't a dependency of the importing package - packages\features\client\client_main\lib\src\presentation\blocs\client_main_cubit.dart:3:8 - depend_on_referenced_packages +warning - Missing type annotation - packages\features\client\create_order\lib\src\data\repositories_impl\client_create_order_repository_impl.dart:30:12 - always_specify_types + info - Don't invoke 'print' in production code - packages\features\client\create_order\lib\src\data\repositories_impl\client_create_order_repository_impl.dart:131:7 - avoid_print + info - Implicit tear-off of the 'call' method - packages\features\client\create_order\lib\src\presentation\blocs\client_create_order_bloc.dart:23:13 - implicit_call_tearoffs +warning - The member 'emit' can only be used within 'package:bloc/src/bloc.dart' or a test - packages\features\client\create_order\lib\src\presentation\blocs\one_time_order_bloc.dart:71:23 - invalid_use_of_visible_for_testing_member +warning - The member 'emit' can only be used within 'package:bloc/src/bloc.dart' or a test - packages\features\client\create_order\lib\src\presentation\blocs\one_time_order_bloc.dart:75:7 - invalid_use_of_visible_for_testing_member + info - Implicit tear-off of the 'call' method - packages\features\client\create_order\lib\src\presentation\blocs\one_time_order_bloc.dart:227:13 - implicit_call_tearoffs + info - Implicit tear-off of the 'call' method - packages\features\client\create_order\lib\src\presentation\blocs\rapid_order_bloc.dart:72:15 - implicit_call_tearoffs + info - Don't invoke 'print' in production code - packages\features\client\create_order\lib\src\presentation\widgets\rapid_order\rapid_order_view.dart:292:21 - avoid_print + info - Implicit tear-off of the 'call' method - packages\features\client\home\lib\src\presentation\blocs\client_home_bloc.dart:40:13 - implicit_call_tearoffs +warning - Missing type annotation - packages\features\client\home\lib\src\presentation\widgets\coverage_dashboard.dart:25:10 - always_specify_types +warning - Missing type annotation - packages\features\client\home\lib\src\presentation\widgets\coverage_dashboard.dart:42:17 - always_specify_types +warning - Missing type annotation - packages\features\client\home\lib\src\presentation\widgets\coverage_dashboard.dart:42:29 - always_specify_types +warning - Missing type annotation - packages\features\client\home\lib\src\presentation\widgets\coverage_dashboard.dart:45:17 - always_specify_types +warning - Missing type annotation - packages\features\client\home\lib\src\presentation\widgets\coverage_dashboard.dart:45:29 - always_specify_types +warning - The name HubCreationFailedException is shown, but isn't used - packages\features\client\hubs\lib\src\data\repositories_impl\hub_repository_impl.dart:12:9 - unused_shown_name + info - Implicit tear-off of the 'call' method - packages\features\client\hubs\lib\src\presentation\blocs\client_hubs_bloc.dart:71:13 - implicit_call_tearoffs + info - Implicit tear-off of the 'call' method - packages\features\client\hubs\lib\src\presentation\blocs\client_hubs_bloc.dart:90:13 - implicit_call_tearoffs + info - Implicit tear-off of the 'call' method - packages\features\client\hubs\lib\src\presentation\blocs\client_hubs_bloc.dart:130:13 - implicit_call_tearoffs + info - Implicit tear-off of the 'call' method - packages\features\client\hubs\lib\src\presentation\blocs\client_hubs_bloc.dart:156:13 - implicit_call_tearoffs + info - Constructor declarations should be before non-constructor declarations - packages\features\client\settings\lib\src\domain\usecases\sign_out_usecase.dart:13:3 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\client\settings\lib\src\presentation\blocs\client_settings_bloc.dart:14:3 - sort_constructors_first + info - Implicit tear-off of the 'call' method - packages\features\client\settings\lib\src\presentation\blocs\client_settings_bloc.dart:26:13 - implicit_call_tearoffs + info - Constructor declarations should be before non-constructor declarations - packages\features\client\settings\lib\src\presentation\blocs\client_settings_state.dart:25:9 - sort_constructors_first + info - Use 'const' with the constructor to improve performance - packages\features\client\settings\lib\src\presentation\widgets\client_settings_page\settings_profile_header.dart:80:23 - prefer_const_constructors + info - Constructor declarations should be before non-constructor declarations - packages\features\client\settings\lib\src\presentation\widgets\client_settings_page\settings_quick_links.dart:69:9 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\client\view_orders\lib\src\data\repositories\view_orders_repository_impl.dart:15:3 - sort_constructors_first + info - Don't invoke 'print' in production code - packages\features\client\view_orders\lib\src\data\repositories\view_orders_repository_impl.dart:43:5 - avoid_print + info - Don't invoke 'print' in production code - packages\features\client\view_orders\lib\src\data\repositories\view_orders_repository_impl.dart:66:7 - avoid_print + info - Don't invoke 'print' in production code - packages\features\client\view_orders\lib\src\data\repositories\view_orders_repository_impl.dart:118:5 - avoid_print + info - Don't invoke 'print' in production code - packages\features\client\view_orders\lib\src\data\repositories\view_orders_repository_impl.dart:124:7 - avoid_print + info - Constructor declarations should be before non-constructor declarations - packages\features\client\view_orders\lib\src\domain\usecases\get_orders_use_case.dart:15:3 - sort_constructors_first + info - Don't invoke 'print' in production code - packages\features\client\view_orders\lib\src\presentation\blocs\view_orders_cubit.dart:248:7 - avoid_print + info - Don't invoke 'print' in production code - packages\features\client\view_orders\lib\src\presentation\blocs\view_orders_cubit.dart:257:7 - avoid_print + info - Don't invoke 'print' in production code - packages\features\client\view_orders\lib\src\presentation\blocs\view_orders_cubit.dart:266:7 - avoid_print +warning - The declaration '_formatDate' isn't referenced - packages\features\client\view_orders\lib\src\presentation\widgets\view_order_card.dart:84:10 - unused_element +warning - The receiver can't be null, so the null-aware operator '?.' is unnecessary - packages\features\client\view_orders\lib\src\presentation\widgets\view_order_card.dart:833:55 - invalid_null_aware_operator + info - Type could be non-nullable - packages\features\client\view_orders\lib\src\presentation\widgets\view_order_card.dart:872:7 - unnecessary_nullable_for_final_variable_declarations + info - Don't use 'BuildContext's across async gaps, guarded by an unrelated 'mounted' check - packages\features\client\view_orders\lib\src\presentation\widgets\view_order_card.dart:1615:39 - use_build_context_synchronously + info - Don't use 'BuildContext's across async gaps, guarded by an unrelated 'mounted' check - packages\features\client\view_orders\lib\src\presentation\widgets\view_order_card.dart:1635:39 - use_build_context_synchronously + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\data\repositories_impl\place_repository_impl.dart:9:3 - sort_constructors_first +warning - Missing type annotation - packages\features\staff\authentication\lib\src\data\repositories_impl\place_repository_impl.dart:13:31 - always_specify_types +warning - Missing type annotation - packages\features\staff\authentication\lib\src\data\repositories_impl\place_repository_impl.dart:40:21 - always_specify_types + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\data\repositories_impl\profile_setup_repository_impl.dart:11:3 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\domain\arguments\sign_in_with_phone_arguments.dart:13:9 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\domain\arguments\verify_otp_arguments.dart:21:9 - sort_constructors_first +warning - Unused import: 'package:krow_domain/krow_domain.dart' - packages\features\staff\authentication\lib\src\domain\repositories\profile_setup_repository.dart:1:8 - unused_import + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\domain\usecases\search_cities_usecase.dart:6:3 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\domain\usecases\sign_in_with_phone_usecase.dart:15:3 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\domain\usecases\submit_profile_setup_usecase.dart:6:3 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\domain\usecases\verify_otp_usecase.dart:15:3 - sort_constructors_first + info - The imported package 'bloc' isn't a dependency of the importing package - packages\features\staff\authentication\lib\src\presentation\blocs\auth_bloc.dart:3:8 - depend_on_referenced_packages + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\blocs\auth_bloc.dart:29:3 - sort_constructors_first + info - Implicit tear-off of the 'call' method - packages\features\staff\authentication\lib\src\presentation\blocs\auth_bloc.dart:114:13 - implicit_call_tearoffs + info - Implicit tear-off of the 'call' method - packages\features\staff\authentication\lib\src\presentation\blocs\auth_bloc.dart:196:13 - implicit_call_tearoffs + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\blocs\auth_event.dart:19:9 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\blocs\auth_event.dart:39:9 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\blocs\auth_event.dart:57:9 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\blocs\auth_event.dart:67:9 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\blocs\auth_event.dart:78:9 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\blocs\auth_event.dart:89:9 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\blocs\auth_state.dart:49:9 - sort_constructors_first + info - Implicit tear-off of the 'call' method - packages\features\staff\authentication\lib\src\presentation\blocs\profile_setup\profile_setup_bloc.dart:92:13 - implicit_call_tearoffs +warning - Missing type annotation - packages\features\staff\authentication\lib\src\presentation\blocs\profile_setup\profile_setup_bloc.dart:117:48 - always_specify_types +warning - Missing type annotation - packages\features\staff\authentication\lib\src\presentation\blocs\profile_setup\profile_setup_bloc.dart:124:7 - always_specify_types +warning - Missing type annotation - packages\features\staff\authentication\lib\src\presentation\blocs\profile_setup\profile_setup_bloc.dart:128:48 - always_specify_types +warning - Missing type annotation - packages\features\staff\authentication\lib\src\presentation\blocs\profile_setup\profile_setup_bloc.dart:136:46 - always_specify_types + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\blocs\profile_setup\profile_setup_event.dart:17:9 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\blocs\profile_setup\profile_setup_event.dart:29:9 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\blocs\profile_setup\profile_setup_event.dart:41:9 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\blocs\profile_setup\profile_setup_event.dart:53:9 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\blocs\profile_setup\profile_setup_event.dart:65:9 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\blocs\profile_setup\profile_setup_event.dart:77:9 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\blocs\profile_setup\profile_setup_event.dart:89:9 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\blocs\profile_setup\profile_setup_state.dart:36:9 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\pages\phone_verification_page.dart:23:9 - sort_constructors_first + info - 'WillPopScope' is deprecated and shouldn't be used. Use PopScope instead. The Android predictive back feature will not work with WillPopScope. This feature was deprecated after v3.12.0-1.0.pre - packages\features\staff\authentication\lib\src\presentation\pages\phone_verification_page.dart:138:24 - deprecated_member_use + info - Use 'const' with the constructor to improve performance - packages\features\staff\authentication\lib\src\presentation\pages\profile_setup_page.dart:157:27 - prefer_const_constructors + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\widgets\common\section_title_subtitle.dart:12:9 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\widgets\get_started_page\get_started_actions.dart:9:9 - sort_constructors_first + info - Unnecessary instance of 'Container' - packages\features\staff\authentication\lib\src\presentation\widgets\get_started_page\get_started_background.dart:9:12 - avoid_unnecessary_containers +warning - Missing type annotation - packages\features\staff\authentication\lib\src\presentation\widgets\get_started_page\get_started_background.dart:11:19 - always_specify_types + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\authentication\lib\src\presentation\widgets\get_started_page\get_started_background.dart:25:50 - deprecated_member_use +warning - Missing type annotation - packages\features\staff\authentication\lib\src\presentation\widgets\get_started_page\get_started_background.dart:32:36 - always_specify_types +warning - Missing type annotation - packages\features\staff\authentication\lib\src\presentation\widgets\get_started_page\get_started_background.dart:32:45 - always_specify_types +warning - Missing type annotation - packages\features\staff\authentication\lib\src\presentation\widgets\get_started_page\get_started_background.dart:32:52 - always_specify_types +warning - Missing type annotation - packages\features\staff\authentication\lib\src\presentation\widgets\get_started_page\get_started_background.dart:43:23 - always_specify_types + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\authentication\lib\src\presentation\widgets\get_started_page\get_started_background.dart:57:43 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\authentication\lib\src\presentation\widgets\get_started_page\get_started_background.dart:66:43 - deprecated_member_use + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\widgets\phone_verification_page\otp_verification.dart:24:9 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\widgets\phone_verification_page\otp_verification\otp_input_field.dart:20:9 - sort_constructors_first +warning - Missing type annotation - packages\features\staff\authentication\lib\src\presentation\widgets\phone_verification_page\otp_verification\otp_input_field.dart:31:52 - always_specify_types +warning - Missing type annotation - packages\features\staff\authentication\lib\src\presentation\widgets\phone_verification_page\otp_verification\otp_input_field.dart:35:39 - always_specify_types +warning - Missing type annotation - packages\features\staff\authentication\lib\src\presentation\widgets\phone_verification_page\otp_verification\otp_input_field.dart:75:21 - always_specify_types + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\widgets\phone_verification_page\otp_verification\otp_resend_section.dart:14:9 - sort_constructors_first +warning - Missing type annotation - packages\features\staff\authentication\lib\src\presentation\widgets\phone_verification_page\otp_verification\otp_resend_section.dart:35:5 - always_specify_types + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\widgets\phone_verification_page\otp_verification\otp_verification_actions.dart:18:9 - sort_constructors_first + info - Use 'const' with the constructor to improve performance - packages\features\staff\authentication\lib\src\presentation\widgets\phone_verification_page\otp_verification\otp_verification_actions.dart:38:17 - prefer_const_constructors + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\widgets\phone_verification_page\otp_verification\otp_verification_header.dart:11:9 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\widgets\phone_verification_page\phone_input\phone_input_actions.dart:15:9 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\widgets\phone_verification_page\phone_input\phone_input_form_field.dart:20:9 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\widgets\profile_setup_page\profile_setup_basic_info.dart:21:9 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\widgets\profile_setup_page\profile_setup_experience.dart:22:9 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\widgets\profile_setup_page\profile_setup_header.dart:17:9 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\widgets\profile_setup_page\profile_setup_location.dart:24:9 - sort_constructors_first +warning - Missing type annotation - packages\features\staff\authentication\lib\src\presentation\widgets\profile_setup_page\profile_setup_location.dart:92:23 - always_specify_types +warning - Missing type annotation - packages\features\staff\authentication\lib\src\presentation\widgets\profile_setup_page\profile_setup_location.dart:92:33 - always_specify_types +warning - Missing type annotation - packages\features\staff\authentication\lib\src\presentation\widgets\profile_setup_page\profile_setup_location.dart:94:21 - always_specify_types +warning - Missing type annotation - packages\features\staff\authentication\lib\src\presentation\widgets\profile_setup_page\profile_setup_location.dart:94:30 - always_specify_types +warning - Missing type annotation - packages\features\staff\authentication\lib\src\presentation\widgets\profile_setup_page\profile_setup_location.dart:104:28 - always_specify_types + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\authentication\lib\src\presentation\widgets\profile_setup_page\profile_setup_location.dart:106:41 - deprecated_member_use +warning - Missing type annotation - packages\features\staff\authentication\lib\src\presentation\widgets\profile_setup_page\profile_setup_location.dart:116:36 - always_specify_types +warning - Missing type annotation - packages\features\staff\authentication\lib\src\presentation\widgets\profile_setup_page\profile_setup_location.dart:116:45 - always_specify_types +warning - Missing type annotation - packages\features\staff\authentication\lib\src\presentation\widgets\profile_setup_page\profile_setup_location.dart:117:31 - always_specify_types +warning - Missing type annotation - packages\features\staff\authentication\lib\src\presentation\widgets\profile_setup_page\profile_setup_location.dart:117:40 - always_specify_types +warning - Missing type annotation - packages\features\staff\authentication\lib\src\presentation\widgets\profile_setup_page\profile_setup_location.dart:118:19 - always_specify_types + info - Library names are not necessary - packages\features\staff\authentication\lib\staff_authentication.dart:1:9 - unnecessary_library_name + info - Statements in an if should be enclosed in a block - packages\features\staff\availability\lib\src\data\repositories_impl\availability_repository_impl.dart:148:28 - curly_braces_in_flow_control_structures + info - Statements in an if should be enclosed in a block - packages\features\staff\availability\lib\src\data\repositories_impl\availability_repository_impl.dart:149:35 - curly_braces_in_flow_control_structures + info - Implicit tear-off of the 'call' method - packages\features\staff\availability\lib\src\presentation\blocs\availability_bloc.dart:34:13 - implicit_call_tearoffs + info - Implicit tear-off of the 'call' method - packages\features\staff\availability\lib\src\presentation\blocs\availability_bloc.dart:106:15 - implicit_call_tearoffs + info - Implicit tear-off of the 'call' method - packages\features\staff\availability\lib\src\presentation\blocs\availability_bloc.dart:158:15 - implicit_call_tearoffs + info - Implicit tear-off of the 'call' method - packages\features\staff\availability\lib\src\presentation\blocs\availability_bloc.dart:198:15 - implicit_call_tearoffs + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\availability\lib\src\presentation\pages\availability_page.dart:100:45 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\availability\lib\src\presentation\pages\availability_page.dart:122:35 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\availability\lib\src\presentation\pages\availability_page.dart:192:30 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\availability\lib\src\presentation\pages\availability_page.dart:193:38 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\availability\lib\src\presentation\pages\availability_page.dart:224:33 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\availability\lib\src\presentation\pages\availability_page.dart:310:49 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\availability\lib\src\presentation\pages\availability_page.dart:341:42 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\availability\lib\src\presentation\pages\availability_page.dart:383:33 - deprecated_member_use + info - 'activeColor' is deprecated and shouldn't be used. Use activeThumbColor instead. This feature was deprecated after v3.31.0-2.0.pre - packages\features\staff\availability\lib\src\presentation\pages\availability_page.dart:418:17 - deprecated_member_use + info - Unnecessary use of 'toList' in a spread - packages\features\staff\availability\lib\src\presentation\pages\availability_page.dart:431:14 - unnecessary_to_list_in_spreads + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\availability\lib\src\presentation\pages\availability_page.dart:484:36 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\availability\lib\src\presentation\pages\availability_page.dart:485:40 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\availability\lib\src\presentation\pages\availability_page.dart:587:35 - deprecated_member_use + info - Library names are not necessary - packages\features\staff\availability\lib\staff_availability.dart:1:9 - unnecessary_library_name +warning - Missing type annotation - packages\features\staff\clock_in\lib\src\data\repositories_impl\clock_in_repository_impl.dart:109:78 - always_specify_types + info - Implicit tear-off of the 'call' method - packages\features\staff\clock_in\lib\src\presentation\bloc\clock_in_bloc.dart:52:13 - implicit_call_tearoffs + info - Implicit tear-off of the 'call' method - packages\features\staff\clock_in\lib\src\presentation\bloc\clock_in_bloc.dart:91:13 - implicit_call_tearoffs + info - Missing an 'await' for the 'Future' computed by this expression - packages\features\staff\clock_in\lib\src\presentation\bloc\clock_in_bloc.dart:105:11 - unawaited_futures + info - Implicit tear-off of the 'call' method - packages\features\staff\clock_in\lib\src\presentation\bloc\clock_in_bloc.dart:206:13 - implicit_call_tearoffs + info - Implicit tear-off of the 'call' method - packages\features\staff\clock_in\lib\src\presentation\bloc\clock_in_bloc.dart:229:13 - implicit_call_tearoffs + info - Missing an 'await' for the 'Future' computed by this expression - packages\features\staff\clock_in\lib\src\presentation\blocs\clock_in_cubit.dart:89:7 - unawaited_futures +warning - Missing type annotation - packages\features\staff\clock_in\lib\src\presentation\blocs\clock_in_cubit.dart:130:11 - always_specify_types +warning - Missing type annotation - packages\features\staff\clock_in\lib\src\presentation\blocs\clock_in_cubit.dart:147:11 - always_specify_types +warning - The value of the local variable 'checkInStr' isn't used - packages\features\staff\clock_in\lib\src\presentation\pages\clock_in_page.dart:68:24 - unused_local_variable +warning - The value of the local variable 'checkOutStr' isn't used - packages\features\staff\clock_in\lib\src\presentation\pages\clock_in_page.dart:71:24 - unused_local_variable +warning - The declaration '_buildModeTab' isn't referenced - packages\features\staff\clock_in\lib\src\presentation\pages\clock_in_page.dart:465:10 - unused_element + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\clock_in\lib\src\presentation\pages\clock_in_page.dart:483:43 - deprecated_member_use +warning - Missing type annotation - packages\features\staff\clock_in\lib\src\presentation\pages\clock_in_page.dart:523:43 - always_specify_types +warning - Missing type annotation - packages\features\staff\clock_in\lib\src\presentation\pages\clock_in_page.dart:573:33 - always_specify_types + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\clock_in\lib\src\presentation\widgets\attendance_card.dart:34:33 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\clock_in\lib\src\presentation\widgets\attendance_card.dart:100:44 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\clock_in\lib\src\presentation\widgets\attendance_card.dart:106:44 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\clock_in\lib\src\presentation\widgets\attendance_card.dart:112:44 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\clock_in\lib\src\presentation\widgets\attendance_card.dart:118:33 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\clock_in\lib\src\presentation\widgets\commute_tracker.dart:175:33 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\clock_in\lib\src\presentation\widgets\commute_tracker.dart:273:33 - deprecated_member_use +warning - Missing type annotation - packages\features\staff\clock_in\lib\src\presentation\widgets\commute_tracker.dart:375:23 - always_specify_types + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\clock_in\lib\src\presentation\widgets\commute_tracker.dart:386:53 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\clock_in\lib\src\presentation\widgets\commute_tracker.dart:427:49 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\clock_in\lib\src\presentation\widgets\commute_tracker.dart:430:51 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\clock_in\lib\src\presentation\widgets\commute_tracker.dart:461:51 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\clock_in\lib\src\presentation\widgets\commute_tracker.dart:464:53 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\clock_in\lib\src\presentation\widgets\commute_tracker.dart:512:56 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\clock_in\lib\src\presentation\widgets\commute_tracker.dart:541:33 - deprecated_member_use +warning - Missing type annotation - packages\features\staff\clock_in\lib\src\presentation\widgets\date_selector.dart:19:34 - always_specify_types + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\clock_in\lib\src\presentation\widgets\date_selector.dart:44:60 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\clock_in\lib\src\presentation\widgets\date_selector.dart:70:44 - deprecated_member_use + info - Unnecessary use of multiple underscores - packages\features\staff\clock_in\lib\src\presentation\widgets\location_map_placeholder.dart:30:24 - unnecessary_underscores + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\clock_in\lib\src\presentation\widgets\location_map_placeholder.dart:59:41 - deprecated_member_use +warning - The value of the field '_tookLunch' isn't used - packages\features\staff\clock_in\lib\src\presentation\widgets\lunch_break_modal.dart:15:9 - unused_field +warning - Missing type annotation - packages\features\staff\clock_in\lib\src\presentation\widgets\lunch_break_modal.dart:187:60 - always_specify_types +warning - Missing type annotation - packages\features\staff\clock_in\lib\src\presentation\widgets\lunch_break_modal.dart:200:60 - always_specify_types + info - 'groupValue' is deprecated and shouldn't be used. Use a RadioGroup ancestor to manage group value instead. This feature was deprecated after v3.32.0-0.0.pre - packages\features\staff\clock_in\lib\src\presentation\widgets\lunch_break_modal.dart:242:16 - deprecated_member_use + info - 'onChanged' is deprecated and shouldn't be used. Use RadioGroup to handle value change instead. This feature was deprecated after v3.32.0-0.0.pre - packages\features\staff\clock_in\lib\src\presentation\widgets\lunch_break_modal.dart:243:16 - deprecated_member_use +warning - Missing type annotation - packages\features\staff\clock_in\lib\src\presentation\widgets\swipe_to_check_in.dart:59:7 - always_specify_types +warning - Missing type annotation - packages\features\staff\clock_in\lib\src\presentation\widgets\swipe_to_check_in.dart:84:11 - always_specify_types + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\clock_in\lib\src\presentation\widgets\swipe_to_check_in.dart:99:34 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\clock_in\lib\src\presentation\widgets\swipe_to_check_in.dart:152:37 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\clock_in\lib\src\presentation\widgets\swipe_to_check_in.dart:168:43 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\clock_in\lib\src\presentation\widgets\swipe_to_check_in.dart:200:47 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\home\lib\src\presentation\widgets\home_page\home_header.dart:36:41 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\home\lib\src\presentation\widgets\home_page\home_header.dart:41:49 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\home\lib\src\presentation\widgets\home_page\pending_payment_card.dart:24:39 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\home\lib\src\presentation\widgets\home_page\pending_payment_card.dart:24:75 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\home\lib\src\presentation\widgets\home_page\pending_payment_card.dart:29:54 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\home\lib\src\presentation\widgets\home_page\placeholder_banner.dart:32:44 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\home\lib\src\presentation\widgets\home_page\quick_action_item.dart:34:46 - deprecated_member_use +warning - Dead code - packages\features\staff\home\lib\src\presentation\widgets\home_page\recommended_shift_card.dart:193:45 - dead_code +warning - The left operand can't be null, so the right operand is never executed - packages\features\staff\home\lib\src\presentation\widgets\home_page\recommended_shift_card.dart:193:48 - dead_null_aware_expression + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\home\lib\src\presentation\widgets\home_page\section_header.dart:52:43 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\home\lib\src\presentation\widgets\home_page\section_header.dart:55:45 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\home\lib\src\presentation\widgets\worker\auto_match_toggle.dart:32:43 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\home\lib\src\presentation\widgets\worker\auto_match_toggle.dart:42:34 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\home\lib\src\presentation\widgets\worker\auto_match_toggle.dart:61:42 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\home\lib\src\presentation\widgets\worker\auto_match_toggle.dart:62:37 - deprecated_member_use + info - 'background' is deprecated and shouldn't be used. Use surface instead. This feature was deprecated after v3.18.0-0.1.pre - packages\features\staff\home\lib\src\presentation\widgets\worker\benefits_widget.dart:20:46 - deprecated_member_use + info - 'onBackground' is deprecated and shouldn't be used. Use onSurface instead. This feature was deprecated after v3.18.0-0.1.pre - packages\features\staff\home\lib\src\presentation\widgets\worker\benefits_widget.dart:25:50 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\home\lib\src\presentation\widgets\worker\benefits_widget.dart:25:63 - deprecated_member_use + info - 'background' is deprecated and shouldn't be used. Use surface instead. This feature was deprecated after v3.18.0-0.1.pre - packages\features\staff\home\lib\src\presentation\widgets\worker\improve_yourself_widget.dart:56:48 - deprecated_member_use + info - 'onBackground' is deprecated and shouldn't be used. Use onSurface instead. This feature was deprecated after v3.18.0-0.1.pre - packages\features\staff\home\lib\src\presentation\widgets\worker\improve_yourself_widget.dart:61:52 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\home\lib\src\presentation\widgets\worker\improve_yourself_widget.dart:61:65 - deprecated_member_use + info - 'surfaceVariant' is deprecated and shouldn't be used. Use surfaceContainerHighest instead. This feature was deprecated after v3.18.0-0.1.pre - packages\features\staff\home\lib\src\presentation\widgets\worker\improve_yourself_widget.dart:78:56 - deprecated_member_use + info - 'background' is deprecated and shouldn't be used. Use surface instead. This feature was deprecated after v3.18.0-0.1.pre - packages\features\staff\home\lib\src\presentation\widgets\worker\more_ways_widget.dart:55:48 - deprecated_member_use + info - 'onBackground' is deprecated and shouldn't be used. Use onSurface instead. This feature was deprecated after v3.18.0-0.1.pre - packages\features\staff\home\lib\src\presentation\widgets\worker\more_ways_widget.dart:60:52 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\home\lib\src\presentation\widgets\worker\more_ways_widget.dart:60:65 - deprecated_member_use + info - 'surfaceVariant' is deprecated and shouldn't be used. Use surfaceContainerHighest instead. This feature was deprecated after v3.18.0-0.1.pre - packages\features\staff\home\lib\src\presentation\widgets\worker\more_ways_widget.dart:77:56 - deprecated_member_use + info - Import of a library in the 'lib/src' directory of another package - packages\features\staff\payments\lib\src\payments_module.dart:1:8 - implementation_imports + info - Implicit tear-off of the 'call' method - packages\features\staff\payments\lib\src\presentation\blocs\payments\payments_bloc.dart:28:13 - implicit_call_tearoffs + info - Implicit tear-off of the 'call' method - packages\features\staff\payments\lib\src\presentation\blocs\payments\payments_bloc.dart:54:15 - implicit_call_tearoffs + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\payments\lib\src\presentation\pages\payments_page.dart:114:41 - deprecated_member_use +warning - The value of the local variable 'maxX' isn't used - packages\features\staff\payments\lib\src\presentation\widgets\earnings_graph.dart:36:18 - unused_local_variable + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\payments\lib\src\presentation\widgets\earnings_graph.dart:47:33 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\payments\lib\src\presentation\widgets\earnings_graph.dart:105:54 - deprecated_member_use +warning - Missing type annotation - packages\features\staff\payments\lib\src\presentation\widgets\earnings_graph.dart:124:12 - always_specify_types + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\payments\lib\src\presentation\widgets\payment_history_item.dart:37:33 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\payments\lib\src\presentation\widgets\payment_stats_card.dart:26:33 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\payments\lib\src\presentation\widgets\pending_pay_card.dart:27:33 - deprecated_member_use +warning - Missing type annotation - packages\features\staff\profile\lib\src\data\repositories\profile_repository_impl.dart:34:5 - always_specify_types +warning - Missing type annotation - packages\features\staff\profile\lib\src\data\repositories\profile_repository_impl.dart:39:5 - always_specify_types + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile\lib\src\domain\usecases\get_profile_usecase.dart:18:9 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile\lib\src\domain\usecases\sign_out_usecase.dart:19:9 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile\lib\src\presentation\blocs\profile_cubit.dart:16:3 - sort_constructors_first +warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\blocs\profile_cubit.dart:30:9 - always_specify_types + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile\lib\src\presentation\blocs\profile_state.dart:36:9 - sort_constructors_first +warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\blocs\profile_state.dart:56:30 - always_specify_types +warning - Duplicate import - packages\features\staff\profile\lib\src\presentation\pages\staff_profile_page.dart:17:8 - duplicate_import +warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\pages\staff_profile_page.dart:64:20 - always_specify_types +warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\pages\staff_profile_page.dart:64:29 - always_specify_types +warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\pages\staff_profile_page.dart:69:19 - always_specify_types +warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\pages\staff_profile_page.dart:69:28 - always_specify_types +warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\pages\staff_profile_page.dart:86:11 - always_specify_types +warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\pages\staff_profile_page.dart:94:25 - always_specify_types +warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\pages\staff_profile_page.dart:108:33 - always_specify_types +warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\pages\staff_profile_page.dart:125:37 - always_specify_types +warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\pages\staff_profile_page.dart:146:37 - always_specify_types +warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\pages\staff_profile_page.dart:150:41 - always_specify_types +warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\pages\staff_profile_page.dart:164:37 - always_specify_types +warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\pages\staff_profile_page.dart:188:37 - always_specify_types +warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\pages\staff_profile_page.dart:195:45 - always_specify_types +warning - Unused import: 'package:flutter_bloc/flutter_bloc.dart' - packages\features\staff\profile\lib\src\presentation\widgets\language_selector_bottom_sheet.dart:4:8 - unused_import + info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\language_selector_bottom_sheet.dart:18:16 - prefer_const_constructors + info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\language_selector_bottom_sheet.dart:19:19 - prefer_const_constructors + info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\language_selector_bottom_sheet.dart:21:23 - prefer_const_constructors + info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\language_selector_bottom_sheet.dart:21:50 - prefer_const_constructors +warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\language_selector_bottom_sheet.dart:26:19 - always_specify_types + info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\language_selector_bottom_sheet.dart:32:11 - prefer_const_constructors + info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\language_selector_bottom_sheet.dart:38:11 - prefer_const_constructors + info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\language_selector_bottom_sheet.dart:44:11 - prefer_const_constructors + info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\language_selector_bottom_sheet.dart:74:18 - prefer_const_constructors +warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\language_selector_bottom_sheet.dart:88:21 - always_specify_types + info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\language_selector_bottom_sheet.dart:96:15 - prefer_const_constructors + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile\lib\src\presentation\widgets\logout_button.dart:12:9 - sort_constructors_first +warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\logout_button.dart:16:5 - always_specify_types + info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\logout_button.dart:31:22 - prefer_const_constructors +warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\logout_button.dart:34:25 - always_specify_types + info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\logout_button.dart:36:17 - prefer_const_constructors + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:23:9 - sort_constructors_first +warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:33:5 - always_specify_types + info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:37:16 - prefer_const_constructors + info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:43:19 - prefer_const_constructors + info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:45:23 - prefer_const_constructors + info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:46:19 - prefer_const_constructors +warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:52:21 - always_specify_types +warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:56:25 - always_specify_types + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:68:57 - deprecated_member_use + info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:74:13 - prefer_const_constructors +warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:78:25 - always_specify_types + info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:82:28 - prefer_const_constructors +warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:88:31 - always_specify_types + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:90:41 - deprecated_member_use +warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:94:32 - always_specify_types + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:96:52 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:106:59 - deprecated_member_use +warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:124:43 - always_specify_types + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:126:53 - deprecated_member_use +warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:149:32 - always_specify_types + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:151:52 - deprecated_member_use + info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:164:13 - prefer_const_constructors + info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:171:13 - prefer_const_constructors + info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:173:24 - prefer_const_constructors + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:178:40 - deprecated_member_use + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile\lib\src\presentation\widgets\profile_menu_grid.dart:10:9 - sort_constructors_first +warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\profile_menu_grid.dart:22:17 - always_specify_types +warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\profile_menu_grid.dart:22:26 - always_specify_types +warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\profile_menu_grid.dart:23:9 - always_specify_types +warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\profile_menu_grid.dart:24:9 - always_specify_types +warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\profile_menu_grid.dart:25:9 - always_specify_types +warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\profile_menu_grid.dart:32:35 - always_specify_types + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile\lib\src\presentation\widgets\profile_menu_item.dart:13:9 - sort_constructors_first + info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\profile_menu_item.dart:31:18 - prefer_const_constructors +warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\profile_menu_item.dart:35:23 - always_specify_types +warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\profile_menu_item.dart:40:29 - always_specify_types + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile\lib\src\presentation\widgets\profile_menu_item.dart:45:49 - deprecated_member_use + info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\profile_menu_item.dart:51:21 - prefer_const_constructors + info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\profile_menu_item.dart:53:32 - prefer_const_constructors + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile\lib\src\presentation\widgets\profile_menu_item.dart:79:46 - deprecated_member_use + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile\lib\src\presentation\widgets\reliability_score_bar.dart:11:9 - sort_constructors_first +warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\reliability_score_bar.dart:18:5 - always_specify_types +warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\reliability_score_bar.dart:19:5 - always_specify_types + info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\reliability_score_bar.dart:22:16 - prefer_const_constructors + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile\lib\src\presentation\widgets\reliability_score_bar.dart:24:33 - deprecated_member_use +warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\reliability_score_bar.dart:29:19 - always_specify_types +warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\reliability_score_bar.dart:32:23 - always_specify_types + info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\reliability_score_bar.dart:47:11 - prefer_const_constructors + info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\reliability_score_bar.dart:58:22 - prefer_const_constructors + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile\lib\src\presentation\widgets\reliability_stats_card.dart:15:9 - sort_constructors_first + info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\reliability_stats_card.dart:27:16 - prefer_const_constructors +warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\reliability_stats_card.dart:32:20 - always_specify_types + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile\lib\src\presentation\widgets\reliability_stats_card.dart:34:40 - deprecated_member_use +warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\reliability_stats_card.dart:42:19 - always_specify_types +warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\reliability_stats_card.dart:86:19 - always_specify_types + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile\lib\src\presentation\widgets\reliability_stats_card.dart:91:39 - deprecated_member_use + info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\reliability_stats_card.dart:97:11 - prefer_const_constructors + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile\lib\src\presentation\widgets\section_title.dart:10:9 - sort_constructors_first + info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\section_title.dart:16:16 - prefer_const_constructors + info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\section_title.dart:17:15 - prefer_const_constructors + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\certificates\lib\src\data\repositories_impl\certificates_repository_impl.dart:23:3 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\certificates\lib\src\domain\usecases\get_certificates_usecase.dart:15:3 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\certificates\lib\src\presentation\blocs\certificates\certificates_cubit.dart:11:3 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\certificates\lib\src\presentation\blocs\certificates\certificates_state.dart:11:9 - sort_constructors_first +warning - Missing type annotation - packages\features\staff\profile_sections\compliance\certificates\lib\src\presentation\blocs\certificates\certificates_state.dart:30:30 - always_specify_types +warning - Missing type annotation - packages\features\staff\profile_sections\compliance\certificates\lib\src\presentation\blocs\certificates\certificates_state.dart:34:15 - always_specify_types + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\certificates\lib\src\presentation\widgets\add_certificate_card.dart:8:9 - sort_constructors_first + info - The imported package 'intl' isn't a dependency of the importing package - packages\features\staff\profile_sections\compliance\certificates\lib\src\presentation\widgets\certificate_card.dart:3:8 - depend_on_referenced_packages + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\certificates\lib\src\presentation\widgets\certificate_card.dart:14:9 - sort_constructors_first + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\compliance\certificates\lib\src\presentation\widgets\certificate_card.dart:48:35 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\compliance\certificates\lib\src\presentation\widgets\certificate_card.dart:62:48 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\compliance\certificates\lib\src\presentation\widgets\certificate_card.dart:99:46 - deprecated_member_use + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\certificates\lib\src\presentation\widgets\certificate_card.dart:416:3 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\certificates\lib\src\presentation\widgets\certificate_upload_modal.dart:15:9 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\certificates\lib\src\presentation\widgets\certificates_header.dart:10:9 - sort_constructors_first + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\compliance\certificates\lib\src\presentation\widgets\certificates_header.dart:42:43 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\compliance\certificates\lib\src\presentation\widgets\certificates_header.dart:73:55 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\compliance\certificates\lib\src\presentation\widgets\certificates_header.dart:103:45 - deprecated_member_use + info - Library names are not necessary - packages\features\staff\profile_sections\compliance\certificates\lib\staff_certificates.dart:1:9 - unnecessary_library_name + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\documents\lib\src\data\repositories_impl\documents_repository_impl.dart:14:3 - sort_constructors_first +warning - Missing type annotation - packages\features\staff\profile_sections\compliance\documents\lib\src\data\repositories_impl\documents_repository_impl.dart:29:12 - always_specify_types +warning - Dead code - packages\features\staff\profile_sections\compliance\documents\lib\src\data\repositories_impl\documents_repository_impl.dart:52:5 - dead_code + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\documents\lib\src\domain\usecases\get_documents_usecase.dart:11:3 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\documents\lib\src\presentation\blocs\documents\documents_cubit.dart:11:3 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\documents\lib\src\presentation\blocs\documents\documents_state.dart:11:9 - sort_constructors_first +warning - Unused import: 'package:krow_core/core.dart' - packages\features\staff\profile_sections\compliance\documents\lib\src\presentation\pages\documents_page.dart:11:8 - unused_import + info - Constructors for public widgets should have a named 'key' parameter - packages\features\staff\profile_sections\compliance\documents\lib\src\presentation\pages\documents_page.dart:15:7 - use_key_in_widget_constructors + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\documents\lib\src\presentation\widgets\document_card.dart:12:9 - sort_constructors_first + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\compliance\documents\lib\src\presentation\widgets\document_card.dart:35:39 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\compliance\documents\lib\src\presentation\widgets\document_card.dart:117:35 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\compliance\documents\lib\src\presentation\widgets\document_card.dart:122:35 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\compliance\documents\lib\src\presentation\widgets\document_card.dart:127:33 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\compliance\documents\lib\src\presentation\widgets\document_card.dart:132:33 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\compliance\documents\lib\src\presentation\widgets\document_card.dart:137:33 - deprecated_member_use + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\documents\lib\src\presentation\widgets\documents_progress_card.dart:17:9 - sort_constructors_first + info - Library names are not necessary - packages\features\staff\profile_sections\compliance\documents\lib\staff_documents.dart:1:9 - unnecessary_library_name +warning - Missing type annotation - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\data\mappers\tax_form_mapper.dart:9:43 - always_specify_types + info - The type of the right operand ('TaxFormType') isn't a subtype or a supertype of the left operand ('EnumValue') - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\data\mappers\tax_form_mapper.dart:47:23 - unrelated_type_equality_checks + info - Statements in an if should be enclosed in a block - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\data\repositories\tax_forms_repository_impl.dart:194:41 - curly_braces_in_flow_control_structures + info - Statements in an if should be enclosed in a block - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\data\repositories\tax_forms_repository_impl.dart:195:47 - curly_braces_in_flow_control_structures + info - Statements in an if should be enclosed in a block - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\data\repositories\tax_forms_repository_impl.dart:196:44 - curly_braces_in_flow_control_structures + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\domain\usecases\get_tax_forms_usecase.dart:7:3 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\domain\usecases\save_i9_form_usecase.dart:7:3 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\domain\usecases\save_w4_form_usecase.dart:7:3 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\domain\usecases\submit_i9_form_usecase.dart:7:3 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\domain\usecases\submit_w4_form_usecase.dart:7:3 - sort_constructors_first + info - The imported package 'uuid' isn't a dependency of the importing package - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\blocs\i9\form_i9_cubit.dart:4:8 - depend_on_referenced_packages + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\blocs\i9\form_i9_cubit.dart:13:3 - sort_constructors_first +warning - Missing type annotation - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\blocs\i9\form_i9_cubit.dart:102:47 - always_specify_types + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\blocs\i9\form_i9_state.dart:38:9 - sort_constructors_first +warning - Missing type annotation - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\blocs\i9\form_i9_state.dart:117:30 - always_specify_types + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\blocs\tax_forms\tax_forms_cubit.dart:11:3 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\blocs\tax_forms\tax_forms_state.dart:11:9 - sort_constructors_first + info - The imported package 'uuid' isn't a dependency of the importing package - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\blocs\w4\form_w4_cubit.dart:4:8 - depend_on_referenced_packages + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\blocs\w4\form_w4_cubit.dart:13:3 - sort_constructors_first +warning - Missing type annotation - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\blocs\w4\form_w4_cubit.dart:95:47 - always_specify_types + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\blocs\w4\form_w4_state.dart:32:9 - sort_constructors_first +warning - Missing type annotation - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\blocs\w4\form_w4_state.dart:92:30 - always_specify_types + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\form_i9_page.dart:12:9 - sort_constructors_first + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\form_i9_page.dart:212:81 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\form_i9_page.dart:232:50 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\form_i9_page.dart:249:77 - deprecated_member_use + info - 'value' is deprecated and shouldn't be used. Use initialValue instead. This will set the initial value for the form field. This feature was deprecated after v3.33.0-1.0.pre - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\form_i9_page.dart:465:21 - deprecated_member_use + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\form_w4_page.dart:12:9 - sort_constructors_first +warning - The value of the field '_usStates' isn't used - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\form_w4_page.dart:27:22 - unused_field + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\form_w4_page.dart:258:81 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\form_w4_page.dart:278:50 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\form_w4_page.dart:295:77 - deprecated_member_use + info - Use 'const' with the constructor to improve performance - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\form_w4_page.dart:446:18 - prefer_const_constructors + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\tax_forms_page.dart:40:47 - deprecated_member_use +warning - Missing type annotation - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\tax_forms_page.dart:148:11 - always_specify_types + info - Missing an 'await' for the 'Future' computed by this expression - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\tax_forms_page.dart:150:53 - unawaited_futures +warning - Missing type annotation - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\tax_forms_page.dart:153:11 - always_specify_types + info - Missing an 'await' for the 'Future' computed by this expression - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\tax_forms_page.dart:155:53 - unawaited_futures + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\tax_forms_page.dart:174:41 - deprecated_member_use + info - Library names are not necessary - packages\features\staff\profile_sections\compliance\tax_forms\lib\staff_tax_forms.dart:1:9 - unnecessary_library_name + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\domain\arguments\add_bank_account_params.dart:9:9 - sort_constructors_first +warning - Missing type annotation - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\domain\arguments\add_bank_account_params.dart:12:30 - always_specify_types + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\domain\usecases\add_bank_account_usecase.dart:9:3 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\domain\usecases\get_bank_accounts_usecase.dart:9:3 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\presentation\blocs\bank_account_cubit.dart:14:3 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\presentation\blocs\bank_account_state.dart:12:9 - sort_constructors_first +warning - Missing type annotation - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\presentation\blocs\bank_account_state.dart:14:21 - always_specify_types +warning - Missing type annotation - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\presentation\blocs\bank_account_state.dart:34:30 - always_specify_types +warning - Unused import: 'package:krow_core/core.dart' - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\presentation\pages\bank_account_page.dart:11:8 - unused_import + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\presentation\pages\bank_account_page.dart:146:33 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\presentation\pages\bank_account_page.dart:202:39 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\presentation\pages\bank_account_page.dart:242:37 - deprecated_member_use +warning - Unused import: 'package:flutter_modular/flutter_modular.dart' - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\presentation\widgets\add_account_form.dart:2:8 - unused_import +warning - Unused import: '../blocs/bank_account_cubit.dart' - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\presentation\widgets\add_account_form.dart:4:8 - unused_import + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\presentation\widgets\add_account_form.dart:11:9 - sort_constructors_first + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\presentation\widgets\add_account_form.dart:125:34 - deprecated_member_use + info - Library names are not necessary - packages\features\staff\profile_sections\finances\staff_bank_account\lib\staff_bank_account.dart:1:9 - unnecessary_library_name + info - The imported package 'firebase_auth' isn't a dependency of the importing package - packages\features\staff\profile_sections\finances\time_card\lib\src\data\repositories_impl\time_card_repository_impl.dart:1:8 - depend_on_referenced_packages + info - The imported package 'firebase_data_connect' isn't a dependency of the importing package - packages\features\staff\profile_sections\finances\time_card\lib\src\data\repositories_impl\time_card_repository_impl.dart:2:8 - depend_on_referenced_packages + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\time_card\lib\src\data\repositories_impl\time_card_repository_impl.dart:17:3 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\time_card\lib\src\domain\arguments\get_time_cards_arguments.dart:8:9 - sort_constructors_first +warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\domain\arguments\get_time_cards_arguments.dart:11:30 - always_specify_types + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\time_card\lib\src\domain\usecases\get_time_cards_usecase.dart:10:3 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\blocs\time_card_bloc.dart:16:3 - sort_constructors_first + info - Implicit tear-off of the 'call' method - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\blocs\time_card_bloc.dart:28:13 - implicit_call_tearoffs +warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\blocs\time_card_event.dart:6:30 - always_specify_types + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\blocs\time_card_event.dart:11:9 - sort_constructors_first +warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\blocs\time_card_event.dart:14:30 - always_specify_types + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\blocs\time_card_event.dart:19:9 - sort_constructors_first +warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\blocs\time_card_event.dart:22:30 - always_specify_types +warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\blocs\time_card_state.dart:6:30 - always_specify_types + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\blocs\time_card_state.dart:17:9 - sort_constructors_first +warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\blocs\time_card_state.dart:25:30 - always_specify_types + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\blocs\time_card_state.dart:29:9 - sort_constructors_first +warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\blocs\time_card_state.dart:31:30 - always_specify_types +warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\pages\time_card_page.dart:30:12 - always_specify_types +warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\pages\time_card_page.dart:53:21 - always_specify_types +warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\pages\time_card_page.dart:53:30 - always_specify_types +warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\pages\time_card_page.dart:65:29 - always_specify_types + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\month_selector.dart:11:9 - sort_constructors_first +warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\month_selector.dart:29:19 - always_specify_types + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\shift_history_list.dart:11:9 - sort_constructors_first +warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\shift_history_list.dart:17:17 - always_specify_types +warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\shift_history_list.dart:30:27 - always_specify_types +warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\shift_history_list.dart:42:30 - always_specify_types + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\time_card_summary.dart:10:9 - sort_constructors_first +warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\time_card_summary.dart:19:17 - always_specify_types + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\time_card_summary.dart:45:9 - sort_constructors_first +warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\time_card_summary.dart:62:19 - always_specify_types +warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\time_card_summary.dart:64:23 - always_specify_types + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\timesheet_card.dart:11:9 - sort_constructors_first +warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\timesheet_card.dart:15:5 - always_specify_types + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\timesheet_card.dart:22:41 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\timesheet_card.dart:27:41 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\timesheet_card.dart:32:37 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\timesheet_card.dart:37:41 - deprecated_member_use +warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\timesheet_card.dart:43:5 - always_specify_types +warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\timesheet_card.dart:54:19 - always_specify_types +warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\timesheet_card.dart:58:23 - always_specify_types +warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\timesheet_card.dart:61:27 - always_specify_types +warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\timesheet_card.dart:98:23 - always_specify_types +warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\timesheet_card.dart:116:25 - always_specify_types +warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\timesheet_card.dart:139:7 - always_specify_types +warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\timesheet_card.dart:141:9 - always_specify_types + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\timesheet_card.dart:155:9 - sort_constructors_first +warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\timesheet_card.dart:161:17 - always_specify_types + info - Library names are not necessary - packages\features\staff\profile_sections\finances\time_card\lib\src\staff_time_card_module.dart:1:9 - unnecessary_library_name + info - The imported package 'firebase_auth' isn't a dependency of the importing package - packages\features\staff\profile_sections\finances\time_card\lib\src\staff_time_card_module.dart:3:8 - depend_on_referenced_packages +warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\staff_time_card_module.dart:45:15 - always_specify_types + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\onboarding\attire\lib\src\data\repositories_impl\attire_repository_impl.dart:15:3 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\onboarding\attire\lib\src\domain\arguments\save_attire_arguments.dart:12:9 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\onboarding\attire\lib\src\domain\arguments\upload_attire_photo_arguments.dart:12:9 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\onboarding\attire\lib\src\domain\usecases\get_attire_options_usecase.dart:11:3 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\onboarding\attire\lib\src\domain\usecases\save_attire_usecase.dart:11:3 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\onboarding\attire\lib\src\domain\usecases\upload_attire_photo_usecase.dart:10:3 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\onboarding\attire\lib\src\presentation\blocs\attire_cubit.dart:18:3 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\onboarding\attire\lib\src\presentation\blocs\attire_state.dart:15:9 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\onboarding\attire\lib\src\presentation\widgets\attestation_checkbox.dart:9:9 - sort_constructors_first + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\onboarding\attire\lib\src\presentation\widgets\attire_bottom_bar.dart:12:9 - sort_constructors_first + info - The imported package 'lucide_icons' isn't a dependency of the importing package - packages\features\staff\profile_sections\onboarding\attire\lib\src\presentation\widgets\attire_grid.dart:3:8 - depend_on_referenced_packages + info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\onboarding\attire\lib\src\presentation\widgets\attire_grid.dart:15:9 - sort_constructors_first + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\onboarding\attire\lib\src\presentation\widgets\attire_grid.dart:56:46 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\onboarding\attire\lib\src\presentation\widgets\attire_grid.dart:156:46 - deprecated_member_use + info - The imported package 'lucide_icons' isn't a dependency of the importing package - packages\features\staff\profile_sections\onboarding\attire\lib\src\presentation\widgets\attire_info_card.dart:3:8 - depend_on_referenced_packages + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\onboarding\attire\lib\src\presentation\widgets\attire_info_card.dart:14:33 - deprecated_member_use + info - Library names are not necessary - packages\features\staff\profile_sections\onboarding\attire\lib\staff_attire.dart:1:9 - unnecessary_library_name + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\onboarding\emergency_contact\lib\src\presentation\widgets\emergency_contact_info_banner.dart:12:32 - deprecated_member_use + info - Constructors in '@immutable' classes should be declared as 'const' - packages\features\staff\profile_sections\onboarding\experience\lib\src\domain\arguments\save_experience_arguments.dart:7:3 - prefer_const_constructors_in_immutables + info - Implicit tear-off of the 'call' method - packages\features\staff\profile_sections\onboarding\experience\lib\src\presentation\blocs\experience_bloc.dart:127:13 - implicit_call_tearoffs + info - Implicit tear-off of the 'call' method - packages\features\staff\profile_sections\onboarding\experience\lib\src\presentation\blocs\experience_bloc.dart:192:13 - implicit_call_tearoffs +warning - The declaration '_buildCustomSkillsList' isn't referenced - packages\features\staff\profile_sections\onboarding\experience\lib\src\presentation\pages\experience_page.dart:140:10 - unused_element + info - Library names are not necessary - packages\features\staff\profile_sections\onboarding\experience\lib\staff_profile_experience.dart:1:9 - unnecessary_library_name + info - Implicit tear-off of the 'call' method - packages\features\staff\profile_sections\onboarding\profile_info\lib\src\presentation\blocs\personal_info_bloc.dart:45:13 - implicit_call_tearoffs +warning - Missing type annotation - packages\features\staff\profile_sections\onboarding\profile_info\lib\src\presentation\blocs\personal_info_bloc.dart:82:48 - always_specify_types + info - Implicit tear-off of the 'call' method - packages\features\staff\profile_sections\onboarding\profile_info\lib\src\presentation\blocs\personal_info_bloc.dart:96:13 - implicit_call_tearoffs + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\onboarding\profile_info\lib\src\presentation\widgets\profile_photo_widget.dart:44:43 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\onboarding\profile_info\lib\src\presentation\widgets\profile_photo_widget.dart:74:53 - deprecated_member_use + info - The imported package 'firebase_auth' isn't a dependency of the importing package - packages\features\staff\shifts\lib\src\data\repositories_impl\shifts_repository_impl.dart:4:8 - depend_on_referenced_packages + info - The imported package 'firebase_data_connect' isn't a dependency of the importing package - packages\features\staff\shifts\lib\src\data\repositories_impl\shifts_repository_impl.dart:5:8 - depend_on_referenced_packages + info - The imported package 'bloc' isn't a dependency of the importing package - packages\features\staff\shifts\lib\src\presentation\blocs\shift_details\shift_details_bloc.dart:1:8 - depend_on_referenced_packages + info - Implicit tear-off of the 'call' method - packages\features\staff\shifts\lib\src\presentation\blocs\shift_details\shift_details_bloc.dart:32:13 - implicit_call_tearoffs + info - Implicit tear-off of the 'call' method - packages\features\staff\shifts\lib\src\presentation\blocs\shift_details\shift_details_bloc.dart:52:13 - implicit_call_tearoffs + info - Implicit tear-off of the 'call' method - packages\features\staff\shifts\lib\src\presentation\blocs\shift_details\shift_details_bloc.dart:72:13 - implicit_call_tearoffs + info - The imported package 'bloc' isn't a dependency of the importing package - packages\features\staff\shifts\lib\src\presentation\blocs\shifts\shifts_bloc.dart:1:8 - depend_on_referenced_packages + info - The imported package 'meta' isn't a dependency of the importing package - packages\features\staff\shifts\lib\src\presentation\blocs\shifts\shifts_bloc.dart:5:8 - depend_on_referenced_packages + info - Implicit tear-off of the 'call' method - packages\features\staff\shifts\lib\src\presentation\blocs\shifts\shifts_bloc.dart:50:13 - implicit_call_tearoffs + info - Implicit tear-off of the 'call' method - packages\features\staff\shifts\lib\src\presentation\blocs\shifts\shifts_bloc.dart:86:13 - implicit_call_tearoffs + info - Implicit tear-off of the 'call' method - packages\features\staff\shifts\lib\src\presentation\blocs\shifts\shifts_bloc.dart:115:13 - implicit_call_tearoffs + info - Implicit tear-off of the 'call' method - packages\features\staff\shifts\lib\src\presentation\blocs\shifts\shifts_bloc.dart:163:13 - implicit_call_tearoffs + info - Implicit tear-off of the 'call' method - packages\features\staff\shifts\lib\src\presentation\blocs\shifts\shifts_bloc.dart:203:13 - implicit_call_tearoffs + info - Implicit tear-off of the 'call' method - packages\features\staff\shifts\lib\src\presentation\blocs\shifts\shifts_bloc.dart:249:15 - implicit_call_tearoffs + info - Don't invoke 'print' in production code - packages\features\staff\shifts\lib\src\presentation\pages\shifts_page.dart:32:5 - avoid_print + info - Don't invoke 'print' in production code - packages\features\staff\shifts\lib\src\presentation\pages\shifts_page.dart:40:7 - avoid_print + info - Don't invoke 'print' in production code - packages\features\staff\shifts\lib\src\presentation\pages\shifts_page.dart:44:7 - avoid_print + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\shifts\lib\src\presentation\widgets\my_shift_card.dart:128:35 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\shifts\lib\src\presentation\widgets\my_shift_card.dart:183:57 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\shifts\lib\src\presentation\widgets\my_shift_card.dart:208:48 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\shifts\lib\src\presentation\widgets\my_shift_card.dart:209:48 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\shifts\lib\src\presentation\widgets\my_shift_card.dart:216:53 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\shifts\lib\src\presentation\widgets\shift_assignment_card.dart:74:33 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\shifts\lib\src\presentation\widgets\shift_assignment_card.dart:100:46 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\shifts\lib\src\presentation\widgets\shift_assignment_card.dart:101:46 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\shifts\lib\src\presentation\widgets\shift_assignment_card.dart:108:51 - deprecated_member_use + info - The imported package 'lucide_icons' isn't a dependency of the importing package - packages\features\staff\shifts\lib\src\presentation\widgets\tabs\my_shifts_tab.dart:4:8 - depend_on_referenced_packages + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\shifts\lib\src\presentation\widgets\tabs\my_shifts_tab.dart:316:54 - deprecated_member_use + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\shifts\lib\src\presentation\widgets\tabs\my_shifts_tab.dart:507:47 - deprecated_member_use + info - The imported package 'krow_core' isn't a dependency of the importing package - packages\features\staff\staff_main\lib\src\presentation\blocs\staff_main_cubit.dart:2:8 - depend_on_referenced_packages + info - The imported package 'krow_core' isn't a dependency of the importing package - packages\features\staff\staff_main\lib\src\staff_main_module.dart:3:8 - depend_on_referenced_packages + diff --git a/apps/mobile/packages/core/lib/src/presentation/mixins/bloc_error_handler.dart b/apps/mobile/packages/core/lib/src/presentation/mixins/bloc_error_handler.dart index 17df6ca0..2e72c233 100644 --- a/apps/mobile/packages/core/lib/src/presentation/mixins/bloc_error_handler.dart +++ b/apps/mobile/packages/core/lib/src/presentation/mixins/bloc_error_handler.dart @@ -1,5 +1,5 @@ import 'dart:developer' as developer; -import 'package:flutter_bloc/flutter_bloc.dart'; + import 'package:krow_domain/krow_domain.dart'; /// Mixin to standardize error handling across all BLoCs. @@ -45,7 +45,7 @@ mixin BlocErrorHandler { /// - Logs full error and stack trace /// - Emits generic error state Future handleError({ - required Emitter emit, + required void Function(S) emit, required Future Function() action, required S Function(String errorKey) onError, String? loggerName, diff --git a/apps/mobile/packages/core/pubspec.yaml b/apps/mobile/packages/core/pubspec.yaml index 53ac14a6..9688cdc9 100644 --- a/apps/mobile/packages/core/pubspec.yaml +++ b/apps/mobile/packages/core/pubspec.yaml @@ -15,3 +15,5 @@ dependencies: path: ../design_system equatable: ^2.0.8 flutter_modular: ^6.4.1 + krow_domain: + path: ../domain diff --git a/apps/mobile/packages/core_localization/lib/src/l10n/es.i18n.json b/apps/mobile/packages/core_localization/lib/src/l10n/es.i18n.json index d25040bc..4f80e30a 100644 --- a/apps/mobile/packages/core_localization/lib/src/l10n/es.i18n.json +++ b/apps/mobile/packages/core_localization/lib/src/l10n/es.i18n.json @@ -382,91 +382,91 @@ }, "home": { "header": { - "welcome_back": "Welcome back", + "welcome_back": "Bienvenido de nuevo", "user_name_placeholder": "Krower" }, "banners": { - "complete_profile_title": "Complete Your Profile", - "complete_profile_subtitle": "Get verified to see more shifts", - "availability_title": "Availability", - "availability_subtitle": "Update your availability for next week" + "complete_profile_title": "Completa tu Perfil", + "complete_profile_subtitle": "Verifícate para ver más turnos", + "availability_title": "Disponibilidad", + "availability_subtitle": "Actualiza tu disponibilidad para la próxima semana" }, "quick_actions": { - "find_shifts": "Find Shifts", - "availability": "Availability", - "messages": "Messages", - "earnings": "Earnings" + "find_shifts": "Buscar Turnos", + "availability": "Disponibilidad", + "messages": "Mensajes", + "earnings": "Ganancias" }, "sections": { - "todays_shift": "Today's Shift", - "scheduled_count": "$count scheduled", - "tomorrow": "Tomorrow", - "recommended_for_you": "Recommended for You", - "view_all": "View all" + "todays_shift": "Turno de Hoy", + "scheduled_count": "$count programados", + "tomorrow": "Mañana", + "recommended_for_you": "Recomendado para Ti", + "view_all": "Ver todo" }, "empty_states": { - "no_shifts_today": "No shifts scheduled for today", - "find_shifts_cta": "Find shifts →", - "no_shifts_tomorrow": "No shifts for tomorrow", - "no_recommended_shifts": "No recommended shifts" + "no_shifts_today": "No hay turnos programados para hoy", + "find_shifts_cta": "Buscar turnos →", + "no_shifts_tomorrow": "No hay turnos para mañana", + "no_recommended_shifts": "No hay turnos recomendados" }, "pending_payment": { - "title": "Pending Payment", - "subtitle": "Payment processing", + "title": "Pago Pendiente", + "subtitle": "Procesando pago", "amount": "$amount" }, "recommended_card": { - "act_now": "• ACT NOW", - "one_day": "One Day", - "today": "Today", - "applied_for": "Applied for $title", + "act_now": "• ACTÚA AHORA", + "one_day": "Un Día", + "today": "Hoy", + "applied_for": "Postulado para $title", "time_range": "$start - $end" }, "benefits": { - "title": "Your Benefits", - "view_all": "View all", - "hours_label": "hours", + "title": "Tus Beneficios", + "view_all": "Ver todo", + "hours_label": "horas", "items": { - "sick_days": "Sick Days", - "vacation": "Vacation", - "holidays": "Holidays" + "sick_days": "Días de Enfermedad", + "vacation": "Vacaciones", + "holidays": "Festivos" } }, "auto_match": { "title": "Auto-Match", - "finding_shifts": "Finding shifts for you", - "get_matched": "Get matched automatically", - "matching_based_on": "Matching based on:", + "finding_shifts": "Buscando turnos para ti", + "get_matched": "Sé emparejado automáticamente", + "matching_based_on": "Emparejamiento basado en:", "chips": { - "location": "Location", - "availability": "Availability", - "skills": "Skills" + "location": "Ubicación", + "availability": "Disponibilidad", + "skills": "Habilidades" } }, "improve": { - "title": "Improve Yourself", + "title": "Mejórate a ti mismo", "items": { "training": { - "title": "Training Section", - "description": "Improve your skills and get certified.", + "title": "Sección de Entrenamiento", + "description": "Mejora tus habilidades y obtén certificaciones.", "page": "/krow-university" }, "podcast": { - "title": "Krow Podcast", - "description": "Listen to tips from top workers.", + "title": "Podcast de Krow", + "description": "Escucha consejos de los mejores trabajadores.", "page": "/krow-university" } } }, "more_ways": { - "title": "More Ways To Use Krow", + "title": "Más Formas de Usar Krow", "items": { "benefits": { - "title": "Krow Benefits", + "title": "Beneficios de Krow", "page": "/benefits" }, "refer": { - "title": "Refer a Friend", + "title": "Recomendar a un Amigo", "page": "/worker-profile" } } @@ -596,62 +596,62 @@ } }, "staff_documents": { - "title": "Documents", + "title": "Documentos", "verification_card": { - "title": "Document Verification", - "progress": "$completed/$total Complete" + "title": "Verificación de Documentos", + "progress": "$completed/$total Completado" }, "list": { - "empty": "No documents found", + "empty": "No se encontraron documentos", "error": "Error: $message" }, "card": { - "view": "View", - "upload": "Upload", - "verified": "Verified", - "pending": "Pending", - "missing": "Missing", - "rejected": "Rejected" + "view": "Ver", + "upload": "Subir", + "verified": "Verificado", + "pending": "Pendiente", + "missing": "Faltante", + "rejected": "Rechazado" } }, "staff_certificates": { - "title": "Certificates", + "title": "Certificados", "progress": { - "title": "Your Progress", - "verified_count": "$completed of $total verified", - "active": "Compliance Active" + "title": "Tu Progreso", + "verified_count": "$completed de $total verificados", + "active": "Cumplimiento Activo" }, "card": { - "expires_in_days": "Expires in $days days - Renew now", - "expired": "Expired - Renew now", - "verified": "Verified", - "expiring_soon": "Expiring Soon", + "expires_in_days": "Expira en $days días - Renovar ahora", + "expired": "Expirado - Renovar ahora", + "verified": "Verificado", + "expiring_soon": "Expira Pronto", "exp": "Exp: $date", - "upload_button": "Upload Certificate", - "edit_expiry": "Edit Expiration Date", - "remove": "Remove Certificate", - "renew": "Renew", - "opened_snackbar": "Certificate opened in new tab" + "upload_button": "Subir Certificado", + "edit_expiry": "Editar Fecha de Expiración", + "remove": "Eliminar Certificado", + "renew": "Renovar", + "opened_snackbar": "Certificado abierto en nueva pestaña" }, "add_more": { - "title": "Add Another Certificate", - "subtitle": "Upload additional certifications" + "title": "Agregar Otro Certificado", + "subtitle": "Subir certificaciones adicionales" }, "upload_modal": { - "title": "Upload Certificate", - "expiry_label": "Expiration Date (Optional)", - "select_date": "Select date", - "upload_file": "Upload File", - "drag_drop": "Drag and drop or click to upload", - "supported_formats": "PDF, JPG, PNG up to 10MB", - "cancel": "Cancel", - "save": "Save Certificate" + "title": "Subir Certificado", + "expiry_label": "Fecha de Expiración (Opcional)", + "select_date": "Seleccionar fecha", + "upload_file": "Subir Archivo", + "drag_drop": "Arrastra y suelta o haz clic para subir", + "supported_formats": "PDF, JPG, PNG hasta 10MB", + "cancel": "Cancelar", + "save": "Guardar Certificado" }, "delete_modal": { - "title": "Remove Certificate?", - "message": "This action cannot be undone.", - "cancel": "Cancel", - "confirm": "Remove" + "title": "¿Eliminar Certificado?", + "message": "Esta acción no se puede deshacer.", + "cancel": "Cancelar", + "confirm": "Eliminar" } }, "staff_profile_attire": { @@ -677,45 +677,45 @@ } }, "staff_shifts": { - "title": "Shifts", + "title": "Turnos", "tabs": { - "my_shifts": "My Shifts", - "find_work": "Find Work" + "my_shifts": "Mis Turnos", + "find_work": "Buscar Trabajo" }, "list": { - "no_shifts": "No shifts found", - "pending_offers": "PENDING OFFERS", - "available_jobs": "$count AVAILABLE JOBS", - "search_hint": "Search jobs..." + "no_shifts": "No se encontraron turnos", + "pending_offers": "OFERTAS PENDIENTES", + "available_jobs": "$count EMPLEOS DISPONIBLES", + "search_hint": "Buscar empleos..." }, "filter": { - "all": "All Jobs", - "one_day": "One Day", - "multi_day": "Multi Day", - "long_term": "Long Term" + "all": "Todos los Empleos", + "one_day": "Un Día", + "multi_day": "Multidía", + "long_term": "Largo Plazo" }, "status": { - "confirmed": "CONFIRMED", - "act_now": "ACT NOW", - "swap_requested": "SWAP REQUESTED", - "completed": "COMPLETED", - "no_show": "NO SHOW", - "pending_warning": "Please confirm assignment" + "confirmed": "CONFIRMADO", + "act_now": "ACTÚA AHORA", + "swap_requested": "INTERCAMBIO SOLICITADO", + "completed": "COMPLETADO", + "no_show": "NO ASISTIÓ", + "pending_warning": "Por favor confirma la asignación" }, "action": { - "decline": "Decline", - "confirm": "Confirm", - "request_swap": "Request Swap" + "decline": "Rechazar", + "confirm": "Confirmar", + "request_swap": "Solicitar Intercambio" }, "details": { - "additional": "ADDITIONAL DETAILS", - "days": "$days Days", - "exp_total": "(exp.total \\$$amount)", - "pending_time": "Pending $time ago" + "additional": "DETALLES ADICIONALES", + "days": "$days Días", + "exp_total": "(total est. \\$$amount)", + "pending_time": "Pendiente hace $time" }, "tags": { - "immediate_start": "Immediate start", - "no_experience": "No experience" + "immediate_start": "Inicio inmediato", + "no_experience": "Sin experiencia" } }, "staff_time_card": { diff --git a/apps/mobile/packages/design_system/lib/src/ui_icons.dart b/apps/mobile/packages/design_system/lib/src/ui_icons.dart index 6acff6a9..d5c9b139 100644 --- a/apps/mobile/packages/design_system/lib/src/ui_icons.dart +++ b/apps/mobile/packages/design_system/lib/src/ui_icons.dart @@ -222,4 +222,7 @@ class UiIcons { /// Award icon static const IconData award = _IconLib.award; + + /// Globe icon + static const IconData globe = _IconLib.globe; } diff --git a/apps/mobile/packages/features/client/billing/lib/src/presentation/blocs/billing_bloc.dart b/apps/mobile/packages/features/client/billing/lib/src/presentation/blocs/billing_bloc.dart index fa9ad332..23b18b1f 100644 --- a/apps/mobile/packages/features/client/billing/lib/src/presentation/blocs/billing_bloc.dart +++ b/apps/mobile/packages/features/client/billing/lib/src/presentation/blocs/billing_bloc.dart @@ -1,4 +1,5 @@ import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:krow_core/core.dart'; import 'package:krow_domain/krow_domain.dart'; import '../../domain/usecases/get_current_bill_amount.dart'; import '../../domain/usecases/get_invoice_history.dart'; @@ -11,7 +12,8 @@ import 'billing_event.dart'; import 'billing_state.dart'; /// BLoC for managing billing state and data loading. -class BillingBloc extends Bloc { +class BillingBloc extends Bloc + with BlocErrorHandler { /// Creates a [BillingBloc] with the given use cases. BillingBloc({ required GetCurrentBillAmountUseCase getCurrentBillAmount, @@ -40,82 +42,82 @@ class BillingBloc extends Bloc { Emitter emit, ) async { emit(state.copyWith(status: BillingStatus.loading)); - try { - final List results = await Future.wait(>[ - _getCurrentBillAmount.call(), - _getSavingsAmount.call(), - _getPendingInvoices.call(), - _getInvoiceHistory.call(), - _getSpendingBreakdown.call(state.period), - ]); + await handleError( + emit: emit, + action: () async { + final List results = + await Future.wait(>[ + _getCurrentBillAmount.call(), + _getSavingsAmount.call(), + _getPendingInvoices.call(), + _getInvoiceHistory.call(), + _getSpendingBreakdown.call(state.period), + ]); - final double currentBill = results[0] as double; - final double savings = results[1] as double; - final List pendingInvoices = results[2] as List; - final List invoiceHistory = results[3] as List; - final List spendingItems = results[4] as List; + final double currentBill = results[0] as double; + final double savings = results[1] as double; + final List pendingInvoices = results[2] as List; + final List invoiceHistory = results[3] as List; + final List spendingItems = results[4] as List; - // Map Domain Entities to Presentation Models - final List uiPendingInvoices = pendingInvoices - .map(_mapInvoiceToUiModel) - .toList(); - final List uiInvoiceHistory = invoiceHistory - .map(_mapInvoiceToUiModel) - .toList(); - final List uiSpendingBreakdown = _mapSpendingItemsToUiModel(spendingItems); - final double periodTotal = uiSpendingBreakdown.fold( - 0.0, - (double sum, SpendingBreakdownItem item) => sum + item.amount, - ); + // Map Domain Entities to Presentation Models + final List uiPendingInvoices = + pendingInvoices.map(_mapInvoiceToUiModel).toList(); + final List uiInvoiceHistory = + invoiceHistory.map(_mapInvoiceToUiModel).toList(); + final List uiSpendingBreakdown = + _mapSpendingItemsToUiModel(spendingItems); + final double periodTotal = uiSpendingBreakdown.fold( + 0.0, + (double sum, SpendingBreakdownItem item) => sum + item.amount, + ); - emit( - state.copyWith( - status: BillingStatus.success, - currentBill: periodTotal, - savings: savings, - pendingInvoices: uiPendingInvoices, - invoiceHistory: uiInvoiceHistory, - spendingBreakdown: uiSpendingBreakdown, - ), - ); - } catch (e) { - emit( - state.copyWith( - status: BillingStatus.failure, - errorMessage: e.toString(), - ), - ); - } + emit( + state.copyWith( + status: BillingStatus.success, + currentBill: periodTotal, + savings: savings, + pendingInvoices: uiPendingInvoices, + invoiceHistory: uiInvoiceHistory, + spendingBreakdown: uiSpendingBreakdown, + ), + ); + }, + onError: (String errorKey) => state.copyWith( + status: BillingStatus.failure, + errorMessage: errorKey, + ), + ); } Future _onPeriodChanged( BillingPeriodChanged event, Emitter emit, ) async { - try { - final List spendingItems = - await _getSpendingBreakdown.call(event.period); - final List uiSpendingBreakdown = - _mapSpendingItemsToUiModel(spendingItems); - final double periodTotal = uiSpendingBreakdown.fold( - 0.0, - (double sum, SpendingBreakdownItem item) => sum + item.amount, - ); - emit( - state.copyWith( - period: event.period, - spendingBreakdown: uiSpendingBreakdown, - currentBill: periodTotal, - ), - ); - } catch (e) { - emit( - state.copyWith( - status: BillingStatus.failure, - errorMessage: e.toString(), - ), - ); - } + await handleError( + emit: emit, + action: () async { + final List spendingItems = + await _getSpendingBreakdown.call(event.period); + final List uiSpendingBreakdown = + _mapSpendingItemsToUiModel(spendingItems); + final double periodTotal = uiSpendingBreakdown.fold( + 0.0, + (double sum, SpendingBreakdownItem item) => sum + item.amount, + ); + emit( + state.copyWith( + period: event.period, + spendingBreakdown: uiSpendingBreakdown, + currentBill: periodTotal, + ), + ); + }, + onError: (String errorKey) => state.copyWith( + status: BillingStatus.failure, + errorMessage: errorKey, + ), + ); } BillingInvoice _mapInvoiceToUiModel(Invoice invoice) { diff --git a/apps/mobile/packages/features/client/client_coverage/lib/src/presentation/blocs/coverage_bloc.dart b/apps/mobile/packages/features/client/client_coverage/lib/src/presentation/blocs/coverage_bloc.dart index c218e9a5..0dc7bdaf 100644 --- a/apps/mobile/packages/features/client/client_coverage/lib/src/presentation/blocs/coverage_bloc.dart +++ b/apps/mobile/packages/features/client/client_coverage/lib/src/presentation/blocs/coverage_bloc.dart @@ -1,6 +1,7 @@ import 'package:flutter_bloc/flutter_bloc.dart'; import '../../domain/arguments/get_coverage_stats_arguments.dart'; import '../../domain/arguments/get_shifts_for_date_arguments.dart'; +import 'package:krow_core/core.dart'; import 'package:krow_domain/krow_domain.dart'; import '../../domain/usecases/get_coverage_stats_usecase.dart'; import '../../domain/usecases/get_shifts_for_date_usecase.dart'; @@ -13,14 +14,15 @@ import 'coverage_state.dart'; /// - Loading shifts for a specific date /// - Loading coverage statistics /// - Refreshing coverage data -class CoverageBloc extends Bloc { +class CoverageBloc extends Bloc + with BlocErrorHandler { /// Creates a [CoverageBloc]. CoverageBloc({ required GetShiftsForDateUseCase getShiftsForDate, required GetCoverageStatsUseCase getCoverageStats, - }) : _getShiftsForDate = getShiftsForDate, - _getCoverageStats = getCoverageStats, - super(const CoverageState()) { + }) : _getShiftsForDate = getShiftsForDate, + _getCoverageStats = getCoverageStats, + super(const CoverageState()) { on(_onLoadRequested); on(_onRefreshRequested); } @@ -40,31 +42,31 @@ class CoverageBloc extends Bloc { ), ); - try { - // Fetch shifts and stats concurrently - final List results = await Future.wait(>[ - _getShiftsForDate(GetShiftsForDateArguments(date: event.date)), - _getCoverageStats(GetCoverageStatsArguments(date: event.date)), - ]); + await handleError( + emit: emit, + action: () async { + // Fetch shifts and stats concurrently + final List results = await Future.wait(>[ + _getShiftsForDate(GetShiftsForDateArguments(date: event.date)), + _getCoverageStats(GetCoverageStatsArguments(date: event.date)), + ]); - final List shifts = results[0] as List; - final CoverageStats stats = results[1] as CoverageStats; + final List shifts = results[0] as List; + final CoverageStats stats = results[1] as CoverageStats; - emit( - state.copyWith( - status: CoverageStatus.success, - shifts: shifts, - stats: stats, - ), - ); - } catch (error) { - emit( - state.copyWith( - status: CoverageStatus.failure, - errorMessage: error.toString(), - ), - ); - } + emit( + state.copyWith( + status: CoverageStatus.success, + shifts: shifts, + stats: stats, + ), + ); + }, + onError: (String errorKey) => state.copyWith( + status: CoverageStatus.failure, + errorMessage: errorKey, + ), + ); } /// Handles the refresh requested event. @@ -78,3 +80,4 @@ class CoverageBloc extends Bloc { add(CoverageLoadRequested(date: state.selectedDate!)); } } + diff --git a/apps/mobile/packages/features/client/create_order/lib/src/data/repositories_impl/client_create_order_repository_impl.dart b/apps/mobile/packages/features/client/create_order/lib/src/data/repositories_impl/client_create_order_repository_impl.dart index f10115d6..6dceadee 100644 --- a/apps/mobile/packages/features/client/create_order/lib/src/data/repositories_impl/client_create_order_repository_impl.dart +++ b/apps/mobile/packages/features/client/create_order/lib/src/data/repositories_impl/client_create_order_repository_impl.dart @@ -128,9 +128,7 @@ class ClientCreateOrderRepositoryImpl final double rate = order.roleRates[position.role] ?? 0; final double totalValue = rate * hours * position.count; - print( - 'CreateOneTimeOrder shiftRole: start=${start.toIso8601String()} end=${normalizedEnd.toIso8601String()}', - ); + await executeProtected(() => _dataConnect .createShiftRole( diff --git a/apps/mobile/packages/features/client/create_order/lib/src/presentation/blocs/client_create_order_bloc.dart b/apps/mobile/packages/features/client/create_order/lib/src/presentation/blocs/client_create_order_bloc.dart index 4ce8b483..d5b79468 100644 --- a/apps/mobile/packages/features/client/create_order/lib/src/presentation/blocs/client_create_order_bloc.dart +++ b/apps/mobile/packages/features/client/create_order/lib/src/presentation/blocs/client_create_order_bloc.dart @@ -1,4 +1,5 @@ import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:krow_core/core.dart'; import 'package:krow_domain/krow_domain.dart'; import '../../domain/usecases/get_order_types_usecase.dart'; import 'client_create_order_event.dart'; @@ -6,7 +7,8 @@ import 'client_create_order_state.dart'; /// BLoC for managing the list of available order types. class ClientCreateOrderBloc - extends Bloc { + extends Bloc + with BlocErrorHandler { ClientCreateOrderBloc(this._getOrderTypesUseCase) : super(const ClientCreateOrderInitial()) { on(_onTypesRequested); @@ -17,7 +19,14 @@ class ClientCreateOrderBloc ClientCreateOrderTypesRequested event, Emitter emit, ) async { - final List types = await _getOrderTypesUseCase(); - emit(ClientCreateOrderLoadSuccess(types)); + await handleError( + emit: emit, + action: () async { + final List types = await _getOrderTypesUseCase(); + emit(ClientCreateOrderLoadSuccess(types)); + }, + onError: (String errorKey) => ClientCreateOrderLoadFailure(errorKey), + ); } } + diff --git a/apps/mobile/packages/features/client/create_order/lib/src/presentation/blocs/client_create_order_state.dart b/apps/mobile/packages/features/client/create_order/lib/src/presentation/blocs/client_create_order_state.dart index 5ef17693..8def2d1b 100644 --- a/apps/mobile/packages/features/client/create_order/lib/src/presentation/blocs/client_create_order_state.dart +++ b/apps/mobile/packages/features/client/create_order/lib/src/presentation/blocs/client_create_order_state.dart @@ -24,3 +24,13 @@ class ClientCreateOrderLoadSuccess extends ClientCreateOrderState { @override List get props => [orderTypes]; } + +/// State representing a failure to load order types. +class ClientCreateOrderLoadFailure extends ClientCreateOrderState { + const ClientCreateOrderLoadFailure(this.error); + + final String error; + + @override + List get props => [error]; +} diff --git a/apps/mobile/packages/features/client/create_order/lib/src/presentation/blocs/one_time_order_bloc.dart b/apps/mobile/packages/features/client/create_order/lib/src/presentation/blocs/one_time_order_bloc.dart index 65822ff3..aa6abf8b 100644 --- a/apps/mobile/packages/features/client/create_order/lib/src/presentation/blocs/one_time_order_bloc.dart +++ b/apps/mobile/packages/features/client/create_order/lib/src/presentation/blocs/one_time_order_bloc.dart @@ -1,5 +1,6 @@ import 'package:firebase_data_connect/firebase_data_connect.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:krow_core/core.dart'; import 'package:krow_data_connect/krow_data_connect.dart' as dc; import 'package:krow_domain/krow_domain.dart'; import '../../domain/arguments/one_time_order_arguments.dart'; @@ -8,7 +9,8 @@ import 'one_time_order_event.dart'; import 'one_time_order_state.dart'; /// BLoC for managing the multi-step one-time order creation form. -class OneTimeOrderBloc extends Bloc { +class OneTimeOrderBloc extends Bloc + with BlocErrorHandler { OneTimeOrderBloc(this._createOneTimeOrderUseCase, this._dataConnect) : super(OneTimeOrderState.initial()) { on(_onVendorsLoaded); @@ -29,79 +31,93 @@ class OneTimeOrderBloc extends Bloc { final dc.ExampleConnector _dataConnect; Future _loadVendors() async { - try { - final QueryResult result = await _dataConnect.listVendors().execute(); - final List vendors = result.data.vendors - .map( - (dc.ListVendorsVendors vendor) => Vendor( - id: vendor.id, - name: vendor.companyName, - rates: const {}, - ), - ) - .toList(); + final List? vendors = await handleErrorWithResult( + action: () async { + final QueryResult result = + await _dataConnect.listVendors().execute(); + return result.data.vendors + .map( + (dc.ListVendorsVendors vendor) => Vendor( + id: vendor.id, + name: vendor.companyName, + rates: const {}, + ), + ) + .toList(); + }, + onError: (_) => add(const OneTimeOrderVendorsLoaded([])), + ); + + if (vendors != null) { add(OneTimeOrderVendorsLoaded(vendors)); - } catch (_) { - add(const OneTimeOrderVendorsLoaded([])); } } - Future _loadRolesForVendor(String vendorId) async { - try { - final QueryResult result = await _dataConnect.listRolesByVendorId( - vendorId: vendorId, - ).execute(); - final List roles = result.data.roles - .map( - (dc.ListRolesByVendorIdRoles role) => OneTimeOrderRoleOption( - id: role.id, - name: role.name, - costPerHour: role.costPerHour, - ), - ) - .toList(); + Future _loadRolesForVendor(String vendorId, Emitter emit) async { + final List? roles = await handleErrorWithResult( + action: () async { + final QueryResult + result = await _dataConnect.listRolesByVendorId(vendorId: vendorId).execute(); + return result.data.roles + .map( + (dc.ListRolesByVendorIdRoles role) => OneTimeOrderRoleOption( + id: role.id, + name: role.name, + costPerHour: role.costPerHour, + ), + ) + .toList(); + }, + onError: (_) => emit(state.copyWith(roles: const [])), + ); + + if (roles != null) { emit(state.copyWith(roles: roles)); - } catch (_) { - emit(state.copyWith(roles: const [])); } } Future _loadHubs() async { - try { - final String? businessId = dc.ClientSessionStore.instance.session?.business?.id; - if (businessId == null || businessId.isEmpty) { - add(const OneTimeOrderHubsLoaded([])); - return; - } - final QueryResult - result = await _dataConnect.listTeamHubsByOwnerId(ownerId: businessId).execute(); - final List hubs = result.data.teamHubs - .map( - (dc.ListTeamHubsByOwnerIdTeamHubs hub) => OneTimeOrderHubOption( - id: hub.id, - name: hub.hubName, - address: hub.address, - placeId: hub.placeId, - latitude: hub.latitude, - longitude: hub.longitude, - city: hub.city, - state: hub.state, - street: hub.street, - country: hub.country, - zipCode: hub.zipCode, - ), - ) - .toList(); + final List? hubs = await handleErrorWithResult( + action: () async { + final String? businessId = + dc.ClientSessionStore.instance.session?.business?.id; + if (businessId == null || businessId.isEmpty) { + return []; + } + final QueryResult + result = await _dataConnect + .listTeamHubsByOwnerId(ownerId: businessId) + .execute(); + return result.data.teamHubs + .map( + (dc.ListTeamHubsByOwnerIdTeamHubs hub) => OneTimeOrderHubOption( + id: hub.id, + name: hub.hubName, + address: hub.address, + placeId: hub.placeId, + latitude: hub.latitude, + longitude: hub.longitude, + city: hub.city, + state: hub.state, + street: hub.street, + country: hub.country, + zipCode: hub.zipCode, + ), + ) + .toList(); + }, + onError: (_) => add(const OneTimeOrderHubsLoaded([])), + ); + + if (hubs != null) { add(OneTimeOrderHubsLoaded(hubs)); - } catch (_) { - add(const OneTimeOrderHubsLoaded([])); } } - void _onVendorsLoaded( + Future _onVendorsLoaded( OneTimeOrderVendorsLoaded event, Emitter emit, - ) { + ) async { final Vendor? selectedVendor = event.vendors.isNotEmpty ? event.vendors.first : null; emit( @@ -111,16 +127,16 @@ class OneTimeOrderBloc extends Bloc { ), ); if (selectedVendor != null) { - _loadRolesForVendor(selectedVendor.id); + await _loadRolesForVendor(selectedVendor.id, emit); } } - void _onVendorChanged( + Future _onVendorChanged( OneTimeOrderVendorChanged event, Emitter emit, - ) { + ) async { emit(state.copyWith(selectedVendor: event.vendor)); - _loadRolesForVendor(event.vendor.id); + await _loadRolesForVendor(event.vendor.id, emit); } void _onHubsLoaded( @@ -207,44 +223,45 @@ class OneTimeOrderBloc extends Bloc { Emitter emit, ) async { emit(state.copyWith(status: OneTimeOrderStatus.loading)); - try { - final Map roleRates = { - for (final OneTimeOrderRoleOption role in state.roles) role.id: role.costPerHour, - }; - final OneTimeOrderHubOption? selectedHub = state.selectedHub; - if (selectedHub == null) { - throw Exception('Hub is missing.'); - } - final OneTimeOrder order = OneTimeOrder( - date: state.date, - location: selectedHub.name, - positions: state.positions, - hub: OneTimeOrderHubDetails( - id: selectedHub.id, - name: selectedHub.name, - address: selectedHub.address, - placeId: selectedHub.placeId, - latitude: selectedHub.latitude, - longitude: selectedHub.longitude, - city: selectedHub.city, - state: selectedHub.state, - street: selectedHub.street, - country: selectedHub.country, - zipCode: selectedHub.zipCode, - ), - eventName: state.eventName, - vendorId: state.selectedVendor?.id, - roleRates: roleRates, - ); - await _createOneTimeOrderUseCase(OneTimeOrderArguments(order: order)); - emit(state.copyWith(status: OneTimeOrderStatus.success)); - } catch (e) { - emit( - state.copyWith( - status: OneTimeOrderStatus.failure, - errorMessage: e.toString(), - ), - ); - } + await handleError( + emit: emit, + action: () async { + final Map roleRates = { + for (final OneTimeOrderRoleOption role in state.roles) + role.id: role.costPerHour, + }; + final OneTimeOrderHubOption? selectedHub = state.selectedHub; + if (selectedHub == null) { + throw const OrderMissingHubException(); + } + final OneTimeOrder order = OneTimeOrder( + date: state.date, + location: selectedHub.name, + positions: state.positions, + hub: OneTimeOrderHubDetails( + id: selectedHub.id, + name: selectedHub.name, + address: selectedHub.address, + placeId: selectedHub.placeId, + latitude: selectedHub.latitude, + longitude: selectedHub.longitude, + city: selectedHub.city, + state: selectedHub.state, + street: selectedHub.street, + country: selectedHub.country, + zipCode: selectedHub.zipCode, + ), + eventName: state.eventName, + vendorId: state.selectedVendor?.id, + roleRates: roleRates, + ); + await _createOneTimeOrderUseCase(OneTimeOrderArguments(order: order)); + emit(state.copyWith(status: OneTimeOrderStatus.success)); + }, + onError: (String errorKey) => state.copyWith( + status: OneTimeOrderStatus.failure, + errorMessage: errorKey, + ), + ); } } diff --git a/apps/mobile/packages/features/client/create_order/lib/src/presentation/blocs/rapid_order_bloc.dart b/apps/mobile/packages/features/client/create_order/lib/src/presentation/blocs/rapid_order_bloc.dart index 4f3e6874..cfb3860b 100644 --- a/apps/mobile/packages/features/client/create_order/lib/src/presentation/blocs/rapid_order_bloc.dart +++ b/apps/mobile/packages/features/client/create_order/lib/src/presentation/blocs/rapid_order_bloc.dart @@ -1,11 +1,13 @@ import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:krow_core/core.dart'; import '../../domain/arguments/rapid_order_arguments.dart'; import '../../domain/usecases/create_rapid_order_usecase.dart'; import 'rapid_order_event.dart'; import 'rapid_order_state.dart'; /// BLoC for managing the rapid (urgent) order creation flow. -class RapidOrderBloc extends Bloc { +class RapidOrderBloc extends Bloc + with BlocErrorHandler { RapidOrderBloc(this._createRapidOrderUseCase) : super( const RapidOrderInitial( @@ -64,19 +66,18 @@ class RapidOrderBloc extends Bloc { final RapidOrderState currentState = state; if (currentState is RapidOrderInitial) { final String message = currentState.message; - print('RapidOrder submit: message="$message"'); emit(const RapidOrderSubmitting()); - try { - await _createRapidOrderUseCase( - RapidOrderArguments(description: message), - ); - print('RapidOrder submit: success'); - emit(const RapidOrderSuccess()); - } catch (e) { - print('RapidOrder submit: error=$e'); - emit(RapidOrderFailure(e.toString())); - } + await handleError( + emit: emit, + action: () async { + await _createRapidOrderUseCase( + RapidOrderArguments(description: message), + ); + emit(const RapidOrderSuccess()); + }, + onError: (String errorKey) => RapidOrderFailure(errorKey), + ); } } @@ -90,3 +91,4 @@ class RapidOrderBloc extends Bloc { } } } + diff --git a/apps/mobile/packages/features/client/home/lib/src/presentation/blocs/client_home_bloc.dart b/apps/mobile/packages/features/client/home/lib/src/presentation/blocs/client_home_bloc.dart index fb844f76..c1e3fefc 100644 --- a/apps/mobile/packages/features/client/home/lib/src/presentation/blocs/client_home_bloc.dart +++ b/apps/mobile/packages/features/client/home/lib/src/presentation/blocs/client_home_bloc.dart @@ -1,5 +1,6 @@ import 'package:client_home/src/domain/repositories/home_repository_interface.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:krow_core/core.dart'; import 'package:krow_domain/krow_domain.dart'; import '../../domain/usecases/get_dashboard_data_usecase.dart'; import '../../domain/usecases/get_recent_reorders_usecase.dart'; @@ -8,8 +9,8 @@ import 'client_home_event.dart'; import 'client_home_state.dart'; /// BLoC responsible for managing the state and business logic of the client home dashboard. -class ClientHomeBloc extends Bloc { - +class ClientHomeBloc extends Bloc + with BlocErrorHandler { ClientHomeBloc({ required GetDashboardDataUseCase getDashboardDataUseCase, required GetRecentReordersUseCase getRecentReordersUseCase, @@ -35,31 +36,31 @@ class ClientHomeBloc extends Bloc { Emitter emit, ) async { emit(state.copyWith(status: ClientHomeStatus.loading)); - try { - // Get session data - final UserSessionData sessionData = _getUserSessionDataUseCase(); + await handleError( + emit: emit, + action: () async { + // Get session data + final UserSessionData sessionData = _getUserSessionDataUseCase(); - // Get dashboard data - final HomeDashboardData data = await _getDashboardDataUseCase(); - final List reorderItems = await _getRecentReordersUseCase(); + // Get dashboard data + final HomeDashboardData data = await _getDashboardDataUseCase(); + final List reorderItems = await _getRecentReordersUseCase(); - emit( - state.copyWith( - status: ClientHomeStatus.success, - dashboardData: data, - reorderItems: reorderItems, - businessName: sessionData.businessName, - photoUrl: sessionData.photoUrl, - ), - ); - } catch (e) { - emit( - state.copyWith( - status: ClientHomeStatus.error, - errorMessage: e.toString(), - ), - ); - } + emit( + state.copyWith( + status: ClientHomeStatus.success, + dashboardData: data, + reorderItems: reorderItems, + businessName: sessionData.businessName, + photoUrl: sessionData.photoUrl, + ), + ); + }, + onError: (String errorKey) => state.copyWith( + status: ClientHomeStatus.error, + errorMessage: errorKey, + ), + ); } void _onEditModeToggled( @@ -73,7 +74,8 @@ class ClientHomeBloc extends Bloc { ClientHomeWidgetVisibilityToggled event, Emitter emit, ) { - final Map newVisibility = Map.from(state.widgetVisibility); + final Map newVisibility = + Map.from(state.widgetVisibility); newVisibility[event.widgetId] = !(newVisibility[event.widgetId] ?? true); emit(state.copyWith(widgetVisibility: newVisibility)); } @@ -119,3 +121,4 @@ class ClientHomeBloc extends Bloc { ); } } + diff --git a/apps/mobile/packages/features/client/settings/lib/src/presentation/blocs/client_settings_bloc.dart b/apps/mobile/packages/features/client/settings/lib/src/presentation/blocs/client_settings_bloc.dart index 25298faa..7f2506b0 100644 --- a/apps/mobile/packages/features/client/settings/lib/src/presentation/blocs/client_settings_bloc.dart +++ b/apps/mobile/packages/features/client/settings/lib/src/presentation/blocs/client_settings_bloc.dart @@ -1,13 +1,14 @@ import 'package:equatable/equatable.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:krow_core/core.dart'; import '../../domain/usecases/sign_out_usecase.dart'; part 'client_settings_event.dart'; part 'client_settings_state.dart'; /// BLoC to manage client settings and profile state. -class ClientSettingsBloc - extends Bloc { +class ClientSettingsBloc extends Bloc + with BlocErrorHandler { final SignOutUseCase _signOutUseCase; ClientSettingsBloc({required SignOutUseCase signOutUseCase}) @@ -21,11 +22,14 @@ class ClientSettingsBloc Emitter emit, ) async { emit(const ClientSettingsLoading()); - try { - await _signOutUseCase(); - emit(const ClientSettingsSignOutSuccess()); - } catch (e) { - emit(ClientSettingsError(e.toString())); - } + await handleError( + emit: emit, + action: () async { + await _signOutUseCase(); + emit(const ClientSettingsSignOutSuccess()); + }, + onError: (String errorKey) => ClientSettingsError(errorKey), + ); } } + diff --git a/apps/mobile/packages/features/client/view_orders/lib/src/presentation/blocs/view_orders_cubit.dart b/apps/mobile/packages/features/client/view_orders/lib/src/presentation/blocs/view_orders_cubit.dart index a413e494..79a136bd 100644 --- a/apps/mobile/packages/features/client/view_orders/lib/src/presentation/blocs/view_orders_cubit.dart +++ b/apps/mobile/packages/features/client/view_orders/lib/src/presentation/blocs/view_orders_cubit.dart @@ -1,5 +1,6 @@ import 'package:intl/intl.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:krow_core/core.dart'; import 'package:krow_domain/krow_domain.dart'; import '../../domain/arguments/orders_day_arguments.dart'; import '../../domain/arguments/orders_range_arguments.dart'; @@ -10,14 +11,14 @@ import 'view_orders_state.dart'; /// Cubit for managing the state of the View Orders feature. /// /// This Cubit handles loading orders, date selection, and tab filtering. -class ViewOrdersCubit extends Cubit { +class ViewOrdersCubit extends Cubit + with BlocErrorHandler { ViewOrdersCubit({ required GetOrdersUseCase getOrdersUseCase, required GetAcceptedApplicationsForDayUseCase getAcceptedAppsUseCase, - }) - : _getOrdersUseCase = getOrdersUseCase, - _getAcceptedAppsUseCase = getAcceptedAppsUseCase, - super(ViewOrdersState(selectedDate: DateTime.now())) { + }) : _getOrdersUseCase = getOrdersUseCase, + _getAcceptedAppsUseCase = getAcceptedAppsUseCase, + super(ViewOrdersState(selectedDate: DateTime.now())) { _init(); } @@ -36,30 +37,33 @@ class ViewOrdersCubit extends Cubit { }) async { final int requestId = ++_requestId; emit(state.copyWith(status: ViewOrdersStatus.loading)); - try { - final List orders = await _getOrdersUseCase( - OrdersRangeArguments(start: rangeStart, end: rangeEnd), - ); - final Map>> apps = await _getAcceptedAppsUseCase( - OrdersDayArguments(day: dayForApps), - ); - final List updatedOrders = _applyApplications(orders, apps); - if (requestId != _requestId) { - return; - } - emit( - state.copyWith( - status: ViewOrdersStatus.success, - orders: updatedOrders, - ), - ); - _updateDerivedState(); - } catch (_) { - if (requestId != _requestId) { - return; - } - emit(state.copyWith(status: ViewOrdersStatus.failure)); - } + + await handleError( + emit: (ViewOrdersState s) { + if (requestId == _requestId) emit(s); + }, + action: () async { + final List orders = await _getOrdersUseCase( + OrdersRangeArguments(start: rangeStart, end: rangeEnd), + ); + final Map>> apps = + await _getAcceptedAppsUseCase(OrdersDayArguments(day: dayForApps)); + + if (requestId != _requestId) { + return; + } + + final List updatedOrders = _applyApplications(orders, apps); + emit( + state.copyWith( + status: ViewOrdersStatus.success, + orders: updatedOrders, + ), + ); + _updateDerivedState(); + }, + onError: (String _) => state.copyWith(status: ViewOrdersStatus.failure), + ); } void selectDate(DateTime date) { @@ -78,7 +82,9 @@ class ViewOrdersCubit extends Cubit { final DateTime? selectedDate = state.selectedDate; final DateTime updatedSelectedDate = selectedDate != null && - calendarDays.any((DateTime day) => _isSameDay(day, selectedDate)) + calendarDays.any( + (DateTime day) => _isSameDay(day, selectedDate), + ) ? selectedDate : calendarDays.first; emit( @@ -135,17 +141,21 @@ class ViewOrdersCubit extends Cubit { } Future _refreshAcceptedApplications(DateTime day) async { - try { - final Map>> apps = await _getAcceptedAppsUseCase( - OrdersDayArguments(day: day), - ); - final List updatedOrders = - _applyApplications(state.orders, apps); - emit(state.copyWith(orders: updatedOrders)); - _updateDerivedState(); - } catch (_) { - // Keep existing data on failure. - } + await handleErrorWithResult( + action: () async { + final Map>> apps = + await _getAcceptedAppsUseCase(OrdersDayArguments(day: day)); + final List updatedOrders = _applyApplications( + state.orders, + apps, + ); + emit(state.copyWith(orders: updatedOrders)); + _updateDerivedState(); + }, + onError: (_) { + // Keep existing data on failure, just log error via handleErrorWithResult + }, + ); } List _applyApplications( @@ -153,7 +163,8 @@ class ViewOrdersCubit extends Cubit { Map>> apps, ) { return orders.map((OrderItem order) { - final List> confirmed = apps[order.id] ?? const >[]; + final List> confirmed = + apps[order.id] ?? const >[]; if (confirmed.isEmpty) { return order; } @@ -209,9 +220,10 @@ class ViewOrdersCubit extends Cubit { ).format(state.selectedDate!); // Filter by date - final List ordersOnDate = state.orders - .where((OrderItem s) => s.date == selectedDateStr) - .toList(); + final List ordersOnDate = + state.orders + .where((OrderItem s) => s.date == selectedDateStr) + .toList(); // Sort by start time ordersOnDate.sort( @@ -219,30 +231,38 @@ class ViewOrdersCubit extends Cubit { ); if (state.filterTab == 'all') { - final List filtered = ordersOnDate - .where( - (OrderItem s) => - // TODO(orders): move PENDING to its own tab once available. - ['OPEN', 'FILLED', 'CONFIRMED', 'PENDING', 'ASSIGNED'] - .contains(s.status), - ) - .toList(); + final List filtered = + ordersOnDate + .where( + (OrderItem s) => + // TODO(orders): move PENDING to its own tab once available. + [ + 'OPEN', + 'FILLED', + 'CONFIRMED', + 'PENDING', + 'ASSIGNED', + ].contains(s.status), + ) + .toList(); print( 'ViewOrders tab=all statuses=${ordersOnDate.map((OrderItem s) => s.status).toList()} filtered=${filtered.length}', ); return filtered; } else if (state.filterTab == 'active') { - final List filtered = ordersOnDate - .where((OrderItem s) => s.status == 'IN_PROGRESS') - .toList(); + final List filtered = + ordersOnDate + .where((OrderItem s) => s.status == 'IN_PROGRESS') + .toList(); print( 'ViewOrders tab=active statuses=${ordersOnDate.map((OrderItem s) => s.status).toList()} filtered=${filtered.length}', ); return filtered; } else if (state.filterTab == 'completed') { - final List filtered = ordersOnDate - .where((OrderItem s) => s.status == 'COMPLETED') - .toList(); + final List filtered = + ordersOnDate + .where((OrderItem s) => s.status == 'COMPLETED') + .toList(); print( 'ViewOrders tab=completed statuses=${ordersOnDate.map((OrderItem s) => s.status).toList()} filtered=${filtered.length}', ); @@ -260,11 +280,17 @@ class ViewOrdersCubit extends Cubit { if (category == 'active') { return state.orders - .where((OrderItem s) => s.date == selectedDateStr && s.status == 'IN_PROGRESS') + .where( + (OrderItem s) => + s.date == selectedDateStr && s.status == 'IN_PROGRESS', + ) .length; } else if (category == 'completed') { return state.orders - .where((OrderItem s) => s.date == selectedDateStr && s.status == 'COMPLETED') + .where( + (OrderItem s) => + s.date == selectedDateStr && s.status == 'COMPLETED', + ) .length; } return 0; @@ -281,9 +307,15 @@ class ViewOrdersCubit extends Cubit { .where( (OrderItem s) => s.date == selectedDateStr && - ['OPEN', 'FILLED', 'CONFIRMED', 'PENDING', 'ASSIGNED'] - .contains(s.status), + [ + 'OPEN', + 'FILLED', + 'CONFIRMED', + 'PENDING', + 'ASSIGNED', + ].contains(s.status), ) .length; } } + diff --git a/apps/mobile/packages/features/staff/authentication/lib/src/presentation/blocs/auth_bloc.dart b/apps/mobile/packages/features/staff/authentication/lib/src/presentation/blocs/auth_bloc.dart index b3718543..cf392d1b 100644 --- a/apps/mobile/packages/features/staff/authentication/lib/src/presentation/blocs/auth_bloc.dart +++ b/apps/mobile/packages/features/staff/authentication/lib/src/presentation/blocs/auth_bloc.dart @@ -1,6 +1,7 @@ import 'dart:async'; import 'package:flutter_modular/flutter_modular.dart'; import 'package:bloc/bloc.dart'; +import 'package:krow_core/core.dart'; import 'package:krow_domain/krow_domain.dart'; import '../../domain/arguments/sign_in_with_phone_arguments.dart'; import '../../domain/arguments/verify_otp_arguments.dart'; @@ -10,7 +11,9 @@ import 'auth_event.dart'; import 'auth_state.dart'; /// BLoC responsible for handling authentication logic. -class AuthBloc extends Bloc implements Disposable { +class AuthBloc extends Bloc + with BlocErrorHandler + implements Disposable { /// The use case for signing in with a phone number. final SignInWithPhoneUseCase _signInUseCase; @@ -84,7 +87,8 @@ class AuthBloc extends Bloc implements Disposable { status: AuthStatus.error, mode: event.mode, phoneNumber: event.phoneNumber ?? state.phoneNumber, - errorMessage: 'Please wait ${remaining}s before requesting a new code.', + errorMessage: + 'Please wait ${remaining}s before requesting a new code.', cooldownSecondsRemaining: remaining, ), ); @@ -105,39 +109,40 @@ class AuthBloc extends Bloc implements Disposable { cooldownSecondsRemaining: 0, ), ); - try { - final String? verificationId = await _signInUseCase( - SignInWithPhoneArguments( - phoneNumber: event.phoneNumber ?? state.phoneNumber, - ), - ); - if (token != _requestToken) return; - emit( - state.copyWith( - status: AuthStatus.codeSent, - verificationId: verificationId, - cooldownSecondsRemaining: 0, - ), - ); - } catch (e) { - if (token != _requestToken) return; - emit( - state.copyWith( + + await handleError( + emit: emit, + action: () async { + final String? verificationId = await _signInUseCase( + SignInWithPhoneArguments( + phoneNumber: event.phoneNumber ?? state.phoneNumber, + ), + ); + if (token != _requestToken) return; + emit( + state.copyWith( + status: AuthStatus.codeSent, + verificationId: verificationId, + cooldownSecondsRemaining: 0, + ), + ); + }, + onError: (String errorKey) { + if (token != _requestToken) return state; + return state.copyWith( status: AuthStatus.error, - errorMessage: e.toString(), + errorMessage: errorKey, cooldownSecondsRemaining: 0, - ), - ); - } + ); + }, + ); } void _onCooldownTicked( AuthCooldownTicked event, Emitter emit, ) { - print('Auth cooldown tick: ${event.secondsRemaining}'); if (event.secondsRemaining <= 0) { - print('Auth cooldown finished: clearing message'); _cancelCooldownTimer(); _cooldownUntil = null; emit( @@ -166,11 +171,9 @@ class AuthBloc extends Bloc implements Disposable { add(AuthCooldownTicked(remaining)); _cooldownTimer = Timer.periodic(const Duration(seconds: 1), (Timer timer) { remaining -= 1; - print('Auth cooldown timer: remaining=$remaining'); if (remaining <= 0) { timer.cancel(); _cooldownTimer = null; - print('Auth cooldown timer: reached 0, emitting tick'); add(const AuthCooldownTicked(0)); return; } @@ -183,27 +186,29 @@ class AuthBloc extends Bloc implements Disposable { _cooldownTimer = null; } - /// Handles OTP submission and verification. Future _onOtpSubmitted( AuthOtpSubmitted event, Emitter emit, ) async { emit(state.copyWith(status: AuthStatus.loading)); - try { - final User? user = await _verifyOtpUseCase( - VerifyOtpArguments( - verificationId: event.verificationId, - smsCode: event.smsCode, - mode: event.mode, - ), - ); - emit(state.copyWith(status: AuthStatus.authenticated, user: user)); - } catch (e) { - emit( - state.copyWith(status: AuthStatus.error, errorMessage: e.toString()), - ); - } + await handleError( + emit: emit, + action: () async { + final User? user = await _verifyOtpUseCase( + VerifyOtpArguments( + verificationId: event.verificationId, + smsCode: event.smsCode, + mode: event.mode, + ), + ); + emit(state.copyWith(status: AuthStatus.authenticated, user: user)); + }, + onError: (String errorKey) => state.copyWith( + status: AuthStatus.error, + errorMessage: errorKey, + ), + ); } /// Disposes the BLoC resources. @@ -213,3 +218,4 @@ class AuthBloc extends Bloc implements Disposable { close(); } } + diff --git a/apps/mobile/packages/features/staff/authentication/lib/src/presentation/blocs/profile_setup/profile_setup_bloc.dart b/apps/mobile/packages/features/staff/authentication/lib/src/presentation/blocs/profile_setup/profile_setup_bloc.dart index 6d8d80b3..67a04394 100644 --- a/apps/mobile/packages/features/staff/authentication/lib/src/presentation/blocs/profile_setup/profile_setup_bloc.dart +++ b/apps/mobile/packages/features/staff/authentication/lib/src/presentation/blocs/profile_setup/profile_setup_bloc.dart @@ -1,4 +1,5 @@ import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:krow_core/core.dart'; import '../../../domain/usecases/submit_profile_setup_usecase.dart'; import '../../../domain/usecases/search_cities_usecase.dart'; @@ -10,7 +11,8 @@ export 'profile_setup_event.dart'; export 'profile_setup_state.dart'; /// BLoC responsible for managing the profile setup state and logic. -class ProfileSetupBloc extends Bloc { +class ProfileSetupBloc extends Bloc + with BlocErrorHandler { ProfileSetupBloc({ required SubmitProfileSetup submitProfileSetup, required SearchCitiesUseCase searchCities, @@ -86,25 +88,25 @@ class ProfileSetupBloc extends Bloc { ) async { emit(state.copyWith(status: ProfileSetupStatus.loading)); - try { - await _submitProfileSetup( - fullName: state.fullName, - bio: state.bio.isEmpty ? null : state.bio, - preferredLocations: state.preferredLocations, - maxDistanceMiles: state.maxDistanceMiles, - industries: state.industries, - skills: state.skills, - ); + await handleError( + emit: emit, + action: () async { + await _submitProfileSetup( + fullName: state.fullName, + bio: state.bio.isEmpty ? null : state.bio, + preferredLocations: state.preferredLocations, + maxDistanceMiles: state.maxDistanceMiles, + industries: state.industries, + skills: state.skills, + ); - emit(state.copyWith(status: ProfileSetupStatus.success)); - } catch (e) { - emit( - state.copyWith( - status: ProfileSetupStatus.failure, - errorMessage: e.toString(), - ), - ); - } + emit(state.copyWith(status: ProfileSetupStatus.success)); + }, + onError: (String errorKey) => state.copyWith( + status: ProfileSetupStatus.failure, + errorMessage: errorKey, + ), + ); } Future _onLocationQueryChanged( @@ -116,6 +118,8 @@ class ProfileSetupBloc extends Bloc { return; } + // For search, we might want to handle errors silently or distinctively + // Using simple try-catch here as it's a search-as-you-type feature where error dialogs are intrusive try { final results = await _searchCities(event.query); emit(state.copyWith(locationSuggestions: results)); @@ -132,3 +136,4 @@ class ProfileSetupBloc extends Bloc { emit(state.copyWith(locationSuggestions: [])); } } + diff --git a/apps/mobile/packages/features/staff/availability/lib/src/presentation/blocs/availability_bloc.dart b/apps/mobile/packages/features/staff/availability/lib/src/presentation/blocs/availability_bloc.dart index 2e1f32a3..62bd200a 100644 --- a/apps/mobile/packages/features/staff/availability/lib/src/presentation/blocs/availability_bloc.dart +++ b/apps/mobile/packages/features/staff/availability/lib/src/presentation/blocs/availability_bloc.dart @@ -2,10 +2,12 @@ import 'package:flutter_bloc/flutter_bloc.dart'; import '../../domain/usecases/apply_quick_set_usecase.dart'; import '../../domain/usecases/get_weekly_availability_usecase.dart'; import '../../domain/usecases/update_day_availability_usecase.dart'; +import 'package:krow_core/core.dart'; import 'availability_event.dart'; import 'availability_state.dart'; -class AvailabilityBloc extends Bloc { +class AvailabilityBloc extends Bloc + with BlocErrorHandler { final GetWeeklyAvailabilityUseCase getWeeklyAvailability; final UpdateDayAvailabilityUseCase updateDayAvailability; final ApplyQuickSetUseCase applyQuickSet; @@ -28,27 +30,34 @@ class AvailabilityBloc extends Bloc { Emitter emit, ) async { emit(AvailabilityLoading()); - try { - final days = await getWeeklyAvailability( - GetWeeklyAvailabilityParams(event.weekStart)); - emit(AvailabilityLoaded( - days: days, - currentWeekStart: event.weekStart, - selectedDate: event.preselectedDate ?? - (days.isNotEmpty ? days.first.date : DateTime.now()), - )); - } catch (e) { - emit(AvailabilityError(e.toString())); - } + await handleError( + emit: emit, + action: () async { + final days = await getWeeklyAvailability( + GetWeeklyAvailabilityParams(event.weekStart), + ); + emit( + AvailabilityLoaded( + days: days, + currentWeekStart: event.weekStart, + selectedDate: event.preselectedDate ?? + (days.isNotEmpty ? days.first.date : DateTime.now()), + ), + ); + }, + onError: (String errorKey) => AvailabilityError(errorKey), + ); } void _onSelectDate(SelectDate event, Emitter emit) { if (state is AvailabilityLoaded) { // Clear success message on navigation - emit((state as AvailabilityLoaded).copyWith( - selectedDate: event.date, - clearSuccessMessage: true, - )); + emit( + (state as AvailabilityLoaded).copyWith( + selectedDate: event.date, + clearSuccessMessage: true, + ), + ); } } @@ -58,14 +67,17 @@ class AvailabilityBloc extends Bloc { ) async { if (state is AvailabilityLoaded) { final currentState = state as AvailabilityLoaded; - + // Clear message emit(currentState.copyWith(clearSuccessMessage: true)); - final newWeekStart = currentState.currentWeekStart - .add(Duration(days: event.direction * 7)); - - final diff = currentState.selectedDate.difference(currentState.currentWeekStart).inDays; + final newWeekStart = currentState.currentWeekStart.add( + Duration(days: event.direction * 7), + ); + + final diff = currentState.selectedDate + .difference(currentState.currentWeekStart) + .inDays; final newSelectedDate = newWeekStart.add(Duration(days: diff)); add(LoadAvailability(newWeekStart, preselectedDate: newSelectedDate)); @@ -78,7 +90,7 @@ class AvailabilityBloc extends Bloc { ) async { if (state is AvailabilityLoaded) { final currentState = state as AvailabilityLoaded; - + final newDay = event.day.copyWith(isAvailable: !event.day.isAvailable); final updatedDays = currentState.days.map((d) { return d.date == event.day.date ? newDay : d; @@ -90,18 +102,29 @@ class AvailabilityBloc extends Bloc { clearSuccessMessage: true, )); - try { - await updateDayAvailability(UpdateDayAvailabilityParams(newDay)); - // Success feedback - if (state is AvailabilityLoaded) { - emit((state as AvailabilityLoaded).copyWith(successMessage: 'Availability updated')); - } - } catch (e) { - // Revert - if (state is AvailabilityLoaded) { - emit((state as AvailabilityLoaded).copyWith(days: currentState.days)); - } - } + await handleError( + emit: emit, + action: () async { + await updateDayAvailability(UpdateDayAvailabilityParams(newDay)); + // Success feedback + if (state is AvailabilityLoaded) { + emit( + (state as AvailabilityLoaded).copyWith( + successMessage: 'Availability updated', + ), + ); + } + }, + onError: (String errorKey) { + // Revert + if (state is AvailabilityLoaded) { + return (state as AvailabilityLoaded).copyWith( + days: currentState.days, + ); + } + return AvailabilityError(errorKey); + }, + ); } } @@ -120,7 +143,7 @@ class AvailabilityBloc extends Bloc { }).toList(); final newDay = event.day.copyWith(slots: updatedSlots); - + final updatedDays = currentState.days.map((d) { return d.date == event.day.date ? newDay : d; }).toList(); @@ -131,18 +154,29 @@ class AvailabilityBloc extends Bloc { clearSuccessMessage: true, )); - try { - await updateDayAvailability(UpdateDayAvailabilityParams(newDay)); - // Success feedback - if (state is AvailabilityLoaded) { - emit((state as AvailabilityLoaded).copyWith(successMessage: 'Availability updated')); - } - } catch (e) { - // Revert - if (state is AvailabilityLoaded) { - emit((state as AvailabilityLoaded).copyWith(days: currentState.days)); - } - } + await handleError( + emit: emit, + action: () async { + await updateDayAvailability(UpdateDayAvailabilityParams(newDay)); + // Success feedback + if (state is AvailabilityLoaded) { + emit( + (state as AvailabilityLoaded).copyWith( + successMessage: 'Availability updated', + ), + ); + } + }, + onError: (String errorKey) { + // Revert + if (state is AvailabilityLoaded) { + return (state as AvailabilityLoaded).copyWith( + days: currentState.days, + ); + } + return AvailabilityError(errorKey); + }, + ); } } @@ -152,28 +186,39 @@ class AvailabilityBloc extends Bloc { ) async { if (state is AvailabilityLoaded) { final currentState = state as AvailabilityLoaded; - - emit(currentState.copyWith( - isActionInProgress: true, - clearSuccessMessage: true, - )); - - try { - final newDays = await applyQuickSet( - ApplyQuickSetParams(currentState.currentWeekStart, event.type)); - - emit(currentState.copyWith( - days: newDays, - isActionInProgress: false, - successMessage: 'Availability updated', - )); - } catch (e) { - emit(currentState.copyWith( - isActionInProgress: false, - // Could set error message here if we had a field for it, or emit AvailabilityError - // But emitting AvailabilityError would replace the whole screen. - )); - } + + emit( + currentState.copyWith( + isActionInProgress: true, + clearSuccessMessage: true, + ), + ); + + await handleError( + emit: emit, + action: () async { + final newDays = await applyQuickSet( + ApplyQuickSetParams(currentState.currentWeekStart, event.type), + ); + + emit( + currentState.copyWith( + days: newDays, + isActionInProgress: false, + successMessage: 'Availability updated', + ), + ); + }, + onError: (String errorKey) { + if (state is AvailabilityLoaded) { + return (state as AvailabilityLoaded).copyWith( + isActionInProgress: false, + ); + } + return AvailabilityError(errorKey); + }, + ); } } } + diff --git a/apps/mobile/packages/features/staff/clock_in/lib/src/presentation/bloc/clock_in_bloc.dart b/apps/mobile/packages/features/staff/clock_in/lib/src/presentation/bloc/clock_in_bloc.dart index 270e296d..acbb57ee 100644 --- a/apps/mobile/packages/features/staff/clock_in/lib/src/presentation/bloc/clock_in_bloc.dart +++ b/apps/mobile/packages/features/staff/clock_in/lib/src/presentation/bloc/clock_in_bloc.dart @@ -1,5 +1,6 @@ import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:geolocator/geolocator.dart'; +import 'package:krow_core/core.dart'; import 'package:krow_domain/krow_domain.dart'; import '../../domain/usecases/get_todays_shift_usecase.dart'; import '../../domain/usecases/get_attendance_status_usecase.dart'; @@ -10,8 +11,8 @@ import '../../domain/arguments/clock_out_arguments.dart'; import 'clock_in_event.dart'; import 'clock_in_state.dart'; -class ClockInBloc extends Bloc { - +class ClockInBloc extends Bloc + with BlocErrorHandler { ClockInBloc({ required GetTodaysShiftUseCase getTodaysShift, required GetAttendanceStatusUseCase getAttendanceStatus, @@ -47,92 +48,105 @@ class ClockInBloc extends Bloc { Emitter emit, ) async { emit(state.copyWith(status: ClockInStatus.loading)); - try { - final List shifts = await _getTodaysShift(); - final AttendanceStatus status = await _getAttendanceStatus(); + await handleError( + emit: emit, + action: () async { + final List shifts = await _getTodaysShift(); + final AttendanceStatus status = await _getAttendanceStatus(); - // Check permissions silently on load? Maybe better to wait for user interaction or specific event - // However, if shift exists, we might want to check permission state - Shift? selectedShift; - if (shifts.isNotEmpty) { - if (status.activeShiftId != null) { - try { - selectedShift = - shifts.firstWhere((Shift s) => s.id == status.activeShiftId); - } catch (_) {} + Shift? selectedShift; + if (shifts.isNotEmpty) { + if (status.activeShiftId != null) { + try { + selectedShift = + shifts.firstWhere((Shift s) => s.id == status.activeShiftId); + } catch (_) {} + } + selectedShift ??= shifts.last; } - selectedShift ??= shifts.last; - } - emit(state.copyWith( - status: ClockInStatus.success, - todayShifts: shifts, - selectedShift: selectedShift, - attendance: status, - )); + emit(state.copyWith( + status: ClockInStatus.success, + todayShifts: shifts, + selectedShift: selectedShift, + attendance: status, + )); - if (selectedShift != null && !status.isCheckedIn) { - add(RequestLocationPermission()); - } - - } catch (e) { - emit(state.copyWith( + if (selectedShift != null && !status.isCheckedIn) { + add(RequestLocationPermission()); + } + }, + onError: (String errorKey) => state.copyWith( status: ClockInStatus.failure, - errorMessage: e.toString(), - )); - } + errorMessage: errorKey, + ), + ); } Future _onRequestLocationPermission( RequestLocationPermission event, Emitter emit, ) async { - try { - LocationPermission permission = await Geolocator.checkPermission(); - if (permission == LocationPermission.denied) { - permission = await Geolocator.requestPermission(); - } - - final bool hasConsent = permission == LocationPermission.always || permission == LocationPermission.whileInUse; - - emit(state.copyWith(hasLocationConsent: hasConsent)); + await handleError( + emit: emit, + action: () async { + LocationPermission permission = await Geolocator.checkPermission(); + if (permission == LocationPermission.denied) { + permission = await Geolocator.requestPermission(); + } - if (hasConsent) { - _startLocationUpdates(); - } - } catch (e) { - emit(state.copyWith(errorMessage: "Location error: $e")); - } + final bool hasConsent = + permission == LocationPermission.always || + permission == LocationPermission.whileInUse; + + emit(state.copyWith(hasLocationConsent: hasConsent)); + + if (hasConsent) { + await _startLocationUpdates(); + } + }, + onError: (String errorKey) => state.copyWith( + errorMessage: errorKey, + ), + ); } Future _startLocationUpdates() async { + // Note: handleErrorWithResult could be used here too if we want centralized logging/conversion try { - final Position position = await Geolocator.getCurrentPosition(desiredAccuracy: LocationAccuracy.high); - + final Position position = await Geolocator.getCurrentPosition( + desiredAccuracy: LocationAccuracy.high, + ); + double distance = 0; - bool isVerified = false; // Require location match by default if shift has location + bool isVerified = + false; // Require location match by default if shift has location if (state.selectedShift != null && state.selectedShift!.latitude != null && state.selectedShift!.longitude != null) { - distance = Geolocator.distanceBetween( - position.latitude, - position.longitude, - state.selectedShift!.latitude!, - state.selectedShift!.longitude!, - ); - isVerified = distance <= allowedRadiusMeters; + distance = Geolocator.distanceBetween( + position.latitude, + position.longitude, + state.selectedShift!.latitude!, + state.selectedShift!.longitude!, + ); + isVerified = distance <= allowedRadiusMeters; } else { - // If no shift location, assume verified or don't restrict? - // For strict clock-in, maybe false? but let's default to verified to avoid blocking if data missing - isVerified = true; + isVerified = true; } - + if (!isClosed) { - add(LocationUpdated(position: position, distance: distance, isVerified: isVerified)); + add( + LocationUpdated( + position: position, + distance: distance, + isVerified: isVerified, + ), + ); } - } catch (e) { - // Handle error silently or via state + } catch (_) { + // Geolocator errors usually handled via onRequestLocationPermission } } @@ -144,7 +158,8 @@ class ClockInBloc extends Bloc { currentLocation: event.position, distanceFromVenue: event.distance, isLocationVerified: event.isVerified, - etaMinutes: (event.distance / 80).round(), // Rough estimate: 80m/min walking speed + etaMinutes: + (event.distance / 80).round(), // Rough estimate: 80m/min walking speed )); } @@ -152,10 +167,10 @@ class ClockInBloc extends Bloc { CommuteModeToggled event, Emitter emit, ) { - emit(state.copyWith(isCommuteModeOn: event.isEnabled)); - if (event.isEnabled) { - add(RequestLocationPermission()); - } + emit(state.copyWith(isCommuteModeOn: event.isEnabled)); + if (event.isEnabled) { + add(RequestLocationPermission()); + } } void _onShiftSelected( @@ -186,28 +201,23 @@ class ClockInBloc extends Bloc { CheckInRequested event, Emitter emit, ) async { - // Only verify location if not using NFC (or depending on requirements) - enforcing for swipe - if (state.checkInMode == 'swipe' && !state.isLocationVerified) { - // Allow for now since coordinates are hardcoded and might not match user location - // emit(state.copyWith(errorMessage: "You must be at the location to clock in.")); - // return; - } - emit(state.copyWith(status: ClockInStatus.actionInProgress)); - try { - final AttendanceStatus newStatus = await _clockIn( - ClockInArguments(shiftId: event.shiftId, notes: event.notes), - ); - emit(state.copyWith( - status: ClockInStatus.success, - attendance: newStatus, - )); - } catch (e) { - emit(state.copyWith( + await handleError( + emit: emit, + action: () async { + final AttendanceStatus newStatus = await _clockIn( + ClockInArguments(shiftId: event.shiftId, notes: event.notes), + ); + emit(state.copyWith( + status: ClockInStatus.success, + attendance: newStatus, + )); + }, + onError: (String errorKey) => state.copyWith( status: ClockInStatus.failure, - errorMessage: e.toString(), - )); - } + errorMessage: errorKey, + ), + ); } Future _onCheckOut( @@ -215,23 +225,25 @@ class ClockInBloc extends Bloc { Emitter emit, ) async { emit(state.copyWith(status: ClockInStatus.actionInProgress)); - try { - final AttendanceStatus newStatus = await _clockOut( - ClockOutArguments( - notes: event.notes, - breakTimeMinutes: 0, // Should be passed from event if supported - applicationId: state.attendance.activeApplicationId, - ), - ); - emit(state.copyWith( - status: ClockInStatus.success, - attendance: newStatus, - )); - } catch (e) { - emit(state.copyWith( + await handleError( + emit: emit, + action: () async { + final AttendanceStatus newStatus = await _clockOut( + ClockOutArguments( + notes: event.notes, + breakTimeMinutes: 0, + applicationId: state.attendance.activeApplicationId, + ), + ); + emit(state.copyWith( + status: ClockInStatus.success, + attendance: newStatus, + )); + }, + onError: (String errorKey) => state.copyWith( status: ClockInStatus.failure, - errorMessage: e.toString(), - )); - } + errorMessage: errorKey, + ), + ); } } diff --git a/apps/mobile/packages/features/staff/clock_in/lib/src/presentation/blocs/clock_in_cubit.dart b/apps/mobile/packages/features/staff/clock_in/lib/src/presentation/blocs/clock_in_cubit.dart index 7f0c228e..01067185 100644 --- a/apps/mobile/packages/features/staff/clock_in/lib/src/presentation/blocs/clock_in_cubit.dart +++ b/apps/mobile/packages/features/staff/clock_in/lib/src/presentation/blocs/clock_in_cubit.dart @@ -86,7 +86,7 @@ class ClockInCubit extends Cubit { // 500m radius return; } - _getCurrentLocation(); + await _getCurrentLocation(); } catch (e) { emit(state.copyWith(isLoading: false, error: e.toString())); } diff --git a/apps/mobile/packages/features/staff/home/lib/src/presentation/blocs/home_cubit.dart b/apps/mobile/packages/features/staff/home/lib/src/presentation/blocs/home_cubit.dart index 792a32eb..a0e158ee 100644 --- a/apps/mobile/packages/features/staff/home/lib/src/presentation/blocs/home_cubit.dart +++ b/apps/mobile/packages/features/staff/home/lib/src/presentation/blocs/home_cubit.dart @@ -1,5 +1,6 @@ import 'package:bloc/bloc.dart'; import 'package:equatable/equatable.dart'; +import 'package:krow_core/core.dart'; import 'package:krow_domain/krow_domain.dart'; import 'package:staff_home/src/domain/usecases/get_home_shifts.dart'; @@ -8,7 +9,7 @@ import 'package:staff_home/src/domain/repositories/home_repository.dart'; part 'home_state.dart'; /// Simple Cubit to manage home page state (shifts + loading/error). -class HomeCubit extends Cubit { +class HomeCubit extends Cubit with BlocErrorHandler { final GetHomeShifts _getHomeShifts; final HomeRepository _repository; @@ -20,29 +21,32 @@ class HomeCubit extends Cubit { Future loadShifts() async { if (isClosed) return; emit(state.copyWith(status: HomeStatus.loading)); - try { - final result = await _getHomeShifts.call(); - final name = await _repository.getStaffName(); - if (isClosed) return; - emit( - state.copyWith( - status: HomeStatus.loaded, - todayShifts: result.today, - tomorrowShifts: result.tomorrow, - recommendedShifts: result.recommended, - staffName: name, - // Mock profile status for now, ideally fetched from a user repository - isProfileComplete: false, - ), - ); - } catch (e) { - if (isClosed) return; - emit( - state.copyWith(status: HomeStatus.error, errorMessage: e.toString()), - ); - } + await handleError( + emit: emit, + action: () async { + final result = await _getHomeShifts.call(); + final name = await _repository.getStaffName(); + if (isClosed) return; + emit( + state.copyWith( + status: HomeStatus.loaded, + todayShifts: result.today, + tomorrowShifts: result.tomorrow, + recommendedShifts: result.recommended, + staffName: name, + // Mock profile status for now, ideally fetched from a user repository + isProfileComplete: false, + ), + ); + }, + onError: (String errorKey) { + if (isClosed) return state; // Avoid state emission if closed, though emit handles it gracefully usually + return state.copyWith(status: HomeStatus.error, errorMessage: errorKey); + }, + ); } + void toggleAutoMatch(bool enabled) { emit(state.copyWith(autoMatchEnabled: enabled)); } diff --git a/apps/mobile/packages/features/staff/home/lib/src/presentation/widgets/home_page/recommended_shift_card.dart b/apps/mobile/packages/features/staff/home/lib/src/presentation/widgets/home_page/recommended_shift_card.dart index 0f2250c2..ede4069d 100644 --- a/apps/mobile/packages/features/staff/home/lib/src/presentation/widgets/home_page/recommended_shift_card.dart +++ b/apps/mobile/packages/features/staff/home/lib/src/presentation/widgets/home_page/recommended_shift_card.dart @@ -190,7 +190,7 @@ class RecommendedShiftCard extends StatelessWidget { const SizedBox(width: 4), Expanded( child: Text( - shift.locationAddress ?? shift.location, + shift.locationAddress, style: const TextStyle( fontSize: 12, color: UiColors.mutedForeground, diff --git a/apps/mobile/packages/features/staff/payments/lib/src/presentation/blocs/payments/payments_bloc.dart b/apps/mobile/packages/features/staff/payments/lib/src/presentation/blocs/payments/payments_bloc.dart index 233016a3..0eba1ed5 100644 --- a/apps/mobile/packages/features/staff/payments/lib/src/presentation/blocs/payments/payments_bloc.dart +++ b/apps/mobile/packages/features/staff/payments/lib/src/presentation/blocs/payments/payments_bloc.dart @@ -1,4 +1,5 @@ import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:krow_core/core.dart'; import 'package:krow_domain/krow_domain.dart'; import '../../../domain/arguments/get_payment_history_arguments.dart'; import '../../../domain/usecases/get_payment_history_usecase.dart'; @@ -6,8 +7,8 @@ import '../../../domain/usecases/get_payment_summary_usecase.dart'; import 'payments_event.dart'; import 'payments_state.dart'; -class PaymentsBloc extends Bloc { - +class PaymentsBloc extends Bloc + with BlocErrorHandler { PaymentsBloc({ required this.getPaymentSummary, required this.getPaymentHistory, @@ -23,20 +24,24 @@ class PaymentsBloc extends Bloc { Emitter emit, ) async { emit(PaymentsLoading()); - try { - final PaymentSummary currentSummary = await getPaymentSummary(); - - final List history = await getPaymentHistory( - const GetPaymentHistoryArguments('week'), - ); - emit(PaymentsLoaded( - summary: currentSummary, - history: history, - activePeriod: 'week', - )); - } catch (e) { - emit(PaymentsError(e.toString())); - } + await handleError( + emit: emit, + action: () async { + final PaymentSummary currentSummary = await getPaymentSummary(); + + final List history = await getPaymentHistory( + const GetPaymentHistoryArguments('week'), + ); + emit( + PaymentsLoaded( + summary: currentSummary, + history: history, + activePeriod: 'week', + ), + ); + }, + onError: (String errorKey) => PaymentsError(errorKey), + ); } Future _onChangePeriod( @@ -45,17 +50,22 @@ class PaymentsBloc extends Bloc { ) async { final PaymentsState currentState = state; if (currentState is PaymentsLoaded) { - try { - final List newHistory = await getPaymentHistory( - GetPaymentHistoryArguments(event.period), - ); - emit(currentState.copyWith( - history: newHistory, - activePeriod: event.period, - )); - } catch (e) { - emit(PaymentsError(e.toString())); - } + await handleError( + emit: emit, + action: () async { + final List newHistory = await getPaymentHistory( + GetPaymentHistoryArguments(event.period), + ); + emit( + currentState.copyWith( + history: newHistory, + activePeriod: event.period, + ), + ); + }, + onError: (String errorKey) => PaymentsError(errorKey), + ); } } } + diff --git a/apps/mobile/packages/features/staff/profile/lib/src/presentation/blocs/profile_cubit.dart b/apps/mobile/packages/features/staff/profile/lib/src/presentation/blocs/profile_cubit.dart index ea5a5fff..f4cba322 100644 --- a/apps/mobile/packages/features/staff/profile/lib/src/presentation/blocs/profile_cubit.dart +++ b/apps/mobile/packages/features/staff/profile/lib/src/presentation/blocs/profile_cubit.dart @@ -1,4 +1,5 @@ import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:krow_core/core.dart'; import '../../domain/usecases/get_profile_usecase.dart'; import '../../domain/usecases/sign_out_usecase.dart'; import 'profile_state.dart'; @@ -6,15 +7,14 @@ import 'profile_state.dart'; /// Cubit for managing the Profile feature state. /// /// Handles loading profile data and user sign-out actions. -class ProfileCubit extends Cubit { +class ProfileCubit extends Cubit + with BlocErrorHandler { final GetProfileUseCase _getProfileUseCase; final SignOutUseCase _signOutUseCase; /// Creates a [ProfileCubit] with the required use cases. - ProfileCubit( - this._getProfileUseCase, - this._signOutUseCase, - ) : super(const ProfileState()); + ProfileCubit(this._getProfileUseCase, this._signOutUseCase) + : super(const ProfileState()); /// Loads the staff member's profile. /// @@ -24,18 +24,16 @@ class ProfileCubit extends Cubit { Future loadProfile() async { emit(state.copyWith(status: ProfileStatus.loading)); - try { - final profile = await _getProfileUseCase(); - emit(state.copyWith( - status: ProfileStatus.loaded, - profile: profile, - )); - } catch (e) { - emit(state.copyWith( - status: ProfileStatus.error, - errorMessage: e.toString(), - )); - } + await handleError( + emit: emit, + action: () async { + final profile = await _getProfileUseCase(); + emit(state.copyWith(status: ProfileStatus.loaded, profile: profile)); + }, + onError: + (String errorKey) => + state.copyWith(status: ProfileStatus.error, errorMessage: errorKey), + ); } /// Signs out the current user. @@ -49,12 +47,21 @@ class ProfileCubit extends Cubit { emit(state.copyWith(status: ProfileStatus.loading)); - try { - await _signOutUseCase(); - emit(state.copyWith(status: ProfileStatus.signedOut)); - } catch (e) { - // Error handling can be added here if needed - // For now, we let the navigation happen regardless - } + await handleError( + emit: emit, + action: () async { + await _signOutUseCase(); + emit(state.copyWith(status: ProfileStatus.signedOut)); + }, + onError: (String _) { + // For sign out errors, we might want to just proceed or show error + // Current implementation was silent catch, let's keep it robust but consistent + // If we want to force navigation even on error, we would do it here + // But usually handleError emits the error state. + // Let's stick to standard error reporting for now. + return state.copyWith(status: ProfileStatus.error); + }, + ); } } + diff --git a/apps/mobile/packages/features/staff/profile/lib/src/presentation/pages/staff_profile_page.dart b/apps/mobile/packages/features/staff/profile/lib/src/presentation/pages/staff_profile_page.dart index 00818f42..c92e8a11 100644 --- a/apps/mobile/packages/features/staff/profile/lib/src/presentation/pages/staff_profile_page.dart +++ b/apps/mobile/packages/features/staff/profile/lib/src/presentation/pages/staff_profile_page.dart @@ -14,7 +14,9 @@ import '../widgets/profile_menu_item.dart'; import '../widgets/profile_header.dart'; import '../widgets/reliability_score_bar.dart'; import '../widgets/reliability_stats_card.dart'; +import '../widgets/reliability_stats_card.dart'; import '../widgets/section_title.dart'; +import '../widgets/language_selector_bottom_sheet.dart'; /// The main Staff Profile page. /// @@ -178,6 +180,25 @@ class StaffProfilePage extends StatelessWidget { ], ), const SizedBox(height: UiConstants.space6), + SectionTitle( + i18n.header.title.contains("Perfil") ? "Ajustes" : "Settings", + ), + ProfileMenuGrid( + crossAxisCount: 3, + children: [ + ProfileMenuItem( + icon: UiIcons.globe, + label: i18n.header.title.contains("Perfil") ? "Idioma" : "Language", + onTap: () { + showModalBottomSheet( + context: context, + builder: (context) => const LanguageSelectorBottomSheet(), + ); + }, + ), + ], + ), + const SizedBox(height: UiConstants.space6), LogoutButton( onTap: () => _onSignOut(cubit, state), ), diff --git a/apps/mobile/packages/features/staff/profile/lib/src/presentation/widgets/language_selector_bottom_sheet.dart b/apps/mobile/packages/features/staff/profile/lib/src/presentation/widgets/language_selector_bottom_sheet.dart new file mode 100644 index 00000000..057a17c9 --- /dev/null +++ b/apps/mobile/packages/features/staff/profile/lib/src/presentation/widgets/language_selector_bottom_sheet.dart @@ -0,0 +1,106 @@ +import 'package:core_localization/core_localization.dart'; +import 'package:design_system/design_system.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_modular/flutter_modular.dart'; + +/// A bottom sheet that allows the user to select their preferred language. +/// +/// Displays options for English and Spanish, and updates the application's +/// locale via the [LocaleBloc]. +class LanguageSelectorBottomSheet extends StatelessWidget { + /// Creates a [LanguageSelectorBottomSheet]. + const LanguageSelectorBottomSheet({super.key}); + + @override + Widget build(BuildContext context) { + return Container( + padding: EdgeInsets.all(UiConstants.space6), + decoration: BoxDecoration( + color: UiColors.background, + borderRadius: BorderRadius.vertical(top: Radius.circular(UiConstants.radiusBase)), + ), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Text( + t.settings.change_language, + style: UiTypography.headline4m, + textAlign: TextAlign.center, + ), + SizedBox(height: UiConstants.space6), + _buildLanguageOption( + context, + label: 'English', + locale: AppLocale.en, + ), + SizedBox(height: UiConstants.space4), + _buildLanguageOption( + context, + label: 'Español', + locale: AppLocale.es, + ), + SizedBox(height: UiConstants.space6), + ], + ), + ); + } + + Widget _buildLanguageOption( + BuildContext context, { + required String label, + required AppLocale locale, + }) { + // Check if this option is currently selected. + // We can use LocaleSettings.currentLocale for a quick check, + // or access the BLoC state if we wanted to be reactive to state changes here directly, + // but LocaleSettings is sufficient for the initial check. + final bool isSelected = LocaleSettings.currentLocale == locale; + + return InkWell( + onTap: () { + // Dispatch the ChangeLocale event to the LocaleBloc + Modular.get().add(ChangeLocale(locale.flutterLocale)); + + // Close the bottom sheet + Navigator.pop(context); + + // Force a rebuild of the entire app to reflect locale change instantly if not handled by root widget + // (Usually handled by BlocBuilder at the root, but this ensures settings are updated) + }, + borderRadius: BorderRadius.circular(UiConstants.radiusMdValue), + child: Container( + padding: EdgeInsets.symmetric( + vertical: UiConstants.space4, + horizontal: UiConstants.space4, + ), + decoration: BoxDecoration( + color: isSelected ? UiColors.primary.withValues(alpha: 0.1) : UiColors.background, + borderRadius: BorderRadius.circular(UiConstants.radiusMdValue), + border: Border.all( + color: isSelected ? UiColors.primary : UiColors.border, + width: isSelected ? 2 : 1, + ), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + label, + style: isSelected + ? UiTypography.body1b.copyWith(color: UiColors.primary) + : UiTypography.body1r, + ), + if (isSelected) + Icon( + UiIcons.check, + color: UiColors.primary, + size: 24.0, + ), + ], + ), + ), + ); + } +} diff --git a/apps/mobile/packages/features/staff/profile_sections/compliance/certificates/lib/src/presentation/blocs/certificates/certificates_cubit.dart b/apps/mobile/packages/features/staff/profile_sections/compliance/certificates/lib/src/presentation/blocs/certificates/certificates_cubit.dart index 717d2886..e42bbea1 100644 --- a/apps/mobile/packages/features/staff/profile_sections/compliance/certificates/lib/src/presentation/blocs/certificates/certificates_cubit.dart +++ b/apps/mobile/packages/features/staff/profile_sections/compliance/certificates/lib/src/presentation/blocs/certificates/certificates_cubit.dart @@ -1,28 +1,38 @@ import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:krow_core/core.dart'; import 'package:krow_domain/krow_domain.dart'; import '../../../domain/usecases/get_certificates_usecase.dart'; import 'certificates_state.dart'; -class CertificatesCubit extends Cubit { +class CertificatesCubit extends Cubit + with BlocErrorHandler { final GetCertificatesUseCase _getCertificatesUseCase; - CertificatesCubit(this._getCertificatesUseCase) : super(const CertificatesState()) { + CertificatesCubit(this._getCertificatesUseCase) + : super(const CertificatesState()) { loadCertificates(); } Future loadCertificates() async { emit(state.copyWith(status: CertificatesStatus.loading)); - try { - final List certificates = await _getCertificatesUseCase(); - emit(state.copyWith( - status: CertificatesStatus.success, - certificates: certificates, - )); - } catch (e) { - emit(state.copyWith( - status: CertificatesStatus.failure, - errorMessage: e.toString(), - )); - } + await handleError( + emit: emit, + action: () async { + final List certificates = + await _getCertificatesUseCase(); + emit( + state.copyWith( + status: CertificatesStatus.success, + certificates: certificates, + ), + ); + }, + onError: + (String errorKey) => state.copyWith( + status: CertificatesStatus.failure, + errorMessage: errorKey, + ), + ); } } + diff --git a/apps/mobile/packages/features/staff/profile_sections/compliance/documents/lib/src/data/repositories_impl/documents_repository_impl.dart b/apps/mobile/packages/features/staff/profile_sections/compliance/documents/lib/src/data/repositories_impl/documents_repository_impl.dart index b30df9ad..08d6014b 100644 --- a/apps/mobile/packages/features/staff/profile_sections/compliance/documents/lib/src/data/repositories_impl/documents_repository_impl.dart +++ b/apps/mobile/packages/features/staff/profile_sections/compliance/documents/lib/src/data/repositories_impl/documents_repository_impl.dart @@ -49,6 +49,7 @@ class DocumentsRepositoryImpl implements DocumentsRepository { ), ]; + /* try { final QueryResult result = @@ -63,6 +64,7 @@ class DocumentsRepositoryImpl implements DocumentsRepository { } catch (e) { throw Exception('Failed to fetch documents: $e'); } + */ } domain.StaffDocument _mapToDomain( diff --git a/apps/mobile/packages/features/staff/profile_sections/compliance/documents/lib/src/presentation/blocs/documents/documents_cubit.dart b/apps/mobile/packages/features/staff/profile_sections/compliance/documents/lib/src/presentation/blocs/documents/documents_cubit.dart index 518ff810..dd4704dd 100644 --- a/apps/mobile/packages/features/staff/profile_sections/compliance/documents/lib/src/presentation/blocs/documents/documents_cubit.dart +++ b/apps/mobile/packages/features/staff/profile_sections/compliance/documents/lib/src/presentation/blocs/documents/documents_cubit.dart @@ -1,26 +1,34 @@ import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:krow_core/core.dart'; import 'package:krow_domain/krow_domain.dart'; import '../../../domain/usecases/get_documents_usecase.dart'; import 'documents_state.dart'; -class DocumentsCubit extends Cubit { +class DocumentsCubit extends Cubit + with BlocErrorHandler { final GetDocumentsUseCase _getDocumentsUseCase; DocumentsCubit(this._getDocumentsUseCase) : super(const DocumentsState()); Future loadDocuments() async { emit(state.copyWith(status: DocumentsStatus.loading)); - try { - final List documents = await _getDocumentsUseCase(); - emit(state.copyWith( - status: DocumentsStatus.success, - documents: documents, - )); - } catch (e) { - emit(state.copyWith( - status: DocumentsStatus.failure, - errorMessage: e.toString(), - )); - } + await handleError( + emit: emit, + action: () async { + final List documents = await _getDocumentsUseCase(); + emit( + state.copyWith( + status: DocumentsStatus.success, + documents: documents, + ), + ); + }, + onError: + (String errorKey) => state.copyWith( + status: DocumentsStatus.failure, + errorMessage: errorKey, + ), + ); } } + diff --git a/apps/mobile/packages/features/staff/profile_sections/compliance/tax_forms/lib/src/presentation/blocs/i9/form_i9_cubit.dart b/apps/mobile/packages/features/staff/profile_sections/compliance/tax_forms/lib/src/presentation/blocs/i9/form_i9_cubit.dart index 4c7a6430..1567d7e5 100644 --- a/apps/mobile/packages/features/staff/profile_sections/compliance/tax_forms/lib/src/presentation/blocs/i9/form_i9_cubit.dart +++ b/apps/mobile/packages/features/staff/profile_sections/compliance/tax_forms/lib/src/presentation/blocs/i9/form_i9_cubit.dart @@ -1,11 +1,12 @@ import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:krow_core/core.dart'; import 'package:krow_domain/krow_domain.dart'; import 'package:uuid/uuid.dart'; import '../../../domain/usecases/submit_i9_form_usecase.dart'; import 'form_i9_state.dart'; -class FormI9Cubit extends Cubit { +class FormI9Cubit extends Cubit with BlocErrorHandler { final SubmitI9FormUseCase _submitI9FormUseCase; String _formId = ''; @@ -16,31 +17,33 @@ class FormI9Cubit extends Cubit { emit(const FormI9State()); // Reset to empty if no form return; } - + final Map data = form.formData; _formId = form.id; - emit(FormI9State( - firstName: data['firstName'] as String? ?? '', - lastName: data['lastName'] as String? ?? '', - middleInitial: data['middleInitial'] as String? ?? '', - otherLastNames: data['otherLastNames'] as String? ?? '', - dob: data['dob'] as String? ?? '', - ssn: data['ssn'] as String? ?? '', - email: data['email'] as String? ?? '', - phone: data['phone'] as String? ?? '', - address: data['address'] as String? ?? '', - aptNumber: data['aptNumber'] as String? ?? '', - city: data['city'] as String? ?? '', - state: data['state'] as String? ?? '', - zipCode: data['zipCode'] as String? ?? '', - citizenshipStatus: data['citizenshipStatus'] as String? ?? '', - uscisNumber: data['uscisNumber'] as String? ?? '', - admissionNumber: data['admissionNumber'] as String? ?? '', - passportNumber: data['passportNumber'] as String? ?? '', - countryIssuance: data['countryIssuance'] as String? ?? '', - preparerUsed: data['preparerUsed'] as bool? ?? false, - signature: data['signature'] as String? ?? '', - )); + emit( + FormI9State( + firstName: data['firstName'] as String? ?? '', + lastName: data['lastName'] as String? ?? '', + middleInitial: data['middleInitial'] as String? ?? '', + otherLastNames: data['otherLastNames'] as String? ?? '', + dob: data['dob'] as String? ?? '', + ssn: data['ssn'] as String? ?? '', + email: data['email'] as String? ?? '', + phone: data['phone'] as String? ?? '', + address: data['address'] as String? ?? '', + aptNumber: data['aptNumber'] as String? ?? '', + city: data['city'] as String? ?? '', + state: data['state'] as String? ?? '', + zipCode: data['zipCode'] as String? ?? '', + citizenshipStatus: data['citizenshipStatus'] as String? ?? '', + uscisNumber: data['uscisNumber'] as String? ?? '', + admissionNumber: data['admissionNumber'] as String? ?? '', + passportNumber: data['passportNumber'] as String? ?? '', + countryIssuance: data['countryIssuance'] as String? ?? '', + preparerUsed: data['preparerUsed'] as bool? ?? false, + signature: data['signature'] as String? ?? '', + ), + ); } void nextStep(int totalSteps) { @@ -58,8 +61,10 @@ class FormI9Cubit extends Cubit { // Personal Info void firstNameChanged(String value) => emit(state.copyWith(firstName: value)); void lastNameChanged(String value) => emit(state.copyWith(lastName: value)); - void middleInitialChanged(String value) => emit(state.copyWith(middleInitial: value)); - void otherLastNamesChanged(String value) => emit(state.copyWith(otherLastNames: value)); + void middleInitialChanged(String value) => + emit(state.copyWith(middleInitial: value)); + void otherLastNamesChanged(String value) => + emit(state.copyWith(otherLastNames: value)); void dobChanged(String value) => emit(state.copyWith(dob: value)); void ssnChanged(String value) => emit(state.copyWith(ssn: value)); void emailChanged(String value) => emit(state.copyWith(email: value)); @@ -73,55 +78,65 @@ class FormI9Cubit extends Cubit { void zipCodeChanged(String value) => emit(state.copyWith(zipCode: value)); // Citizenship - void citizenshipStatusChanged(String value) => emit(state.copyWith(citizenshipStatus: value)); - void uscisNumberChanged(String value) => emit(state.copyWith(uscisNumber: value)); - void admissionNumberChanged(String value) => emit(state.copyWith(admissionNumber: value)); - void passportNumberChanged(String value) => emit(state.copyWith(passportNumber: value)); - void countryIssuanceChanged(String value) => emit(state.copyWith(countryIssuance: value)); + void citizenshipStatusChanged(String value) => + emit(state.copyWith(citizenshipStatus: value)); + void uscisNumberChanged(String value) => + emit(state.copyWith(uscisNumber: value)); + void admissionNumberChanged(String value) => + emit(state.copyWith(admissionNumber: value)); + void passportNumberChanged(String value) => + emit(state.copyWith(passportNumber: value)); + void countryIssuanceChanged(String value) => + emit(state.copyWith(countryIssuance: value)); // Signature - void preparerUsedChanged(bool value) => emit(state.copyWith(preparerUsed: value)); + void preparerUsedChanged(bool value) => + emit(state.copyWith(preparerUsed: value)); void signatureChanged(String value) => emit(state.copyWith(signature: value)); Future submit() async { emit(state.copyWith(status: FormI9Status.submitting)); - try { - final Map formData = { - 'firstName': state.firstName, - 'lastName': state.lastName, - 'middleInitial': state.middleInitial, - 'otherLastNames': state.otherLastNames, - 'dob': state.dob, - 'ssn': state.ssn, - 'email': state.email, - 'phone': state.phone, - 'address': state.address, - 'aptNumber': state.aptNumber, - 'city': state.city, - 'state': state.state, - 'zipCode': state.zipCode, - 'citizenshipStatus': state.citizenshipStatus, - 'uscisNumber': state.uscisNumber, - 'admissionNumber': state.admissionNumber, - 'passportNumber': state.passportNumber, - 'countryIssuance': state.countryIssuance, - 'preparerUsed': state.preparerUsed, - 'signature': state.signature, - }; + await handleError( + emit: emit, + action: () async { + final Map formData = { + 'firstName': state.firstName, + 'lastName': state.lastName, + 'middleInitial': state.middleInitial, + 'otherLastNames': state.otherLastNames, + 'dob': state.dob, + 'ssn': state.ssn, + 'email': state.email, + 'phone': state.phone, + 'address': state.address, + 'aptNumber': state.aptNumber, + 'city': state.city, + 'state': state.state, + 'zipCode': state.zipCode, + 'citizenshipStatus': state.citizenshipStatus, + 'uscisNumber': state.uscisNumber, + 'admissionNumber': state.admissionNumber, + 'passportNumber': state.passportNumber, + 'countryIssuance': state.countryIssuance, + 'preparerUsed': state.preparerUsed, + 'signature': state.signature, + }; - final I9TaxForm form = I9TaxForm( - id: _formId.isNotEmpty ? _formId : const Uuid().v4(), - title: 'Form I-9', - formData: formData, - ); + final I9TaxForm form = I9TaxForm( + id: _formId.isNotEmpty ? _formId : const Uuid().v4(), + title: 'Form I-9', + formData: formData, + ); - await _submitI9FormUseCase(form); - emit(state.copyWith(status: FormI9Status.success)); - } catch (e) { - emit(state.copyWith( - status: FormI9Status.failure, - errorMessage: e.toString(), - )); - } + await _submitI9FormUseCase(form); + emit(state.copyWith(status: FormI9Status.success)); + }, + onError: + (String errorKey) => state.copyWith( + status: FormI9Status.failure, + errorMessage: errorKey, + ), + ); } } + diff --git a/apps/mobile/packages/features/staff/profile_sections/compliance/tax_forms/lib/src/presentation/blocs/tax_forms/tax_forms_cubit.dart b/apps/mobile/packages/features/staff/profile_sections/compliance/tax_forms/lib/src/presentation/blocs/tax_forms/tax_forms_cubit.dart index 4af9a967..4ccfb4ff 100644 --- a/apps/mobile/packages/features/staff/profile_sections/compliance/tax_forms/lib/src/presentation/blocs/tax_forms/tax_forms_cubit.dart +++ b/apps/mobile/packages/features/staff/profile_sections/compliance/tax_forms/lib/src/presentation/blocs/tax_forms/tax_forms_cubit.dart @@ -1,26 +1,29 @@ import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:krow_core/core.dart'; import 'package:krow_domain/krow_domain.dart'; import '../../../domain/usecases/get_tax_forms_usecase.dart'; import 'tax_forms_state.dart'; -class TaxFormsCubit extends Cubit { +class TaxFormsCubit extends Cubit + with BlocErrorHandler { final GetTaxFormsUseCase _getTaxFormsUseCase; TaxFormsCubit(this._getTaxFormsUseCase) : super(const TaxFormsState()); Future loadTaxForms() async { emit(state.copyWith(status: TaxFormsStatus.loading)); - try { - final List forms = await _getTaxFormsUseCase(); - emit(state.copyWith( - status: TaxFormsStatus.success, - forms: forms, - )); - } catch (e) { - emit(state.copyWith( - status: TaxFormsStatus.failure, - errorMessage: e.toString(), - )); - } + await handleError( + emit: emit, + action: () async { + final List forms = await _getTaxFormsUseCase(); + emit(state.copyWith(status: TaxFormsStatus.success, forms: forms)); + }, + onError: + (String errorKey) => state.copyWith( + status: TaxFormsStatus.failure, + errorMessage: errorKey, + ), + ); } } + diff --git a/apps/mobile/packages/features/staff/profile_sections/compliance/tax_forms/lib/src/presentation/blocs/w4/form_w4_cubit.dart b/apps/mobile/packages/features/staff/profile_sections/compliance/tax_forms/lib/src/presentation/blocs/w4/form_w4_cubit.dart index 440ef51c..c6d02860 100644 --- a/apps/mobile/packages/features/staff/profile_sections/compliance/tax_forms/lib/src/presentation/blocs/w4/form_w4_cubit.dart +++ b/apps/mobile/packages/features/staff/profile_sections/compliance/tax_forms/lib/src/presentation/blocs/w4/form_w4_cubit.dart @@ -1,11 +1,12 @@ import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:krow_core/core.dart'; import 'package:krow_domain/krow_domain.dart'; import 'package:uuid/uuid.dart'; import '../../../domain/usecases/submit_w4_form_usecase.dart'; import 'form_w4_state.dart'; -class FormW4Cubit extends Cubit { +class FormW4Cubit extends Cubit with BlocErrorHandler { final SubmitW4FormUseCase _submitW4FormUseCase; String _formId = ''; @@ -16,31 +17,33 @@ class FormW4Cubit extends Cubit { emit(const FormW4State()); // Reset return; } - + final Map data = form.formData; _formId = form.id; - + // Combine address parts if needed, or take existing final String city = data['city'] as String? ?? ''; final String stateVal = data['state'] as String? ?? ''; final String zip = data['zipCode'] as String? ?? ''; final String cityStateZip = '$city, $stateVal $zip'.trim(); - emit(FormW4State( - firstName: data['firstName'] as String? ?? '', - lastName: data['lastName'] as String? ?? '', - ssn: data['ssn'] as String? ?? '', - address: data['address'] as String? ?? '', - cityStateZip: cityStateZip.contains(',') ? cityStateZip : '', - filingStatus: data['filingStatus'] as String? ?? '', - multipleJobs: data['multipleJobs'] as bool? ?? false, - qualifyingChildren: data['qualifyingChildren'] as int? ?? 0, - otherDependents: data['otherDependents'] as int? ?? 0, - otherIncome: data['otherIncome'] as String? ?? '', - deductions: data['deductions'] as String? ?? '', - extraWithholding: data['extraWithholding'] as String? ?? '', - signature: data['signature'] as String? ?? '', - )); + emit( + FormW4State( + firstName: data['firstName'] as String? ?? '', + lastName: data['lastName'] as String? ?? '', + ssn: data['ssn'] as String? ?? '', + address: data['address'] as String? ?? '', + cityStateZip: cityStateZip.contains(',') ? cityStateZip : '', + filingStatus: data['filingStatus'] as String? ?? '', + multipleJobs: data['multipleJobs'] as bool? ?? false, + qualifyingChildren: data['qualifyingChildren'] as int? ?? 0, + otherDependents: data['otherDependents'] as int? ?? 0, + otherIncome: data['otherIncome'] as String? ?? '', + deductions: data['deductions'] as String? ?? '', + extraWithholding: data['extraWithholding'] as String? ?? '', + signature: data['signature'] as String? ?? '', + ), + ); } void nextStep(int totalSteps) { @@ -62,52 +65,65 @@ class FormW4Cubit extends Cubit { void lastNameChanged(String value) => emit(state.copyWith(lastName: value)); void ssnChanged(String value) => emit(state.copyWith(ssn: value)); void addressChanged(String value) => emit(state.copyWith(address: value)); - void cityStateZipChanged(String value) => emit(state.copyWith(cityStateZip: value)); + void cityStateZipChanged(String value) => + emit(state.copyWith(cityStateZip: value)); // Form Data - void filingStatusChanged(String value) => emit(state.copyWith(filingStatus: value)); - void multipleJobsChanged(bool value) => emit(state.copyWith(multipleJobs: value)); - void qualifyingChildrenChanged(int value) => emit(state.copyWith(qualifyingChildren: value)); - void otherDependentsChanged(int value) => emit(state.copyWith(otherDependents: value)); - + void filingStatusChanged(String value) => + emit(state.copyWith(filingStatus: value)); + void multipleJobsChanged(bool value) => + emit(state.copyWith(multipleJobs: value)); + void qualifyingChildrenChanged(int value) => + emit(state.copyWith(qualifyingChildren: value)); + void otherDependentsChanged(int value) => + emit(state.copyWith(otherDependents: value)); + // Adjustments - void otherIncomeChanged(String value) => emit(state.copyWith(otherIncome: value)); - void deductionsChanged(String value) => emit(state.copyWith(deductions: value)); - void extraWithholdingChanged(String value) => emit(state.copyWith(extraWithholding: value)); + void otherIncomeChanged(String value) => + emit(state.copyWith(otherIncome: value)); + void deductionsChanged(String value) => + emit(state.copyWith(deductions: value)); + void extraWithholdingChanged(String value) => + emit(state.copyWith(extraWithholding: value)); void signatureChanged(String value) => emit(state.copyWith(signature: value)); Future submit() async { emit(state.copyWith(status: FormW4Status.submitting)); - try { - final Map formData = { - 'firstName': state.firstName, - 'lastName': state.lastName, - 'ssn': state.ssn, - 'address': state.address, - 'cityStateZip': state.cityStateZip, // Note: Repository should split this if needed. - 'filingStatus': state.filingStatus, - 'multipleJobs': state.multipleJobs, - 'qualifyingChildren': state.qualifyingChildren, - 'otherDependents': state.otherDependents, - 'otherIncome': state.otherIncome, - 'deductions': state.deductions, - 'extraWithholding': state.extraWithholding, - 'signature': state.signature, - }; + await handleError( + emit: emit, + action: () async { + final Map formData = { + 'firstName': state.firstName, + 'lastName': state.lastName, + 'ssn': state.ssn, + 'address': state.address, + 'cityStateZip': + state.cityStateZip, // Note: Repository should split this if needed. + 'filingStatus': state.filingStatus, + 'multipleJobs': state.multipleJobs, + 'qualifyingChildren': state.qualifyingChildren, + 'otherDependents': state.otherDependents, + 'otherIncome': state.otherIncome, + 'deductions': state.deductions, + 'extraWithholding': state.extraWithholding, + 'signature': state.signature, + }; - final W4TaxForm form = W4TaxForm( - id: _formId.isNotEmpty ? _formId : const Uuid().v4(), - title: 'Form W-4', - formData: formData, - ); + final W4TaxForm form = W4TaxForm( + id: _formId.isNotEmpty ? _formId : const Uuid().v4(), + title: 'Form W-4', + formData: formData, + ); - await _submitW4FormUseCase(form); - emit(state.copyWith(status: FormW4Status.success)); - } catch (e) { - emit(state.copyWith( - status: FormW4Status.failure, - errorMessage: e.toString(), - )); - } + await _submitW4FormUseCase(form); + emit(state.copyWith(status: FormW4Status.success)); + }, + onError: + (String errorKey) => state.copyWith( + status: FormW4Status.failure, + errorMessage: errorKey, + ), + ); } } + diff --git a/apps/mobile/packages/features/staff/profile_sections/compliance/tax_forms/lib/src/presentation/pages/tax_forms_page.dart b/apps/mobile/packages/features/staff/profile_sections/compliance/tax_forms/lib/src/presentation/pages/tax_forms_page.dart index f214a99b..923e7f24 100644 --- a/apps/mobile/packages/features/staff/profile_sections/compliance/tax_forms/lib/src/presentation/pages/tax_forms_page.dart +++ b/apps/mobile/packages/features/staff/profile_sections/compliance/tax_forms/lib/src/presentation/pages/tax_forms_page.dart @@ -147,12 +147,12 @@ class TaxFormsPage extends StatelessWidget { if (form is I9TaxForm) { final result = await Modular.to.pushNamed('i9', arguments: form); if (result == true && context.mounted) { - BlocProvider.of(context).loadTaxForms(); + await BlocProvider.of(context).loadTaxForms(); } } else if (form is W4TaxForm) { final result = await Modular.to.pushNamed('w4', arguments: form); if (result == true && context.mounted) { - BlocProvider.of(context).loadTaxForms(); + await BlocProvider.of(context).loadTaxForms(); } } }, diff --git a/apps/mobile/packages/features/staff/profile_sections/finances/staff_bank_account/lib/src/presentation/blocs/bank_account_cubit.dart b/apps/mobile/packages/features/staff/profile_sections/finances/staff_bank_account/lib/src/presentation/blocs/bank_account_cubit.dart index 4f948740..f159781e 100644 --- a/apps/mobile/packages/features/staff/profile_sections/finances/staff_bank_account/lib/src/presentation/blocs/bank_account_cubit.dart +++ b/apps/mobile/packages/features/staff/profile_sections/finances/staff_bank_account/lib/src/presentation/blocs/bank_account_cubit.dart @@ -1,35 +1,42 @@ import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:krow_core/core.dart'; import 'package:krow_domain/krow_domain.dart'; import '../../domain/arguments/add_bank_account_params.dart'; import '../../domain/usecases/add_bank_account_usecase.dart'; import '../../domain/usecases/get_bank_accounts_usecase.dart'; import 'bank_account_state.dart'; -class BankAccountCubit extends Cubit { +class BankAccountCubit extends Cubit + with BlocErrorHandler { final GetBankAccountsUseCase _getBankAccountsUseCase; final AddBankAccountUseCase _addBankAccountUseCase; BankAccountCubit({ required GetBankAccountsUseCase getBankAccountsUseCase, required AddBankAccountUseCase addBankAccountUseCase, - }) : _getBankAccountsUseCase = getBankAccountsUseCase, - _addBankAccountUseCase = addBankAccountUseCase, - super(const BankAccountState()); + }) : _getBankAccountsUseCase = getBankAccountsUseCase, + _addBankAccountUseCase = addBankAccountUseCase, + super(const BankAccountState()); Future loadAccounts() async { emit(state.copyWith(status: BankAccountStatus.loading)); - try { - final List accounts = await _getBankAccountsUseCase(); - emit(state.copyWith( - status: BankAccountStatus.loaded, - accounts: accounts, - )); - } catch (e) { - emit(state.copyWith( - status: BankAccountStatus.error, - errorMessage: e.toString(), - )); - } + await handleError( + emit: emit, + action: () async { + final List accounts = await _getBankAccountsUseCase(); + emit( + state.copyWith( + status: BankAccountStatus.loaded, + accounts: accounts, + ), + ); + }, + onError: + (String errorKey) => state.copyWith( + status: BankAccountStatus.error, + errorMessage: errorKey, + ), + ); } void toggleForm(bool show) { @@ -43,35 +50,47 @@ class BankAccountCubit extends Cubit { required String type, }) async { emit(state.copyWith(status: BankAccountStatus.loading)); - + // Create domain entity final BankAccount newAccount = BankAccount( - id: '', // Generated by server usually - userId: '', // Handled by Repo/Auth - bankName: bankName, - accountNumber: accountNumber, - accountName: '', - sortCode: routingNumber, - type: type == 'CHECKING' ? BankAccountType.checking : BankAccountType.savings, - last4: accountNumber.length > 4 ? accountNumber.substring(accountNumber.length - 4) : accountNumber, - isPrimary: false, + id: '', // Generated by server usually + userId: '', // Handled by Repo/Auth + bankName: bankName, + accountNumber: accountNumber, + accountName: '', + sortCode: routingNumber, + type: + type == 'CHECKING' + ? BankAccountType.checking + : BankAccountType.savings, + last4: + accountNumber.length > 4 + ? accountNumber.substring(accountNumber.length - 4) + : accountNumber, + isPrimary: false, ); - try { - await _addBankAccountUseCase(AddBankAccountParams(account: newAccount)); + await handleError( + emit: emit, + action: () async { + await _addBankAccountUseCase(AddBankAccountParams(account: newAccount)); - // Re-fetch to get latest state including server-generated IDs - await loadAccounts(); - - emit(state.copyWith( - status: BankAccountStatus.accountAdded, - showForm: false, // Close form on success - )); - } catch (e) { - emit(state.copyWith( - status: BankAccountStatus.error, - errorMessage: e.toString(), - )); - } + // Re-fetch to get latest state including server-generated IDs + await loadAccounts(); + + emit( + state.copyWith( + status: BankAccountStatus.accountAdded, + showForm: false, // Close form on success + ), + ); + }, + onError: + (String errorKey) => state.copyWith( + status: BankAccountStatus.error, + errorMessage: errorKey, + ), + ); } } + diff --git a/apps/mobile/packages/features/staff/profile_sections/finances/time_card/lib/src/presentation/blocs/time_card_bloc.dart b/apps/mobile/packages/features/staff/profile_sections/finances/time_card/lib/src/presentation/blocs/time_card_bloc.dart index e655755e..2b9a9217 100644 --- a/apps/mobile/packages/features/staff/profile_sections/finances/time_card/lib/src/presentation/blocs/time_card_bloc.dart +++ b/apps/mobile/packages/features/staff/profile_sections/finances/time_card/lib/src/presentation/blocs/time_card_bloc.dart @@ -1,5 +1,6 @@ import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:equatable/equatable.dart'; +import 'package:krow_core/core.dart'; import 'package:krow_domain/krow_domain.dart'; import '../../domain/arguments/get_time_cards_arguments.dart'; import '../../domain/usecases/get_time_cards_usecase.dart'; @@ -8,35 +9,55 @@ part 'time_card_event.dart'; part 'time_card_state.dart'; /// BLoC to manage Time Card state. -class TimeCardBloc extends Bloc { +class TimeCardBloc extends Bloc + with BlocErrorHandler { final GetTimeCardsUseCase getTimeCards; - + TimeCardBloc({required this.getTimeCards}) : super(TimeCardInitial()) { on(_onLoadTimeCards); on(_onChangeMonth); } /// Handles fetching time cards for the requested month. - Future _onLoadTimeCards(LoadTimeCards event, Emitter emit) async { + Future _onLoadTimeCards( + LoadTimeCards event, + Emitter emit, + ) async { emit(TimeCardLoading()); - try { - final List cards = await getTimeCards(GetTimeCardsArguments(event.month)); - - final double totalHours = cards.fold(0.0, (double sum, TimeCard t) => sum + t.totalHours); - final double totalEarnings = cards.fold(0.0, (double sum, TimeCard t) => sum + t.totalPay); + await handleError( + emit: emit, + action: () async { + final List cards = await getTimeCards( + GetTimeCardsArguments(event.month), + ); - emit(TimeCardLoaded( - timeCards: cards, - selectedMonth: event.month, - totalHours: totalHours, - totalEarnings: totalEarnings, - )); - } catch (e) { - emit(TimeCardError(e.toString())); - } + final double totalHours = cards.fold( + 0.0, + (double sum, TimeCard t) => sum + t.totalHours, + ); + final double totalEarnings = cards.fold( + 0.0, + (double sum, TimeCard t) => sum + t.totalPay, + ); + + emit( + TimeCardLoaded( + timeCards: cards, + selectedMonth: event.month, + totalHours: totalHours, + totalEarnings: totalEarnings, + ), + ); + }, + onError: (String errorKey) => TimeCardError(errorKey), + ); } - - Future _onChangeMonth(ChangeMonth event, Emitter emit) async { - add(LoadTimeCards(event.month)); + + Future _onChangeMonth( + ChangeMonth event, + Emitter emit, + ) async { + add(LoadTimeCards(event.month)); } } + diff --git a/apps/mobile/packages/features/staff/profile_sections/onboarding/attire/lib/src/presentation/blocs/attire_cubit.dart b/apps/mobile/packages/features/staff/profile_sections/onboarding/attire/lib/src/presentation/blocs/attire_cubit.dart index 76ae73c9..feae446a 100644 --- a/apps/mobile/packages/features/staff/profile_sections/onboarding/attire/lib/src/presentation/blocs/attire_cubit.dart +++ b/apps/mobile/packages/features/staff/profile_sections/onboarding/attire/lib/src/presentation/blocs/attire_cubit.dart @@ -1,4 +1,5 @@ import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:krow_core/core.dart'; import 'package:krow_domain/krow_domain.dart'; import '../../domain/arguments/save_attire_arguments.dart'; @@ -8,7 +9,8 @@ import '../../domain/usecases/save_attire_usecase.dart'; import '../../domain/usecases/upload_attire_photo_usecase.dart'; import 'attire_state.dart'; -class AttireCubit extends Cubit { +class AttireCubit extends Cubit + with BlocErrorHandler { final GetAttireOptionsUseCase _getAttireOptionsUseCase; final SaveAttireUseCase _saveAttireUseCase; final UploadAttirePhotoUseCase _uploadAttirePhotoUseCase; @@ -23,30 +25,41 @@ class AttireCubit extends Cubit { Future loadOptions() async { emit(state.copyWith(status: AttireStatus.loading)); - try { - final List options = await _getAttireOptionsUseCase(); - - // Auto-select mandatory items initially as per prototype - final List mandatoryIds = options - .where((AttireItem e) => e.isMandatory) - .map((AttireItem e) => e.id) - .toList(); - - final List initialSelection = List.from(state.selectedIds); - for (final String id in mandatoryIds) { - if (!initialSelection.contains(id)) { - initialSelection.add(id); - } - } + await handleError( + emit: emit, + action: () async { + final List options = await _getAttireOptionsUseCase(); - emit(state.copyWith( - status: AttireStatus.success, - options: options, - selectedIds: initialSelection, - )); - } catch (e) { - emit(state.copyWith(status: AttireStatus.failure, errorMessage: e.toString())); - } + // Auto-select mandatory items initially as per prototype + final List mandatoryIds = + options + .where((AttireItem e) => e.isMandatory) + .map((AttireItem e) => e.id) + .toList(); + + final List initialSelection = List.from( + state.selectedIds, + ); + for (final String id in mandatoryIds) { + if (!initialSelection.contains(id)) { + initialSelection.add(id); + } + } + + emit( + state.copyWith( + status: AttireStatus.success, + options: options, + selectedIds: initialSelection, + ), + ); + }, + onError: + (String errorKey) => state.copyWith( + status: AttireStatus.failure, + errorMessage: errorKey, + ), + ); } void toggleSelection(String id) { @@ -67,51 +80,81 @@ class AttireCubit extends Cubit { } Future uploadPhoto(String itemId) async { - final Map currentUploading = Map.from(state.uploadingStatus); + final Map currentUploading = Map.from( + state.uploadingStatus, + ); currentUploading[itemId] = true; emit(state.copyWith(uploadingStatus: currentUploading)); - try { - final String url = await _uploadAttirePhotoUseCase( - UploadAttirePhotoArguments(itemId: itemId), - ); - - final Map currentPhotos = Map.from(state.photoUrls); - currentPhotos[itemId] = url; - - // Auto-select item on upload success if not selected - final List currentSelection = List.from(state.selectedIds); - if (!currentSelection.contains(itemId)) { - currentSelection.add(itemId); - } + await handleError( + emit: emit, + action: () async { + final String url = await _uploadAttirePhotoUseCase( + UploadAttirePhotoArguments(itemId: itemId), + ); - currentUploading[itemId] = false; - emit(state.copyWith( - uploadingStatus: currentUploading, - photoUrls: currentPhotos, - selectedIds: currentSelection, - )); - } catch (e) { - currentUploading[itemId] = false; - emit(state.copyWith( - uploadingStatus: currentUploading, + final Map currentPhotos = Map.from( + state.photoUrls, + ); + currentPhotos[itemId] = url; + + // Auto-select item on upload success if not selected + final List currentSelection = List.from( + state.selectedIds, + ); + if (!currentSelection.contains(itemId)) { + currentSelection.add(itemId); + } + + final Map updatedUploading = Map.from( + state.uploadingStatus, + ); + updatedUploading[itemId] = false; + + emit( + state.copyWith( + uploadingStatus: updatedUploading, + photoUrls: currentPhotos, + selectedIds: currentSelection, + ), + ); + }, + onError: (String errorKey) { + final Map updatedUploading = Map.from( + state.uploadingStatus, + ); + updatedUploading[itemId] = false; // Could handle error specifically via snackbar event - )); - } + // For now, attaching the error message but keeping state generally usable + return state.copyWith( + uploadingStatus: updatedUploading, + errorMessage: errorKey, + ); + }, + ); } Future save() async { if (!state.canSave) return; - + emit(state.copyWith(status: AttireStatus.saving)); - try { - await _saveAttireUseCase(SaveAttireArguments( - selectedItemIds: state.selectedIds, - photoUrls: state.photoUrls, - )); - emit(state.copyWith(status: AttireStatus.saved)); - } catch (e) { - emit(state.copyWith(status: AttireStatus.failure, errorMessage: e.toString())); - } + await handleError( + emit: emit, + action: () async { + await _saveAttireUseCase( + SaveAttireArguments( + selectedItemIds: state.selectedIds, + photoUrls: state.photoUrls, + ), + ); + emit(state.copyWith(status: AttireStatus.saved)); + }, + onError: + (String errorKey) => state.copyWith( + status: AttireStatus.failure, + errorMessage: errorKey, + ), + ); } } + diff --git a/apps/mobile/packages/features/staff/profile_sections/onboarding/emergency_contact/lib/src/presentation/blocs/emergency_contact_bloc.dart b/apps/mobile/packages/features/staff/profile_sections/onboarding/emergency_contact/lib/src/presentation/blocs/emergency_contact_bloc.dart index 1d4e2169..92dfc124 100644 --- a/apps/mobile/packages/features/staff/profile_sections/onboarding/emergency_contact/lib/src/presentation/blocs/emergency_contact_bloc.dart +++ b/apps/mobile/packages/features/staff/profile_sections/onboarding/emergency_contact/lib/src/presentation/blocs/emergency_contact_bloc.dart @@ -1,4 +1,5 @@ import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:krow_core/core.dart'; import 'package:krow_domain/krow_domain.dart'; import '../../domain/arguments/get_emergency_contacts_arguments.dart'; import '../../domain/arguments/save_emergency_contacts_arguments.dart'; @@ -12,7 +13,8 @@ export 'emergency_contact_state.dart'; // BLoC class EmergencyContactBloc - extends Bloc { + extends Bloc + with BlocErrorHandler { final GetEmergencyContactsUseCase getEmergencyContacts; final SaveEmergencyContactsUseCase saveEmergencyContacts; @@ -28,29 +30,30 @@ class EmergencyContactBloc add(EmergencyContactsLoaded()); } - Future _onLoaded( EmergencyContactsLoaded event, Emitter emit, ) async { emit(state.copyWith(status: EmergencyContactStatus.loading)); - try { - final contacts = await getEmergencyContacts( - const GetEmergencyContactsArguments(), - ); - emit(state.copyWith( - status: EmergencyContactStatus.loaded, - contacts: contacts.isNotEmpty - ? contacts - : [EmergencyContact.empty()], - )); - } catch (e) { - emit(state.copyWith( + await handleError( + emit: emit, + action: () async { + final contacts = await getEmergencyContacts( + const GetEmergencyContactsArguments(), + ); + emit( + state.copyWith( + status: EmergencyContactStatus.loaded, + contacts: contacts.isNotEmpty ? contacts : [EmergencyContact.empty()], + ), + ); + }, + onError: (String errorKey) => state.copyWith( status: EmergencyContactStatus.failure, - errorMessage: e.toString(), - )); - } + errorMessage: errorKey, + ), + ); } void _onAdded( @@ -85,18 +88,19 @@ class EmergencyContactBloc Emitter emit, ) async { emit(state.copyWith(status: EmergencyContactStatus.saving)); - try { - await saveEmergencyContacts( - SaveEmergencyContactsArguments( - contacts: state.contacts, - ), - ); - emit(state.copyWith(status: EmergencyContactStatus.saved)); - } catch (e) { - emit(state.copyWith( + await handleError( + emit: emit, + action: () async { + await saveEmergencyContacts( + SaveEmergencyContactsArguments(contacts: state.contacts), + ); + emit(state.copyWith(status: EmergencyContactStatus.saved)); + }, + onError: (String errorKey) => state.copyWith( status: EmergencyContactStatus.failure, - errorMessage: e.toString(), - )); - } + errorMessage: errorKey, + ), + ); } } + diff --git a/apps/mobile/packages/features/staff/profile_sections/onboarding/experience/lib/src/presentation/blocs/experience_bloc.dart b/apps/mobile/packages/features/staff/profile_sections/onboarding/experience/lib/src/presentation/blocs/experience_bloc.dart index 5bd99c77..3a1e6515 100644 --- a/apps/mobile/packages/features/staff/profile_sections/onboarding/experience/lib/src/presentation/blocs/experience_bloc.dart +++ b/apps/mobile/packages/features/staff/profile_sections/onboarding/experience/lib/src/presentation/blocs/experience_bloc.dart @@ -1,5 +1,6 @@ import 'package:equatable/equatable.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:krow_core/core.dart'; import 'package:krow_domain/krow_domain.dart'; import '../../domain/arguments/save_experience_arguments.dart'; import '../../domain/usecases/get_staff_industries_usecase.dart'; @@ -92,8 +93,8 @@ class ExperienceState extends Equatable { } // BLoC -class ExperienceBloc extends Bloc { - +class ExperienceBloc extends Bloc + with BlocErrorHandler { final GetStaffIndustriesUseCase getIndustries; final GetStaffSkillsUseCase getSkills; final SaveExperienceUseCase saveExperience; @@ -102,10 +103,12 @@ class ExperienceBloc extends Bloc { required this.getIndustries, required this.getSkills, required this.saveExperience, - }) : super(const ExperienceState( - availableIndustries: Industry.values, - availableSkills: ExperienceSkill.values, - )) { + }) : super( + const ExperienceState( + availableIndustries: Industry.values, + availableSkills: ExperienceSkill.values, + ), + ) { on(_onLoaded); on(_onIndustryToggled); on(_onSkillToggled); @@ -120,26 +123,28 @@ class ExperienceBloc extends Bloc { Emitter emit, ) async { emit(state.copyWith(status: ExperienceStatus.loading)); - try { - final results = await Future.wait([ - getIndustries(), - getSkills(), - ]); + await handleError( + emit: emit, + action: () async { + final results = await Future.wait([getIndustries(), getSkills()]); - emit(state.copyWith( - status: ExperienceStatus.initial, - selectedIndustries: results[0] - .map((e) => Industry.fromString(e)) - .whereType() - .toList(), - selectedSkills: results[1], - )); - } catch (e) { - emit(state.copyWith( + emit( + state.copyWith( + status: ExperienceStatus.initial, + selectedIndustries: + results[0] + .map((e) => Industry.fromString(e)) + .whereType() + .toList(), + selectedSkills: results[1], + ), + ); + }, + onError: (String errorKey) => state.copyWith( status: ExperienceStatus.failure, - errorMessage: e.toString(), - )); - } + errorMessage: errorKey, + ), + ); } void _onIndustryToggled( @@ -183,19 +188,22 @@ class ExperienceBloc extends Bloc { Emitter emit, ) async { emit(state.copyWith(status: ExperienceStatus.loading)); - try { - await saveExperience( - SaveExperienceArguments( - industries: state.selectedIndustries.map((e) => e.value).toList(), - skills: state.selectedSkills, - ), - ); - emit(state.copyWith(status: ExperienceStatus.success)); - } catch (e) { - emit(state.copyWith( + await handleError( + emit: emit, + action: () async { + await saveExperience( + SaveExperienceArguments( + industries: state.selectedIndustries.map((e) => e.value).toList(), + skills: state.selectedSkills, + ), + ); + emit(state.copyWith(status: ExperienceStatus.success)); + }, + onError: (String errorKey) => state.copyWith( status: ExperienceStatus.failure, - errorMessage: e.toString(), - )); - } + errorMessage: errorKey, + ), + ); } } + diff --git a/apps/mobile/packages/features/staff/profile_sections/onboarding/profile_info/lib/src/presentation/blocs/personal_info_bloc.dart b/apps/mobile/packages/features/staff/profile_sections/onboarding/profile_info/lib/src/presentation/blocs/personal_info_bloc.dart index 5359772d..c57c7287 100644 --- a/apps/mobile/packages/features/staff/profile_sections/onboarding/profile_info/lib/src/presentation/blocs/personal_info_bloc.dart +++ b/apps/mobile/packages/features/staff/profile_sections/onboarding/profile_info/lib/src/presentation/blocs/personal_info_bloc.dart @@ -1,5 +1,6 @@ import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_modular/flutter_modular.dart'; +import 'package:krow_core/core.dart'; import 'package:krow_domain/krow_domain.dart'; import '../../domain/usecases/get_personal_info_usecase.dart'; @@ -13,17 +14,17 @@ import 'personal_info_state.dart'; /// during onboarding or profile editing. It delegates business logic to /// use cases following Clean Architecture principles. class PersonalInfoBloc extends Bloc + with BlocErrorHandler implements Disposable { - /// Creates a [PersonalInfoBloc]. /// /// Requires the use cases to load and update the profile. PersonalInfoBloc({ required GetPersonalInfoUseCase getPersonalInfoUseCase, required UpdatePersonalInfoUseCase updatePersonalInfoUseCase, - }) : _getPersonalInfoUseCase = getPersonalInfoUseCase, - _updatePersonalInfoUseCase = updatePersonalInfoUseCase, - super(const PersonalInfoState.initial()) { + }) : _getPersonalInfoUseCase = getPersonalInfoUseCase, + _updatePersonalInfoUseCase = updatePersonalInfoUseCase, + super(const PersonalInfoState.initial()) { on(_onLoadRequested); on(_onFieldChanged); on(_onAddressSelected); @@ -40,32 +41,37 @@ class PersonalInfoBloc extends Bloc Emitter emit, ) async { emit(state.copyWith(status: PersonalInfoStatus.loading)); - try { - final Staff staff = await _getPersonalInfoUseCase(); - - // Initialize form values from staff entity - // Note: Staff entity currently stores address as a string, but we want to map it to 'preferredLocations' - final Map initialValues = { - 'name': staff.name, - 'email': staff.email, - 'phone': staff.phone, - 'preferredLocations': staff.address != null - ? [staff.address] - : [], // TODO: Map correctly when Staff entity supports list - 'avatar': staff.avatar, - }; + await handleError( + emit: emit, + action: () async { + final Staff staff = await _getPersonalInfoUseCase(); - emit(state.copyWith( - status: PersonalInfoStatus.loaded, - staff: staff, - formValues: initialValues, - )); - } catch (e) { - emit(state.copyWith( + // Initialize form values from staff entity + // Note: Staff entity currently stores address as a string, but we want to map it to 'preferredLocations' + final Map initialValues = { + 'name': staff.name, + 'email': staff.email, + 'phone': staff.phone, + 'preferredLocations': + staff.address != null + ? [staff.address] + : [], // TODO: Map correctly when Staff entity supports list + 'avatar': staff.avatar, + }; + + emit( + state.copyWith( + status: PersonalInfoStatus.loaded, + staff: staff, + formValues: initialValues, + ), + ); + }, + onError: (String errorKey) => state.copyWith( status: PersonalInfoStatus.error, - errorMessage: e.toString(), - )); - } + errorMessage: errorKey, + ), + ); } /// Handles updating a field value in the current staff profile. @@ -86,43 +92,48 @@ class PersonalInfoBloc extends Bloc if (state.staff == null) return; emit(state.copyWith(status: PersonalInfoStatus.saving)); - try { - final Staff updatedStaff = await _updatePersonalInfoUseCase( - UpdatePersonalInfoParams( - staffId: state.staff!.id, - data: state.formValues, - ), - ); - - // Update local state with the returned staff and keep form values in sync - final Map newValues = { - 'name': updatedStaff.name, - 'email': updatedStaff.email, - 'phone': updatedStaff.phone, - 'preferredLocations': updatedStaff.address != null - ? [updatedStaff.address] - : [], - 'avatar': updatedStaff.avatar, - }; + await handleError( + emit: emit, + action: () async { + final Staff updatedStaff = await _updatePersonalInfoUseCase( + UpdatePersonalInfoParams( + staffId: state.staff!.id, + data: state.formValues, + ), + ); - emit(state.copyWith( - status: PersonalInfoStatus.saved, - staff: updatedStaff, - formValues: newValues, - )); - } catch (e) { - emit(state.copyWith( + // Update local state with the returned staff and keep form values in sync + final Map newValues = { + 'name': updatedStaff.name, + 'email': updatedStaff.email, + 'phone': updatedStaff.phone, + 'preferredLocations': + updatedStaff.address != null + ? [updatedStaff.address] + : [], + 'avatar': updatedStaff.avatar, + }; + + emit( + state.copyWith( + status: PersonalInfoStatus.saved, + staff: updatedStaff, + formValues: newValues, + ), + ); + }, + onError: (String errorKey) => state.copyWith( status: PersonalInfoStatus.error, - errorMessage: e.toString(), - )); - } + errorMessage: errorKey, + ), + ); } void _onAddressSelected( PersonalInfoAddressSelected event, Emitter emit, ) { - // TODO: Implement Google Places logic if needed + // TODO: Implement Google Places logic if needed } /// With _onPhotoUploadRequested and _onSaveRequested removed or renamed, @@ -133,3 +144,4 @@ class PersonalInfoBloc extends Bloc close(); } } + diff --git a/apps/mobile/packages/features/staff/shifts/lib/src/presentation/blocs/shift_details/shift_details_bloc.dart b/apps/mobile/packages/features/staff/shifts/lib/src/presentation/blocs/shift_details/shift_details_bloc.dart index c16263fc..5e1f386d 100644 --- a/apps/mobile/packages/features/staff/shifts/lib/src/presentation/blocs/shift_details/shift_details_bloc.dart +++ b/apps/mobile/packages/features/staff/shifts/lib/src/presentation/blocs/shift_details/shift_details_bloc.dart @@ -1,4 +1,5 @@ import 'package:bloc/bloc.dart'; +import 'package:krow_core/core.dart'; import '../../../domain/usecases/apply_for_shift_usecase.dart'; import '../../../domain/usecases/decline_shift_usecase.dart'; import '../../../domain/usecases/get_shift_details_usecase.dart'; @@ -6,7 +7,8 @@ import '../../../domain/arguments/get_shift_details_arguments.dart'; import 'shift_details_event.dart'; import 'shift_details_state.dart'; -class ShiftDetailsBloc extends Bloc { +class ShiftDetailsBloc extends Bloc + with BlocErrorHandler { final GetShiftDetailsUseCase getShiftDetails; final ApplyForShiftUseCase applyForShift; final DeclineShiftUseCase declineShift; @@ -26,47 +28,54 @@ class ShiftDetailsBloc extends Bloc { Emitter emit, ) async { emit(ShiftDetailsLoading()); - try { - final shift = await getShiftDetails( - GetShiftDetailsArguments(shiftId: event.shiftId, roleId: event.roleId), - ); - if (shift != null) { - emit(ShiftDetailsLoaded(shift)); - } else { - emit(const ShiftDetailsError("Shift not found")); - } - } catch (e) { - emit(ShiftDetailsError(e.toString())); - } + await handleError( + emit: emit, + action: () async { + final shift = await getShiftDetails( + GetShiftDetailsArguments(shiftId: event.shiftId, roleId: event.roleId), + ); + if (shift != null) { + emit(ShiftDetailsLoaded(shift)); + } else { + emit(const ShiftDetailsError("Shift not found")); + } + }, + onError: (String errorKey) => ShiftDetailsError(errorKey), + ); } Future _onBookShift( BookShiftDetailsEvent event, Emitter emit, ) async { - try { - await applyForShift( - event.shiftId, - isInstantBook: true, - roleId: event.roleId, - ); - emit( - ShiftActionSuccess("Shift successfully booked!", shiftDate: event.date), - ); - } catch (e) { - emit(ShiftDetailsError(e.toString())); - } + await handleError( + emit: emit, + action: () async { + await applyForShift( + event.shiftId, + isInstantBook: true, + roleId: event.roleId, + ); + emit( + ShiftActionSuccess("Shift successfully booked!", shiftDate: event.date), + ); + }, + onError: (String errorKey) => ShiftDetailsError(errorKey), + ); } Future _onDeclineShift( DeclineShiftDetailsEvent event, Emitter emit, ) async { - try { - await declineShift(event.shiftId); - emit(const ShiftActionSuccess("Shift declined")); - } catch (e) { - emit(ShiftDetailsError(e.toString())); - } + await handleError( + emit: emit, + action: () async { + await declineShift(event.shiftId); + emit(const ShiftActionSuccess("Shift declined")); + }, + onError: (String errorKey) => ShiftDetailsError(errorKey), + ); } } + diff --git a/apps/mobile/packages/features/staff/shifts/lib/src/presentation/blocs/shifts/shifts_bloc.dart b/apps/mobile/packages/features/staff/shifts/lib/src/presentation/blocs/shifts/shifts_bloc.dart index ff8dd4fd..1aa10435 100644 --- a/apps/mobile/packages/features/staff/shifts/lib/src/presentation/blocs/shifts/shifts_bloc.dart +++ b/apps/mobile/packages/features/staff/shifts/lib/src/presentation/blocs/shifts/shifts_bloc.dart @@ -1,5 +1,6 @@ import 'package:bloc/bloc.dart'; import 'package:equatable/equatable.dart'; +import 'package:krow_core/core.dart'; import 'package:krow_domain/krow_domain.dart'; import 'package:meta/meta.dart'; @@ -14,7 +15,8 @@ import '../../../domain/usecases/get_pending_assignments_usecase.dart'; part 'shifts_event.dart'; part 'shifts_state.dart'; -class ShiftsBloc extends Bloc { +class ShiftsBloc extends Bloc + with BlocErrorHandler { final GetMyShiftsUseCase getMyShifts; final GetAvailableShiftsUseCase getAvailableShifts; final GetPendingAssignmentsUseCase getPendingAssignments; @@ -43,33 +45,32 @@ class ShiftsBloc extends Bloc { if (state is! ShiftsLoaded) { emit(ShiftsLoading()); } - - // Determine what to load based on current tab? - // Or load all for simplicity as per prototype logic which had them all in memory. - - try { - final List days = _getCalendarDaysForOffset(0); - final myShiftsResult = await getMyShifts( - GetMyShiftsArguments(start: days.first, end: days.last), - ); - - emit(ShiftsLoaded( - myShifts: myShiftsResult, - pendingShifts: const [], - cancelledShifts: const [], - availableShifts: const [], - historyShifts: const [], - availableLoading: false, - availableLoaded: false, - historyLoading: false, - historyLoaded: false, - myShiftsLoaded: true, - searchQuery: '', - jobType: 'all', - )); - } catch (_) { - emit(const ShiftsError('Failed to load shifts')); - } + + await handleError( + emit: emit, + action: () async { + final List days = _getCalendarDaysForOffset(0); + final myShiftsResult = await getMyShifts( + GetMyShiftsArguments(start: days.first, end: days.last), + ); + + emit(ShiftsLoaded( + myShifts: myShiftsResult, + pendingShifts: const [], + cancelledShifts: const [], + availableShifts: const [], + historyShifts: const [], + availableLoading: false, + availableLoaded: false, + historyLoading: false, + historyLoaded: false, + myShiftsLoaded: true, + searchQuery: '', + jobType: 'all', + )); + }, + onError: (String errorKey) => ShiftsError(errorKey), + ); } Future _onLoadHistoryShifts( @@ -81,17 +82,24 @@ class ShiftsBloc extends Bloc { if (currentState.historyLoading || currentState.historyLoaded) return; emit(currentState.copyWith(historyLoading: true)); - try { - final historyResult = await getHistoryShifts(); - emit(currentState.copyWith( - myShiftsLoaded: true, - historyShifts: historyResult, - historyLoading: false, - historyLoaded: true, - )); - } catch (_) { - emit(currentState.copyWith(historyLoading: false)); - } + await handleError( + emit: emit, + action: () async { + final historyResult = await getHistoryShifts(); + emit(currentState.copyWith( + myShiftsLoaded: true, + historyShifts: historyResult, + historyLoading: false, + historyLoaded: true, + )); + }, + onError: (String errorKey) { + if (state is ShiftsLoaded) { + return (state as ShiftsLoaded).copyWith(historyLoading: false); + } + return ShiftsError(errorKey); + }, + ); } Future _onLoadAvailableShifts( @@ -103,17 +111,24 @@ class ShiftsBloc extends Bloc { if (currentState.availableLoading || currentState.availableLoaded) return; emit(currentState.copyWith(availableLoading: true)); - try { - final availableResult = - await getAvailableShifts(const GetAvailableShiftsArguments()); - emit(currentState.copyWith( - availableShifts: _filterPastShifts(availableResult), - availableLoading: false, - availableLoaded: true, - )); - } catch (_) { - emit(currentState.copyWith(availableLoading: false)); - } + await handleError( + emit: emit, + action: () async { + final availableResult = + await getAvailableShifts(const GetAvailableShiftsArguments()); + emit(currentState.copyWith( + availableShifts: _filterPastShifts(availableResult), + availableLoading: false, + availableLoaded: true, + )); + }, + onError: (String errorKey) { + if (state is ShiftsLoaded) { + return (state as ShiftsLoaded).copyWith(availableLoading: false); + } + return ShiftsError(errorKey); + }, + ); } Future _onLoadFindFirst( @@ -137,81 +152,86 @@ class ShiftsBloc extends Bloc { )); } - final currentState = - state is ShiftsLoaded ? state as ShiftsLoaded : null; + final currentState = state is ShiftsLoaded ? state as ShiftsLoaded : null; if (currentState != null && currentState.availableLoaded) return; if (currentState != null) { emit(currentState.copyWith(availableLoading: true)); } - try { - final availableResult = - await getAvailableShifts(const GetAvailableShiftsArguments()); - final loadedState = state is ShiftsLoaded - ? state as ShiftsLoaded - : const ShiftsLoaded( - myShifts: [], - pendingShifts: [], - cancelledShifts: [], - availableShifts: [], - historyShifts: [], - availableLoading: true, - availableLoaded: false, - historyLoading: false, - historyLoaded: false, - myShiftsLoaded: false, - searchQuery: '', - jobType: 'all', - ); - emit(loadedState.copyWith( - availableShifts: _filterPastShifts(availableResult), - availableLoading: false, - availableLoaded: true, - )); - } catch (_) { - if (state is ShiftsLoaded) { - final current = state as ShiftsLoaded; - emit(current.copyWith(availableLoading: false)); - } - } + await handleError( + emit: emit, + action: () async { + final availableResult = + await getAvailableShifts(const GetAvailableShiftsArguments()); + final loadedState = state is ShiftsLoaded + ? state as ShiftsLoaded + : const ShiftsLoaded( + myShifts: [], + pendingShifts: [], + cancelledShifts: [], + availableShifts: [], + historyShifts: [], + availableLoading: true, + availableLoaded: false, + historyLoading: false, + historyLoaded: false, + myShiftsLoaded: false, + searchQuery: '', + jobType: 'all', + ); + emit(loadedState.copyWith( + availableShifts: _filterPastShifts(availableResult), + availableLoading: false, + availableLoaded: true, + )); + }, + onError: (String errorKey) { + if (state is ShiftsLoaded) { + return (state as ShiftsLoaded).copyWith(availableLoading: false); + } + return ShiftsError(errorKey); + }, + ); } Future _onLoadShiftsForRange( LoadShiftsForRangeEvent event, Emitter emit, ) async { - try { - final myShiftsResult = await getMyShifts( - GetMyShiftsArguments(start: event.start, end: event.end), - ); + await handleError( + emit: emit, + action: () async { + final myShiftsResult = await getMyShifts( + GetMyShiftsArguments(start: event.start, end: event.end), + ); - if (state is ShiftsLoaded) { - final currentState = state as ShiftsLoaded; - emit(currentState.copyWith( + if (state is ShiftsLoaded) { + final currentState = state as ShiftsLoaded; + emit(currentState.copyWith( + myShifts: myShiftsResult, + myShiftsLoaded: true, + )); + return; + } + + emit(ShiftsLoaded( myShifts: myShiftsResult, + pendingShifts: const [], + cancelledShifts: const [], + availableShifts: const [], + historyShifts: const [], + availableLoading: false, + availableLoaded: false, + historyLoading: false, + historyLoaded: false, myShiftsLoaded: true, + searchQuery: '', + jobType: 'all', )); - return; - } - - emit(ShiftsLoaded( - myShifts: myShiftsResult, - pendingShifts: const [], - cancelledShifts: const [], - availableShifts: const [], - historyShifts: const [], - availableLoading: false, - availableLoaded: false, - historyLoading: false, - historyLoaded: false, - myShiftsLoaded: true, - searchQuery: '', - jobType: 'all', - )); - } catch (_) { - emit(const ShiftsError('Failed to load shifts')); - } + }, + onError: (String errorKey) => ShiftsError(errorKey), + ); } Future _onFilterAvailableShifts( @@ -224,23 +244,27 @@ class ShiftsBloc extends Bloc { add(LoadAvailableShiftsEvent()); return; } - // Optimistic update or loading indicator? - // Since it's filtering, we can just reload available. - - try { - final result = await getAvailableShifts(GetAvailableShiftsArguments( - query: event.query ?? currentState.searchQuery, - type: event.jobType ?? currentState.jobType, - )); - emit(currentState.copyWith( - availableShifts: _filterPastShifts(result), - searchQuery: event.query ?? currentState.searchQuery, - jobType: event.jobType ?? currentState.jobType, - )); - } catch (_) { - // Error handling if filter fails - } + await handleError( + emit: emit, + action: () async { + final result = await getAvailableShifts(GetAvailableShiftsArguments( + query: event.query ?? currentState.searchQuery, + type: event.jobType ?? currentState.jobType, + )); + + emit(currentState.copyWith( + availableShifts: _filterPastShifts(result), + searchQuery: event.query ?? currentState.searchQuery, + jobType: event.jobType ?? currentState.jobType, + )); + }, + onError: (String errorKey) { + // Stay on current state for filtering errors, maybe show a snackbar? + // For now just logging is enough via handleError mixin. + return currentState; + }, + ); } } @@ -268,3 +292,4 @@ class ShiftsBloc extends Bloc { }).toList(); } } +