docs: sync review gate and subscription UX. Refs EventHub/EventHubFront#8
This commit is contained in:
@@ -100,6 +100,11 @@ EventHub — платформа для управления событиями
|
|||||||
|
|
||||||
### 2.4. Отзывы и рейтинги
|
### 2.4. Отзывы и рейтинги
|
||||||
- Пользователи могут оставлять отзывы (рейтинг 1–5 и комментарий) на события или календари.
|
- Пользователи могут оставлять отзывы (рейтинг 1–5 и комментарий) на события или календари.
|
||||||
|
- **Право на отзыв (`logic_review:can_review/3`):**
|
||||||
|
- `event` — только при `confirmed` booking пользователя на это событие;
|
||||||
|
- `calendar` — только при `confirmed` booking на **любое** событие этого календаря;
|
||||||
|
- иначе create возвращает `cannot_review`.
|
||||||
|
- Жалоба (`report`) на event/calendar **не** требует booking.
|
||||||
- Отзыв можно редактировать (сохраняется `edited_at`).
|
- Отзыв можно редактировать (сохраняется `edited_at`).
|
||||||
- Отзывы могут быть скрыты модератором.
|
- Отзывы могут быть скрыты модератором.
|
||||||
- При добавлении/изменении/удалении отзыва пересчитывается средний рейтинг события
|
- При добавлении/изменении/удалении отзыва пересчитывается средний рейтинг события
|
||||||
@@ -122,6 +127,7 @@ EventHub — платформа для управления событиями
|
|||||||
Параметр `type` (`event` | `calendar`) ограничивает один тип; без `type` — оба в `results`.
|
Параметр `type` (`event` | `calendar`) ограничивает один тип; без `type` — оба в `results`.
|
||||||
Если tops пусты или после фильтра `can_access` ничего не осталось — fallback на полный scan
|
Если tops пусты или после фильтра `can_access` ничего не осталось — fallback на полный scan
|
||||||
(как при фильтрованном поиске без `q`).
|
(как при фильтрованном поиске без `q`).
|
||||||
|
В элементах `events` есть `calendar_id` и `calendar_title` (для UI-дедупа).
|
||||||
- Полнотекстовый поиск по названиям событий, календарей, тегам (при наличии `q` или любого
|
- Полнотекстовый поиск по названиям событий, календарей, тегам (при наличии `q` или любого
|
||||||
фильтра из списка выше).
|
фильтра из списка выше).
|
||||||
- Фильтрация по дате, категории, местоположению, рейтингу.
|
- Фильтрация по дате, категории, местоположению, рейтингу.
|
||||||
@@ -162,6 +168,8 @@ EventHub — платформа для управления событиями
|
|||||||
### 2.9. Платная подписка
|
### 2.9. Платная подписка
|
||||||
- Пользователи могут оформить подписку (`subscription`) с разными планами: monthly, quarterly,
|
- Пользователи могут оформить подписку (`subscription`) с разными планами: monthly, quarterly,
|
||||||
biannual, annual.
|
biannual, annual.
|
||||||
|
- Цены (`logic_subscription:plan_price/1`, minor units): monthly **999**, quarterly **2499**,
|
||||||
|
biannual **4499**, annual **7999**; trial — 0. Платёжный шлюз — заглушка (`process_payment` → ok).
|
||||||
- Статус подписки: `active`, `expired`, `cancelled`.
|
- Статус подписки: `active`, `expired`, `cancelled`.
|
||||||
- Отслеживание использования пробного периода (`trial_used`).
|
- Отслеживание использования пробного периода (`trial_used`).
|
||||||
|
|
||||||
|
|||||||
+13
-4
@@ -52,11 +52,16 @@ Deep-link на календарь, владельцем которого явл
|
|||||||
- Главные вкладки: **Календарь** (`/`, `/c/:id`), **Найти** (`/search`), **Записи** (`/bookings`), **Ещё** (`/more`).
|
- Главные вкладки: **Календарь** (`/`, `/c/:id`), **Найти** (`/search`), **Записи** (`/bookings`), **Ещё** (`/more`).
|
||||||
- Контекст виджета: свой календарь (селектор) или чужой (browse после поиска). `personal` чужой — только просмотр; `commercial` — запись на событие.
|
- Контекст виджета: свой календарь (селектор) или чужой (browse после поиска). `personal` чужой — только просмотр; `commercial` — запись на событие.
|
||||||
- Выбор события открывает карточку действий: mobile — bottom sheet; desktop — боковая панель. Действия зависят от роли (owner / participant).
|
- Выбор события открывает карточку действий: mobile — bottom sheet; desktop — боковая панель. Действия зависят от роли (owner / participant).
|
||||||
- Без выбранного события — панель «О календаре» (описание, рейтинг, отзывы; у browse — отзыв/жалоба на календарь).
|
- Без выбранного события — панель «О календаре» (описание, title/meta, рейтинг, отзывы).
|
||||||
|
Форма отзыва на календарь/событие — только при confirmed booking; жалоба доступна без записи.
|
||||||
|
- На чужом `/c/:id` — CTA «Мой календарь» и таб Calendar не `aria-current` (intent `browse`).
|
||||||
|
- Открытие события — `navigate` push (не `replace`), чтобы Back возвращал к календарю.
|
||||||
- Owner: WS subscribe на активный календарь; `PUT` события из карточки; `PUT` календаря на `/calendars`.
|
- Owner: WS subscribe на активный календарь; `PUT` события из карточки; `PUT` календаря на `/calendars`.
|
||||||
- Поиск — список календарей/событий; выбор подставляет календарь в виджет (`/c/:id` или `/c/:id/e/:eventId`).
|
- Поиск (`/search`): query/filters в URL params (восстановление при возврате); chip type фильтрует
|
||||||
|
discovery tops без ухода из Popular; в строке результата — id snippet и `calendar_title` для event.
|
||||||
- CRUD своих календарей — `/calendars` (из «Ещё»). Legacy `/discover`, `/calendars/:id` → redirects.
|
- CRUD своих календарей — `/calendars` (из «Ещё»). Legacy `/discover`, `/calendars/:id` → redirects.
|
||||||
- На мобиле — bottom tab bar (+ safe-area); на desktop — sticky header + табы.
|
- На мобиле — bottom tab bar (+ safe-area); на desktop — sticky header + табы.
|
||||||
|
Nav `aria-current` синхронизирован с `useLocation` (без remount `Outlet` по pathname).
|
||||||
- Mood themes — см. §3.2.
|
- Mood themes — см. §3.2.
|
||||||
|
|
||||||
## 3.2. Настроения (mood themes)
|
## 3.2. Настроения (mood themes)
|
||||||
@@ -125,12 +130,16 @@ Redirects: `/discover` → `/search`; `/calendars/:id` → `/c/:id`; `/calendars
|
|||||||
### 5.7. Отзывы
|
### 5.7. Отзывы
|
||||||
`GET/POST /v1/reviews`, `GET/PUT/DELETE /v1/reviews/:id`, `GET /v1/user/reviews`. Цели: `event` | `calendar`.
|
`GET/POST /v1/reviews`, `GET/PUT/DELETE /v1/reviews/:id`, `GET /v1/user/reviews`. Цели: `event` | `calendar`.
|
||||||
Голос: `PUT /v1/reviews/:id/vote` `{ "value": "like"|"dislike" }`, `DELETE /v1/reviews/:id/vote`; в ответах — `my_vote`.
|
Голос: `PUT /v1/reviews/:id/vote` `{ "value": "like"|"dislike" }`, `DELETE /v1/reviews/:id/vote`; в ответах — `my_vote`.
|
||||||
|
UI: форма отзыва скрыта без confirmed booking (event — booking на это событие; calendar — booking на событие календаря); подсказка + жалоба остаются.
|
||||||
|
|
||||||
### 5.8. Жалобы
|
### 5.8. Жалобы
|
||||||
`POST /v1/reports` — `target_type`: `event` | `calendar` | `review`.
|
`POST /v1/reports` — `target_type`: `event` | `calendar` | `review`. Жалоба не требует booking.
|
||||||
|
|
||||||
### 5.9. Подписка
|
### 5.9. Подписка
|
||||||
`GET /v1/subscription`, `POST /v1/subscription` (`start_trial` | `activate`).
|
`GET /v1/subscription`, `POST /v1/subscription` (`start_trial` | `activate` + `plan` + опционально `payment_info`).
|
||||||
|
Планы и цены (как Back `plan_price/1`, minor units → ₽): monthly **999**, quarterly **2499**, biannual **4499**, annual **7999**.
|
||||||
|
UI: карточки сравнения, локализованный «Бесплатно» без подписки, trial, демо-оплата (шлюз-заглушка).
|
||||||
|
Создание commercial-календаря без подписки → `402` → редирект на `/subscription`.
|
||||||
|
|
||||||
### 5.10. Тикеты
|
### 5.10. Тикеты
|
||||||
- ErrorBoundary / необработанные ошибки → `POST /v1/tickets` с `source=frontend`
|
- ErrorBoundary / необработанные ошибки → `POST /v1/tickets` с `source=frontend`
|
||||||
|
|||||||
Reference in New Issue
Block a user