From 894e53eed21c129cbca392500b9574ca2c12b9a1 Mon Sep 17 00:00:00 2001 From: im-na0 <139189221+im-na0@users.noreply.github.com> Date: Fri, 12 Jul 2024 01:59:20 +0900 Subject: [PATCH 01/23] =?UTF-8?q?feat:=20search=20console=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- index.html | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/index.html b/index.html index e3a9bcfc..a6d7f8e6 100644 --- a/index.html +++ b/index.html @@ -25,6 +25,14 @@ href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.9/dist/web/variable/pretendardvariable-dynamic-subset.min.css" /> 퍼센트 호텔 + 못 가게된 숙박권 더 이상 돈 날리지 말고, 비싼 호캉스도 믿고 거래하자! + 특가보다 저렴한 호캉스 예약. + + + ); + }, +); From 2fde5096c3025bd74218763e2ce7a9742b7bd10c Mon Sep 17 00:00:00 2001 From: im-na0 <139189221+im-na0@users.noreply.github.com> Date: Fri, 12 Jul 2024 19:06:02 +0900 Subject: [PATCH 09/23] =?UTF-8?q?feat:=20Home=20=ED=8E=98=EC=9D=B4?= =?UTF-8?q?=EC=A7=80=20json-ld=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/homePage/Home.tsx | 59 ++++++++++++++++++++++++++++++------- 1 file changed, 48 insertions(+), 11 deletions(-) diff --git a/src/pages/homePage/Home.tsx b/src/pages/homePage/Home.tsx index 2b5bad15..1c0e7ad1 100644 --- a/src/pages/homePage/Home.tsx +++ b/src/pages/homePage/Home.tsx @@ -12,7 +12,8 @@ import WeekendCarousel from "./weekendCarousel/WeekendCarousel"; import { fetchMainItem } from "@/apis/fetchMainItems"; import secondMonth from "@/assets/EventImages/secondMonth.png"; -import { LocaleItem, WeekendItem } from "@/types/saleSection"; +import { HelmetTag } from "@/components/Helmet/Helmet"; +import { LocaleItem, LocaleItemsType, WeekendItem } from "@/types/saleSection"; interface EventItem { id: number; image: string; @@ -20,12 +21,12 @@ interface EventItem { title2: string; } -const Home = () => { - const { data: mainData } = useSuspenseQuery({ - queryKey: ["main"], - queryFn: fetchMainItem, - }); - const [localeProds, weekendProds] = mainData; +const HomeView = ({ + data, +}: { + data: [LocaleItemsType, WeekendItem[] | null]; +}) => { + const [localeProds, weekendProds] = data; const EventCarouselContents: EventItem[] = [ { id: 1, @@ -73,11 +74,9 @@ const Home = () => { 프리미엄 호캉스 퍼센특가로 만나는 4-5성급 호텔 모음 - { )} - 지역 + 지역 - 할인 호텔 + 할인 호텔
{ ); }; +const Home = () => { + const { data } = useSuspenseQuery({ + queryKey: ["main"], + queryFn: fetchMainItem, + }); + + const [localeProds, weekendProds] = data; + + const schemaData = { + areaServed: Object.keys(localeProds), + makesOffer: [ + { + "@type": "Offer", + itemOffered: { + "@type": "TravelService", + name: "지역별 할인 호텔", + description: `${Object.keys(localeProds).length}개 지역의 할인 호텔 상품`, + }, + }, + { + "@type": "Offer", + itemOffered: { + "@type": "TravelService", + name: "프리미엄 호캉스", + description: `${weekendProds?.length || 0}개의 프리미엄 호캉스 상품`, + }, + }, + ], + }; + + return ( + <> + + + + ); +}; + export default Home; From 3713c7bdbdcf31d80cdfdb8ce5f3f490870bb1b8 Mon Sep 17 00:00:00 2001 From: im-na0 <139189221+im-na0@users.noreply.github.com> Date: Fri, 12 Jul 2024 19:06:17 +0900 Subject: [PATCH 10/23] =?UTF-8?q?feat:=20=ED=8C=90=EB=A7=A4=20=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=20json-ld=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../transferWritingPage/TransferWriting.tsx | 20 +++++++++++++++- .../TransferWritingPrice.tsx | 20 +++++++++++++++- .../TransferWritingSuccess.tsx | 24 ++++++++++++++++--- 3 files changed, 59 insertions(+), 5 deletions(-) diff --git a/src/pages/transferWritingPage/TransferWriting.tsx b/src/pages/transferWritingPage/TransferWriting.tsx index 4805c9f1..1ab59424 100644 --- a/src/pages/transferWritingPage/TransferWriting.tsx +++ b/src/pages/transferWritingPage/TransferWriting.tsx @@ -8,13 +8,14 @@ import * as S from "./TransferWriting.style"; import { fetchTransferItems } from "@/apis/fetchTransferItems"; import { fetchUserInfo } from "@/apis/fetchUserInfo.ts"; import { ResponseError } from "@/components/error/Error"; +import { HelmetTag } from "@/components/Helmet/Helmet"; import NoResult from "@/components/noResult/NoResult"; import { ERROR_CODE } from "@/constants/api"; import { PATH } from "@/constants/path"; import useToastConfig from "@/hooks/common/useToastConfig"; import useAuthStore from "@/store/authStore"; -const TransferWriting = () => { +const TransferWritingView = () => { const { handleToast } = useToastConfig(); const isLoggedIn = useAuthStore((state) => state.isLoggedIn); @@ -110,4 +111,21 @@ const TransferWriting = () => { ); }; +const TransferWriting = () => { + const schemaData = { + "@type": "WebPage", + mainEntityOfPage: { + "@type": "WebPage", + "@id": `${location.origin}${PATH.WRITE_TRANSFER}`, + }, + }; + + return ( + <> + + + + ); +}; + export default TransferWriting; diff --git a/src/pages/transferWritingPricePage/TransferWritingPrice.tsx b/src/pages/transferWritingPricePage/TransferWritingPrice.tsx index 5f829186..acdc9b71 100644 --- a/src/pages/transferWritingPricePage/TransferWritingPrice.tsx +++ b/src/pages/transferWritingPricePage/TransferWritingPrice.tsx @@ -17,6 +17,7 @@ import useChangePage from "../../hooks/common/useChangePage"; import useReadyToSubmit from "../../hooks/common/useReadyToSubmit"; import useSubmitHandler from "../../hooks/common/useSubmitHandler"; +import { HelmetTag } from "@/components/Helmet/Helmet"; import { useUserInfoQuery } from "@/hooks/api/useUserInfoQuery"; import usePreventLeave from "@/hooks/common/usePreventLeave"; import useTransferNavigation from "@/hooks/common/useTransferNavigation"; @@ -34,7 +35,7 @@ import { type SellerCommentType } from "@/types/sellerComments"; // name: "Bumang", // }; -const TransferWritingPrice = () => { +const TransferWritingPriceView = () => { // 현재 선택된 숙박 const selectedItem = useSelectedItemStore((state) => state.selectedItem); @@ -256,4 +257,21 @@ const TransferWritingPrice = () => { ); }; +const TransferWritingPrice = () => { + const schemaData = { + "@type": "WebPage", + mainEntityOfPage: { + "@type": "WebPage", + "@id": `${location.origin}${location.pathname}}`, + }, + }; + + return ( + <> + + + + ); +}; + export default TransferWritingPrice; diff --git a/src/pages/transferWritingSuccessPage/TransferWritingSuccess.tsx b/src/pages/transferWritingSuccessPage/TransferWritingSuccess.tsx index 7ba6d0f3..a6e2775d 100644 --- a/src/pages/transferWritingSuccessPage/TransferWritingSuccess.tsx +++ b/src/pages/transferWritingSuccessPage/TransferWritingSuccess.tsx @@ -1,14 +1,15 @@ -import PercentHotelLogo from "@/assets/logos/Percent-hotel_logo_b.png"; -import { PATH } from "@/constants/path"; import { useEffect, useState } from "react"; import { useNavigate, useSearchParams } from "react-router-dom"; import AccountBottomSheet from "./accountBottomSheet/AccountBottomSheet"; import * as S from "./TransferWritingSuccess.style"; +import PercentHotelLogo from "@/assets/logos/Percent-hotel_logo_b.png"; +import { HelmetTag } from "@/components/Helmet/Helmet"; import Success from "@/components/lottie/success/Success"; +import { PATH } from "@/constants/path"; -const TransferWritingSuccess = () => { +const TransferWritingSuccessView = () => { const [content, setContent] = useState< "default" | "agreement" | "firstlyNoAccount" >("default"); @@ -52,4 +53,21 @@ const TransferWritingSuccess = () => { ); }; +const TransferWritingSuccess = () => { + const schemaData = { + "@type": "WebPage", + mainEntityOfPage: { + "@type": "WebPage", + "@id": `${location.origin}${location.pathname}}`, + }, + }; + + return ( + <> + + + + ); +}; + export default TransferWritingSuccess; From b5ff14d88afed46204b7aab3175f561518c9e56c Mon Sep 17 00:00:00 2001 From: im-na0 <139189221+im-na0@users.noreply.github.com> Date: Fri, 12 Jul 2024 19:06:31 +0900 Subject: [PATCH 11/23] =?UTF-8?q?feat:=20=ED=9A=8C=EC=9B=90=EA=B0=80?= =?UTF-8?q?=EC=9E=85,=EB=A1=9C=EA=B7=B8=EC=9D=B8=20=ED=8E=98=EC=9D=B4?= =?UTF-8?q?=EC=A7=80=20json-ld=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/signInPage/SignIn.tsx | 20 +++++++++++++++++++- src/pages/signUpPage/SignUp.tsx | 30 ++++++++++++++++++++++++++++-- 2 files changed, 47 insertions(+), 3 deletions(-) diff --git a/src/pages/signInPage/SignIn.tsx b/src/pages/signInPage/SignIn.tsx index 038c4c18..2c84633d 100644 --- a/src/pages/signInPage/SignIn.tsx +++ b/src/pages/signInPage/SignIn.tsx @@ -5,6 +5,7 @@ import { Link, useNavigate, useSearchParams } from "react-router-dom"; import * as S from "./SignIn.style"; import { postLogin } from "@/apis/fetchLogin"; +import { HelmetTag } from "@/components/Helmet/Helmet"; import { PATH } from "@/constants/path"; import useToastConfig from "@/hooks/common/useToastConfig"; import { useUserInfoStore } from "@/store/store"; @@ -15,7 +16,7 @@ type FormValues = { password: string; }; -const SignIn = () => { +const SignInView = () => { const navigate = useNavigate(); const [searchParams] = useSearchParams(); const redirectUrl = searchParams.get("redirect"); @@ -114,4 +115,21 @@ const SignIn = () => { ); }; +const SignIn = () => { + const schemaData = { + "@type": "WebPage", + mainEntityOfPage: { + "@type": "WebPage", + "@id": `${location.origin}${PATH.LOGIN}`, + }, + }; + + return ( + <> + + + + ); +}; + export default SignIn; diff --git a/src/pages/signUpPage/SignUp.tsx b/src/pages/signUpPage/SignUp.tsx index c989b60f..2e1f683c 100644 --- a/src/pages/signUpPage/SignUp.tsx +++ b/src/pages/signUpPage/SignUp.tsx @@ -1,11 +1,14 @@ -import TermsAgreementSection from "@/pages/connectYanoljaPage/verificationPage/components/termsAgreementSection/TermsAgreementSection"; import { FormProvider, useForm } from "react-hook-form"; import FieldValues from "./components/fieldValues/FieldValues"; import SignUpSubmitBtn from "./components/signUpSubmitBtn/SignUpSubmitBtn"; import * as S from "./SignUp.style"; -const SignUp = () => { +import { HelmetTag } from "@/components/Helmet/Helmet"; +import { PATH } from "@/constants/path"; +import TermsAgreementSection from "@/pages/connectYanoljaPage/verificationPage/components/termsAgreementSection/TermsAgreementSection"; + +const SignUpView = () => { const methods = useForm({ mode: "onChange", shouldUnregister: false, @@ -27,4 +30,27 @@ const SignUp = () => { ); }; +const SignUp = () => { + const schemaData = { + "@type": "WebPage", + description: + "퍼센트호텔 회원가입 페이지입니다. 가입하시면 다양한 혜택을 누리실 수 있습니다.", + mainEntityOfPage: { + "@type": "WebPage", + "@id": `${location.origin}${PATH.SIGNUP}`, + }, + }; + + return ( + <> + + + + ); +}; + export default SignUp; From 9b43ebbdca7a3fde2012a82751c9708fa67c3105 Mon Sep 17 00:00:00 2001 From: im-na0 <139189221+im-na0@users.noreply.github.com> Date: Fri, 12 Jul 2024 19:06:44 +0900 Subject: [PATCH 12/23] =?UTF-8?q?feat:=20=EA=B2=80=EC=83=89,=EA=B2=80?= =?UTF-8?q?=EC=83=89=ED=95=84=ED=84=B0=20=ED=8E=98=EC=9D=B4=EC=A7=80=20jso?= =?UTF-8?q?n-ld=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/searchFilterPage/SearchFilter.tsx | 56 ++++++++++++- src/pages/searchPage/Search.tsx | 91 +++++++++++---------- 2 files changed, 105 insertions(+), 42 deletions(-) diff --git a/src/pages/searchFilterPage/SearchFilter.tsx b/src/pages/searchFilterPage/SearchFilter.tsx index cbba440f..829c06ee 100644 --- a/src/pages/searchFilterPage/SearchFilter.tsx +++ b/src/pages/searchFilterPage/SearchFilter.tsx @@ -6,11 +6,12 @@ import PeopleCounter from "./components/peopleCounter/PeopleCounter"; import RegionModal from "./components/regionModal/RegionModal"; import * as S from "./SearchFilter.style"; +import { HelmetTag } from "@/components/Helmet/Helmet"; import { PATH } from "@/constants/path"; import { useSearchFilterInfoStore } from "@/store/store"; import { formatDateMonthAndDay } from "@/utils/dateFomaterMonthDay"; -const SearchFilter = () => { +const SearchFilterView = () => { const searchInfo = useSearchFilterInfoStore((state) => state.searchInfo); const setSearchInfo = useSearchFilterInfoStore( (state) => state.setSearchInfo, @@ -113,4 +114,57 @@ const SearchFilter = () => { ); }; +const SearchFilter = () => { + const schemaData = { + "@type": "WebPage", + name: "퍼센트호텔 검색 필터", + description: + "퍼센트호텔에서 원하는 조건으로 호텔을 검색하세요. 지역, 날짜, 인원 수를 선택할 수 있습니다.", + mainEntityOfPage: { + "@type": "WebPage", + "@id": `${location.origin}${PATH.SEARCH_FILTER}`, + }, + potentialAction: { + "@type": "SearchAction", + target: { + "@type": "EntryPoint", + urlTemplate: `${location.origin}/search?location={location}&checkIn={checkIn}&checkOut={checkOut}&people={people}`, + }, + "query-input": [ + { + "@type": "PropertyValueSpecification", + valueRequired: true, + valueName: "location", + }, + { + "@type": "PropertyValueSpecification", + valueRequired: true, + valueName: "checkIn", + }, + { + "@type": "PropertyValueSpecification", + valueRequired: true, + valueName: "checkOut", + }, + { + "@type": "PropertyValueSpecification", + valueRequired: true, + valueName: "people", + }, + ], + }, + }; + + return ( + <> + + + + ); +}; + export default SearchFilter; diff --git a/src/pages/searchPage/Search.tsx b/src/pages/searchPage/Search.tsx index 17a1563f..80f3cca9 100644 --- a/src/pages/searchPage/Search.tsx +++ b/src/pages/searchPage/Search.tsx @@ -1,4 +1,3 @@ -import { useInfiniteQuery } from "@tanstack/react-query"; import { useEffect, useState } from "react"; import SearchBar from "./components/searchBar/SearchBar"; @@ -6,53 +5,19 @@ import SearchItem from "./components/searchItem/SearchItem"; import SearchNav from "./components/searchNav/SearchNav"; import * as S from "./Search.style"; +import type { ISearchFilterInfo } from "@/types/searchFilterInfo"; import type { ISearchList } from "@/types/searchList"; -import { fetchSearchList } from "@/apis/fetchSeachList"; import ArrowIcon from "@/assets/icons/ic_arrow.svg?react"; +import { HelmetTag } from "@/components/Helmet/Helmet"; +import { useInfiniteSearchQuery } from "@/hooks/api/useSearchQuery"; import { useIntersectionObserver } from "@/hooks/common/useIntersectionObserver"; import { useSearchFilterInfoStore } from "@/store/store"; -const Search = () => { +const SearchView = ({ searchInfo }: { searchInfo: ISearchFilterInfo }) => { const [isTopButtonVisible, setIsTopButtonVisible] = useState(false); - const searchInfo = useSearchFilterInfoStore((state) => state.searchInfo); - - const pageSize = 10; - const { data, fetchNextPage, isLoading, hasNextPage } = useInfiniteQuery({ - queryKey: [ - "searchItems", - searchInfo.location, - searchInfo.checkIn, - searchInfo.checkOut, - searchInfo.quantityPeople, - searchInfo.sorted, - searchInfo.brunch, - searchInfo.pool, - searchInfo.oceanView, - ], - queryFn: ({ pageParam = 0 }) => - fetchSearchList( - searchInfo.location, - searchInfo.checkIn, - searchInfo.checkOut, - searchInfo.quantityPeople, - searchInfo.sorted, - searchInfo.brunch, - searchInfo.pool, - searchInfo.oceanView, - pageParam, - pageSize, - ), - refetchOnMount: false, - refetchOnWindowFocus: false, - initialPageParam: 0, - getNextPageParam: (lastPage) => { - const lastData = lastPage?.content; - return lastData && lastData.length === pageSize - ? lastPage?.number + 1 - : undefined; - }, - }); + const { data, fetchNextPage, isLoading, hasNextPage } = + useInfiniteSearchQuery(searchInfo); const handleIntersect = (isIntersecting: boolean) => { if (isIntersecting && hasNextPage) { @@ -119,4 +84,48 @@ const Search = () => { ); }; +const Search = () => { + const searchInfo = useSearchFilterInfoStore((state) => state.searchInfo); + + const schemaData = { + "@type": "SearchResultsPage", + mainEntityOfPage: { + "@type": "WebPage", + "@id": `${location.origin}/search`, + }, + about: { + "@type": "HotelSearch", + checkinTime: searchInfo.checkIn, + checkoutTime: searchInfo.checkOut, + location: { + "@type": "Place", + name: searchInfo.location, + }, + occupancy: { + "@type": "QuantitativeValue", + value: searchInfo.quantityPeople, + }, + }, + potentialAction: { + "@type": "SearchAction", + target: { + "@type": "EntryPoint", + urlTemplate: `${location.origin}/search?q={search_term_string}`, + }, + "query-input": "required name=search_term_string", + }, + }; + + return ( + <> + + + + ); +}; + export default Search; From 0387574a93956237a87997219737f771953c6e8a Mon Sep 17 00:00:00 2001 From: im-na0 <139189221+im-na0@users.noreply.github.com> Date: Fri, 12 Jul 2024 19:07:04 +0900 Subject: [PATCH 13/23] =?UTF-8?q?feat:=20=ED=8C=90=EB=A7=A4=EB=82=B4?= =?UTF-8?q?=EC=97=AD=20=ED=8E=98=EC=9D=B4=EC=A7=80=20json-ld=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/saleDetailPage/SaleDetail.tsx | 30 ++++++++++++++++++++----- 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/src/pages/saleDetailPage/SaleDetail.tsx b/src/pages/saleDetailPage/SaleDetail.tsx index 3ed8fd7a..37589d28 100644 --- a/src/pages/saleDetailPage/SaleDetail.tsx +++ b/src/pages/saleDetailPage/SaleDetail.tsx @@ -1,8 +1,3 @@ -import Caption from "@/components/caption/Caption"; -import Card from "@/components/card/Card"; -import CardItem from "@/components/cardItem/CardItem"; -import { CaptionWrapper } from "@/pages/paymentPage/Payment.style"; -import { calculateFee } from "@/utils/calculator"; import { parse, sub, format } from "date-fns"; import { useParams, useSearchParams } from "react-router-dom"; @@ -10,10 +5,16 @@ import SaleButton from "./saleButton/SaleButton"; import * as S from "./SaleDetail.style"; import SaleInfo from "./saleInfo/SaleInfo"; +import Caption from "@/components/caption/Caption"; +import Card from "@/components/card/Card"; +import CardItem from "@/components/cardItem/CardItem"; +import { HelmetTag } from "@/components/Helmet/Helmet"; import { useSaleDetailQuery } from "@/hooks/api/useSaleQuery"; +import { CaptionWrapper } from "@/pages/paymentPage/Payment.style"; +import { calculateFee } from "@/utils/calculator"; import { formatDateString } from "@/utils/dateFormatter"; -const SaleDetail = () => { +const SaleDetailView = () => { const { saleId } = useParams(); const [searchParams] = useSearchParams(); const isPaymentId = searchParams.get("isPaymentId"); @@ -269,4 +270,21 @@ const SaleDetail = () => { ); }; +const SaleDetail = () => { + const schemaData = { + "@type": "WebPage", + mainEntityOfPage: { + "@type": "WebPage", + "@id": `${location.origin}${location.pathname}}`, + }, + }; + + return ( + <> + + + + ); +}; + export default SaleDetail; From 321e9085db7fbda30fa39760b2a73fd4776cfb9f Mon Sep 17 00:00:00 2001 From: im-na0 <139189221+im-na0@users.noreply.github.com> Date: Fri, 12 Jul 2024 19:07:13 +0900 Subject: [PATCH 14/23] =?UTF-8?q?feat:=20=EC=83=81=ED=92=88=20=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=20json-ld=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/roomDetailPage/RoomDetail.tsx | 122 +++++++++++++++++++++--- 1 file changed, 107 insertions(+), 15 deletions(-) diff --git a/src/pages/roomDetailPage/RoomDetail.tsx b/src/pages/roomDetailPage/RoomDetail.tsx index 10c18fb3..773f7dee 100644 --- a/src/pages/roomDetailPage/RoomDetail.tsx +++ b/src/pages/roomDetailPage/RoomDetail.tsx @@ -3,6 +3,8 @@ import { useParams } from "react-router-dom"; import * as S from "./RoomDetail.style"; +import type { RoomData } from "@/types/room"; + import Carousel from "@/components/carousel/Carousel"; import { HelmetTag } from "@/components/Helmet/Helmet"; import { useRoomQuery } from "@/hooks/api/useRoomQuery"; @@ -12,40 +14,130 @@ import RoomInfo from "@/pages/roomDetailPage/components/roomInfo/RoomInfo"; import RoomNavBar from "@/pages/roomDetailPage/components/roomNavBar/RoomNavBar"; import useAuthStore from "@/store/authStore"; -const RoomDetail = () => { - const { productId } = useParams(); - - if (!productId) throw new Error("존재하지 않는 roomId 입니다."); - - const isLoggedIn = useAuthStore((state) => state.isLoggedIn); +interface RoomDetailViewProps { + roomData: RoomData; + discountRate: string; + productId: string; +} - const { data } = useRoomQuery(productId, isLoggedIn); - const { rawData, discountRate } = data; +const RoomDetailView = ({ + roomData, + discountRate, + productId, +}: RoomDetailViewProps) => { const { handleToast } = useToastConfig(); useEffect(() => { - if (rawData.isSeller) { + if (roomData.isSeller) { handleToast(false, ["내가 판매 중인 상품입니다"]); } // eslint-disable-next-line react-hooks/exhaustive-deps - }, [rawData.isSeller]); + }, [roomData.isSeller]); return ( - - + - - + + ); }; +const RoomDetail = () => { + const { productId } = useParams(); + + if (!productId) throw new Error("존재하지 않는 roomId 입니다."); + + const isLoggedIn = useAuthStore((state) => state.isLoggedIn); + const { data } = useRoomQuery(productId, isLoggedIn); + const { rawData, discountRate } = data; + + const amenities = [ + rawData.roomTheme.parkingZone && "주차장", + rawData.roomTheme.breakfast && "조식", + rawData.roomTheme.pool && "수영장", + rawData.roomTheme.oceanView && "오션뷰", + ].filter(Boolean); + + const schemaData = { + "@type": "Hotel", + name: rawData.hotelName, + image: rawData.hotelImageUrlList, + address: { + "@type": "PostalAddress", + streetAddress: rawData.hotelAddress, + addressCountry: "KR", + }, + starRating: { + "@type": "Rating", + ratingValue: rawData.hotelLevel, + }, + aggregateRating: { + "@type": "AggregateRating", + ratingValue: rawData.roomAllRating, + bestRating: "5", + worstRating: "1", + }, + amenityFeature: amenities.map((amenity) => ({ + "@type": "LocationFeatureSpecification", + name: amenity, + })), + url: rawData.hotelInfoUrl, + offers: { + "@type": "Offer", + name: rawData.roomName, + price: rawData.sellingPrice, + priceCurrency: "KRW", + availability: rawData.saleStatus + ? "https://schema.org/InStock" + : "https://schema.org/OutOfStock", + validFrom: rawData.checkIn, + validThrough: rawData.checkOut, + priceValidUntil: rawData.checkOut, + }, + containsPlace: { + "@type": "HotelRoom", + name: rawData.roomName, + occupancy: { + "@type": "QuantitativeValue", + minValue: rawData.standardPeople, + maxValue: rawData.maxPeople, + }, + bed: { + "@type": "BedDetails", + typeOfBed: rawData.bedType, + }, + amenityFeature: [ + { + "@type": "LocationFeatureSpecification", + name: rawData.facilityInformation, + }, + ], + }, + }; + + return ( + <> + + + + ); +}; + export default RoomDetail; From 2e044f6d42393bcedc9e0ad00943e2a2b95e4af1 Mon Sep 17 00:00:00 2001 From: im-na0 <139189221+im-na0@users.noreply.github.com> Date: Fri, 12 Jul 2024 19:07:31 +0900 Subject: [PATCH 15/23] =?UTF-8?q?feat:=20=EC=84=A4=EC=A0=95=20=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=20json-ld=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/myPage/setting/Setting.tsx | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/src/pages/myPage/setting/Setting.tsx b/src/pages/myPage/setting/Setting.tsx index 9584eaef..b9bc9992 100644 --- a/src/pages/myPage/setting/Setting.tsx +++ b/src/pages/myPage/setting/Setting.tsx @@ -2,12 +2,25 @@ import * as S from "./Setting.style"; import Info from "../info/Info"; import Manage from "../manage/Manage"; +import { HelmetTag } from "@/components/Helmet/Helmet"; + const Setting = () => { + const schemaData = { + "@type": "WebPage", + mainEntityOfPage: { + "@type": "WebPage", + "@id": `${location.origin}${location.pathname}}`, + }, + }; + return ( - - - - + <> + + + + + + ); }; From 321c3bb3560a1d58ad3656ef9a7d8e14132e0640 Mon Sep 17 00:00:00 2001 From: im-na0 <139189221+im-na0@users.noreply.github.com> Date: Fri, 12 Jul 2024 19:07:46 +0900 Subject: [PATCH 16/23] =?UTF-8?q?feat:=20=EA=B5=AC=EB=A7=A4=EB=82=B4?= =?UTF-8?q?=EC=97=AD=20=ED=8E=98=EC=9D=B4=EC=A7=80=20json-ld=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../purchaseDetailPage/PurchaseDetail.tsx | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/pages/purchaseDetailPage/PurchaseDetail.tsx b/src/pages/purchaseDetailPage/PurchaseDetail.tsx index 5574c512..96cf823b 100644 --- a/src/pages/purchaseDetailPage/PurchaseDetail.tsx +++ b/src/pages/purchaseDetailPage/PurchaseDetail.tsx @@ -5,12 +5,13 @@ import { useNavigate, useSearchParams } from "react-router-dom"; import * as S from "./PurchaseDetail.style"; import { fetchPurchaseDetail } from "../../apis/fetchPurchaseDetail"; +import { HelmetTag } from "@/components/Helmet/Helmet"; import ProgressiveImg from "@/components/progressiveImg/ProgressiveImg"; import { PATH } from "@/constants/path"; import { IPurchaseData } from "@/types/purchaseDetail"; import { formatDateString } from "@/utils/dateFormatter"; -const PurchaseDetail = () => { +const PurchaseDetailView = () => { const [searchParams] = useSearchParams(); const id = searchParams.get("id"); if (!id) throw new Error("존재하지 않는 roomId 입니다."); @@ -124,4 +125,21 @@ const PurchaseDetail = () => { ); }; +const PurchaseDetail = () => { + const schemaData = { + "@type": "WebPage", + mainEntityOfPage: { + "@type": "WebPage", + "@id": `${location.origin}${location.pathname}}`, + }, + }; + + return ( + <> + + + + ); +}; + export default PurchaseDetail; From f0de59effcecc0617d4009961217a7d1ebccdb84 Mon Sep 17 00:00:00 2001 From: im-na0 <139189221+im-na0@users.noreply.github.com> Date: Fri, 12 Jul 2024 19:07:56 +0900 Subject: [PATCH 17/23] =?UTF-8?q?feat:=20=EB=B9=84=EB=B0=80=EB=B2=88?= =?UTF-8?q?=ED=98=B8=20=EB=A6=AC=EC=85=8B=20=ED=8E=98=EC=9D=B4=EC=A7=80=20?= =?UTF-8?q?json-ld=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/passwordResetPage/PasswordReset.tsx | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/src/pages/passwordResetPage/PasswordReset.tsx b/src/pages/passwordResetPage/PasswordReset.tsx index 87224bc7..f928f458 100644 --- a/src/pages/passwordResetPage/PasswordReset.tsx +++ b/src/pages/passwordResetPage/PasswordReset.tsx @@ -4,7 +4,10 @@ import FieldValues from "./components/fieldValues/FieldValues"; import PasswordResetSubmitBtn from "./components/passwordResetSubmitBtn.tsx/PasswordResetSubmitBtn"; import * as S from "./PasswordReset.style"; -const PasswordReset = () => { +import { HelmetTag } from "@/components/Helmet/Helmet"; +import { PATH } from "@/constants/path"; + +const PasswordResetView = () => { const method = useForm({ mode: "onChange", shouldUnregister: false, @@ -24,4 +27,21 @@ const PasswordReset = () => { ); }; +const PasswordReset = () => { + const schemaData = { + "@type": "WebPage", + mainEntityOfPage: { + "@type": "WebPage", + "@id": `${location.origin}${PATH.PASSWORD_RESET}`, + }, + }; + + return ( + <> + + + + ); +}; + export default PasswordReset; From a2ad15415e6393d807a18072adea10cf66d5024d Mon Sep 17 00:00:00 2001 From: im-na0 <139189221+im-na0@users.noreply.github.com> Date: Fri, 12 Jul 2024 19:08:05 +0900 Subject: [PATCH 18/23] =?UTF-8?q?feat:=20=EB=A7=88=EC=9D=B4=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=20json-ld=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/myPage/MyPage.tsx | 48 +++++++++++++++++++++++-------------- 1 file changed, 30 insertions(+), 18 deletions(-) diff --git a/src/pages/myPage/MyPage.tsx b/src/pages/myPage/MyPage.tsx index 94fcfa20..c7d1beb7 100644 --- a/src/pages/myPage/MyPage.tsx +++ b/src/pages/myPage/MyPage.tsx @@ -3,6 +3,7 @@ import { Outlet, useNavigate } from "react-router-dom"; import MyPageNav from "./components/myPageNav/MyPageNav"; import * as S from "./MyPage.style"; +import { HelmetTag } from "@/components/Helmet/Helmet"; import { PATH } from "@/constants/path"; import { useLoadUserInfo } from "@/hooks/common/useLoadUserInfo"; import useAuthStore from "@/store/authStore"; @@ -17,25 +18,36 @@ const MyPage = () => { navigate(PATH.YANOLJA_ACCOUNT); }; + const schemaData = { + "@type": "WebPage", + mainEntityOfPage: { + "@type": "WebPage", + "@id": `${location.origin}${location.pathname}}`, + }, + }; + return ( - - - {isLoggedIn && userInfo ? ( -

{userInfo.email} 님

- ) : ( -

로그인 후 판매글을 작성해보세요

- )} - {!isLoggedIn ? ( - - ) : isConnected ? ( - 야놀자와 연동된 계정입니다 - ) : ( - - )} -
- - -
+ <> + + + + {isLoggedIn && userInfo ? ( +

{userInfo.email} 님

+ ) : ( +

로그인 후 판매글을 작성해보세요

+ )} + {!isLoggedIn ? ( + + ) : isConnected ? ( + 야놀자와 연동된 계정입니다 + ) : ( + + )} +
+ + +
+ ); }; From 2279d5bd5ca9ce61b0fa76b786d266658dbdbfb7 Mon Sep 17 00:00:00 2001 From: im-na0 <139189221+im-na0@users.noreply.github.com> Date: Fri, 12 Jul 2024 19:09:15 +0900 Subject: [PATCH 19/23] =?UTF-8?q?refactor:=20=EB=A9=94=EC=9D=B8=20?= =?UTF-8?q?=EC=83=81=EC=84=B8=20=ED=8E=98=EC=9D=B4=EC=A7=80=20=EB=A6=AC?= =?UTF-8?q?=ED=8C=A9=ED=84=B0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * search 무한 쿼리 hooks로 분리 * fetcher - view 컴포넌트 분리 * json-ld 추가 --- src/pages/mainDetailPage/MainDetail.tsx | 194 +++++++++++++++--------- 1 file changed, 121 insertions(+), 73 deletions(-) diff --git a/src/pages/mainDetailPage/MainDetail.tsx b/src/pages/mainDetailPage/MainDetail.tsx index 312f0edb..33fccd1b 100644 --- a/src/pages/mainDetailPage/MainDetail.tsx +++ b/src/pages/mainDetailPage/MainDetail.tsx @@ -1,73 +1,55 @@ -import { useInfiniteQuery } from "@tanstack/react-query"; -import { useEffect, useState } from "react"; +import type { InfiniteData } from "@tanstack/react-query"; + +import React, { useState, useEffect } from "react"; import MainTheme from "./components/MainTheme/MainTheme"; import RegionButton from "./components/RegionButton/RegionButton"; import * as S from "./MainDetail.style"; -import { fetchSearchList } from "@/apis/fetchSeachList"; import ArrowIcon from "@/assets/icons/ic_arrow.svg?react"; +import { HelmetTag } from "@/components/Helmet/Helmet"; +import { useInfiniteSearchQuery } from "@/hooks/api/useSearchQuery"; import { useIntersectionObserver } from "@/hooks/common/useIntersectionObserver"; import SearchItem from "@/pages/searchPage/components/searchItem/SearchItem"; import { ISearchList } from "@/types/searchList"; -const MainDetail = () => { - const pageSize = 10; - const [selectedRegion, setSelectedRegion] = useState("전체"); - const [scrollPosition, setScrollPosition] = useState(0); +interface SearchPage { + content: ISearchList[]; + empty: boolean; + first: boolean; + last: boolean; + number: number; + numberOfElements: number; + size: number; + totalElements: number; + totalPages: number; +} + +interface MainDetailViewProps { + data: InfiniteData; + fetchNextPage: () => void; + isLoading: boolean; + hasNextPage: boolean | undefined; + selectedRegion: string; + setSelectedRegion: React.Dispatch>; +} +const MainDetailView = ({ + data, + fetchNextPage, + isLoading, + hasNextPage, + selectedRegion, + setSelectedRegion, +}: MainDetailViewProps) => { const [isTopButtonVisible, setIsTopButtonVisible] = useState(false); - const searchInfo = { - brunch: null, - checkIn: null, - checkOut: null, - location: selectedRegion === "전체" ? null : selectedRegion, - oceanView: null, - pool: null, - quantityPeople: 0, - sorted: null, - }; - const { data, fetchNextPage, isLoading, hasNextPage } = useInfiniteQuery({ - queryKey: [ - "searchItems", - searchInfo.location, - searchInfo.checkIn, - searchInfo.checkOut, - searchInfo.quantityPeople, - searchInfo.sorted, - searchInfo.brunch, - searchInfo.pool, - searchInfo.oceanView, - ], - queryFn: ({ pageParam = 0 }) => - fetchSearchList( - searchInfo.location, - searchInfo.checkIn, - searchInfo.checkOut, - searchInfo.quantityPeople, - searchInfo.sorted, - searchInfo.brunch, - searchInfo.pool, - searchInfo.oceanView, - pageParam, - pageSize, - ), - refetchOnMount: false, - refetchOnWindowFocus: false, - initialPageParam: 0, - getNextPageParam: (lastPage) => { - const lastData = lastPage?.content; - return lastData && lastData.length === pageSize - ? lastPage?.number + 1 - : undefined; - }, - }); const handleIntersect = (isIntersecting: boolean) => { if (isIntersecting && hasNextPage) { fetchNextPage(); } }; + const { ref } = useIntersectionObserver({ onChange: handleIntersect, threshold: 0.5, @@ -75,23 +57,18 @@ const MainDetail = () => { const handleScroll = () => { const currentPosition = window.scrollY; - setScrollPosition(currentPosition); setIsTopButtonVisible(currentPosition > 500); }; useEffect(() => { window.addEventListener("scroll", handleScroll); - return () => { - window.removeEventListener("scroll", handleScroll); - }; - }, [scrollPosition]); - - const MoveToTop = () => { - window.scroll({ - top: 0, - behavior: "smooth", - }); + return () => window.removeEventListener("scroll", handleScroll); + }, []); + + const moveToTop = () => { + window.scroll({ top: 0, behavior: "smooth" }); }; + return ( @@ -99,9 +76,8 @@ const MainDetail = () => { selectedRegion={selectedRegion} setSelectedRegion={setSelectedRegion} /> - - {!isLoading && data && !data?.pages?.[0]?.content?.length && ( + {!isLoading && data && !data.pages[0]?.content.length && ( 검색 조건에 맞는 호텔이 없어요 @@ -110,19 +86,17 @@ const MainDetail = () => { )} - {data && - data.pages?.length > 0 && - data.pages.map((page) => - page?.content.map((item: ISearchList) => ( - - )), - )} + {data?.pages.map((page) => + page?.content.map((item: ISearchList) => ( + + )), + )}
@@ -131,4 +105,78 @@ const MainDetail = () => { ); }; + +const MainDetail: React.FC = () => { + const [selectedRegion, setSelectedRegion] = useState("전체"); + + const searchInfo = { + brunch: null, + checkIn: null, + checkOut: null, + location: selectedRegion === "전체" ? null : selectedRegion, + oceanView: null, + pool: null, + quantityPeople: 0, + sorted: null, + }; + + const { data, fetchNextPage, isLoading, hasNextPage } = + useInfiniteSearchQuery(searchInfo); + + const schemaData = { + "@type": "ItemList", + name: "황금 연휴 호캉스 추천", + description: "성수기 숙소 예약 놓쳤다면? 황금연휴 호캉스 추천", + itemListElement: + data?.pages.flatMap((page, pageIndex) => + page?.content.map((item: ISearchList, index: number) => ({ + "@type": "ListItem", + position: pageIndex * 10 + index + 1, + item: { + "@type": "Hotel", + name: item.name, + image: item.imageUrl, + offers: { + "@type": "Offer", + price: item.salePrice, + priceCurrency: "KRW", + priceValidUntil: item.checkOut, + availability: "https://schema.org/InStock", + }, + checkinTime: item.checkIn, + checkoutTime: item.checkOut, + starRating: { + "@type": "Rating", + ratingValue: item.hotelRate, + }, + aggregateRating: { + "@type": "AggregateRating", + ratingValue: item.reviewRate, + bestRating: "5", + worstRating: "1", + }, + }, + })), + ) || [], + }; + + return ( + <> + + + + ); +}; + export default MainDetail; From 26d5cf1d017febffb8327b95af879bc7fffc08d2 Mon Sep 17 00:00:00 2001 From: im-na0 <139189221+im-na0@users.noreply.github.com> Date: Fri, 12 Jul 2024 19:09:42 +0900 Subject: [PATCH 20/23] =?UTF-8?q?refactor:=20=EA=B2=80=EC=83=89=20?= =?UTF-8?q?=EB=AC=B4=ED=95=9C=20=EC=BF=BC=EB=A6=AC=20Hooks=20=EB=B6=84?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hooks/api/useSearchQuery.ts | 45 +++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 src/hooks/api/useSearchQuery.ts diff --git a/src/hooks/api/useSearchQuery.ts b/src/hooks/api/useSearchQuery.ts new file mode 100644 index 00000000..ab9ee45f --- /dev/null +++ b/src/hooks/api/useSearchQuery.ts @@ -0,0 +1,45 @@ +import { useSuspenseInfiniteQuery } from "@tanstack/react-query"; + +import type { ISearchFilterInfo } from "@/types/searchFilterInfo"; + +import { fetchSearchList } from "@/apis/fetchSeachList"; + +export const useInfiniteSearchQuery = (searchInfo: ISearchFilterInfo) => { + const pageSize = 10; + + return useSuspenseInfiniteQuery({ + queryKey: [ + "searchItems", + searchInfo.location, + searchInfo.checkIn, + searchInfo.checkOut, + searchInfo.quantityPeople, + searchInfo.sorted, + searchInfo.brunch, + searchInfo.pool, + searchInfo.oceanView, + ], + queryFn: ({ pageParam = 0 }) => + fetchSearchList( + searchInfo.location, + searchInfo.checkIn, + searchInfo.checkOut, + searchInfo.quantityPeople, + searchInfo.sorted, + searchInfo.brunch, + searchInfo.pool, + searchInfo.oceanView, + pageParam, + pageSize, + ), + refetchOnMount: false, + refetchOnWindowFocus: false, + initialPageParam: 0, + getNextPageParam: (lastPage) => { + const lastData = lastPage?.content; + return lastData && lastData.length === pageSize + ? lastPage?.number + 1 + : undefined; + }, + }); +}; From 06245a1d102d54979a9731abf3c43b14a5fa7a15 Mon Sep 17 00:00:00 2001 From: im-na0 <139189221+im-na0@users.noreply.github.com> Date: Fri, 12 Jul 2024 19:10:11 +0900 Subject: [PATCH 21/23] =?UTF-8?q?feat:=20=EC=95=BC=EB=86=80=EC=9E=90=20?= =?UTF-8?q?=EC=9D=B8=EC=A6=9D=20=ED=8E=98=EC=9D=B4=EC=A7=80=20json-ld=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/connectYanoljaPage/IntroPage/IntroPage.tsx | 8 ++++---- src/pages/connectYanoljaPage/successPage/SuccessPage.tsx | 4 ++-- .../verificationPage/VerificationPage.tsx | 7 ++++--- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/pages/connectYanoljaPage/IntroPage/IntroPage.tsx b/src/pages/connectYanoljaPage/IntroPage/IntroPage.tsx index 022d5726..e5bc4cda 100644 --- a/src/pages/connectYanoljaPage/IntroPage/IntroPage.tsx +++ b/src/pages/connectYanoljaPage/IntroPage/IntroPage.tsx @@ -1,12 +1,12 @@ -import XIcon from "@/assets/icons/ic_x.png"; -import PercentHotelLogo from "@/assets/logos/Percent-hotel_logo_b.png"; -import YanoljaLogo from "@/assets/logos/Yanolja_CI.png"; -import { PATH } from "@/constants/path"; import { useNavigate } from "react-router-dom"; import * as S from "./IntroPage.style.ts"; +import XIcon from "@/assets/icons/ic_x.png"; +import PercentHotelLogo from "@/assets/logos/Percent-hotel_logo_b.png"; +import YanoljaLogo from "@/assets/logos/Yanolja_CI.png"; import ProgressiveImg from "@/components/progressiveImg/ProgressiveImg.tsx"; +import { PATH } from "@/constants/path"; const IntroPage = () => { const navigate = useNavigate(); diff --git a/src/pages/connectYanoljaPage/successPage/SuccessPage.tsx b/src/pages/connectYanoljaPage/successPage/SuccessPage.tsx index cccf79c9..7af6789f 100644 --- a/src/pages/connectYanoljaPage/successPage/SuccessPage.tsx +++ b/src/pages/connectYanoljaPage/successPage/SuccessPage.tsx @@ -1,11 +1,11 @@ -import PercentHotelLogo from "@/assets/logos/Percent-hotel_logo_b.png"; -import { PATH } from "@/constants/path"; import { useEffect } from "react"; import { useLocation, useNavigate } from "react-router-dom"; import * as S from "./SuccessPage.style.ts"; +import PercentHotelLogo from "@/assets/logos/Percent-hotel_logo_b.png"; import Success from "@/components/lottie/success/Success"; +import { PATH } from "@/constants/path"; const SuccessPage = () => { const navigate = useNavigate(); diff --git a/src/pages/connectYanoljaPage/verificationPage/VerificationPage.tsx b/src/pages/connectYanoljaPage/verificationPage/VerificationPage.tsx index ed00151c..362e5acd 100644 --- a/src/pages/connectYanoljaPage/verificationPage/VerificationPage.tsx +++ b/src/pages/connectYanoljaPage/verificationPage/VerificationPage.tsx @@ -1,10 +1,11 @@ +import { FormProvider, useForm } from "react-hook-form"; + +import * as S from "./VerificationPage.style"; + import YanoljaLogo from "@/assets/logos/Yanolja_CI.png"; import SubmitButton from "@/pages/connectYanoljaPage/verificationPage/components/submitButton/SubmitButton"; import TermsAgreementSection from "@/pages/connectYanoljaPage/verificationPage/components/termsAgreementSection/TermsAgreementSection"; import VerificationSection from "@/pages/connectYanoljaPage/verificationPage/components/verificationSection/VerificationSection"; -import { FormProvider, useForm } from "react-hook-form"; - -import * as S from "./VerificationPage.style"; const VerificationPage = () => { const methods = useForm({ From 341ec999f816883ddc19f82b2e577d3ff4995703 Mon Sep 17 00:00:00 2001 From: im-na0 <139189221+im-na0@users.noreply.github.com> Date: Fri, 12 Jul 2024 19:10:19 +0900 Subject: [PATCH 22/23] =?UTF-8?q?feat:=20=EC=95=8C=EB=A6=BC=20=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=20json-ld=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/alarmPage/AlarmPage.tsx | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/pages/alarmPage/AlarmPage.tsx b/src/pages/alarmPage/AlarmPage.tsx index b33405ec..56d61eca 100644 --- a/src/pages/alarmPage/AlarmPage.tsx +++ b/src/pages/alarmPage/AlarmPage.tsx @@ -8,8 +8,9 @@ import { fetchUserInfo } from "@/apis/fetchUserInfo"; import NoResult from "@/components/noResult/NoResult"; import { PATH } from "@/constants/path"; import { isMobileSafari } from "@/utils/isMobileSafari"; +import { HelmetTag } from "@/components/Helmet/Helmet"; -const AlarmPage = () => { +const AlarView = () => { const mobileSafari = isMobileSafari(); const { data: userData } = useSuspenseQuery({ @@ -66,4 +67,21 @@ const AlarmPage = () => { } }; +const AlarmPage = () => { + const schemaData = { + "@type": "WebPage", + mainEntityOfPage: { + "@type": "WebPage", + "@id": `${location.origin}${location.pathname}}`, + }, + }; + + return ( + <> + + + + ); +}; + export default AlarmPage; From 6e47f605439a88bdf8d903bee75f116424e638af Mon Sep 17 00:00:00 2001 From: im-na0 <139189221+im-na0@users.noreply.github.com> Date: Fri, 12 Jul 2024 19:13:07 +0900 Subject: [PATCH 23/23] =?UTF-8?q?refactor:=20carousel=20height=20props=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/carousel/Carousel.style.ts | 8 +------- src/components/carousel/Carousel.tsx | 8 ++++---- src/pages/homePage/itemCarousel/ItemCarousel.tsx | 7 ++++--- .../homePage/weekendCarousel/WeekendCarousel.style.ts | 9 +-------- src/pages/homePage/weekendCarousel/WeekendCarousel.tsx | 4 +--- 5 files changed, 11 insertions(+), 25 deletions(-) diff --git a/src/components/carousel/Carousel.style.ts b/src/components/carousel/Carousel.style.ts index 3595b001..d4fe0472 100644 --- a/src/components/carousel/Carousel.style.ts +++ b/src/components/carousel/Carousel.style.ts @@ -1,16 +1,10 @@ import { PiCaretLeftBold, PiCaretRightBold } from "react-icons/pi"; import styled, { css } from "styled-components"; -export const CarouselContainer = styled.div<{ - $height: number; -}>` +export const CarouselContainer = styled.div` position: relative; - min-height: ${(props) => `${props.$height}px`}; - height: ${(props) => `${props.$height}px`}; - overflow: hidden; - cursor: grab; touch-action: pan-y; `; diff --git a/src/components/carousel/Carousel.tsx b/src/components/carousel/Carousel.tsx index f06376c2..f5007000 100644 --- a/src/components/carousel/Carousel.tsx +++ b/src/components/carousel/Carousel.tsx @@ -1,9 +1,9 @@ -import { useCarousel } from "@/hooks/common/useCarousel"; -import { useCarouselSize } from "@/hooks/common/useCarouselSize"; - import * as S from "./Carousel.style.ts"; import ProgressiveImg from "../progressiveImg/ProgressiveImg.tsx"; +import { useCarousel } from "@/hooks/common/useCarousel"; +import { useCarouselSize } from "@/hooks/common/useCarouselSize"; + interface CarouselProps { images: string[]; height?: number; @@ -41,7 +41,7 @@ const Carousel = ({ }); console.log("currentIndex", currentIndex); return ( - + ` +export const CarouselContainer = styled.div` position: relative; - width: 100%; - min-height: ${(props) => `${props.$height}px`}; - height: ${(props) => `${props.$height}px`}; background-color: white; display: flex; align-items: center; gap: 8px; - - cursor: grab; touch-action: pan-y; `; diff --git a/src/pages/homePage/weekendCarousel/WeekendCarousel.tsx b/src/pages/homePage/weekendCarousel/WeekendCarousel.tsx index 3d23edb4..dd1a02ad 100644 --- a/src/pages/homePage/weekendCarousel/WeekendCarousel.tsx +++ b/src/pages/homePage/weekendCarousel/WeekendCarousel.tsx @@ -11,7 +11,6 @@ interface CarouselProps { onChangeLocale: React.Dispatch< React.SetStateAction<[number, string, LocaleItem[]]> >; - height?: number; arrows?: boolean; infinite?: boolean; draggable?: boolean; @@ -20,7 +19,6 @@ interface CarouselProps { const WeekendCarousel = ({ weekendHotels, - height = 300, arrows = true, infinite = false, draggable = false, @@ -41,7 +39,7 @@ const WeekendCarousel = ({ }); return ( - +