Обновить статус агента в 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": "[email protected]",
    "_id": "594f4665ae36b70029f80ba0",
    "first_name": "pm",
    "email": "[email protected]",
}

при отправке статуса я запускаю следующее действие для саги

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 действия зависят от результата.

Если вы желаете оптимистичного обновления, то все равно должны инициировать действие, идентичное настоящему, но в случае информации о сбое в будущем, необходимо сгенерировать компенсирующие действия, переводящие текущее состояние в предыдущее состояние.

Другие вопросы по тегам