Part of the WIP for the Compass App example. Merge to `compass-app`.
This PR introduces:
- A new feature for Activities (UI unfinished).
- A repository for the current Itinerary Configuration.
- A `Command` utils class to be used in View Models.
**Activities**
- PR adds the `compass_app/app/assets/activities.json` (large file!)
- Created `ActivityRepository` with local and remote implementation.
- Added `getActivitiesByDestination` to `ApiClient`
- Added `Activity` data model
- Created `ActivitiesScreen` and `ActivitiesViewModel`.
- WIP: Decided to finish the UI later due to the size the PR was taking.
- WIP: Server implementation for Activities will be completed in another
PR.
**Itinerary Configuration**
- Created the `ItineraryConfigRepository` with an "in-memory"
implementation. (local database or shared preferences could potentially
be implemented too)
- Refactored the way screens share data, instead of passing data using
the navigator query parameters, the screens store the state (the
itinerary configuration) in this repository, and load it when the screen
is opened.
- This allows to navigate between screens, back and forth, and keep the
selection of data the user made.
**Commands**
- To handle button taps and other running actions.
- Encapsulates an action, exposes the running state (to show progress
indicators), and ensures that the action cannot execute if it is already
running (to avoid multiple taps on buttons).
- Two implementations included, one without arguments `Command0`, and
one that supports a single argument `Command1`.
- Commands also provide an `onComplete` callback, in case the UI needs
to do something when the action finished running (e.g. navigate).
- Tests are included.
**TODO in further PRs**
- Finish the Activities UI and continue implementing the app flow.
- Introduce an error handling solution.
- Move the data jsons into a common folder (maybe a package?) so they
can be shared between app and server and don't duplicate files.
**Screencast**
As it can be observed, the state of the screen is recovered from the
stored "itinerary config".
Note: Activites screen appears empty, the list is just printed on
terminal at the moment.
[Screencast from 2024-07-23
10-58-40.webm](https://github.com/user-attachments/assets/54805c66-2938-48dd-8f63-a26b1e88eab6)
## Pre-launch Checklist
- [x] I read the [Flutter Style Guide] _recently_, and have followed its
advice.
- [x] I signed the [CLA].
- [x] I read the [Contributors Guide].
- [x] I updated/added relevant documentation (doc comments with `///`).
- [x] All existing and new tests are passing.
If you need help, consider asking for advice on the #hackers-devrel
channel on [Discord].
<!-- Links -->
[Flutter Style Guide]:
https://github.com/flutter/flutter/blob/master/docs/contributing/Style-guide-for-Flutter-repo.md
[CLA]: https://cla.developers.google.com/
[Discord]:
https://github.com/flutter/flutter/blob/master/docs/contributing/Chat.md
[Contributors Guide]:
https://github.com/flutter/samples/blob/main/CONTRIBUTING.md