야영장 지도의 중요 기능 중 하나인 북마크와 링크 공유 버튼 구현 과정을 담았다.
// 북마크 클릭 시 동작하는 함수
const bookmarkHandler = () => {
// spotInfo(야영지 정보)를 인수로 보냄
// controlWebStorage에서 반환된 값을 bookmark라는 전역 함수에 등록
setBookmark(controlWebStorage(spotInfo));
};
// utills/controlStorage.js
const controlWebStorage = (spotInfo) => {
let bookmarkList = JSON.parse(localStorage.getItem("bookmark"));
const bookmarkObj = {
id: spotInfo.contentId,
addr: spotInfo.addr1,
name: spotInfo.facltNm,
x: spotInfo.mapX,
y: spotInfo.mapY,
};
// 처음 북마크를 등록할 때
if (!bookmarkList) {
return localStorage.setItem("bookmark", JSON.stringify([bookmarkObj]));
}
// 이미 등록된 북마크를 다시 클릭했을 때
if (bookmarkList.filter((e) => e.id === spotInfo.contentId)[0]) {
const exceptExistValue = bookmarkList.filter((e) => e.id !== spotInfo.contentId);
localStorage.setItem("bookmark", JSON.stringify(exceptExistValue));
} else {
// 기존 북마크 배열에 새로운 북마크 등록
bookmarkList.push(bookmarkObj);
localStorage.setItem("bookmark", JSON.stringify(bookmarkList));
}
return JSON.parse(localStorage.getItem("bookmark"));
};
모든 상세 정보 페이지는 params로 id값을 주기 때문에 id값과 local Storage값을 비교한 뒤 filter 적용
bookmark.js
const Bookmark = () => {
const bookmark = useRecoilValue(bookmarkState);
const navigate = useNavigate();
const bookmarkClickHandler = (e) => {
navigate({
pathname: "/maps",
search: `?${createSearchParams({
id: e.id,
x: e.x,
y: e.y,
})}`,
});
};
return (
<section css={bookmarkContent}>
<ul>
{bookmark ? (
bookmark.map((e) => {
return (
<li
onClick={() => {
bookmarkClickHandler(e);
}}
key={e.id}>
<h4>{e.name}</h4>
<p>{e.addr}</p>
</li>
);
})
) : (
<p>아직 등록된 북마크가 없습니다.</p>
)}
</ul>
</section>
);
};
모바일
브라우저