export default async function handleRiskPromptDialogSubmit()

in packages-fetcher/console-fetcher-risk-prompt/src/util/handle-risk-prompt-dialog-submit/index.ts [27:143]


export default async function handleRiskPromptDialogSubmit({
  contentContext,
  setRiskCanceledErrorProps,
  reRequestWithVerifyResult,
  ...dialogSubmitProps
}: THandleRiskPromptDialogSubmitProps): Promise<void> {
  const {
    data, updateData, lock, unlock, close
  } = contentContext;
  const {
    dialogSubmitType
  } = dialogSubmitProps;
  const {
    errorMessageObject,
    oldMainOrMpkData,
    currentSubVerificationDeviceType
  } = data;
  const isMpkDowngradeInOldMainRisk = oldMainOrMpkData?.isMpkDowngrade;

  // 基于当前风控弹窗的账号类型以及风控验证类型,来更新错误信息
  const updateErrorMessage = (errorMessage: string): void => {
    const keyOfErrorMessageObject = ((): TKeyofErrorMessageObject => {
      if (dialogSubmitType === ERiskType.NEW_SUB && currentSubVerificationDeviceType) {
        return currentSubVerificationDeviceType;
      }

      return ESceneKey.MAIN_ACCOUNT;
    })();

    updateData({
      errorMessageObject: {
        ...errorMessageObject,
        [keyOfErrorMessageObject]: errorMessage
      }
    });
  };

  // 锁定 dialog
  lock(true);
  updateData({
    dialogBlocked: true
  });
  updateErrorMessage('');

  const riskPromptVerifyResult = await getRiskPromptVerifyResult({
    dialogData: data,
    dialogSubmitProps,
    updateErrorMessage,
    setRiskCanceledErrorProps
  });

  if (riskPromptVerifyResult) {
    const slsRiskLoggerCommonPayload = {
      dialogSubmitProps,
      isMpkDowngradeInOldMainRisk,
      currentSubVerificationDeviceType
    };

    if (!reRequestWithVerifyResult) {
      slsRiskLogger({
        ...slsRiskLoggerCommonPayload,
        slsResultType: ESlsResultType.RISK_PROMPT_RESOLVE
      });

      // 如果 riskPrompt 的参数不带 reRequestWithVerifyResult,那么 close 函数的参数只有 riskPromptVerifyResult
      close(riskPromptVerifyResult);

      return;
    }

    // 如果 riskPrompt 的参数中,有重新请求被风控接口的函数 reRequestWithVerifyResult
    try {
      const reRequestResponse = await reRequestWithVerifyResult(riskPromptVerifyResult);

      slsRiskLogger({
        ...slsRiskLoggerCommonPayload,
        slsResultType: ESlsResultType.SUCCESS
      });

      // 如果有 reRequestWithVerifyResult,那么弹窗 close 时对外输出的数据中会包含重新请求被风控接口的响应 reRequestResponse
      close({
        ...riskPromptVerifyResult,
        reRequestResponse
      });
    } catch (error) {
      const {
        code
      } = error as FetcherError;
      const riskSlsErrorCommonPayload = getRiskSlsErrorCommonPayload(error as FetcherError);

      slsRiskLogger({
        ...slsRiskLoggerCommonPayload,
        ...riskSlsErrorCommonPayload
      });

      // 如果报错是风控验证错误,那么提示用户验证码错误,且不关闭风控弹窗
      if (code && CODE_RISK_ERROR_ARRAY.includes(code)) {
        updateErrorMessage(intl('message:code_incorrect'));
      } else {
        // 如果重新请求后触发了正常的报错,那么抛出 error,并关闭弹窗
        close(error as Error, true);

        throw error;
      }
    } finally {
      updateData({
        dialogBlocked: false
      });
      unlock();
    }
  } else {
    updateData({
      dialogBlocked: false
    });
    unlock();
  }
}