Forge

Forge — User Flows

Flowchart TD · Mermaid · Синтаксис GitHub-сумісний Екрани у [квадратних дужках] — назви зі sitemap.md. {ромб} — точка рішення. (округлий) — стан: loading / empty / error / дія. ((коло)) — кінець: успіх або тупик.


MAIN JOB — J3 + J4

Знати, що тренувати сьогодні, і залогувати виконання

Хто: атлет (Оля) · Частота: 3–5 разів на тиждень

flowchart TD
    A(Запуск застосунку) --> B{"Автентифікований?"}
    B -->|ні| C["Вхід"]
    C --> B
    B -->|так| D{"Підключений до тренера?"}

    D -->|ні| E["Сьогодні — план на день"]
    E --> F("Стан: немає тренера — введи інвайт-код")
    F --> Z1(("Тупик: очікуємо інвайт від тренера"))

    D -->|так| G("Завантажуємо план...")
    G --> H{"Завантажено?"}
    H -->|ні| I("Помилка мережі")
    I --> J{"Повторити?"}
    J -->|так| G
    J -->|ні| Z2(("Тупик: немає з'єднання"))

    H -->|так| K{"План на сьогодні є?"}
    K -->|ні| L["Сьогодні — план на день"]
    L --> M("Стан: план не призначено — чекаємо від тренера")
    M --> Z3(("Тупик: чекаємо план"))

    K -->|так| N["Сьогодні — план на день"]
    N --> O("Тап — Почати тренування")
    O --> P["Активне тренування / Логер"]

    P --> Q{"Заповнив вагу і повтори?"}
    Q -->|ні| R("Стан: поля порожні — кнопка Зберегти неактивна")
    R --> P

    Q -->|так| S("Тап — Зберегти підхід")
    S --> T{"Збережено?"}
    T -->|ні| U("Помилка збереження підходу")
    U --> V{"Повторити?"}
    V -->|так| S
    V -->|ні| Z4(("Тупик: дані підходу втрачено"))

    T -->|так| W{"Останній підхід вправи?"}
    W -->|ні| X("Таймер відпочинку")
    X --> P
    W -->|так| Y{"Остання вправа у тренуванні?"}
    Y -->|ні| AA("Перехід до наступної вправи")
    AA --> P
    Y -->|так| AB("Тап — Завершити тренування")
    AB --> AC["Завершення тренування"]
    AC --> SUCCESS1(("Успіх: тренування залоговано"))

Рішення у flow:

  1. Автентифікований? — якщо ні, блокуємо на екрані входу; після входу повертаємося
  2. Підключений до тренера? — без тренера план ніколи не з’явиться; тупик без інвайту
  3. Завантажено? — мережева помилка; retry або мертва гілка (немає кешу)
  4. План на сьогодні є? — тренер підключений, але план ще не призначений; empty state
  5. Заповнив поля? — кнопка «Зберегти» неактивна поки хоча б одне поле порожнє
  6. Збережено? — збій синхронізації; retry або застереження про втрату підходу
  7. Останній підхід? / Остання вправа? — цикл логування; вихід тільки після всіх вправ

Стани:


J1 — Тренер створює і призначає план

Хто: тренер (Максим) · Коли: початок нового тижня або новий клієнт

flowchart TD
    A(Вхід у застосунок) --> B["Мої атлети — огляд"]
    B --> C("Тап — вкладка Програми")
    C --> D["Програми — список"]
    D --> E{"Є програми?"}

    E -->|ні| F("Стан: список порожній")
    F --> G("Тап — Створити програму")
    E -->|так| G

    G --> H["Конструктор програми"]
    H --> I("Ввести назву і опис програми")
    I --> J("Тап — Додати день / сесію")
    J --> K["Редактор дня / сесії"]
    K --> L("Ввести вправу: назва, сети, повтори, вага, відпочинок")
    L --> M{"Ще вправи у цьому дні?"}
    M -->|так| L
    M -->|ні| N{"Ще дні у програмі?"}
    N -->|так| J
    N -->|ні| O("Тап — Зберегти програму")

    O --> P{"Збережено?"}
    P -->|ні| Q("Помилка збереження програми")
    Q --> R{"Повторити?"}
    R -->|так| O
    R -->|ні| Z1(("Тупик: програму не збережено"))

    P -->|так| S["Програми — список"]
    S --> T("Тап — Призначити атлету")
    T --> U["Призначити програму атлету"]
    U --> V{"Є підключені атлети?"}

    V -->|ні| W("Стан: немає жодного атлета")
    W --> X["Запросити атлета (інвайт)"]
    X --> Y{"Атлет прийняв інвайт?"}
    Y -->|ні| Z2(("Тупик: чекаємо підключення атлета"))
    Y -->|так| U

    V -->|так| AA("Вибрати атлета зі списку")
    AA --> AB("Вибрати дату початку")
    AB --> AC("Тап — Підтвердити призначення")
    AC --> AD{"Призначено?"}
    AD -->|ні| AE("Помилка призначення")
    AE --> AF{"Повторити?"}
    AF -->|так| AC
    AF -->|ні| Z3(("Тупик: план не призначено"))
    AD -->|так| SUCCESS1(("Успіх: план призначено — атлет побачить його на екрані Сьогодні"))

Рішення у flow:

  1. Є програми? — якщо порожньо, одразу пропонуємо створити нову
  2. Ще вправи? / Ще дні? — цикл побудови програми; виходимо коли тренер готовий
  3. Збережено? — збій при збереженні (немає мережі або validation error); retry або тупик
  4. Є підключені атлети? — без атлета призначити нікому; відкриваємо invite flow
  5. Атлет прийняв інвайт? — очікування on hold; продовжуємо після підключення
  6. Призначено? — збій призначення; retry або тупик

Стани:


Nutrition — Атлет логує харчування

Хто: атлет · Коли: під час або після їжі · Частота: 3–4 рази на день

flowchart TD
    A(Відкрив застосунок) --> B("Тап — вкладка Харчування")
    B --> C("Завантажуємо записи за сьогодні...")
    C --> D{"Завантажено?"}
    D -->|ні| E("Помилка мережі")
    E --> F{"Повторити?"}
    F -->|так| C
    F -->|ні| Z1(("Тупик: харчування недоступне"))

    D -->|так| G["Харчування — сьогодні"]
    G --> H{"Є записи за сьогодні?"}
    H -->|ні| I("Стан: нічого не залоговано — денні показники нульові")
    H -->|так| J("Підсумок: ккал / білки / жири / вуглеводи за день")
    I --> K("Тап — Додати їжу")
    J --> K

    K --> L["Додати їжу"]
    L --> M("Ввести назву страви")
    M --> N("Ввести калорії")
    N --> O{"Додати макроси?"}
    O -->|ні| P("Тап — Зберегти")
    O -->|так| Q("Ввести білки / жири / вуглеводи")
    Q --> P

    P --> R{"Збережено?"}
    R -->|ні| S("Помилка збереження запису")
    S --> T{"Повторити?"}
    T -->|так| P
    T -->|ні| Z2(("Тупик: запис страви втрачено"))

    R -->|так| U["Харчування — сьогодні"]
    U --> V("Оновлений підсумок: ккал і макроси додано")
    V --> W{"Додати ще одну страву?"}
    W -->|так| K
    W -->|ні| SUCCESS1(("Успіх: харчування залоговано"))

Рішення у flow:

  1. Завантажено? — кешований вид або retry; без мережі харчування недоступне
  2. Є записи за сьогодні? — empty state якщо перший запис дня; нульові показники
  3. Додати макроси? — лише ккал обов’язково; білки/жири/вуглеводи — опціонально
  4. Збережено? — retry або попередження про втрату запису
  5. Додати ще? — цикл: атлет логує кілька страв поспіль без виходу зі сценарію

Стани:


J2 + E2 — Тренер переглядає прогрес клієнта і залишає фідбек

Хто: тренер (Максим) · Коли: після тренування клієнта · Частота: кілька разів на тиждень

flowchart TD
    A(Вхід у застосунок) --> B["Мої атлети — огляд"]
    B --> C{"Є підключені атлети?"}

    C -->|ні| D("Стан: список порожній — запроси першого атлета")
    D --> E["Запросити атлета (інвайт)"]
    E --> Z1(("Тупик: чекаємо підключення"))

    C -->|так| F("Підсумок активності: хто тренувався, хто ні")
    F --> G("Вибрати клієнта зі списку")
    G --> H["Атлет — активність і фідбек"]
    H --> I{"Є тренування без фідбеку?"}

    I -->|ні| J("Стан: всі тренування вже прокоментовано")
    J --> Z2(("Тупик: нема що переглядати"))

    I -->|так| K("Завантажуємо деталі тренувань...")
    K --> L{"Завантажено?"}
    L -->|ні| M("Помилка мережі")
    M --> N{"Повторити?"}
    N -->|так| K
    N -->|ні| Z3(("Тупик: дані клієнта недоступні"))

    L -->|так| O("Вибрати конкретне тренування")
    O --> P["Деталі тренування (тренер-вид)"]
    P --> Q{"Дані виглядають коректно?"}

    Q -->|ні| R("Стан: аномальні дані — наприклад, вага різко впала")
    R --> S["Залишити фідбек"]
    Q -->|так| S

    S --> T("Написати текстовий коментар")
    T --> U{"Коментар не порожній?"}
    U -->|ні| V("Стан: поле порожнє — кнопка неактивна")
    V --> T

    U -->|так| W("Тап — Надіслати фідбек")
    W --> X{"Фідбек збережено?"}
    X -->|ні| Y("Помилка відправки")
    Y --> Z{"Повторити?"}
    Z -->|так| W
    Z -->|ні| Z4(("Тупик: фідбек не надіслано"))

    X -->|так| SUCCESS1(("Успіх: фідбек надіслано — атлет побачить у розділі Прогрес"))

Рішення у flow:

  1. Є підключені атлети? — empty state якщо тренер ще нікого не запросив
  2. Є тренування без фідбеку? — якщо всі прокоментовано, тупик: нема дій
  3. Завантажено? — мережева помилка; retry або тупик
  4. Дані коректні? — anomaly flag: різкий спад ваги або підозрілі повтори; тренер може реагувати окремо
  5. Коментар не порожній? — порожній фідбек заблоковано; кнопка неактивна
  6. Фідбек збережено? — retry або застереження про невідправлений коментар

Стани:


Новий екран додано у sitemap.md: Деталі тренування (тренер-вид) [T] (J2) — деталізований вигляд конкретного тренування атлета для тренера; точка входу до Залишити фідбек.