display flex
display grid
마우스 이벤트 종류
다음 접속 시에도 활용할 수 있도록 localstorage에 닉네임을 저장하였다.
닉네임 입력 시 랜딩화면이 2초 간 fadeout되어 홈화면이 보이도록 하였다.
fadeout 효과를 주는 클래스 fadeout를 부여한 뒤 2초 뒤 display:none 스타일을 적용하는 disappearWelcome 클래스를 추가한다.
useEffect(() => {
  if (nickname === null) return;
  setFadeOutEffect((prev) => {
    if (prev === null) return "fadeout";
    else return prev;
  });
  const timer = setTimeout(() => {
    const welcomeSection = document.getElementById("welcome");
    if (welcomeSection) {
      setFadeOutEffect((prev) => prev + " disappearWelcome");
    }
  }, 2000);
  return () => clearTimeout(timer);
}, [nickname]);
...
 <section className={`welcome ${fadeOutEffect}`} 
 style={{ backgroundColor: `${color}` }} id="welcome">
...
모달창의 modal-top부분과 랜딩화면의 배경색을 사용자 설정에 따라 변경해주었다. 테마 색상을 redux에서 전역적으로 관리한다.
localstorage에 직접 저장하던 방식을 redux를 통해 전역적으로 관리하는 방식으로 변경하였다. 닉네임 입력과 저장 로직을 재활용할 수 있게 되었다.
square에 모달의 아이콘을 나열하는 을 settings에서 재활용하고자 하였다. 다음과 같은 차이가 설정 되어야 한다.
props를 이용해 컴포넌트 간 설정사항을 전달해주었다.
type IconPropsType = {
  imgSize: string;
  clickedTime: number;
  belongToSettings: boolean;
  fontColor: string;
};
...
<div
  //클릭 수
  onClick={clickedTime === 1 ? onModalOpen : onFocusIcon}
  onDoubleClick={clickedTime === 2 ? onModalOpen : undefined}
  //hover 효과
  className={[
    belongToSettings && "icon-hover",
    clickedImg === modal.type && "colorChange",
  ].join(" ")}
...>
</div>
<Icon
  imgSize="100px"
  clickedTime={2}
  belongToSettings={false}
  fontColor="black"
/>
<Icon
  imgSize="50px"
  clickedTime={1}
  belongToSettings={true}
  fontColor="white"
/>
