diff --git a/src/assets/fonts/NanumSquareRoundOTFB.otf b/src/assets/fonts/NanumSquareRoundOTFB.otf
new file mode 100644
index 0000000..b8db7ee
Binary files /dev/null and b/src/assets/fonts/NanumSquareRoundOTFB.otf differ
diff --git a/src/assets/images/userLocation.svg b/src/assets/images/userLocation.svg
new file mode 100644
index 0000000..4cf8f44
--- /dev/null
+++ b/src/assets/images/userLocation.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/assets/img/Developers.svg b/src/assets/img/Developers.svg
new file mode 100644
index 0000000..bd045d4
--- /dev/null
+++ b/src/assets/img/Developers.svg
@@ -0,0 +1,9 @@
+
diff --git a/src/assets/img/github.svg b/src/assets/img/github.svg
new file mode 100644
index 0000000..6d31fbb
--- /dev/null
+++ b/src/assets/img/github.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/assets/img/instagram.svg b/src/assets/img/instagram.svg
new file mode 100644
index 0000000..f814dcb
--- /dev/null
+++ b/src/assets/img/instagram.svg
@@ -0,0 +1,9 @@
+
diff --git a/src/components/about/Footer.jsx b/src/components/about/Footer.jsx
new file mode 100644
index 0000000..1dfcd6e
--- /dev/null
+++ b/src/components/about/Footer.jsx
@@ -0,0 +1,55 @@
+import { useNavigate } from 'react-router-dom';
+import { Review } from "@components/about/Review/Review"
+// import github from "@assets/img/github.svg"
+import github from '../../assets/img/github.svg'
+import Develop from '../../assets/img/Developers.svg'
+import insta from '../../assets/img/instagram.svg'
+import * as F from './FooterStyle';
+import * as S from "@pages/about/AboutPage.styled";
+
+
+
+const Footer = () => {
+ const navigate = useNavigate();
+
+ const goToAboutPage = () => {
+ navigate('/about');
+ }
+
+ const goToGithub = () => {
+ window.open('https://github.com/LikeLion-at-DGU/2024_fall_festival_front', '_blank'); // 새로운 탭에서 GitHub 열기
+ };
+
+ const goToInstagram = () => {
+ window.open('https://www.instagram.com/likelion.official/', '_blank'); // 새로운 탭에서 Instagram 열기
+ };
+
+ return(
+
+
+ Copyright ⓒ 2024. 동국대학교 멋쟁이사자처럼 All rights reserved.
+
+
+
+
+
+
+
+
+
+
+
+ )
+
+}
+
+export default Footer;
\ No newline at end of file
diff --git a/src/components/about/FooterStyle.js b/src/components/about/FooterStyle.js
new file mode 100644
index 0000000..614b935
--- /dev/null
+++ b/src/components/about/FooterStyle.js
@@ -0,0 +1,55 @@
+import styled from "styled-components";
+
+export const Footer = styled.div`
+ display: flex;
+ flex-direction: column;
+
+*{
+ /* border: 1px solid black; */
+}
+
+#copy{
+ text-align: center;
+ color: rgba(0, 0, 0, 0.35);
+ padding: 10px 0;
+}
+`
+
+export const ButtonBar = styled.div`
+ display: flex;
+ flex-direction: row;
+ justify-content: center;
+ align-items: center;
+ width: 100%;
+ gap: 15px;
+ margin: 10px 0;
+
+ @media (max-width: 370px) {
+ flex-direction: column;
+ }
+
+ button{
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ flex-shrink: 0;
+ gap: 3px;
+
+ padding: 3px 8px;
+ border-radius: 10px;
+ border: 0.5px solid #BFBFBF;
+ background: #FFF;
+ }
+
+ span{
+ height: 100%;
+ text-align: center;
+ line-height: 1.8;
+ }
+
+ img{
+ width: 24px;
+ height: 24px;
+ object-fit: cover;
+ }
+`
\ No newline at end of file
diff --git a/src/components/about/Review/styled.js b/src/components/about/Review/styled.js
index 8c56f39..7ff3451 100644
--- a/src/components/about/Review/styled.js
+++ b/src/components/about/Review/styled.js
@@ -7,17 +7,18 @@ export const MainWrapper = styled.div`
align-items: center;
justify-content:center;
gap: 20px;
- margin-top:50px;
+ margin-top:30px;
`;
export const MentPlusLink = styled.div`
display:flex;
flex-direction:column;
gap:7px;
- margin-bottom:30px;
+ margin-bottom: 15px;
align-items: center;
justify-content:center;
`;
+
export const MainMent = styled.div`
color: #000;
font-family: ${({ theme }) => theme.fonts.AppleSDGothicNeoUL00['font-family']};
diff --git a/src/components/common/BoothDetail/BoothDetail.jsx b/src/components/common/BoothDetail/BoothDetail.jsx
index ce1af0c..c06ac32 100644
--- a/src/components/common/BoothDetail/BoothDetail.jsx
+++ b/src/components/common/BoothDetail/BoothDetail.jsx
@@ -116,11 +116,12 @@ export const BoothDetail = ({ onClose, booth_id, boothInfo }) => {
-
- MoveonTabling(boothDetailData.insta_link)}
- >
+ {boothInfo.is_reservable === true && (
+ MoveonTabling(boothDetailData.insta_link)}
+ >
+ )}
);
};
diff --git a/src/components/searchBar/SearchBar.jsx b/src/components/searchBar/SearchBar.jsx
index f518087..d500a99 100644
--- a/src/components/searchBar/SearchBar.jsx
+++ b/src/components/searchBar/SearchBar.jsx
@@ -1,64 +1,53 @@
import React, { useState } from "react";
-import axios from "axios";
import * as S from "./SearchBarStyle";
-import searchIcon from "../../assets/images/searchIcon.svg";
-
-const SearchBar = () => {
- const [searchWord, setSearch] = useState("");
- const [message, setMessage] = useState(""); //결과 확인 출력용 추후 삭제!!
-
- const handleInput = (e) => {
- setSearch(e.target.value);
- };
-
- const handleSearch = async () => {
- try {
- //우선 임시로 링크 걸어뒀습니다.
- const response = await axios.get(`${import.meta.env.VITE_API_BASE_URL}/api/v1/booth/`, {
- params: {
- //필요하면 필터링
- },
- });
-
- const data = response.data;
- console.log("받아온 데이터:", data);
-
- //검색어와 부스 name or host가 일치하는 항목 불러오기
- const filteredData = data.filter((booth) =>
- booth.name.includes(searchWord) || booth.host.includes(searchWord)
- );
-
- if (filteredData.length > 0) {
- const boothIds = filteredData.map(booth => booth.id);
- console.log("필터링된 데이터:", filteredData);
- console.log("필터링된 부스 ID들:", boothIds); //부스 id 여기 있어유
- setMessage(""); //검색 결과 있으면 해당 결과 출력
- } else {
- setMessage("검색 결과가 없습니다.");
- }
- } catch (err) {
- console.error("데이터를 가져오는 중 오류 발생:", err);
- setMessage("데이터를 가져오는 중 오류가 발생했습니다.");
- }
- };
-
- return (
- <>
-
-
-
-
-
-
- {/* {message &&
{message}
} */}
- >
-
+import searchIcon from "../../assets/images/searchIcon.svg";
+import { useBoothData } from "../../hook/useBooth"; // boothpage.jsx와 동일한 방식으로 데이터 훅 사용
+
+export const SearchBar = () => {
+ const [searchWord, setSearchWord] = useState(""); // 검색어 입력 상태 관리
+
+ const handleInput = (e) => {
+ setSearchWord(e.target.value);
+ };
+
+ // BoothPage.jsx에서 사용한 API 데이터 훅을 활용
+ const { boothData } = useBoothData({
+ day: undefined, // 날짜는 검색 기능에서 제외
+ category: undefined, // 카테고리 필터는 제외
+ location: undefined, // 위치 필터는 제외
+ is_night: undefined, // 시간 필터는 제외
+ is_reservable: undefined,
+ });
+
+ // 검색어를 통해 부스 데이터를 필터링
+ const handleSearch = () => {
+ if (!searchWord) return;
+
+ const filteredData = boothData?.filter(
+ (booth) =>
+ booth.name.includes(searchWord) || booth.host.includes(searchWord)
);
+
+ if (filteredData?.length > 0) {
+ console.log("검색 결과:", filteredData);
+ } else {
+ console.log("검색 결과가 없습니다.");
+ }
+ };
+
+ return (
+
+
+
+
+
+
+ );
};
export default SearchBar;
diff --git a/src/components/searchBar/SearchBarStyle.js b/src/components/searchBar/SearchBarStyle.js
index 01c04d5..1f19076 100644
--- a/src/components/searchBar/SearchBarStyle.js
+++ b/src/components/searchBar/SearchBarStyle.js
@@ -1,32 +1,34 @@
import styled from "styled-components";
export const SearchContainer = styled.div`
- display: flex;
- justify-content: center;
- align-items: center;
- width: 90%;
- margin: 10px auto;
- padding: 3px 10px;
- border: 1px solid #DDDDDD;
- border-radius: 10px;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ width: 90%;
+ margin: 10px auto;
+ padding: 3px 10px;
+ border: 1px solid #dddddd;
+ border-radius: 10px;
+ height: 35px;
+ color: #5f5f5f;
`;
export const SearchInput = styled.input`
- width: 100%;
- padding: 10px;
- border: none;
- outline: none;
- font-size: 12px;
- color: #5F5F5F;
+ width: 100%;
+ height: 100%;
+ padding: 10px;
+ border: none;
+ outline: none;
+ font-size: 12px;
`;
export const SearchButton = styled.button`
- cursor: pointer;
- padding-top: 3px;
- padding-right: 5px;
+ cursor: pointer;
+ padding-top: 3px;
+ padding-right: 5px;
`;
export const SearchIcon = styled.img`
- width: 12px;
- height: 12px;
+ width: 14px;
+ height: 14px;
`;
diff --git a/src/pages/about/AboutPage.jsx b/src/pages/about/AboutPage.jsx
index 53f5394..34d310a 100644
--- a/src/pages/about/AboutPage.jsx
+++ b/src/pages/about/AboutPage.jsx
@@ -3,13 +3,15 @@ import { AboutCard } from "@components/about/AboutCard/AboutCard";
import { LikeLionLink } from "@components/about/LikeLionLink/LikeLionLink";
import { Review } from "@components/about/Review/Review";
import { TopBar } from "@components/topBar/TopBar";
+import Footer from "@components/about/Footer";
+
export const AboutPage = () => {
return (
< TopBar />
-
+
);
};
diff --git a/src/pages/booth/BoothPage.jsx b/src/pages/booth/BoothPage.jsx
index 6c15082..dbaa352 100644
--- a/src/pages/booth/BoothPage.jsx
+++ b/src/pages/booth/BoothPage.jsx
@@ -5,11 +5,13 @@ import { TopBar } from "@components/topBar/TopBar";
import { Modal } from "@components/modal/Modal";
import { useBoothData } from "../../hook/useBooth";
import { BoothDetail } from "@components/common/BoothDetail/BoothDetail";
+import { SearchBar } from "@components/searchBar/SearchBar";
import nonselect_GI from "../../assets/images/nonselect_GI.png";
import nonselect_JU from "../../assets/images/nonselect_JU.png";
import select_GI from "../../assets/images/select_GI.png";
import select_JU from "../../assets/images/select_JU.png";
+import Footer from "../../components/about/Footer";
export const BoothPage = () => {
// 모달 상태 추가
@@ -77,10 +79,13 @@ export const BoothPage = () => {
const boothListRef = useRef(null);
const toggleDropdown = (type) => {
- setIsDropdownOpen((prevState) => ({
- ...prevState,
- [type]: !prevState[type],
- }));
+ setIsDropdownOpen((prevState) => {
+ const newDropdownState = Object.keys(prevState).reduce((acc, key) => {
+ acc[key] = key === type ? !prevState[key] : false;
+ return acc;
+ }, {});
+ return newDropdownState;
+ });
};
// 현위치 띄우기 용
@@ -104,6 +109,12 @@ export const BoothPage = () => {
setSelectedType("유형");
setSelectedLocation("위치");
+ setIsDropdownOpen({
+ time: false,
+ type: false,
+ location: false,
+ });
+
const button = e.currentTarget;
button.style.transform = "rotate(0deg)";
@@ -155,9 +166,9 @@ export const BoothPage = () => {
// 부스 유형에 따른 초기 마커 이미지 설정 함수
const getInitialMarkerImage = (booth) => {
- if (!window.kakao || !window.kakao.maps) return null;
+ let markerImage =
+ booth.category === "야간부스" ? nonselect_JU : nonselect_GI;
- let markerImage = booth.category === "주점" ? nonselect_JU : nonselect_GI;
return new window.kakao.maps.MarkerImage(
markerImage,
new window.kakao.maps.Size(30, 36)
@@ -173,10 +184,9 @@ export const BoothPage = () => {
script.onload = () => {
window.kakao.maps.load(() => {
- if (!mapRef.current) return;
const container = document.getElementById("map");
const options = {
- center: new window.kakao.maps.LatLng(37.5567, 127.0003),
+ center: new window.kakao.maps.LatLng(37.5577, 127.00099),
level: 3,
};
mapRef.current = new window.kakao.maps.Map(container, options);
@@ -364,7 +374,7 @@ export const BoothPage = () => {
{/* 상단 날짜 선택 버튼 */}
-
+
{/* 카카오맵 자리 */}
{
- setFollowUser(!followUser)}>
- {followUser ? "위치 추적 중지" : "현재 위치 보기"}
-
{/* 부스 리스트 */}
+ setFollowUser(!followUser)}>
+
+
{isBoothListOpen ? : }
@@ -451,9 +461,9 @@ export const BoothPage = () => {
푸드트럭
handleSelect("type", "주점")}
+ onClick={() => handleSelect("type", "야간부스")}
>
- 주점
+ 야간부스
handleSelect("type", "예약가능")}
@@ -525,7 +535,9 @@ export const BoothPage = () => {
{booth.name}
- 예약 가능
+ {booth.is_reservable === true && (
+ 예약 가능
+ )}
{booth.host}
@@ -543,9 +555,9 @@ export const BoothPage = () => {
) : (
현재 운영중인 부스가 없어요!
)}
+
-
{/* 선택한 부스 디테일 */}
{selectBooth && (
<>
diff --git a/src/pages/booth/Styled.js b/src/pages/booth/Styled.js
index 687b2ba..b997451 100644
--- a/src/pages/booth/Styled.js
+++ b/src/pages/booth/Styled.js
@@ -1,6 +1,13 @@
import styled, { keyframes } from "styled-components";
import { IoIosArrowDown, IoIosHeart, IoIosClose } from "react-icons/io";
import { FaLocationDot, FaArrowRotateLeft } from "react-icons/fa6";
+import { BiTargetLock } from "react-icons/bi";
+
+export const userLocationIcon = styled(BiTargetLock)`
+ color: ${({ $followUser }) => ($followUser ? "#ED6308" : "#5F5F5F")};
+ width: 30px;
+ height: 30px;
+`;
//애니메이션 모음
@@ -56,13 +63,13 @@ export const Header = styled.div`
align-items: center;
width: 100%;
`;
-
export const CurrentLocationButton = styled.div`
display: flex;
position: absolute;
z-index: 20;
- bottom: 80px;
- left: 10px;
+ position: absolute;
+ top: -35px;
+ left: 2px;
`;
export const DateSelector = styled.div`
@@ -70,7 +77,7 @@ export const DateSelector = styled.div`
align-items: center;
justify-content: flex-start;
padding: 0.5rem 1rem;
- gap: 6.65px;
+
width: 100%;
`;
@@ -80,10 +87,9 @@ export const DateButton = styled.div`
color: ${({ $active, theme }) =>
$active ? theme.colors.buttonFall : theme.colors.noneSelected};
font-family: ${({ theme }) => theme.fonts.NanumSquareRoundB["font-family"]};
- padding: 0.625rem 1rem;
- font-size: 14px;
+
border: none;
- border-radius: 5px;
+
cursor: pointer;
transition: background-color 0.3s ease, color 0.3s ease;
@@ -94,6 +100,9 @@ export const DateButton = styled.div`
`
background-color: #FFF3EA;
color: ${({ theme }) => theme.colors.buttonFall};
+
+
+
`}
/* 선택되지 않은 버튼 애니메이션 */
@@ -103,17 +112,39 @@ export const DateButton = styled.div`
background-color: #FFFFFF;
color: ${({ theme }) => theme.colors.noneSelected};
`}
+
+display: flex;
+ justify-content: center;
+ align-items: center;
+
+ width: 80px;
+ height: 40px;
+ font-size: 14px;
+
+ &:first-of-type {
+ border-radius: 28px 0px 0px 28px;
+ }
+ &:nth-of-type(2) {
+ border-radius: 0px 28px 28px 0px;
+ }
+
+ @media (max-width: 375px) {
+ width: 53.2px;
+ height: 28px;
+ font-size: 11px;
+ }
`;
// 카카오맵이 들어갈 자리
export const MapPlaceholder = styled.div`
width: 100%;
height: ${({ $isBoothListOpen }) =>
- $isBoothListOpen ? "calc(100vh - 520px)" : "calc(100vh - 180px)"};
+ $isBoothListOpen ? "calc(100vh - 450px)" : "calc(100vh - 180px)"};
background-color: #e0e0e0;
display: flex;
justify-content: center;
color: #666;
+ position: relative;
`;
// 부스 리스트와 필터가 들어가는 Wrapper
@@ -125,10 +156,14 @@ export const BoothListWrapper = styled.div`
bottom: ${({ $isOpen }) => ($isOpen ? "0" : "-20px")};
width: 100%;
max-width: 540px;
- height: ${({ $isOpen }) => ($isOpen ? "350px" : "0px")};
+ height: ${({ $isOpen }) => ($isOpen ? "400px" : "0px")};
background-color: inherit;
transition: bottom 0.5s ease, height 0.5s ease;
z-index: 10;
+
+ @media (max-width: 375px) {
+ height: ${({ $isOpen }) => ($isOpen ? "350px" : "0px")};
+ }
`;
// 부스 리스트 헤더
@@ -266,9 +301,6 @@ export const NoticeTabling = styled.div`
color: #5f5f5f;
font-family: ${({ theme }) => theme.fonts.NanumSquareRoundR["font-family"]};
font-size: 11px;
- font-style: normal;
- font-weight: 400;
- line-height: normal;
`;
export const BoothItem = styled.div`
@@ -299,7 +331,7 @@ export const BoothInfo = styled.div`
export const BoothWrap = styled.div`
display: flex;
- flex-direction: row;
+ flex-direction: column;
gap: 4px;
`;
@@ -315,33 +347,26 @@ export const LocationButton = styled.div`
font-family: ${({ theme }) =>
theme.fonts.NanumSquareRoundR["font-family"]}; // R
font-size: 10px;
- font-style: normal;
- font-weight: 400;
- line-height: normal;
cursor: pointer;
`;
export const BoothName = styled.div`
display: flex;
-
color: #000;
-
font-family: ${({ theme }) => theme.fonts.NanumSquareRoundB["font-family"]};
- font-size: 14.045px;
+ font-size: 14px;
`;
export const reservabletag = styled.div`
display: flex;
width: 43px;
padding: 3.896px 5.454px;
align-items: center;
- gap: 7.791px;
- font-family: ${({ theme }) => theme.fonts.NanumSquareRoundB["font-family"]};
+ font-family: ${({ theme }) => theme.fonts.NanumSquareRoundOTF["font-family"]};
border-radius: 4.09px;
background: #e4ff83;
- color: var(--Color-blue-blue500, #1851ff);
- font-family: NanumSquareRoundOTF;
- font-size: 8.38px;
+ color: #1851ff;
+ font-size: 8px;
font-style: normal;
font-weight: 700;
line-height: normal;
@@ -349,42 +374,27 @@ export const reservabletag = styled.div`
export const HeartWrap = styled.div`
display: flex;
flex-direction: row;
-
gap: 4px;
-
color: #000;
font-family: ${({ theme }) => theme.fonts.NanumSquareRoundR["font-family"]};
font-size: 10px;
- font-style: normal;
- font-weight: 400;
- line-height: normal;
`;
export const BoothWho = styled.div`
display: flex;
-
color: #5f5f5f;
-
font-family: ${({ theme }) => theme.fonts.NanumSquareRoundR["font-family"]};
- font-size: 12px;
- font-style: normal;
- font-weight: 400;
- line-height: normal;
+ font-size: 10px;
`;
export const NoBooth = styled.div`
display: flex;
justify-content: center;
align-items: center;
-
height: 100%;
-
color: #5f5f5f;
font-family: ${({ theme }) => theme.fonts.NanumSquareRoundB["font-family"]};
font-size: 13px;
- font-style: normal;
- font-weight: 400;
- line-height: normal;
`;
//부스 디테일
@@ -475,12 +485,8 @@ export const FilterTag = styled.div`
width: 46px;
height: 16px;
border-radius: 5px;
-
font-family: ${({ theme }) => theme.fonts.NanumSquareRoundR["font-family"]};
font-size: 10px;
- font-style: normal;
- font-weight: 400;
- line-height: normal;
`;
export const Details = styled.div`
@@ -490,24 +496,16 @@ export const Details = styled.div`
export const DetailTitle = styled.div`
display: flex;
-
color: #000;
font-family: ${({ theme }) => theme.fonts.NanumSquareRoundB["font-family"]};
font-size: 10px;
- font-style: normal;
- font-weight: 400;
- line-height: normal;
`;
export const DetailContext = styled.div`
display: flex;
-
color: #000;
font-family: ${({ theme }) => theme.fonts.NanumSquareRoundR["font-family"]};
font-size: 10px;
- font-style: normal;
- font-weight: 400;
- line-height: normal;
`;
export const DetailLine = styled.div`
@@ -542,9 +540,6 @@ export const LineNowText = styled.div`
color: #333740;
font-family: ${({ theme }) => theme.fonts.NanumSquareRoundB["font-family"]};
font-size: 10.5px;
- font-style: normal;
- font-weight: 400;
- line-height: normal;
`;
export const LineNowLogo = styled.img`
@@ -563,13 +558,11 @@ export const StyledFaLocationDot = styled(FaLocationDot)`
text-align: center;
width: 15px;
height: 27px;
-
color: #ff9849;
`;
export const StyledIoIosHeart = styled(IoIosHeart)`
display: flex;
-
color: ${({ theme }) => theme.colors.buttonFall};
`;
diff --git a/src/router.jsx b/src/router.jsx
index b91cb39..9a77019 100644
--- a/src/router.jsx
+++ b/src/router.jsx
@@ -21,11 +21,8 @@ export const router = createBrowserRouter([
},
{ path: "/about", element: },
- //에러페이지
- {
- path: "/error",
- element: ,
- },
],
+
+ errorElement: , // ErrorBoundary에 에러 핸들링 적용
},
]);
diff --git a/src/styles/global.js b/src/styles/global.js
index 65ad36b..5312e3a 100644
--- a/src/styles/global.js
+++ b/src/styles/global.js
@@ -57,6 +57,10 @@ i {font-style:normal}
font-family: "AppleSDGothicNeoM00";
src: url("src/assets/fonts/AppleSDGothicNeoM.ttf") format("truetype");
}
+@font-face {
+ font-family: "NanumSquareRoundOTF";
+ src: url("src/assets/fonts/NanumSquareRoundOTFB.ttf") format("truetype");
+}
//나눔 스퀘어 라운드 폰트 설정
diff --git a/src/styles/theme.js b/src/styles/theme.js
index 934ab15..94c1d4c 100644
--- a/src/styles/theme.js
+++ b/src/styles/theme.js
@@ -45,13 +45,7 @@ export const theme = {
},
fonts: {
- default: fontGenerator(
- "NanumSquareRoundR",
- "1rem",
- "400",
- "1.5",
- "normal"
- ),
+ default: fontGenerator("NanumSquareRoundR", "1rem", "400", "1.5", "normal"),
// Apple SD 산돌고딕 Neo 폰트 설정
AppleSDGothicNeoH00: fontGenerator("AppleSDGothicNeoH00"),
@@ -66,5 +60,6 @@ export const theme = {
NanumSquareRoundEB: fontGenerator("NanumSquareRoundEB"),
NanumSquareRoundR: fontGenerator("NanumSquareRoundR"),
NanumSquareRoundL: fontGenerator("NanumSquareRoundL"),
+ NanumSquareRoundOTF: fontGenerator("NanumSquareRoundOTF"),
},
};