/Pomodo

Primary LanguageDart

Pomodo

Pomodo (Pomodoro + ToDo) is a mobile application made with Flutter for a case study and test.

Flutter SDK Badge

presentation

This application was made with Flutter using BLoC, and some other minimal packages.

To run the app you need a todoist test token, which can be obtained via the console at the todist developer website, and run the application with your desired commands and a dart define flag, for example:

flutter run --release --dart-define TODOIST_API_TEST_TOKEN=$TODOIST_TEST_TOKEN

Where $TODOIST_TEST_TOKEN is the previously mentioned token.

If you wish to easily update the project dependencies, just run the script scripts/refresh_project_pub.sh, which will update any dart pub dependencies necessary and build the application localization files.

Additionally, you can run the application tests using a helper script located at scripts/run_tests.sh. Depending on the test type (unit or integration), you may also need the test token.

Also, some tests may be failing as there were breaking changes near the end of the case study, and there wasn't enough time to address them.

MVP Development

App data flow

Initial data retrieve

  1. Get all Projects
    1. Check if has parent project named "pomodo_app"
      1. If has, return its data and ID
      2. Otherwise, create and do step above
    2. Filter all projects that have the parent ID of above
    3. Pass filtered projects
  2. Get all Sections
    1. Filter Sections based on projects IDs
    2. Check if has TODO, PROGRESS and DONE sections
      1. If has, return its data and ID
      2. Otherwise, create missing sections and do step above
  3. Get all Tasks
    1. Filter each Task if it's a child project of the "pomodo_app" project ID
    2. Add each Task to each project, in each section with both having the same ID

Tracking time

Each Task has a description field, at the end of the description field there's a tag as:

<pomodo_app:time_s:0>

Where zero is the duration in seconds of how long the task has been tracked for, as the API doesn't have a metadata option, this was the alternative.

Progress tracking

Schedule

Where monday is 08/07 and friday 12/07.

Weekday mon tue wed thu fri
Availability x x x

Total time

The total time focused in the project (average of bellow tasks) was around 30.6 hours.

General
  • Base project structure (+30min)
  • Add logger (+5min)
  • Add main FlutterError.onError
  • Add main runZonedGuarded
  • Add i18n with slang package (+30m)

Features

  • Create Project, Section and Task model (+30min)
    • Create models test
  • Create Project, Section and Task datasource (+3h)
    • Tests for each datasource implementation
    • Connect with developer todoist for Project endpoints integration tests
    • Add environment variable for test token
  • Create Task comment datasource (+1h)
  • Create Project repository (+3h)
    • Create repository test
    • Add to app providers
  • Create Project store (+2h)
  • Create Tasks cubit (+3h)
    • Create tests
    • Get tasks
    • Add task
    • Move tasks
    • Close task
    • Start task timer
    • Update task time (maybe)
    • Filter tasks
  • Added Task timer (+5h)
    • Start timer
    • Listen to timers update
    • Stop timer
    • Save timer data periodically
  • History of completed tasks
  • Task comment
  • Better error messages

UI

  • App styling and assets (+2h)
  • Tasks Home screen (+3h)
    • Task To Do, In Progress, Done tabs
  • Create task screen (+6h)
    • Connect task screen with states
    • Edit task screen (flagged screen)
  • Task bottom modal (+30m)
  • Task tracking time modal screen (+30m)
  • Splash screen
  • Home bottom tab page with history of completed tasks
    • Make use of StatefulShellRoute with indexed stack from Go Router
  • Task comment flow in task details modal

Outro

  • Add application videos to README
  • Add application icon, name and signature

Extra

In case there's extra time remaining, implement the following in order of priority/easier

  • Dark theme
  • Skeleton loading animation
  • Local notifications
  • Implement GitHub CI/CD
  • Offline feature
    • Caching, or;
    • Offline first
  • Feature:
    • User can create/rename/delete more than one project

Design references