From b147d632e81215b47e396c8a8afee9999d291e7b Mon Sep 17 00:00:00 2001 From: Codex Date: Tue, 14 Apr 2026 23:01:02 +0300 Subject: [PATCH] feat: add role switch login and clean production copy --- ...6-04-14-role-switch-and-production-copy.md | 83 +++++++++++++++++ ...-role-switch-and-production-copy-design.md | 37 ++++++++ src/components/auth/OtpLoginForm.jsx | 32 ++++--- src/components/auth/OtpLoginForm.test.jsx | 13 +-- src/components/dashboard/PwaDemoPanel.jsx | 88 ------------------- .../dashboard/PwaDemoPanel.test.jsx | 63 ------------- src/context/AuthContext.jsx | 20 ++++- src/context/AuthContext.test.js | 20 ++++- src/data/mockAppData.js | 12 +-- src/pages/DashboardPage.jsx | 14 --- src/pages/LoginPage.jsx | 21 ++++- src/services/deliveryInvitationApi.js | 36 +++++++- src/services/deliveryInvitationApi.test.js | 23 +++++ 13 files changed, 265 insertions(+), 197 deletions(-) create mode 100644 docs/superpowers/plans/2026-04-14-role-switch-and-production-copy.md create mode 100644 docs/superpowers/specs/2026-04-14-role-switch-and-production-copy-design.md delete mode 100644 src/components/dashboard/PwaDemoPanel.jsx delete mode 100644 src/components/dashboard/PwaDemoPanel.test.jsx diff --git a/docs/superpowers/plans/2026-04-14-role-switch-and-production-copy.md b/docs/superpowers/plans/2026-04-14-role-switch-and-production-copy.md new file mode 100644 index 0000000..b7dfa72 --- /dev/null +++ b/docs/superpowers/plans/2026-04-14-role-switch-and-production-copy.md @@ -0,0 +1,83 @@ +# Role Switch And Production Copy Implementation Plan + +> **For agentic workers:** REQUIRED: Use superpowers:subagent-driven-development (if subagents available) or superpowers:executing-plans to implement this plan. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** Добавить служебный вход по специальному email с выбором роли, убрать demo/PWA-подачу из интерфейса и подготовить клиентскую showcase-ссылку для показа. + +**Architecture:** Обычный OTP flow остается без изменений. Новая служебная ветка определяется на уровне login/auth helper-логики через специальный email `roles@local` и использует локальный fallback-профиль выбранной роли без OTP. UI-copy в логине, overview и клиентской странице упрощается до рабочего нейтрального тона, а PWA explanatory panel убирается из overview. + +**Tech Stack:** React 18, Vite, existing UI kit, Vitest, local fallback auth, Supabase Auth. + +--- + +## Chunk 1: Role Switch Entry + +### Task 1: Зафиксировать тестами служебный вход по специальному email + +**Files:** +- Modify: `src/components/auth/OtpLoginForm.test.jsx` +- Modify: `src/context/AuthContext.test.js` + +- [ ] **Step 1: Add failing tests for service email mode** +- [ ] **Step 2: Run targeted auth tests and confirm failure** +- [ ] **Step 3: Verify copy no longer references demo mode in production path** + +### Task 2: Реализовать special-email вход без OTP + +**Files:** +- Modify: `src/context/AuthContext.jsx` +- Modify: `src/pages/LoginPage.jsx` +- Modify: `src/components/auth/OtpLoginForm.jsx` + +- [ ] **Step 1: Add helper constants for `roles@local` and service mode detection** +- [ ] **Step 2: Route special-email flow to local role-based sign-in** +- [ ] **Step 3: Update login form labels/buttons for service mode** +- [ ] **Step 4: Re-run targeted auth tests and confirm pass** + +## Chunk 2: Production Copy Cleanup + +### Task 3: Убрать demo/PWA explanatory copy + +**Files:** +- Modify: `src/pages/DashboardPage.jsx` +- Modify: `src/pages/LoginPage.jsx` +- Modify: `src/components/auth/OtpLoginForm.jsx` +- Modify: `README.md` if needed + +- [ ] **Step 1: Remove PWA explanatory panel from overview** +- [ ] **Step 2: Replace demo-oriented labels/messages with neutral product copy** +- [ ] **Step 3: Re-run affected UI tests** + +## Chunk 3: Client Showcase Link + +### Task 4: Добавить локальную клиентскую showcase-ссылку + +**Files:** +- Modify: `src/services/deliveryInvitationApi.js` +- Modify: `src/pages/ClientDeliveryPage.jsx` +- Modify: `src/components/client/DeliveryChoiceFlow.test.jsx` +- Modify or Create: related test file if needed + +- [ ] **Step 1: Add failing test for showcase token payload** +- [ ] **Step 2: Implement local invitation for showcase token** +- [ ] **Step 3: Verify tomorrow/after-tomorrow and half-day slots are shown** +- [ ] **Step 4: Re-run client tests and confirm pass** + +## Chunk 4: Final Verification + +### Task 5: Проверка итогового сценария + +**Files:** +- Reference: `src/pages/LoginPage.jsx` +- Reference: `src/pages/DashboardPage.jsx` +- Reference: `src/pages/ClientDeliveryPage.jsx` + +- [ ] **Step 1: Run targeted test suite** + +Run: `npm test -- src/context/AuthContext.test.js src/components/auth/OtpLoginForm.test.jsx src/components/client/DeliveryChoiceFlow.test.jsx src/components/client/DeliverySlotsPicker.test.jsx` +Expected: PASS + +- [ ] **Step 2: Run broader UI regression checks** + +Run: `npm test -- src/components/orders/OrdersTable.test.jsx src/components/orders/OrderDetailPanel.test.jsx src/components/orders/OrderFilters.test.jsx src/services/orderService.test.js` +Expected: PASS diff --git a/docs/superpowers/specs/2026-04-14-role-switch-and-production-copy-design.md b/docs/superpowers/specs/2026-04-14-role-switch-and-production-copy-design.md new file mode 100644 index 0000000..6ae8f60 --- /dev/null +++ b/docs/superpowers/specs/2026-04-14-role-switch-and-production-copy-design.md @@ -0,0 +1,37 @@ +# Role Switch And Production Copy Design + +**Goal:** Убрать из пользовательского интерфейса явную demo/PWA-подачу, добавить служебный сценарий быстрого входа по специальному email с выбором роли и подготовить аккуратную клиентскую ссылку для показа выбора доставки. + +## Scope + +- Обычный рабочий OTP-вход остается основным сценарием. +- При вводе специального email `roles@local` логин переключается в локальный служебный режим: + - пользователь выбирает роль `manager`, `logistician` или `driver`; + - OTP не требуется; + - приложение авторизует пользователя через локальный fallback-профиль для выбранной роли. +- Из интерфейса убираются тексты и панели, которые прямо продают demo/PWA-режим. +- Для клиентского показа появляется локальный showcase-token с понятными слотами: + - завтра / послезавтра; + - до обеда / после обеда. + +## UX Decisions + +- Служебный email не скрывается глубоко в коде: он поддерживается формой логина напрямую, чтобы им было удобно пользоваться на встрече. +- Тексты в логине и дашборде должны звучать как рабочий продукт, без слов `demo`, `демонстрация`, `PWA-версия`, `offline demo`. +- Быстрый вход по роли оформляется как сервисный режим доступа, а не как обучающий блок. +- Клиентская showcase-ссылка должна выглядеть как реальная страница подтверждения доставки, а не как технический мок. + +## Data Approach + +- Для служебного role-switch входа используются уже существующие локальные профили ролей. +- Для showcase-клиента используется локально собранный invitation payload, без вызова Supabase. +- Боевой Supabase flow не меняется и продолжает обслуживать обычные invitation token. + +## Validation + +- Тесты на логин покрывают: + - обычный OTP-copy без demo-текста; + - служебный режим по `roles@local`; + - выбор роли без OTP. +- Тесты client flow покрывают showcase invitation. +- После правок прогоняются таргетированные тесты UI и auth. diff --git a/src/components/auth/OtpLoginForm.jsx b/src/components/auth/OtpLoginForm.jsx index 57e2f52..8b105cb 100644 --- a/src/components/auth/OtpLoginForm.jsx +++ b/src/components/auth/OtpLoginForm.jsx @@ -15,10 +15,16 @@ export const OtpLoginForm = ({ isOtpSent, isLoading, isDemoMode, + isRoleSwitchMode, onRequestOtp, onVerifyOtp, error, }) => { + const isServiceAccessMode = + Boolean(isRoleSwitchMode) || String(email || "").trim().toLowerCase() === "roles@local"; + const showsLocalRolePicker = !isOtpSent && (isServiceAccessMode || isDemoMode); + const submitLabel = isServiceAccessMode ? "Войти без кода" : "Отправить код"; + return (
@@ -29,8 +35,8 @@ export const OtpLoginForm = ({ Вход по email и коду

- Введите email, и код придет на почту. В рабочем режиме доступ определяется учетной - записью в системе, а не выбором роли. + Введите email, и код придет на почту. Для быстрого доступа к рабочим кабинетам можно + использовать служебный адрес и выбрать роль вручную.

@@ -49,14 +55,14 @@ export const OtpLoginForm = ({ /> - {isDemoMode && !isOtpSent ? ( + {showsLocalRolePicker ? (

- Демо-режим активен + {isServiceAccessMode ? "Служебный вход" : "Локальный вход"}