Очередь уведомлений (Notify) в react, redux

Нужно как то организовать очередь уведомлений которые dispatch если например не может загрузить данные с внешнего API (новости Яндекса, курсы валют с ЦБ).

Сейчас есть 2 action (новости и курсы валют):

export const getNewsAction = () => {
  return (dispatch) => {
    dispatch(getNewsRequest());
    axios
      .get(process.env.REACT_APP_NEWS_URL)
      .then((response) => {
        if (response.status === 200) {
          const news = fastParser.parse(response.data);
          dispatch(
            getNewsResponse(
              sortArray(news.rss.channel.item.slice(0, 11), "pubDate", {
                reverse: true,
              })
            )
          );
        }
      })
      .catch((error) => {
        dispatch(getNewsError(error));
        dispatch(
          showNotify(
            "Не удалось загрузить новости, попробуйте перезагрузить страницу",
            "error"
          )
        );
        setTimeout(() => {
          dispatch(hideNotify());
        }, 4000);
      });
  };
}; 

и

export const getCurrencyAction = () => {
  return (dispatch) => {
    dispatch(getCurrencyRequest());
    axios
      .get(process.env.REACT_APP_CURRENCY_URL)
      .then((response) => {
        if (response.status === 200) {
          const currency = Object.values(response.data.Valute).filter(
            (item) => item.CharCode === "USD" || item.CharCode === "EUR"
          );
          dispatch(getCurrencyResponse(currency));
        }
      })
      .catch((error) => {
        dispatch(getCurrencyError(error));
        dispatch(
          showNotify(
            "Не удалось загрузить курсы валют, попробуйте перезагрузить страницу",
            "error"
          )
        );
        setTimeout(() => {
          dispatch(hideNotify());
        }, 4000);
      });
  };
};

Если ресурс не доступен один то всё вроде как бы нормально. Выводит сообщение при ошибке. Но если и второй не доступен ресурс то выводит только Notify тот у которого ошибка обрабатывается первая. А хочется что бы они или одновременно приходили (второй под первым) ну или по очереди...


Ответы (1 шт):

Автор решения: Александр

Так и сделал передал массив в store, в коде так:

Reducer:

const initialState = {
  notify: [],
};

export default function (state = initialState, action) {
  switch (action.type) {
    case SHOW_NOTIFY:
      return {
        ...state,
        notify: [
          ...state.notify,
          { message: action.message, messageType: action.messageType },
        ],
      };
    case HIDE_NOTIFY:
      return {
        ...state,
        notify: [],
      };
    default:
      return state;
  }
}

Action:

export const showNotifyAction = (message, messageType) => {
  return {
    type: SHOW_NOTIFY,
    message,
    messageType,
  };
};

export const hideNotifyAction = () => {
  return {
    type: HIDE_NOTIFY,
  };
};

Ну и пример использования:

const handleSubmit = (event) => {
    const { email, password } = user;
    event.preventDefault();

    firebase
      .login({
        email,
        password,
      })
      .catch(() => showNotify("Неправильный e-mail или пароль", "error"));
    setTimeout(() => {
      hideNotify();
    }, 3000);
  };
→ Ссылка