Для обработки начала и окончания работы глобального компонента загрузки можно использовать lifecycle-методы React компонентов, такие как componentDidMount и componentWillUnmount. В методе componentDidMount можно установить состояние загрузки на true, а в componentWillUnmount - на false.
Чтобы добавить блок <div className={loader}>...</div> в компонент <Layout />, можно использовать условный рендеринг на основе состояния загрузки. В компоненте Layout нужно проверить состояние загрузки и в зависимости от него, либо рендерить контент, либо блок с загрузкой. Примерно так:
```jsx
import { useSelector } from 'react-redux';
function Layout() {
const isLoading = useSelector(state => state.loader.isLoading);
return (
<div>
{isLoading ? <div className={loader}>...</div> : null}
{/* остальной контент */}
</div>
);
}
```
Чтобы передать dispatch в loader роутера, можно воспользоваться контекстом. Если используется react-router, можно воспользоваться withRouter HOC для доступа к router из props. Примерно так:
```jsx
import { withRouter } from 'react-router-dom';
function Layout({ history }) {
// ...
const isLoading = useSelector(state => state.loader.isLoading);
useEffect(() => {
const unsubscribe = history.listen(() => {
// вызов dispatch для начала загрузки
});
return () => {
unsubscribe();
// вызов dispatch для окончания загрузки
};
}, [history]);
return (
// ...
);
}
export default withRouter(Layout);
```
Надеюсь, это поможет!