Документ описывает фактически реализованные пользовательские сценарии мобильного клиента из mobile_around/src/pages и mobile_around/src/views. Для каждого самостоятельного сценария приведена отдельная схема движения и текстовое описание. Маршруты указаны в формате Nuxt pages.
/auth → Регистрация → /auth/register → заполнить форму → /auth/verify → OTP
├─ адрес есть → /home
└─ адреса нет → /address → выбрать точку → заполнить адрес → /home
После отправки регистрационной формы идентификатор сохраняется как ожидающий подтверждения. Без него middleware не разрешает открыть OTP-экран. Успешная проверка кода сохраняет access/refresh tokens. Пользователь без адреса обязательно проходит его настройку.
/auth → Уже есть аккаунт → /auth/login → телефон или e-mail → /auth/verify → OTP
├─ адрес есть → /home
└─ адреса нет → /address → /home
Пользователь вводит телефон или e-mail, запрашивает код и подтверждает его. На OTP-экране доступна повторная отправка. После проверки создаётся локальная сессия.
/
├─ есть токены → /home
└─ нет токенов → /auth
защищённый маршрут без токенов → /auth
auth-маршрут с токенами → /home
/profile → Выйти → очистить сессию → /auth
Глобальный middleware разделяет гостевые и защищённые маршруты. Наличие access и refresh token считается активной сессией. Logout очищает локальные токены и профиль.
/address → карта → геолокация или ручной выбор → Продолжить
→ город + улица + здание + дом → сохранить
├─ задан redirect → вернуться в исходный flow
└─ redirect не задан → /home
Сначала выбираются координаты, затем уточняются обязательные текстовые части адреса. Экран поддерживает возврат в прерванный flow через query-параметр redirect.
нижнее меню
├─ Главная → /home
├─ Календарь → /calendar
├─ Уведомления → /notifications
├─ Чаты → /chat
└─ Профиль → /profile
Нижнее меню показывается на основных защищённых экранах. На auth, address и полноэкранных мастерах оно скрывается.
/profile → Редактировать профиль → /profile/edit
→ изменить данные и/или аватар → сохранить → /profile
Форма заполняется текущими данными. Имя обязательно. После сохранения обновляются backend и Pinia store.
/profile → /profile/settings
├─ Язык → /profile/settings/language → выбрать → настройки
├─ Документы → /profile/settings/documents
└─ Обратная связь → /profile/settings/feedback → текст → отправить
Язык сразу меняет локаль и сохраняется в профиле. Документы — информационная страница. Feedback отправляется только с непустым текстом. «Защита профиля» и «Пароль» пока не имеют действий.
/chat → список диалогов → /chat/{chatID} → история
├─ текст → отправить
└─ выбрать/перетащить файлы → загрузить → отправить
Диалоги сортируются по последнему сообщению. В треде доступны текст и вложения; выбранные файлы можно удалить до отправки.
/profile → Служба поддержки → найти is_support чат
├─ найден → /chat/{supportChatID}
└─ не найден → error toast
Пункт доступен в личной и бизнес-вкладке. Клиент ищет уже созданный support-чат и не создаёт его самостоятельно.
/notifications → Все или Прочитанные → открыть → отметить прочитанным
├─ open_hot_ad → /hot-ads/{id}
├─ open_chat + id → /chat/{id}
├─ open_chat → /chat
├─ event_id + sheet_type → /events/{type}/{id}
└─ нет action → /notifications
Непрочитанный элемент помечается прочитанным перед переходом. Целевой маршрут определяется payload уведомления.
/profile/cards?usage=client|business → список
├─ выбрать → сделать основной
├─ удалить → обновить список
└─ добавить
├─ business → тип владельца
└─ client/business → redirect провайдера → /profile/cards/complete → список
Карты разделены по назначению. Можно назначить основную и удалить карту. Основной add flow использует redirect платёжного провайдера и callback завершения.
/home → проверить адрес
├─ адреса нет → /address → /home
└─ адрес есть → карта + выдача → поиск/категория/фильтры
→ применить → анкеты → /sheets/{id}?type={type}
Пользователь ищет текстом, выбирает быстрый тип или задаёт рейтинг, радиус, сортировку, теги, получение и место оказания. Результаты показаны на карте и в draggable bottom sheet.
/sheets/{id}
├─ галерея
├─ добавить/удалить из избранного
├─ отзывы → /sheets/{id}/reviews
├─ услуги/товары → /sheets/{id}/services
└─ бронирование → /sheets/{id}/book
Карточка адаптируется под job, storage, contract и bringing и показывает исполнителя, рейтинг, локацию, позиции и фото.
/profile → Избранное → /profile/favorites → список
├─ открыть анкету
└─ удалить из избранного → убрать карточку
Экран загружает favorite sheets пользователя. Удаление выполняется без отдельного подтверждения.
/sheets/{id}/book?type=job → услуги и количество → место/адрес
→ дата → свободный слот → проверка → карта → создать event → success
├─ чат
└─ главная
Цена и длительность пересчитываются по выбранным услугам. Доступность адреса зависит от типа локации и радиуса исполнителя. После даты загружаются свободные слоты.
/sheets/{id}/book?type=product_storage → товары → pickup/delivery
→ адрес → дата и время → карта → создать event → success → чат или главная
Способы получения зависят от анкеты. Пользователь выбирает позиции, получение, адрес, время и оплату; интерфейс показывает итог и предоплату.
/sheets/{id}/book?type=product_bringing → товары → контроль вместимости
→ адрес → дата и время → карта → создать event → success → чат или главная
Количество позиций влияет на занятую вместимость транспорта. Заказ создаётся после выбора адреса, времени и карты.
/sheets/{id}/book?type=product_contract → позиции → начало и окончание
→ описание → карта → создать event → отправить на согласование → чат
Цена строится по минимальным ценам позиций, срок ограничивается настройками продукта. После создания event клиент отправляет заказ самозанятому на согласование.
/profile/orders → Текущие или Прошлые → заказ
├─ детали → /events/{type}/{id}
├─ повторить → календарь или /sheets/{id}/book
├─ отзыв → /reviews/new
└─ QR bringing → /orders/bringing/{id}/issuance
События всех типов объединены и разделены на текущие и прошлые. Действия зависят от типа и статуса.
/events/{type}/{id} → детали
├─ предложить перенос → дата/время → отправить
├─ входящий перенос → принять/отклонить
└─ отменить → обновить статус
Набор действий вычисляется по типу, статусу и роли. Входящее предложение можно принять или отклонить.
/chat/{id} → карточка contract-заказа → Ваш заказ → Оплатить
→ payment modal → подтвердить → success → вернуться в чат
После платёжного запроса самозанятого клиент видит сумму, срок и позиции и подтверждает оплату в modal flow.
оплата завершена → Принять заказ → подтверждение → завершить event
→ оставить отзыв → рейтинг + имя + текст → success → главная
Клиент подтверждает получение результата. После завершения contract event frontend предлагает встроенную форму отзыва.
/home → Горячие объявления → список → /hot-ads/{id}
→ галерея и описание → Написать в чат → /chat
Hot ads — отдельный режим выдачи. Детальная страница показывает категорию, цену, адрес и фото. Связь пока ведёт в общий список чатов.
завершённый заказ → /reviews/new → рейтинг 1–5 + имя + текст
→ отправить → success → главная
Рейтинг, имя и sheet id обязательны, текст ограничен 500 символами. Форма также доступна внутри contract-чата.
/profile → вкладка Бизнес
├─ мои анкеты
├─ шаблоны времени
├─ мои заказы
├─ карты для бизнеса
└─ поддержка
Личная и бизнес-роль — вкладки одного профиля. Выбор сохраняется в localStorage и query tab.
/profile/sheets → Создать → выбрать job → информация, теги, фото
→ радиус и место оказания
├─ нет адреса → /address → вернуться
└─ адрес есть → сохранить
→ success → услуги: создать/изменить/удалить → success
→ /profile/sheets/calendar?type=job
Сначала создаётся анкета и география работы, затем минимум одна услуга с ценой, длительностью и паузой. Завершение ведёт в календарь.
/profile/sheets/new → storage → информация + pickup/delivery + фото → адрес
→ [если delivery] радиус доставки и цена → радиус обслуживания и цена
→ success → товары: создать/изменить/удалить → success → календарь → профиль
Flow ветвится по наличию доставки. Для радиусов задаются расстояние и цена. Пустой список товаров завершить нельзя.
/profile/sheets/new → bringing → режим → информация и фото → адрес
→ success → позиции: создать/изменить/удалить → success
→ календарь → payment placeholder → профиль
Самозанятый выбирает режим и создаёт перевозимые позиции с параметром вместимости. Платёжный шаг мастера пока информационный.
/profile/sheets/new → contract → режим → информация и фото → адрес
→ success → позиции: создать/изменить/удалить → success
→ payment placeholder → onboarding чата → профиль
Позиции договора содержат минимальную цену и параметры срока. После сохранения следуют информационные экраны оплаты и чата.
/profile?tab=business → Шаблоны времени
→ /profile/sheets/calendar?mode=template&global=1
→ тип + название + цвет + интервалы + перерывы → сохранить → бизнес-профиль
Глобальный шаблон создаётся независимо от анкеты. Название и цвет обязательны; интервалы и перерывы сохраняются в template.
/profile/sheets/{id} → Календарь → выбрать даты → выбрать шаблон
├─ шаблона нет → создать
└─ шаблон есть → применить → success → продолжить мастер или профиль
Для анкеты тип шаблона фиксируется query-параметрами. Выбранный template применяется к отмеченным календарным датам.
/profile/sheets → выбрать → /profile/sheets/{id}
├─ предпросмотр → /sheets/{id}
├─ редактировать → /profile/sheets/{id}/edit
├─ позиции → /profile/sheets/{id}/items
├─ календарь → /profile/sheets/calendar
├─ архивировать/разархивировать
└─ удалить → список
Список объединяет все типы анкет. Экран анкеты даёт доступ к содержимому, календарю и lifecycle-действиям.
/profile/issuer-orders → Текущие или Прошлые → заказ
├─ детали → /events/{type}/{id}
├─ перенос → принять/отклонить
├─ bringing → начать доставку и публиковать геопозицию
└─ выдача → scanner
OrdersView в режиме issuer показывает события исполнителя. Для bringing доступен запуск доставки с публикацией геолокации через WebSocket.
заказ → /events/{type}/{id}/scanner → камера
├─ сканировать QR
└─ ввести token вручную
→ отправить → успех или повтор
Scanner использует Capacitor и имеет ручной fallback. После чтения token отправляется в issuance API.
клиентский bringing-заказ → /orders/bringing/{id}/issuance
→ получить token → показать QR → самозанятый сканирует
└─ ошибка → повторить
Это парный flow к scanner: клиент показывает QR или текстовый token, самозанятый подтверждает выдачу своим устройством.
contract-чат → Ваш заказ → проверить позиции, сумму и дату
→ отправить запрос оплаты → issuer approve → клиент оплачивает → клиент принимает
При статусе issuer_approval владелец бизнес-заказа отправляет платёжный запрос. Дальнейшие действия выполняет клиент.
/profile/hot-ads → Создать → категория + текст + цена + точка + радиус + фото
→ сохранить → активировать → активные
├─ завершить → freeze → завершённые
└─ редактировать → /profile/hot-ads/new?ad_id={id} → сохранить
Форма обслуживает создание и редактирование. Фото загружаются отдельно, затем новое объявление активируется. Freeze переносит его во вкладку завершённых.
/profile./chat, а не к автору./profile/cards/new существует, но основной flow использует provider redirect.