3a71d0df1f
Tests / frontend-test (push) Successful in 1m20s
Co-authored-by: gorbenko.pavel <gorbenko.pavel@tansu.kz> Reviewed-on: http://git.tnsu.kz/timur.gorodetskiy/request-portal/pulls/8
25 lines
1.9 KiB
TypeScript
25 lines
1.9 KiB
TypeScript
// Общее событие «список заявок изменился»: создана новая заявка или принято
|
|
// решение согласующего. Панель «Текущие заявки» (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);
|
|
}
|