// Общее событие «список заявок изменился»: создана новая заявка или принято // решение согласующего. Панель «Текущие заявки» (features/myRequests) подписана // и перечитывает данные. Через window.dispatchEvent — проще шины состояния, // достаточно для нечастых событий (сохранение формы, решение согласующего). const EVENT_NAME = 'rp-requests-changed'; /** * force=true — повторный клик по УЖЕ открытому пункту меню (см. goto в * RequestPortal.tsx): пользователь явно просит обновить список, поэтому таблица * прячет прежние строки и показывает «Загрузка…», пока не придёт свежий ответ. * force=false/не задан — фоновые обновления (создание заявки, решение * согласующего, десятиминутный автообновление): строки остаются на экране, чтобы * не моргать, если данные не изменились. */ export function emitRequestsChanged(force?: boolean): void { window.dispatchEvent(new CustomEvent<{ force?: boolean }>(EVENT_NAME, { detail: { force } })); } /** Подписка на изменения. Возвращает функцию отписки (вызвать в cleanup эффекта). */ export function onRequestsChanged(handler: (force?: boolean) => void): () => void { const listener = (e: Event): void => handler((e as CustomEvent<{ force?: boolean }>).detail?.force); window.addEventListener(EVENT_NAME, listener); return () => window.removeEventListener(EVENT_NAME, listener); }