프론트 컨벤션

포팅메뉴얼

프론트 회의록

개발주의사항

import { useEffect, useRef, useState } from 'react';
import { useMutation, useQuery } from 'react-query';
import useInput from '../../../hooks/useInput';
import { getQuestionState, postQuestion } from '../apis/postQuestion';
import getAnswer from '../apis/getAnswer';

/**
 * 질문 전송 및 데이터 관리 훅
 * @returns QuestionFormData
 */
const useQuestion = (type) => {
  // initial, process, finish, error(추가 예정)
  const [stage, setStage] = useState('initial');
  const { value: ItemValue, onChange: ItemChange, setValue: setItemValue } = useInput('');
  const { value: ContentsValue, onChange: ContentsChange, setValue: setContentsValue } = useInput('');
  const [quesionId, setQuestionId] = useState('');
  const [requestQuestion, setRequestQuestion] = useState(false);
  const [requestCount, setRequestCount] = useState(0);
  const [answerId, setAnswerId] = useState('');
  const [progress, setProgress] = useState(0);
  // const [maxRequestCount, setMaxRequestCount] = useState(17);
  const maxCount = 15;
  const [maxRequestCount, setMaxRequestCount] = useState(maxCount);

  // 질문 재시도 횟수
  const retryCount = 10;

  // questionID를 바꾼 후에, Question 응답을 받는 코드
  const isMouted = useRef(false);
  useEffect(() => {
    if (isMouted.current) {
      if (quesionId) {
        setRequestQuestion(true);
      } else {
        setRequestQuestion(false);
        setAnswerId('');
      }
    } else {
      isMouted.current = true;
    }
  }, [quesionId]);

  // 요청 횟수가 증가할때 마다 progress변경
  useEffect(() => {
    if (isMouted.current) {

      setProgress(Math.max(100 - Math.floor((requestCount / maxRequestCount) * 100), 0));
    } else {
      isMouted.current = true;
    }
  }, [requestCount]);

  // 질문 재시도시 남은 횟수 변경하는 함수
  const setRetryRequest = () => {
    setMaxRequestCount(retryCount);
    setRequestCount(0);
    setRequestQuestion(true);
    setStage('process');
  };

  // 답변 받는 쿼리
  const { data: gptAnswer } = useQuery({
    queryKey: ['getAnswer', answerId],
    queryFn: () => getAnswer(answerId),
  });

  // 답변 생성 여부 확인 쿼리
  const { remove: DeleteAnswer } = useQuery({
    queryFn: async () => {
      const { data } = await getQuestionState(quesionId);
      // 요청 횟수 1회 증가
      setRequestCount((prev) => prev + 1);

      // 질문에 답이 있는 경우
      if (data?.answer?.length > 0) {
        // 답 저장 후 로직 종료
        setAnswerId(data.answer);
        setRequestQuestion(false);
        setTimeout(() => {
          setStage('finish');
        }, 3000);

        // 정답 id로 요청보내기
        return data;
      }

      // 요청 횟수 비교
      if (requestCount >= maxRequestCount) {
        // 실패로직 추가
        setRequestQuestion(false);
        setStage('error');
      }
      return data;
    },

    queryKey: ['getId', quesionId, type],
    enabled: requestQuestion,
    refetchInterval: 1000,
    refetchIntervalInBackground: true,
  });

  const { mutate } = useMutation(postQuestion, {
    onSuccess: ({ data }) => {
      DeleteAnswer();
      setQuestionId(data.id);
    },
  });

  const QuestionFormData = {
    ItemValue,
    ItemChange,
    ContentsValue,
    ContentsChange,
  };

  const SubmitQuestion = (event) => {
    event.preventDefault();
    setMaxRequestCount(maxCount);
    mutate({ ItemValue, ContentsValue, type });
    setStage('process');
  };

  const refreshForm = () => {
    setQuestionId('');
    setAnswerId('');
    setItemValue('');
    setContentsValue('');
    setStage('initial');
    setRequestCount(0);
    setProgress(0);
  };

  const retryForm = () => {
    setQuestionId('');
    setAnswerId('');
    setStage('initial');
    setRequestCount(0);
    setProgress(0);
  };

  return {
    stage,
    refreshForm,
    QuestionFormData,
    SubmitQuestion,
    progress,
    answerId,
    quesionId,
    gptAnswer,
    setRetryRequest,
    retryForm,
  };
};

export default useQuestion;
import { useEffect, useRef, useState } from 'react';
import { useMutation, useQuery } from 'react-query';
import useInput from '../../../hooks/useInput';
import { getQuestionState, postQuestion } from '../apis/postQuestion';
import getAnswer from '../apis/getAnswer';

/**
 * 질문 전송 및 데이터 관리 훅
 * @returns QuestionFormData
 */
const useQuestion = (type) => {
  // initial, process, finish, error(추가 예정)
  const [stage, setStage] = useState('initial');
  const { value: ItemValue, onChange: ItemChange, setValue: setItemValue } = useInput('');
  const { value: ContentsValue, onChange: ContentsChange, setValue: setContentsValue } = useInput('');
  const [quesionId, setQuestionId] = useState('');
  const [requestQuestion, setRequestQuestion] = useState(false);
  const [requestCount, setRequestCount] = useState(0);
  const [answerId, setAnswerId] = useState('');
  const [progress, setProgress] = useState(0);
  // const [maxRequestCount, setMaxRequestCount] = useState(17);
  const maxCount = 15;
  const [maxRequestCount, setMaxRequestCount] = useState(maxCount);

  // 질문 재시도 횟수
  const retryCount = 10;

  // questionID를 바꾼 후에, Question 응답을 받는 코드
  const isMouted = useRef(false);
  useEffect(() => {
    if (isMouted.current) {
      if (quesionId) {
        setRequestQuestion(true);
      } else {
        setRequestQuestion(false);
        setAnswerId('');
      }
    } else {
      isMouted.current = true;
    }
  }, [quesionId]);

  // 요청 횟수가 증가할때 마다 progress변경
  useEffect(() => {
    if (isMouted.current) {

      setProgress(Math.max(100 - Math.floor((requestCount / maxRequestCount) * 100), 0));
    } else {
      isMouted.current = true;
    }
  }, [requestCount]);

  // 질문 재시도시 남은 횟수 변경하는 함수
  const setRetryRequest = () => {
    setMaxRequestCount(retryCount);
    setRequestCount(0);
    setRequestQuestion(true);
    setStage('process');
  };

  // 답변 받는 쿼리
  const { data: gptAnswer } = useQuery({
    queryKey: ['getAnswer', answerId],
    queryFn: () => getAnswer(answerId),
  });

  // 답변 생성 여부 확인 쿼리
  const { remove: DeleteAnswer } = useQuery({
    queryFn: async () => {
      const { data } = await getQuestionState(quesionId);
      // 요청 횟수 1회 증가
      setRequestCount((prev) => prev + 1);

      // 질문에 답이 있는 경우
      if (data?.answer?.length > 0) {
        // 답 저장 후 로직 종료
        setAnswerId(data.answer);
        setRequestQuestion(false);
        setTimeout(() => {
          setStage('finish');
        }, 3000);

        // 정답 id로 요청보내기
        return data;
      }

      // 요청 횟수 비교
      if (requestCount >= maxRequestCount) {
        // 실패로직 추가
        setRequestQuestion(false);
        setStage('error');
      }
      return data;
    },

    queryKey: ['getId', quesionId, type],
    enabled: requestQuestion,
    refetchInterval: 1000,
    refetchIntervalInBackground: true,
  });

  const { mutate } = useMutation(postQuestion, {
    onSuccess: ({ data }) => {
      DeleteAnswer();
      setQuestionId(data.id);
    },
  });

  const QuestionFormData = {
    ItemValue,
    ItemChange,
    ContentsValue,
    ContentsChange,
  };

  const SubmitQuestion = (event) => {
    event.preventDefault();
    setMaxRequestCount(maxCount);
    mutate({ ItemValue, ContentsValue, type });
    setStage('process');
  };

  const refreshForm = () => {
    setQuestionId('');
    setAnswerId('');
    setItemValue('');
    setContentsValue('');
    setStage('initial');
    setRequestCount(0);
    setProgress(0);
  };

  const retryForm = () => {
    setQuestionId('');
    setAnswerId('');
    setStage('initial');
    setRequestCount(0);
    setProgress(0);
  };

  return {
    stage,
    refreshForm,
    QuestionFormData,
    SubmitQuestion,
    progress,
    answerId,
    quesionId,
    gptAnswer,
    setRetryRequest,
    retryForm,
  };
};

export default useQuestion;