diff --git a/frontend/src/webparts/approvalAdmin/components/screens/ManageRequestsScreen.tsx b/frontend/src/webparts/approvalAdmin/components/screens/ManageRequestsScreen.tsx index dc21171..831cb4d 100644 --- a/frontend/src/webparts/approvalAdmin/components/screens/ManageRequestsScreen.tsx +++ b/frontend/src/webparts/approvalAdmin/components/screens/ManageRequestsScreen.tsx @@ -192,11 +192,21 @@ export const ManageRequestsScreen: React.FC = ({ api // title/status в комбобоксе (а значит, и в localStorage) держим // синхронными с сервером — особенно важно после захода по глубокой // ссылке, где изначально они пустые (см. эффект-затравку выше). - setSelection(prev => - prev.selectedRequest && prev.selectedRequest.id === m.request.id - ? { ...prev, selectedRequest: m.request } - : prev - ); + // + // ВАЖНО: возвращаем ТОТ ЖЕ prev (без изменений), если title/status не + // отличаются — m.request это каждый раз НОВЫЙ объект (свежий парсинг + // ответа), и если писать его в состояние безусловно, selectedRequest + // получает новую ссылку на КАЖДОЙ загрузке, даже когда содержимое не + // поменялось. Это меняет зависимости reloadMatrix → пересоздаёт саму + // функцию → мониторящий её useEffect срабатывает заново → снова + // reloadMatrix() → снова новая ссылка — бесконечный цикл перезагрузки + // (именно так выглядела «неадекватно долгая загрузка»). + setSelection(prev => { + const sel = prev.selectedRequest; + if (!sel || sel.id !== m.request.id) return prev; + const same = sel.title === m.request.title && sel.status === m.request.status; + return same ? prev : { ...prev, selectedRequest: m.request }; + }); }) .catch((e: Error) => setMatrixError(e.message)) .finally(() => {