feat(pwa): вход для сотрудника, просмотр от лица водителя и вкладка «Отладка»
Приложение обкатывается на боевом контуре, поэтому интерфейс надо проверять на живых данных — а живые данные лежат у настоящих водителей. * «Вход для сотрудника» (/dev) — логин учётки CRM, поддержан второй шаг 2FA; дальше поиск водителя по ФИО/телефону/id и просмотр его экранов. * Плашка «Смотрю как …» над всеми экранами: интерфейс в этом режиме неотличим от водительского, и чужой баланс легко принять за свой. * Вкладка «Отладка» (/debug, водителю недоступна): смена водителя, driver_id, режим, срок токена, адрес API, коммит и время сборки, журнал последних 40 ответивших запросов, сброс кэша сервис-воркера. * Пополнение под просмотром идёт в учебный контур: экран /mock-pay/:orderId выбирает, что «ответит» банк, а настоящий экран оплаты разбирает эти статусы своим боевым кодом. Ни рубля, ни чека 54-ФЗ. Заодно доезжает незакоммиченная работа прошлой сессии: дев-прокси в vite.config.ts, его тест и разобранный .env.example. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,29 @@
|
||||
import { create } from "zustand";
|
||||
import { persist } from "zustand/middleware";
|
||||
|
||||
/**
|
||||
* Сеанс СОТРУДНИКА — учётка CRM, которой берут просмотр от лица водителя.
|
||||
*
|
||||
* Хранится отдельно от водительского: это два разных токена с разным смыслом.
|
||||
* «Перестать смотреть за водителя» обязано оставлять сотрудника залогиненным,
|
||||
* иначе смена водителя каждый раз означала бы новый ввод пароля; и наоборот —
|
||||
* `clear()` водительского сеанса не должен трогать сотрудника.
|
||||
*/
|
||||
interface StaffState {
|
||||
token: string | null;
|
||||
username: string | null;
|
||||
setStaff: (token: string, username: string) => void;
|
||||
clear: () => void;
|
||||
}
|
||||
|
||||
export const useStaff = create<StaffState>()(
|
||||
persist(
|
||||
(set) => ({
|
||||
token: null,
|
||||
username: null,
|
||||
setStaff: (token, username) => set({ token, username }),
|
||||
clear: () => set({ token: null, username: null }),
|
||||
}),
|
||||
{ name: "pp-driver-staff" }
|
||||
)
|
||||
);
|
||||
Reference in New Issue
Block a user