-
프로젝트에서 우리가 캠과 마이크가 필요한 게임을 만들다 보니 사용자에게 공지사항겸 팝업창을 만들기로 하였다.
팝업은 자바스크립트나 제이쿼리를 사용해서 만들었던 기억이 있었는데 리액트는 어떻게 구현하나 찾아보던 중
쿠키 라이브러리가 있었다.
쿠키 라이브러리
react-cookie
Universal cookies for React. Latest version: 7.1.4, last published: 3 months ago. Start using react-cookie in your project by running `npm i react-cookie`. There are 661 other projects in the npm registry using react-cookie.
www.npmjs.com
간단하게 버튼으로 하루 창 닫기와 닫기 버튼을 만들 예정이라 간단하게 구현하였다.
"use client"; import React, { useEffect, useState } from "react"; import S from "@/style/commons/commons.module.css"; import { useCookies } from "react-cookie"; import Link from "next/link"; const Popup = () => { const [open, setOpen] = useState(false); const [cookies, setCookie] = useCookies(["IceCraft_Cookie"]); //닫기 const closeModal = () => { setOpen(false); }; //하루 보지 않기 const closeForADay = () => { const expires = getExpiredDate(1); setCookie("IceCraft_Cookie", true, { expires }); setOpen(false); }; const getExpiredDate = (days: number) => { const date = new Date(); date.setDate(date.getDate() + days); return date; }; useEffect(() => { setOpen(true); if (cookies["IceCraft_Cookie"]) { setOpen(false); } }, []); if (!open) return null; return ( <article className={S.article}> <div className={S.popupContent}> <h2>공지사항</h2> <div> <p>IceCraft를 방문해 주셔서 감사합니다.</p> <p> 현재 마피아 게임은 <span>"캠"</span>과 <span>"마이크"</span>가 있으신 분들만 게임이 가능합니다. 이용에 참고해 주시기 바랍니다. </p> <Link href="">오류 및 버그 문의하기 (클릭)</Link> </div> </div> <div className={S.closeButton}> <button onClick={closeForADay}>하루 보지 않기</button> <button onClick={closeModal}>닫기</button> </div> </article> ); }; export default Popup;
useState훅으로 open상태를 true,false로 만든다.
useCookies훅을 사용하여 IceCraft_Cookie라는 이름의 쿠키를 관리하였다.
먼저 쿠키의 유효기간을 지정하는 함수를 생성한다.
getExpiredDate 함수는 현재 날짜에 지정한 일수를 더한 만료일을 반환한다.
// 쿠키의 유효기한을 지정하는 함수 const getExpiredDate = (days: number) => { const date = new Date(); // 현재 시간을 받아온다 date.setDate(date.getDate() + days); // 현재시간 날짜 + days 만큼 더하여 유효기간을 지정해준다. return date; };
그리고 getExpiredDate 함수를 호출하여 1일뒤의 만료일을 계산한다.
setCookie 함수를 사용하여 IceCraft_Cookie를 설정하고 유효기간을 지정한다.
//하루 보지 않기 const closeForADay = () => { const expires = getExpiredDate(1); setCookie("IceCraft_Cookie", true, { path: "/", expires }); setOpen(false); };
setCookie("IceCraft_Cookie", true, { path: "/", expires });
이 내용은 라이브러리의 setCookie함수를 사용하여 쿠키를 설정하는 코드이다.
IceCraft_Cookie : 쿠키 이름
true : 쿠키에 저장할 값
{ path: "/", expires } : 쿠키의 옵션을 설정하는 객체, path는 유효한 URL경로를 지정한다
"/"로 설정하면 도메인의 모든 경로에서 쿠키가 유효하도록 가능하다.
expires : 쿠키의 만료 날짜 지정, getExpiredDate 함수로 쿠키의 만료 날짜를 지정해주었음.
useEffect로 컴포넌트가 마운트될때 IceCrraft_Cookie가 존재하는지 확인하고 쿠키가 존재하면 팝업을 닫는다.
useEffect(() => { setOpen(true); if (cookies["IceCraft_Cookie"]) { setOpen(false); } }, []);
약간의 트러블 슈팅?
setOpen을 기본으로 useState훅에다가 true로 넣었었는데 새로고침할때마다 깜빡이면서 사라지는 현상이 있었다.
그냥 처음부터 false로 두고 useEffect훅 안에 넣어 컴포넌트가 마운트될때 setOpen(true)를 넣어버렸다.
쉽게 해결하였음
'✨ 기억보다 기록을 > 프로젝트' 카테고리의 다른 글
IceCraft - TypeBot 추가하기 (0) 2024.07.22 IceCraft - EmailJS 적용하기 (0) 2024.06.30 IceCraft - search검색부분(리팩토링), 디바운싱 적용하기 (0) 2024.06.23 IceCraft - skeleton라이브러리 추가하기 (0) 2024.06.21 IceCraft - 메인페이지swiper 슬라이드 추가하기 (0) 2024.06.20 댓글