diff --git a/AGENTS.md b/AGENTS.md index 574b58f..21c1bbc 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,136 +1,90 @@ # AGENTS.md -`[opencode] AGENTS.md loaded` +## Project -## Project Overview +TodoApp — sample Flutter app (Android/iOS/macOS) for checklists + tasks, +persisted with sqflite. flutter_bloc (Cubit), get_it + injectable, auto_route, +freezed, EN/PT localization. Dart package name is `todoapp`. -TodoApp is a sample Flutter project built as a testing playground. It manages -checklists and tasks using sqflite for local persistence. Targets Android, iOS, -and macOS. Uses flutter_bloc (Cubit) for state management, get_it + injectable -for DI, auto_route for navigation, freezed for immutable models, and supports -English/Portuguese localization. +## Commands -## Dev Environment Setup - -1. Install Flutter 3.38.x (see `.github/actions/setup-flutter/action.yml` for - the pinned version) -2. `flutter pub get` -3. `dart run build_runner build --delete-conflicting-outputs` -4. `flutter gen-l10n` - -Steps 3 and 4 must be re-run after any changes to annotated classes -(`*.freezed.dart`, router config, injectable config) or `.arb` localization -files. +```sh +flutter pub get +dart run build_runner build --delete-conflicting-outputs # freezed/injectable/auto_route +flutter gen-l10n # lib/ui/l10n/app_localizations*.dart +flutter test +flutter test test/domain/tasks_list_sort_test.dart # one file +flutter test --plain-name 'TasksViewModel' # one test +dart analyze +dart run eagle_eye:main # architecture check +flutter run -d +``` -## Project Architecture +Flutter is pinned to 3.38.3 (`.github/actions/setup-flutter/action.yml`). +Re-run codegen after touching `@freezed` classes, `@Injectable`/DI, `@RoutePage` +/router config, or `.arb` files — tests and `dart analyze` fail without the +generated files. Generated outputs (`*.freezed.dart`, `*.config.dart`, +`*.gr.dart`, `lib/ui/l10n/app_localizations*.dart`) are gitignored; never +hand-edit or commit them. -### Layer-first layout +## Layout ``` lib/ - data/ — models (freezed), DAOs (sqflite), repository, share handler - domain/ — sort & summary helpers - ui/ — screens (features), shared components, widgets, l10n - util/ — DI (get_it + injectable), navigation provider + domain/ model/ (freezed) + repository interface + sort/summary helpers + data/ database/ DAOs, todo_repository_impl.dart, share_message_handler.dart + ui/ screens// (screen + viewmodel + screen_state), + components/widgets, l10n/ + util/ di/ (injectable), navigation_provider.dart ``` -### Key patterns - -- **State management:** flutter_bloc (Cubit) with freezed immutable states. - Cubits are `@Injectable()` and used via `BlocProvider`/`BlocBuilder`. -- **DI:** get_it + injectable with code-gen. Initialized at startup via - `GetItStartupHandlerWrapper`. -- **Navigation:** auto_route (generated router). Abstracted behind - `NavigatorProvider` interface for testability. -- **Data:** Abstract repository → Impl → DAO pattern. The Abstract + Impl - convention is also used for `NavigatorProvider`, `ShareMessageHandler`, and - `TaskListSortHelper`. - -### Code generation +`main.dart` only runs `TodoApp`; DI and the router initialize in +`lib/ui/screens/startup/startup_screen.dart` via +`GetItStartupHandlerWrapper.init()`. -Generated files (`*.freezed.dart`, `*.config.dart`, `*.gr.dart`, -`app_localizations*.dart`) are gitignored. Generated on demand via -`build_runner`. +## Architecture constraints (eagle_eye, enforced in CI) -## Coding Conventions +Config: `eagle_eye_config.json`. It only checks internal +(`package:todoapp/...`) imports; external packages are always allowed. -### Naming +- `*viewmodel.dart` may only import `package:todoapp/domain/*` and + `*_screen_state.dart`. Keep UI/widgets out of viewmodels. +- `lib/util/*_provider.dart` and `lib/util/*_handler.dart` may import no other + `package:todoapp/*` file. +- The `*/data/model/*` rule matches nothing today (models live in + `lib/domain/model/`). -- Files: `snake_case` (enforced by `file_names` lint) -- Classes/widgets: `PascalCase` -- Methods/variables: `camelCase` -- Abstract interfaces: plain name (e.g. `TodoRepository`); implementation: - name + `Impl` +## Conventions -### Imports +Lints are promoted to `error` in `analysis_options.yaml`, so violations fail +`dart analyze`. Highest impact: single quotes, `package:` imports only (no +relative), directive ordering (`dart:` → `package:` → project), 80-char lines, +explicit return types, `const` constructors, braces on all control flow, +snake_case files. `avoid_print` is disabled. -- Always use package imports (`package:todoapp/...`), never relative (enforced - by `always_use_package_imports` and `avoid_relative_lib_imports`) -- Directives ordered as: `dart:` → `package:` → project (enforced by - `directives_ordering`) - -### Style - -- Single quotes (enforced) -- `const` constructors wherever possible (enforced) -- Lines max 80 chars (enforced by `lines_longer_than_80_chars`) -- Curly braces required on all flow control (enforced by - `curly_braces_in_flow_control_structures`) -- Always declare return types (enforced by `always_declare_return_types`) - -### Architecture rules (eagle_eye) - -- `data/model/*` must have zero external dependencies -- `*viewmodel.dart` must not depend on `*_screen.dart` -- `util/*_provider.dart` and `util/*_handler.dart` must have zero external - dependencies +Naming: interfaces plain (`TodoRepository`), implementations `...Impl`. Cubits +are `@Injectable()`; other impls `@Injectable(as: Interface)`. ## Testing -### Running tests - -``` -flutter test -``` - -Code generation (`build_runner` + `flutter gen-l10n`) must complete before -tests pass. - -### Organization - -Tests mirror `lib/` structure under `test/` (layer-first). - -### Patterns - -- **Domain/logic tests:** Pure Dart, no widget testing. Use - Arrange/Act/Assert with real implementations (no mocking framework). -- **ViewModel (Cubit) tests:** Use `FakeRepository` (in-memory) from - `test/test_utils/fakes/`. Test initial state, then state transitions after - method calls. -- **Widget tests:** Wrap with `WidgetsUtil.buildMaterialAppWidgetTest()` - (sets up MaterialApp + localization delegates, forced English locale). Use - `testWidgets()`, `pumpWidget()`, `find.byKey()`, `find.text()`. - -### Test doubles - -Hand-written fakes in `test/test_utils/fakes/` (no mockito): -`FakeRepository`, `FakeNavigatorProvider`, `FakeCallbacks`, `FakeStates`. - -## PR & CI - -### PR checks (`.github/workflows/pr.yml`) - -Triggered on PRs to `main`. Runs on every PR: +- Codegen must complete before tests (localizations are required). +- Mirror `lib/` under `test/`; domain logic is plain Dart + (Arrange/Act/Assert, real implementations). +- Cubit tests use the in-memory `FakeRepository` from + `test/test_utils/fakes/`. No mocking framework — fakes are hand-written + (`FakeRepository`, `FakeNavigatorProvider`, `FakeCallbacks`, `FakeStates`). +- Widget tests wrap with `WidgetsUtil.buildMaterialAppWidgetTest(tester: tester, + child: ...)`; it forces the `en` locale because tests assert English strings. -1. `flutter gen-l10n` — generate localizations -2. `dart run eagle_eye:main` — check architecture violations -3. `flutter test` — run test suite -4. `dart analyze` — static analysis -5. `flutter build apk --debug` — verify build compiles +## CI / release -All steps must pass before merging. +PRs to `main` (`.github/workflows/pr.yml`), all must pass: +`flutter gen-l10n` → `dart run eagle_eye:main` → `flutter test` → +`dart analyze` → `flutter build apk --debug`. -### Release (`.github/workflows/release_flutter_app.yaml`) +Any tag triggers `.github/workflows/release_flutter_app.yaml` (APK to Firebase +App Distribution, macOS zip to a GitHub Release). -Triggered on any tag push. Builds APK (uploaded to Firebase App Distribution) -and macOS `.app.zip` (attached to GitHub Release). +Commits follow conventional commits; the repo-local `feature-branch-pr` skill +(`.opencode/skills/feature-branch-pr/SKILL.md`) creates `feature/` +branches and PRs. diff --git a/android/gradle.properties b/android/gradle.properties index 2597170..4147ba3 100644 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -1,3 +1,7 @@ org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true +# This builtInKotlin flag was added automatically by Flutter migrator +android.builtInKotlin=false +# This newDsl flag was added automatically by Flutter migrator +android.newDsl=false diff --git a/eagle_eye_config.json b/eagle_eye_config.json index b5eafa6..e32bdde 100644 --- a/eagle_eye_config.json +++ b/eagle_eye_config.json @@ -5,7 +5,7 @@ }, { "filePattern": "*viewmodel.dart", - "forbiddenDependencies": ["*_screen.dart"] + "exclusiveDependencies": ["*/domain/*", "*_screen_state.dart"] }, { "filePattern": "*/util/*_provider.dart", diff --git a/lib/data/database/checklist_dao.dart b/lib/data/database/checklist_dao.dart index a12bf1e..fba6a75 100644 --- a/lib/data/database/checklist_dao.dart +++ b/lib/data/database/checklist_dao.dart @@ -1,7 +1,7 @@ import 'package:injectable/injectable.dart'; import 'package:sqflite/sqflite.dart'; import 'package:todoapp/data/database/task_dao.dart'; -import 'package:todoapp/data/model/checklist.dart'; +import 'package:todoapp/domain/model/checklist.dart'; @LazySingleton() class ChecklistDAO { diff --git a/lib/data/database/task_dao.dart b/lib/data/database/task_dao.dart index 96c5c4f..a28cd5c 100644 --- a/lib/data/database/task_dao.dart +++ b/lib/data/database/task_dao.dart @@ -1,7 +1,7 @@ import 'package:injectable/injectable.dart'; import 'package:sqflite/sqflite.dart'; import 'package:todoapp/data/database/checklist_dao.dart'; -import 'package:todoapp/data/model/task.dart'; +import 'package:todoapp/domain/model/task.dart'; @LazySingleton() class TaskDAO { diff --git a/lib/data/todo_repository.dart b/lib/data/todo_repository_impl.dart similarity index 71% rename from lib/data/todo_repository.dart rename to lib/data/todo_repository_impl.dart index e05ceb2..be0fe04 100644 --- a/lib/data/todo_repository.dart +++ b/lib/data/todo_repository_impl.dart @@ -1,40 +1,10 @@ import 'package:injectable/injectable.dart'; import 'package:todoapp/data/database/checklist_dao.dart'; import 'package:todoapp/data/database/task_dao.dart'; -import 'package:todoapp/data/model/checklist.dart'; -import 'package:todoapp/data/model/task.dart'; import 'package:todoapp/data/share_message_handler.dart'; - -abstract class TodoRepository { - Future> getTasks(int? checklistId); - - Future updateTask(Task task, bool isCompletedNewValue); - - Future updateTasks(List tasks, bool isCompletedNewValue); - - Future addTask(Task task, int? checklistId); - - Future deleteTasks(List tasks); - - Future updateAllTasks(List tasks); - - Future addChecklist(Checklist checklist); - - Future deleteChecklist(Checklist checklist); - - Future> getChecklists(); - - Future updateTaskName({ - required int checklistId, - required int taskId, - required String taskTitle, - }); - - Future share({ - required String text, - required String title, - }); -} +import 'package:todoapp/domain/model/checklist.dart'; +import 'package:todoapp/domain/model/task.dart'; +import 'package:todoapp/domain/todo_repository.dart'; @Injectable(as: TodoRepository) class TodoRepositoryImpl implements TodoRepository { diff --git a/lib/data/model/checklist.dart b/lib/domain/model/checklist.dart similarity index 100% rename from lib/data/model/checklist.dart rename to lib/domain/model/checklist.dart diff --git a/lib/data/model/task.dart b/lib/domain/model/task.dart similarity index 100% rename from lib/data/model/task.dart rename to lib/domain/model/task.dart diff --git a/lib/data/model/tasks_complete_status.dart b/lib/domain/model/tasks_complete_status.dart similarity index 100% rename from lib/data/model/tasks_complete_status.dart rename to lib/domain/model/tasks_complete_status.dart diff --git a/lib/domain/task_list_sort_helper.dart b/lib/domain/task_list_sort_helper.dart index d087a1b..0924963 100644 --- a/lib/domain/task_list_sort_helper.dart +++ b/lib/domain/task_list_sort_helper.dart @@ -1,5 +1,5 @@ import 'package:injectable/injectable.dart'; -import 'package:todoapp/data/model/task.dart'; +import 'package:todoapp/domain/model/task.dart'; abstract class TaskListSortHelper { bool areThemEqual({required List oldList, required List newList}); diff --git a/lib/domain/task_list_summary_helper.dart b/lib/domain/task_list_summary_helper.dart index cc766d2..8e1de68 100644 --- a/lib/domain/task_list_summary_helper.dart +++ b/lib/domain/task_list_summary_helper.dart @@ -1,6 +1,6 @@ import 'package:injectable/injectable.dart'; -import 'package:todoapp/data/model/task.dart'; -import 'package:todoapp/data/model/tasks_complete_status.dart'; +import 'package:todoapp/domain/model/task.dart'; +import 'package:todoapp/domain/model/tasks_complete_status.dart'; abstract class TaskListSummaryHelper { bool shouldShowShareButton({required List tasks}); diff --git a/lib/domain/todo_repository.dart b/lib/domain/todo_repository.dart new file mode 100644 index 0000000..054196d --- /dev/null +++ b/lib/domain/todo_repository.dart @@ -0,0 +1,34 @@ + +import 'package:todoapp/domain/model/checklist.dart'; +import 'package:todoapp/domain/model/task.dart'; + +abstract class TodoRepository { + Future> getTasks(int? checklistId); + + Future updateTask(Task task, bool isCompletedNewValue); + + Future updateTasks(List tasks, bool isCompletedNewValue); + + Future addTask(Task task, int? checklistId); + + Future deleteTasks(List tasks); + + Future updateAllTasks(List tasks); + + Future addChecklist(Checklist checklist); + + Future deleteChecklist(Checklist checklist); + + Future> getChecklists(); + + Future updateTaskName({ + required int checklistId, + required int taskId, + required String taskTitle, + }); + + Future share({ + required String text, + required String title, + }); +} diff --git a/lib/ui/components/tasks_view_model/tasks_screen_state.dart b/lib/ui/components/tasks_view_model/tasks_screen_state.dart index 56efd48..32c6de7 100644 --- a/lib/ui/components/tasks_view_model/tasks_screen_state.dart +++ b/lib/ui/components/tasks_view_model/tasks_screen_state.dart @@ -1,6 +1,6 @@ import 'package:freezed_annotation/freezed_annotation.dart'; -import 'package:todoapp/data/model/task.dart'; -import 'package:todoapp/data/model/tasks_complete_status.dart'; +import 'package:todoapp/domain/model/task.dart'; +import 'package:todoapp/domain/model/tasks_complete_status.dart'; part 'tasks_screen_state.freezed.dart'; diff --git a/lib/ui/components/tasks_view_model/tasks_viewmodel.dart b/lib/ui/components/tasks_view_model/tasks_viewmodel.dart index a1db0d7..bb8a5a9 100644 --- a/lib/ui/components/tasks_view_model/tasks_viewmodel.dart +++ b/lib/ui/components/tasks_view_model/tasks_viewmodel.dart @@ -1,11 +1,11 @@ import 'package:flutter/widgets.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:injectable/injectable.dart'; -import 'package:todoapp/data/model/task.dart'; -import 'package:todoapp/data/model/tasks_complete_status.dart'; -import 'package:todoapp/data/todo_repository.dart'; +import 'package:todoapp/domain/model/task.dart'; +import 'package:todoapp/domain/model/tasks_complete_status.dart'; import 'package:todoapp/domain/task_list_sort_helper.dart'; import 'package:todoapp/domain/task_list_summary_helper.dart'; +import 'package:todoapp/domain/todo_repository.dart'; import 'package:todoapp/ui/components/tasks_view_model/tasks_screen_state.dart'; @Injectable() diff --git a/lib/ui/components/widgets/check_all_action_chip_widget.dart b/lib/ui/components/widgets/check_all_action_chip_widget.dart index 74cbd3e..08f8bbf 100644 --- a/lib/ui/components/widgets/check_all_action_chip_widget.dart +++ b/lib/ui/components/widgets/check_all_action_chip_widget.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:todoapp/data/model/tasks_complete_status.dart'; +import 'package:todoapp/domain/model/tasks_complete_status.dart'; import 'package:todoapp/ui/l10n/app_localizations.dart'; class CheckAllActionChipWidget extends StatelessWidget { diff --git a/lib/ui/components/widgets/checklist/checklist_full_widget.dart b/lib/ui/components/widgets/checklist/checklist_full_widget.dart index 2cc92fe..1dfb2c0 100644 --- a/lib/ui/components/widgets/checklist/checklist_full_widget.dart +++ b/lib/ui/components/widgets/checklist/checklist_full_widget.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; -import 'package:todoapp/data/model/checklist.dart'; -import 'package:todoapp/data/model/task.dart'; -import 'package:todoapp/data/model/tasks_complete_status.dart'; +import 'package:todoapp/domain/model/checklist.dart'; +import 'package:todoapp/domain/model/task.dart'; +import 'package:todoapp/domain/model/tasks_complete_status.dart'; import 'package:todoapp/ui/components/remove_task_dialog_builder.dart'; import 'package:todoapp/ui/components/tasks_view_model/tasks_viewmodel.dart'; import 'package:todoapp/ui/components/widgets/checklist/checklist_item_widget.dart'; @@ -111,7 +111,7 @@ class ChecklistsListFullWidgetState extends State { context, task, ), - onReorder: _tasksViewModel.reorder, + onReorderItem: _tasksViewModel.reorder, onTap: (task) => _navigateToTaskScreen( context, checklistId: selected?.id, diff --git a/lib/ui/components/widgets/checklist/checklist_item_widget.dart b/lib/ui/components/widgets/checklist/checklist_item_widget.dart index a9dadca..a1e905c 100644 --- a/lib/ui/components/widgets/checklist/checklist_item_widget.dart +++ b/lib/ui/components/widgets/checklist/checklist_item_widget.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; -import 'package:todoapp/data/model/checklist.dart'; +import 'package:todoapp/domain/model/checklist.dart'; import 'package:todoapp/ui/components/widgets/card_wrapper_widget.dart'; class ChecklistItemWidget extends StatelessWidget { diff --git a/lib/ui/components/widgets/checklist/checklists_list_widget.dart b/lib/ui/components/widgets/checklist/checklists_list_widget.dart index d6bea36..6a72dde 100644 --- a/lib/ui/components/widgets/checklist/checklists_list_widget.dart +++ b/lib/ui/components/widgets/checklist/checklists_list_widget.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:todoapp/data/model/checklist.dart'; +import 'package:todoapp/domain/model/checklist.dart'; import 'package:todoapp/ui/components/widgets/checklist/checklist_item_widget.dart'; class ChecklistsListWidget extends StatelessWidget { diff --git a/lib/ui/components/widgets/task/task_cell_widget.dart b/lib/ui/components/widgets/task/task_cell_widget.dart index d612910..267badf 100644 --- a/lib/ui/components/widgets/task/task_cell_widget.dart +++ b/lib/ui/components/widgets/task/task_cell_widget.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:todoapp/data/model/task.dart'; +import 'package:todoapp/domain/model/task.dart'; import 'package:todoapp/ui/components/widgets/card_wrapper_widget.dart'; import 'package:todoapp/ui/components/widgets/task/task_title_widget.dart'; diff --git a/lib/ui/components/widgets/tasks_list_widget.dart b/lib/ui/components/widgets/tasks_list_widget.dart index 2d6aa54..0177f48 100644 --- a/lib/ui/components/widgets/tasks_list_widget.dart +++ b/lib/ui/components/widgets/tasks_list_widget.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; -import 'package:todoapp/data/model/task.dart'; -import 'package:todoapp/data/model/tasks_complete_status.dart'; +import 'package:todoapp/domain/model/task.dart'; +import 'package:todoapp/domain/model/tasks_complete_status.dart'; import 'package:todoapp/ui/components/widgets/check_all_action_chip_widget.dart'; import 'package:todoapp/ui/components/widgets/progress_widget.dart'; import 'package:todoapp/ui/components/widgets/task/task_cell_widget.dart'; @@ -13,7 +13,7 @@ class TasksListWidget extends StatelessWidget { final int? flex; final Function(Task) onRemoveTask; final Function(Task p1, bool p2) onCompleteTask; - final Function(int oldIndex, int newIndex) onReorder; + final Function(int oldIndex, int newIndex) onReorderItem; final Function(Task) onTap; final Function() onCompleteButtonAction; @@ -25,7 +25,7 @@ class TasksListWidget extends StatelessWidget { this.flex, required this.onRemoveTask, required this.onCompleteTask, - required this.onReorder, + required this.onReorderItem, required this.onTap, required this.onCompleteButtonAction, }); @@ -66,7 +66,7 @@ class TasksListWidget extends StatelessWidget { child = ReorderableListView.builder( header: header, - onReorder: onReorder, + onReorder: onReorderItem, padding: const EdgeInsets.only( bottom: 120.0, ), diff --git a/lib/ui/screens/checklist/checklist_viewmodel.dart b/lib/ui/screens/checklist/checklist_viewmodel.dart index d61c365..ef57044 100644 --- a/lib/ui/screens/checklist/checklist_viewmodel.dart +++ b/lib/ui/screens/checklist/checklist_viewmodel.dart @@ -1,7 +1,7 @@ import 'package:injectable/injectable.dart'; -import 'package:todoapp/data/model/checklist.dart'; +import 'package:todoapp/domain/model/checklist.dart'; -import 'package:todoapp/data/todo_repository.dart'; +import 'package:todoapp/domain/todo_repository.dart'; @Injectable() class ChecklistViewModel { diff --git a/lib/ui/screens/checklists/checklists_screen.dart b/lib/ui/screens/checklists/checklists_screen.dart index 5c13593..3750908 100644 --- a/lib/ui/screens/checklists/checklists_screen.dart +++ b/lib/ui/screens/checklists/checklists_screen.dart @@ -2,7 +2,7 @@ import 'package:auto_route/auto_route.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_expandable_fab/flutter_expandable_fab.dart'; -import 'package:todoapp/data/model/checklist.dart'; +import 'package:todoapp/domain/model/checklist.dart'; import 'package:todoapp/ui/components/widgets/checklist/checklist_full_widget.dart'; import 'package:todoapp/ui/components/widgets/checklist/checklists_list_widget.dart'; import 'package:todoapp/ui/components/widgets/checklist/fabmenu/checklist_expandable_fab_menu.dart'; diff --git a/lib/ui/screens/checklists/checklists_screen_state.dart b/lib/ui/screens/checklists/checklists_screen_state.dart index 4cf3009..0a62502 100644 --- a/lib/ui/screens/checklists/checklists_screen_state.dart +++ b/lib/ui/screens/checklists/checklists_screen_state.dart @@ -1,5 +1,5 @@ import 'package:freezed_annotation/freezed_annotation.dart'; -import 'package:todoapp/data/model/checklist.dart'; +import 'package:todoapp/domain/model/checklist.dart'; part 'checklists_screen_state.freezed.dart'; diff --git a/lib/ui/screens/checklists/checklists_viewmodel.dart b/lib/ui/screens/checklists/checklists_viewmodel.dart index c5b1250..8a87433 100644 --- a/lib/ui/screens/checklists/checklists_viewmodel.dart +++ b/lib/ui/screens/checklists/checklists_viewmodel.dart @@ -1,7 +1,7 @@ import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:injectable/injectable.dart'; -import 'package:todoapp/data/model/checklist.dart'; -import 'package:todoapp/data/todo_repository.dart'; +import 'package:todoapp/domain/model/checklist.dart'; +import 'package:todoapp/domain/todo_repository.dart'; import 'package:todoapp/ui/screens/checklists/checklists_screen_state.dart'; diff --git a/lib/ui/screens/task/task_screen.dart b/lib/ui/screens/task/task_screen.dart index 294ce4d..1da65ba 100644 --- a/lib/ui/screens/task/task_screen.dart +++ b/lib/ui/screens/task/task_screen.dart @@ -1,6 +1,6 @@ import 'package:auto_route/auto_route.dart'; import 'package:flutter/material.dart'; -import 'package:todoapp/data/model/task.dart'; +import 'package:todoapp/domain/model/task.dart'; import 'package:todoapp/ui/components/form_validator.dart'; import 'package:todoapp/ui/components/widgets/custom_app_bar_widget.dart'; import 'package:todoapp/ui/components/widgets/task/task_form_widget.dart'; diff --git a/lib/ui/screens/task/task_viewmodel.dart b/lib/ui/screens/task/task_viewmodel.dart index dcec210..4753038 100644 --- a/lib/ui/screens/task/task_viewmodel.dart +++ b/lib/ui/screens/task/task_viewmodel.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; -import 'package:todoapp/data/model/task.dart'; -import 'package:todoapp/data/todo_repository.dart'; +import 'package:todoapp/domain/model/task.dart'; +import 'package:todoapp/domain/todo_repository.dart'; class TaskViewModel { late TodoRepository _repository; diff --git a/lib/ui/screens/tasks/tasks_screen.dart b/lib/ui/screens/tasks/tasks_screen.dart index bccd360..ba01532 100644 --- a/lib/ui/screens/tasks/tasks_screen.dart +++ b/lib/ui/screens/tasks/tasks_screen.dart @@ -1,8 +1,8 @@ import 'package:auto_route/auto_route.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:todoapp/data/model/checklist.dart'; -import 'package:todoapp/data/model/task.dart'; +import 'package:todoapp/domain/model/checklist.dart'; +import 'package:todoapp/domain/model/task.dart'; import 'package:todoapp/ui/components/remove_task_dialog_builder.dart'; import 'package:todoapp/ui/components/tasks_view_model/tasks_screen_state.dart'; import 'package:todoapp/ui/components/tasks_view_model/tasks_viewmodel.dart'; @@ -109,7 +109,7 @@ class TasksScaffold extends StatelessWidget { tasks: uiState.tasks, status: uiState.tasksCompleteStatus, progress: uiState.progress, - onReorder: callbacks.onReorder, + onReorderItem: callbacks.onReorder, onRemoveTask: (task) => _showConfirmationDialogToRemoveTask(context, task), onCompleteTask: callbacks.onCompleteTask, diff --git a/lib/ui/screens/tasks/tasks_screen_callbacks.dart b/lib/ui/screens/tasks/tasks_screen_callbacks.dart index 5414f56..03a5246 100644 --- a/lib/ui/screens/tasks/tasks_screen_callbacks.dart +++ b/lib/ui/screens/tasks/tasks_screen_callbacks.dart @@ -1,4 +1,4 @@ -import 'package:todoapp/data/model/task.dart'; +import 'package:todoapp/domain/model/task.dart'; class TasksScreenCallbacks { final Function(int?) updateTasks; diff --git a/pubspec.lock b/pubspec.lock index 0fa0c51..5f535f7 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -229,10 +229,10 @@ packages: dependency: "direct dev" description: name: eagle_eye - sha256: baf04a2c91b2d72bd62456d934d8c525a49fddb0a1453281c36bb65b9fee374c + sha256: "365ee237d8268b22101d382995ab114fc1376a58a665e7d257714d1ca8df9c30" url: "https://pub.dev" source: hosted - version: "2.0.3" + version: "2.0.5" fake_async: dependency: transitive description: @@ -1014,10 +1014,10 @@ packages: dependency: transitive description: name: yaml - sha256: b9da305ac7c39faa3f030eccd175340f968459dae4af175130b3fc47e40d76ce + sha256: f67cdd8e07d3c6329146aaef1ba043542b3134c12489f553ca9a7435d1068aea url: "https://pub.dev" source: hosted - version: "3.1.3" + version: "3.1.4" sdks: dart: ">=3.12.0 <4.0.0" flutter: ">=3.44.0" diff --git a/pubspec.yaml b/pubspec.yaml index 35306a4..0cef3a0 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -63,7 +63,7 @@ dev_dependencies: injectable_generator: ^2.5.0 build_runner: ^2.5.4 auto_route_generator: ^10.1.0 - eagle_eye: ^2.0.3 + eagle_eye: ^2.0.5 # For information on the generic Dart part of this file, see the # following page: https://dart.dev/tools/pub/pubspec diff --git a/test/domain/tasks_list_sorter_comparator_test.dart b/test/domain/tasks_list_sorter_comparator_test.dart index b8f2928..9211151 100644 --- a/test/domain/tasks_list_sorter_comparator_test.dart +++ b/test/domain/tasks_list_sorter_comparator_test.dart @@ -1,5 +1,5 @@ import 'package:flutter_test/flutter_test.dart'; -import 'package:todoapp/data/model/task.dart'; +import 'package:todoapp/domain/model/task.dart'; import 'package:todoapp/domain/task_list_sort_helper.dart'; void main() { diff --git a/test/domain/tasks_list_sorter_sort_test.dart b/test/domain/tasks_list_sorter_sort_test.dart index f88121c..ca06dc0 100644 --- a/test/domain/tasks_list_sorter_sort_test.dart +++ b/test/domain/tasks_list_sorter_sort_test.dart @@ -1,5 +1,5 @@ import 'package:flutter_test/flutter_test.dart'; -import 'package:todoapp/data/model/task.dart'; +import 'package:todoapp/domain/model/task.dart'; import 'package:todoapp/domain/task_list_sort_helper.dart'; void main() { diff --git a/test/domain/tasks_list_summary_helper_test.dart b/test/domain/tasks_list_summary_helper_test.dart index a8a6674..c5488f6 100644 --- a/test/domain/tasks_list_summary_helper_test.dart +++ b/test/domain/tasks_list_summary_helper_test.dart @@ -1,5 +1,5 @@ import 'package:flutter_test/flutter_test.dart'; -import 'package:todoapp/data/model/task.dart'; +import 'package:todoapp/domain/model/task.dart'; import 'package:todoapp/domain/task_list_summary_helper.dart'; void main() { diff --git a/test/test_utils/fakes/fake_repository.dart b/test/test_utils/fakes/fake_repository.dart index 0e6051e..7716f59 100644 --- a/test/test_utils/fakes/fake_repository.dart +++ b/test/test_utils/fakes/fake_repository.dart @@ -1,6 +1,6 @@ -import 'package:todoapp/data/model/checklist.dart'; -import 'package:todoapp/data/model/task.dart'; -import 'package:todoapp/data/todo_repository.dart'; +import 'package:todoapp/domain/model/checklist.dart'; +import 'package:todoapp/domain/model/task.dart'; +import 'package:todoapp/domain/todo_repository.dart'; class FakeRepository implements TodoRepository { late List _tasks; diff --git a/test/test_utils/fakes/fake_states.dart b/test/test_utils/fakes/fake_states.dart index 0b7ba0e..00205b6 100644 --- a/test/test_utils/fakes/fake_states.dart +++ b/test/test_utils/fakes/fake_states.dart @@ -1,4 +1,4 @@ -import 'package:todoapp/data/model/task.dart'; +import 'package:todoapp/domain/model/task.dart'; import 'package:todoapp/ui/components/tasks_view_model/tasks_screen_state.dart'; class FakeStates { diff --git a/test/ui/components/widgets/task/taskslist/tasks_viewmodel_test.dart b/test/ui/components/widgets/task/taskslist/tasks_viewmodel_test.dart index ec0d9cd..0562202 100644 --- a/test/ui/components/widgets/task/taskslist/tasks_viewmodel_test.dart +++ b/test/ui/components/widgets/task/taskslist/tasks_viewmodel_test.dart @@ -1,6 +1,6 @@ import 'package:flutter_test/flutter_test.dart'; -import 'package:todoapp/data/model/task.dart'; -import 'package:todoapp/data/model/tasks_complete_status.dart'; +import 'package:todoapp/domain/model/task.dart'; +import 'package:todoapp/domain/model/tasks_complete_status.dart'; import 'package:todoapp/domain/task_list_sort_helper.dart'; import 'package:todoapp/domain/task_list_summary_helper.dart'; import 'package:todoapp/ui/components/tasks_view_model/tasks_screen_state.dart'; diff --git a/test/ui/components/widgets/task_cell_widget_test.dart b/test/ui/components/widgets/task_cell_widget_test.dart index 9e26c86..07f227d 100644 --- a/test/ui/components/widgets/task_cell_widget_test.dart +++ b/test/ui/components/widgets/task_cell_widget_test.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; -import 'package:todoapp/data/model/task.dart'; +import 'package:todoapp/domain/model/task.dart'; import 'package:todoapp/ui/components/widgets/task/task_cell_widget.dart'; import '../../../test_utils/widgets_util.dart'; diff --git a/test/ui/task/task_viewmodel_test.dart b/test/ui/task/task_viewmodel_test.dart index 162538d..041cf18 100644 --- a/test/ui/task/task_viewmodel_test.dart +++ b/test/ui/task/task_viewmodel_test.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; -import 'package:todoapp/data/model/checklist.dart'; -import 'package:todoapp/data/model/task.dart'; +import 'package:todoapp/domain/model/checklist.dart'; +import 'package:todoapp/domain/model/task.dart'; import 'package:todoapp/ui/screens/task/task_viewmodel.dart'; import '../../test_utils/fakes/fake_repository.dart';