Обновить статус агента в Redx Saga
Мне нужно обновить статус агента. Если статус проверен, API-интерфейсу нужны имя-документа (несколько) и причина. Если статус находится в режиме ожидания и отклонен, API нужна единственная причина.
Это объект агента.
{
"active": true,
"agent_info": [], // an array of object where document_name and reason has to be updated with
"user_role": "enduser",
"last_name": "m",
"middle_name": null,
"username": "k@mail.com",
"_id": "594f4665ae36b70029f80ba0",
"first_name": "pm",
"email": "k@mail.com",
}
при отправке статуса я запускаю следующее действие для саги
this.props.updateAgentStatus(status, agent, accepted, reason);
Сатус - это статус агента (подтверждено, отложено или отклонено). Агент - это подробная информация об агенте, принятом в качестве документа в случае подтверждения статуса. Причина - причина статуса.
function* updateAgent(action) {
const agentId = action.agent._id;
const status = action.status;
let agent = yield select(selectAgent(), action);
let updatedAgent;
let statusUpdatedAgent = agent.set("agent_status", fromJS(action.status));
if (status === "verified") {
updatedAgent = statusUpdatedAgent
.setIn(["agent_info", 0, "approval_documents"], fromJS(action.accepted))
.setIn(["agent_info", 0, "reason"], fromJS(action.reason));
} else {
updatedAgent = statusUpdatedAgent.setIn(
["agent_info", 0, "reason"],
fromJS(action.reason)
);
}
console.log("updateAgentStatus", updatedAgent.toJS());
// above log gives me the whole object of agent by updating the agent_info object with
// document_name and reason which is inside of agent_info block and agent_status which is
// outside the agent_info block.
yield fork(
XcelTrip.put(
`api/agent/applicant/status/${agentId}/?status=${status}`,
agentStatusUpdated,
agentStatusUpdatingError,
updatedAgent.toJS(),
agentId,
status
)
);
}
Нужно ли передавать весь объект или только имя_документа и причину, если это проверенный статус, или только причину, если он находится в режиме ожидания и отклонен? Если это просто имя_документа и причина, как я могу отправить его, учитывая все эти статусы, потому что в случае проверенного необходимо дополнительное имя_документа?
1 ответ
Решение зависит от того, собираетесь ли вы использовать оптимистическое обновление, хотя даже в этом случае можно принять одно универсальное решение. В идеале вы не должны изменять состояние в саге, вместо этого сага должна отлавливать действия, по которым необходимо организовать асинхронные запросы, и по результатам генерировать новые действия, которые уже перейдут к редуктору. Например, реагирующий компонент генерирует UPDATE_AGENT_REQUEST
действие, сага ловит его и выполняет асинхронный вызов API, который генерирует UPDATE_AGENT_SUCCESS
или же UPDATE_AGENT_FAILURE
действия зависят от результата.
Если вы желаете оптимистичного обновления, то все равно должны инициировать действие, идентичное настоящему, но в случае информации о сбое в будущем, необходимо сгенерировать компенсирующие действия, переводящие текущее состояние в предыдущее состояние.