useEffect(() => {
//NOTE - 방 입장 시 한 번만 실행 && Remote Player가 존재할 경우에만 실행
if (roomId && remotesTrack.length !== 0) {
socket.emit("usersInfo", roomId);
console.log("usersInfo socket.emit 실행");
}
}, [roomId]);
const sockets = {
//NOTE - players의 실시간 준비 상태 update
setReady: (playerId: string, isReady: boolean) => {
setReadyPlayers(playerId, isReady);
},
//NOTE - players의 Ready 초기 상태
usersInfo: (players: playersInfo[]) => {
players.forEach((player) => {
if (player.is_ready) {
setReadyPlayers(player.user_id, player.is_ready);
}
});
}
};
useSocketOn(sockets);
const RoomPage = () => {
const { isExit } = useExitStore();
return <>{isExit ? <Loading /> : <JoinMafiaRoom />}</>;
};
//NOTE - 방 나가기 이벤트 헨들러
const leaveRoom = () => {
setIsExit(true);
socket.emit("exitRoom", roomId, userId);
};
const Loading = () => {
const router = useRouter();
const { setIsExit } = useExitStore();
useEffect(() => {
const timer = setTimeout(() => {
setIsExit(false);
router.replace("/main");
}, 3000);
return () => {
clearTimeout(timer);
};
}, []);
현상이 발생하는 이유)
방을 나갈 시 setIsExit(true); 상태 값이 변경되고 이때 Loading 컴포넌트가 실행 -> 이때 setTimeout이 종료된 후 setIsExit 값을 초기화 시켜주는 로직이 돌아가 JoinMafiaRoom 컴포넌트가 실행되어 방 입장 UI가 보이는 현상이 발생
해결 과정)
setIsExit(false);
state 값이 변경되어도 현재 접속한 페이지가 마피아 방 페이지가 아니므로 Error 해결해결) useEffect의 기본 개념인 clean Up 함수를 통해 해결
useEffect(() => {
const timer = setTimeout(() => {
router.replace("/main");
}, 3000);
// UnMout 시 작동되므로 UI가 표시 되지 않는 걸 확인
return () => {
setIsExit(false);
clearTimeout(timer);
};
}, []);