diff --git a/dev-dist/sw.js b/dev-dist/sw.js new file mode 100644 index 0000000..ee36f5c --- /dev/null +++ b/dev-dist/sw.js @@ -0,0 +1,89 @@ +/** + * Copyright 2018 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// If the loader is already loaded, just stop. +if (!self.define) { + let registry = {}; + + // Used for `eval` and `importScripts` where we can't get script URL by other means. + // In both cases, it's safe to use a global var because those functions are synchronous. + let nextDefineUri; + + const singleRequire = (uri, parentUri) => { + uri = new URL(uri + ".js", parentUri).href; + return registry[uri] || ( + + new Promise(resolve => { + if ("document" in self) { + const script = document.createElement("script"); + script.src = uri; + script.onload = resolve; + document.head.appendChild(script); + } else { + nextDefineUri = uri; + importScripts(uri); + resolve(); + } + }) + + .then(() => { + let promise = registry[uri]; + if (!promise) { + throw new Error(`Module ${uri} didn’t register its module`); + } + return promise; + }) + ); + }; + + self.define = (depsNames, factory) => { + const uri = nextDefineUri || ("document" in self ? document.currentScript.src : "") || location.href; + if (registry[uri]) { + // Module is already loading or loaded. + return; + } + let exports = {}; + const require = depUri => singleRequire(depUri, uri); + const specialDeps = { + module: { uri }, + exports, + require + }; + registry[uri] = Promise.all(depsNames.map( + depName => specialDeps[depName] || require(depName) + )).then(deps => { + factory(...deps); + return exports; + }); + }; +} +define(['./workbox-5a5d9309'], (function (workbox) { 'use strict'; + + self.skipWaiting(); + workbox.clientsClaim(); + + /** + * The precacheAndRoute() method efficiently caches and responds to + * requests for URLs in the manifest. + * See https://goo.gl/S9QRab + */ + workbox.precacheAndRoute([{ + "url": "index.html", + "revision": "0.0260f7p30q8" + }], {}); + workbox.cleanupOutdatedCaches(); + workbox.registerRoute(new workbox.NavigationRoute(workbox.createHandlerBoundToURL("index.html"), { + allowlist: [/^\/$/] + })); + +})); diff --git a/src/assets/icons/Menu.svg b/src/assets/icons/Menu.svg index fa38f6f..55c975c 100644 --- a/src/assets/icons/Menu.svg +++ b/src/assets/icons/Menu.svg @@ -1,3 +1,3 @@ - + diff --git a/src/components/home/EventList.jsx b/src/components/home/EventList.jsx index 41289f7..782b7ed 100644 --- a/src/components/home/EventList.jsx +++ b/src/components/home/EventList.jsx @@ -3,7 +3,6 @@ import useCustomFetch from "../../utils/hooks/useCustomFetch"; import Bookmark from "../../assets/icons/Bookmark.svg?react"; import BookmarkOL from "../../assets/icons/BookmarkOL.svg?react"; - export default function EventList({ id, title, @@ -14,39 +13,31 @@ export default function EventList({ onClick, onScrapClick, }) { - { - const { fetchData } = useCustomFetch(); - - const handleScrapClick = () => { - onScrapClick(id, scraped, fetchData); - }; - - return ( - - - {title} - - { - e.stopPropagation(); - handleScrapClick(); - }} - > - {scraped ? ( - - ) : ( - - )} - - -
-
- ); - } + return ( + + + {title} + + { + e.stopPropagation(); // 1. 상세 페이지 이동(카드 클릭) 방지 + onScrapClick(); // 2. 부모의 스크랩 함수만 깔끔하게 실행 + }} + > + {scraped ? ( + + ) : ( + + )} + + +
+
+ ); } const GreenBookmark = styled(Bookmark)` diff --git a/src/components/menu/MenuTrigger.jsx b/src/components/menu/MenuTrigger.jsx index 38c5f41..d9e2324 100644 --- a/src/components/menu/MenuTrigger.jsx +++ b/src/components/menu/MenuTrigger.jsx @@ -1,7 +1,7 @@ import styled from "styled-components"; -import { useMenu } from "./MenuProvider.jsx"; import MenuSvg from "../../assets/icons/Menu.svg?react"; // 기본(흰색) import HamburgerSvg from "../../assets/icons/HamburgerMenu.svg?react"; // 검정색 +import { useMenu } from "./MenuProvider.jsx"; export default function MenuTrigger({ size = 24, diff --git a/src/pages/Detail.jsx b/src/pages/Detail.jsx index 9626f0e..81a1cea 100644 --- a/src/pages/Detail.jsx +++ b/src/pages/Detail.jsx @@ -439,7 +439,7 @@ export default function Detail() { {exhibition.dateException && (
- +

{exhibition.dateException}

)} @@ -890,3 +890,11 @@ const AutoHeightTextarea = styled.textarea` color: ${({ theme }) => theme.colors.gray6}; } `; + +const StyledMenuIcon = styled(MenuIcon)` + width: 18px; + height: 18px; + path { + stroke: #57b190; + } +`; diff --git a/src/pages/Home.jsx b/src/pages/Home.jsx index 5625265..e7f4de4 100644 --- a/src/pages/Home.jsx +++ b/src/pages/Home.jsx @@ -77,18 +77,17 @@ export default function Home() { } try { - // fetchData(여기서는 axiosInstance)를 전달 const success = await toggleScrap(fetchData, id, scraped); - if (success) { window.location.reload(); } else { - console.error("스크랩 실패"); + alert("스크랩 처리에 실패했습니다."); } } catch (err) { console.error("에러 발생:", err); } }; + return ( {showLoginModal && ( diff --git a/src/pages/enrollEvent/EnrollEvent.jsx b/src/pages/enrollEvent/EnrollEvent.jsx index 62055ee..079c7c9 100644 --- a/src/pages/enrollEvent/EnrollEvent.jsx +++ b/src/pages/enrollEvent/EnrollEvent.jsx @@ -144,8 +144,6 @@ export default function EnrollEvent() { images: formattedImages, }; - console.log("🚀 전송 데이터:", body); - try { const res = await createExhibition(body); diff --git a/src/pages/enrollEvent/EnrollStepOne.jsx b/src/pages/enrollEvent/EnrollStepOne.jsx index 0fa5be4..995b51a 100644 --- a/src/pages/enrollEvent/EnrollStepOne.jsx +++ b/src/pages/enrollEvent/EnrollStepOne.jsx @@ -27,13 +27,14 @@ function EnrollStepOne({ data, setData, setIsNextActive }) { }; //전시 수정 (추가) + useEffect(() => { - if (data.link) { - setNoTicket(false); - } else if (data.link === "") { - setNoTicket(true); - } - }, []); + // 가격 + setIsFree(data.price === "무료"); + + // 링크 + setNoTicket(!data.link || data.link === ""); + }, [data.price, data.link]); //입력값 검사 useEffect(() => { const safeStr = (val) => String(val || "").trim(); @@ -256,19 +257,23 @@ function EnrollStepOne({ data, setData, setIsNextActive }) { {/* 예매 링크 */}
+ { setNoTicket(checked); + update("link", checked ? "" : data.link); }} /> + 예매 필요 없음 (자유 입장) + {!noTicket && ( update("link", v)} textAlign="right" />