Задача: встроиться между axios и обработкой результата с BE, выполнить действия (в моем случае показать сообщение), и передать результат дальше для обработки другой функции.
1.
http - инстанс axios
2.
middlewareMessage - отправка сообщения
3.
emailConfirmation - дальнейшая обработка результата
То есть, я не могу это сделать в
http в интерсепторах ввиду того, что не везде нужен показ сообщения.
Если это делать в
emailConfirmation, получится много однотипного кода.
Вопрос: как правильно реализовать данную задачу, а особенно взаимодействие ф-ций между собой?
Мой вариант, предложенный ниже, не особо мне нравится.
Проблема данного решения, как минимум, еще и в том, что сложно будет встроить доп. функционал наподобие
middlewareMessage.
const call = ({ search, ...params }) =>
http.post(`${generatePath(ENDPOINTS.AUTH.EMAIL_CONFIRMATION, params)}${search}`);
export const emailConfirmation = async (data) => {
const [execute] = middlewareMessage(call);
await execute(data);
};
export const middlewareMessage = (fn) => {
const execute = async (params) => {
try {
const response = await fn(params)
.then((response) => get(response, 'data', null))
.catch((error) => throwError(getErrors(error)));
const messageType = get(response, 'message.type', null);
const messageText = get(response, 'message.text', null);
if (messageType && messageText) {
store.dispatch(
messageSlice.actions.setMessage({
key: getRandomString(),
type: messageType,
text: messageText,
})
);
}
return response;
} catch (error) {
store.dispatch(
messageSlice.actions.setMessage({
key: getRandomString(),
type: MESSAGE_TYPES.ERROR,
text: get(error, 'message'),
})
);
return error;
}
};
return [execute];
};