-
Notifications
You must be signed in to change notification settings - Fork 1
게임 종료된 상태에서 사용자 게임 참여 여부에 따른 FinalResult 분기 처리
현재 이벤트에 대한 선착순 밸런스 게임이 종료된 상태에서 사용자의 게임 참여 여부에 따라 결과 창을 다르게 보여주도록 구현했다.
원래는 해당 부분에 있어서 아예 사용자가 참여하지 않은 경우에는 /event/rush/result API 에서 400 오류가 발생했다. 하지만 사용자가 참여하지 않은 경우에도 결과 데이터가 필요하기 때문에 백엔드와 상의한 결과, 우선 서버에서는 /event/rush/result API에서 사용자가 게임을 참여하지 않은 경우에 isWinner, rank, totalParticipants 이 3개의 값에 대해서 null로 처리되도록 결정됐다.
클라이언트에서는 비록 isWinner, rank, totalParticipants 이 3개의 값이 null로 오지만, 애초에 사용자 게임 참여 여부가 boolean 값으로 응답오는 getRushUserParticipationStatus API가 있기 때문에 해당 API를 처음 게임 화면 진입할 때에 호출하여 Context에 gameState.userParticipatedStatus를 설정해주도록 하였다.
따라서, 다음과 같이 useFetch 훅을 통해 getRushUserParticipationStatus API를 호출해주고 다음과 같이 isSuccessUserParticipationStatus가 true일 때만 setUserParticipationStatus 함수가 호출되도록 했다.
그리고 isSuccessUserParticipationStatus가 fasle일 때는 화면을 Loading 처리해주고, true되면 컴포넌트가 보여지도록 구현했다.
const { gameState, setUserParticipationStatus } = useRushGameContext();
const {
data: userParticipatedStatus,
isSuccess: isSuccessUserParticipationStatus,
fetchData: getRushUserParticipationStatus
} = useFetch<
GetRushUserParticipationStatusResponse,
string
>((token) => RushAPI.getRushUserParticipationStatus(token));
useEffect(() => {
getRushUserParticipationStatus(cookies[COOKIE_KEY.ACCESS_TOKEN]);
}, []);
useEffect(() => {
if (isSuccessUserParticipationStatus) {
setUserParticipationStatus(userParticipatedStatus);
}
}, [userParticipatedStatus, isSuccessUserParticipationStatus]);
const renderRushGameContent = () => {
switch (gameState.phase) {
case CARD_PHASE.NOT_STARTED:
return <Countdown />;
case CARD_PHASE.IN_PROGRESS:
if (!isSuccessUserParticipationStatus) {
return <div>Loading...</div>;
} else {
if (!gameState.userParticipatedStatus) {
return <CardOptions />;
} else {
return <SelectedCard unblockNavigation={unblockNavigation} />;
}
}
case CARD_PHASE.COMPLETED:
return <FinalResult unblockNavigation={unblockNavigation} />;
default:
return null;
}
};
그러나 문제는 제대로 동작하지 않는다는 것이었는데, 그 이유가 userParticipatedStatus 데이터 값 자체가 그냥 true/false만 오기 때문에 useFetch 내부에서는 아예 isSuccess를 반환할 때 setIsSuccess(!!data);
이런 방식으로 데이터 자체를 boolean으로 바꾸어서 내보낸다. 따라서 사용자가 아직 참여하지 않은, 즉 data가 false 이면 isSuccess 자체가 false로 반환되어 동작을 안하는 것이었다.
그래서 아예 isSuccess를 사용하지 않고 데이터가 null 이 아닌 경우에만 setUserParticipationStatus 함수가 호출되도록 바꿔주었다.
const { gameState, setUserParticipationStatus } = useRushGameContext();
const { data: userParticipatedStatus, fetchData: getRushUserParticipationStatus } = useFetch<
GetRushUserParticipationStatusResponse,
string
>((token) => RushAPI.getRushUserParticipationStatus(token));
useEffect(() => {
getRushUserParticipationStatus(cookies[COOKIE_KEY.ACCESS_TOKEN]);
}, []);
useEffect(() => {
if (userParticipatedStatus !== null) { // 조건문 수정
setUserParticipationStatus(userParticipatedStatus);
}
}, [userParticipatedStatus]); // 의존성 배열 수정
const renderRushGameContent = () => {
switch (gameState.phase) {
case CARD_PHASE.NOT_STARTED:
return <Countdown />;
case CARD_PHASE.IN_PROGRESS:
if (userParticipatedStatus === null) return <></>; // 조건문 수정
else {
if (!gameState.userParticipatedStatus) {
return <CardOptions />;
} else {
return <SelectedCard unblockNavigation={unblockNavigation} />;
}
}
case CARD_PHASE.COMPLETED:
return <FinalResult unblockNavigation={unblockNavigation} />;
default:
return null;
}
};
- 페이지가 렌더링 된 후 스크롤을 최상단으로 올리기
- DOM을 이미지로 저장하기
- Context API에서 불필요한 리렌더링을 줄이는 방법
- 무한 Transition 애니메이션
- Github Action 워크플로우 정의하기
- 무한 Transition 애니메이션 최적화하기
- 무한 Transition 애니메이션 최적화하기 2
- 무한 Transition 애니메이션 최적화하기 3
- fetch timeout 구현하기
- ErrorBoundary 구현하기
- 뒤로가기 confirm 로직 구현하기
- 선착순 밸런스 게임 상태 관리
- Modal 내부 컴포넌트에서 무한 스크롤이 제대로 동작 안되는 문제
- useToggleContents 훅 기본값 설정 및 조건부 사용법
- 폰트 굵기 적용 이슈
- SVG 내부 stroke 속성 값 제어를 위한 SVGIcon Util 함수 및 SVGR 사용 과정
- tailwindCSS의 @apply를 cva로 바꾸기
- 스크롤 내려갈 때 해당 섹션의 요소들 인터렉션 동작
- 공통 컴포넌트 내부에 애니메이션을 넣는 것에 대한 고민
- 특정 컴포넌트 위치에서 헤더 스타일 다르게 적용하는 방법
- 스크롤 거꾸로 올릴 때 IntersectionObserver가 뷰포트 감지 못하는 현상
- 선착순 밸런스 게임 최종 결과 계산에 대한 고민 (08.14)
- 프로그래스바 공통 컴포넌트로 분리
- (08.23 기준) 선착순 서버 시간 연동 문제
- 게임 종료된 상태에서 사용자 게임 참여 여부에 따른 FinalResult 분기 처리
- FinalResult 컴포넌트의 “당신의 선택” 카테고리 설정 이슈
- 게임 접속 시 게임 현재 진행 상태 초기화 및 카운트 다운 설정
- 선착순 밸런스 게임 UX 개선