diff --git a/src/api/detail.ts b/src/api/detail.ts index d36f3217..ca416352 100644 --- a/src/api/detail.ts +++ b/src/api/detail.ts @@ -21,12 +21,19 @@ export const getReviewsRating = async (id: number, typeId: number, title: string }; export const getIsWish = async (id: number) => { - const response = await axios.get(`/api/wishes/${id}`, { - withCredentials: true, - }); - console.log(response.data); + try { + const response = await axios.get(`/api/wishes/${id}`, { + withCredentials: true, + }); + console.log(response.data); - return response.data; + return response.data; + } catch (error) { + if (axios.isAxiosError(error)) { + console.log(error); + return error.response; + } + } }; export const getPlacesNearby = async ( diff --git a/src/components/Detail/BottomFixedBtn/RegistrationSlide/RegistrationTripSpace/RegistrationTripSpace.tsx b/src/components/Detail/BottomFixedBtn/RegistrationSlide/RegistrationTripSpace/RegistrationTripSpace.tsx index 8a8615ef..587e4906 100644 --- a/src/components/Detail/BottomFixedBtn/RegistrationSlide/RegistrationTripSpace/RegistrationTripSpace.tsx +++ b/src/components/Detail/BottomFixedBtn/RegistrationSlide/RegistrationTripSpace/RegistrationTripSpace.tsx @@ -30,7 +30,9 @@ function RegistrationTripSpace({tripSelectedId, setTripSelectedId, spaces}: Regi
{ - setIsDropped(!isDropped); + if (spaces.length > 0) { + setIsDropped(!isDropped); + } }} > {isSelected ? ( diff --git a/src/components/Detail/Contents/Information/BasicInformation/MapInDetail/MapInDetail.tsx b/src/components/Detail/Contents/Information/BasicInformation/MapInDetail/MapInDetail.tsx index 696c5eae..b349112b 100644 --- a/src/components/Detail/Contents/Information/BasicInformation/MapInDetail/MapInDetail.tsx +++ b/src/components/Detail/Contents/Information/BasicInformation/MapInDetail/MapInDetail.tsx @@ -6,6 +6,8 @@ import {CustomOverlayMap, Map} from 'react-kakao-maps-sdk'; import styles from './MapInDetail.module.scss'; import BigHomeMarker from '@/assets/homeIcons/map/house_big.svg?react'; +import BigFlagMarker from '@/assets/homeIcons/map/flag_big.svg?react'; +import BigRestaurantMarker from '@/assets/homeIcons/map/restaurant_big.svg?react'; import MapModal from '../MapModal/MapModal'; @@ -52,7 +54,9 @@ function MapInDetail({lat, lng, title, thumbnail, id, contentTypeId, areaCode}: onDoubleClick={handleMapDoubleClick} > - + {contentTypeId === 32 && } + {contentTypeId === 39 && } + {contentTypeId !== 39 && contentTypeId !== 32 && } - + {contentTypeId === 32 && } + {contentTypeId === 39 && } + {contentTypeId !== 39 && contentTypeId !== 32 && } diff --git a/src/components/Detail/Contents/Review/Review.tsx b/src/components/Detail/Contents/Review/Review.tsx index e4891df4..d1b1a252 100644 --- a/src/components/Detail/Contents/Review/Review.tsx +++ b/src/components/Detail/Contents/Review/Review.tsx @@ -8,6 +8,11 @@ import ReviewImageSlider from './ReviewImageSlider/ReviewImageSlider'; import {ReviewPropsTypes} from '@/types/detail'; function Review({name, isGoogle, rating, visitedAt, content, images, profileImage}: ReviewPropsTypes) { + const changeDateFormat = (visitedAt: string) => { + const arr = visitedAt.split('-'); + return `${arr[0]}년 ${arr[1]}월 방문`; + }; + return (
@@ -20,8 +25,8 @@ function Review({name, isGoogle, rating, visitedAt, content, images, profileImag
- {rating} - {visitedAt} + {rating.toFixed(1)} + {changeDateFormat(visitedAt)}
{content}
{images && } diff --git a/src/components/Detail/Main/Title/Title.tsx b/src/components/Detail/Main/Title/Title.tsx index 957156b3..eaf4584c 100644 --- a/src/components/Detail/Main/Title/Title.tsx +++ b/src/components/Detail/Main/Title/Title.tsx @@ -7,6 +7,7 @@ import CustomToast from '@/components/CustomToast/CustomToast'; import WishBtn from '@/components/WishBtn/WishBtn'; import {translateCategoryToStr} from '@/utils/translateSearchData'; +import {useLocation} from 'react-router-dom'; interface TitleProps { id: number; @@ -21,6 +22,19 @@ function Title({id, contentTypeId, title, rating, reviewsCount}: TitleProps) { const categoryStr = translateCategoryToStr(contentTypeId); + // 링크 복사 + const location = useLocation(); + + const handleCopyClipBoard = async () => { + try { + console.log(location); + await navigator.clipboard.writeText(`tripvote.site${location.pathname}`); + showToast('링크가 복사되었습니다.'); + } catch (err) { + console.log(err); + } + }; + return (

{title}

@@ -32,13 +46,7 @@ function Title({id, contentTypeId, title, rating, reviewsCount}: TitleProps) {
- { - showToast('링크가 복사되었습니다.'); - }} - /> + handleCopyClipBoard()} />
); diff --git a/src/components/Detail/Navigation/MeatballBottomSlide/MeatballBottomSlide.tsx b/src/components/Detail/Navigation/MeatballBottomSlide/MeatballBottomSlide.tsx index 4995e769..97ab009b 100644 --- a/src/components/Detail/Navigation/MeatballBottomSlide/MeatballBottomSlide.tsx +++ b/src/components/Detail/Navigation/MeatballBottomSlide/MeatballBottomSlide.tsx @@ -17,6 +17,7 @@ import ReviewBottomSlide from '../../Contents/ReviewBottomSlide/ReviewBottomSlid import {NavigationMeatballProps} from '@/types/detail'; import {useDeleteWishes, usePostWishes} from '@/hooks/Detail/useWish'; +import {useLocation} from 'react-router-dom'; const MeatballBottomSlide = ({onBottomSlideOpen, onClose, id, contentTypeId, title}: NavigationMeatballProps) => { const [isWish, setIsWish] = useRecoilState(IsHeartValued); @@ -61,6 +62,19 @@ const MeatballBottomSlide = ({onBottomSlideOpen, onClose, id, contentTypeId, tit } }; + // 링크 복사 + const location = useLocation(); + + const handleCopyClipBoard = async () => { + try { + console.log(location); + await navigator.clipboard.writeText(`tripvote.site${location.pathname}`); + showToast('링크가 복사되었습니다.'); + } catch (err) { + console.log(err); + } + }; + return (
+ + + + ); } diff --git a/src/hooks/Detail/useReviews.ts b/src/hooks/Detail/useReviews.ts index 999ca5cf..8cbe3cdd 100644 --- a/src/hooks/Detail/useReviews.ts +++ b/src/hooks/Detail/useReviews.ts @@ -7,6 +7,7 @@ export const useGetReviewsRating = (id: number, typeId: number, title: string) = return useSuspenseQuery({ queryKey: ['reviewsRating', id, typeId, title], queryFn: () => getReviewsRating(id, typeId, title), + retry: false, }); }; diff --git a/src/hooks/useDebounce.ts b/src/hooks/useDebounce.ts index 7724e39e..cdc7e8ac 100644 --- a/src/hooks/useDebounce.ts +++ b/src/hooks/useDebounce.ts @@ -15,3 +15,19 @@ export const useDebounce = (value: string, delay: number) => { return debouncedValue; }; + +export const useDebounceBoolean = (value: boolean, delay: number) => { + const [debouncedValue, setDebouncedValue] = useState(value); + + useEffect(() => { + const timer = setTimeout(() => { + setDebouncedValue(value); + }, delay); + + return () => { + clearTimeout(timer); + }; + }, [value, delay]); + + return debouncedValue; +}; diff --git a/src/pages/Detail/Detail.tsx b/src/pages/Detail/Detail.tsx index f2bdfbab..2029d263 100644 --- a/src/pages/Detail/Detail.tsx +++ b/src/pages/Detail/Detail.tsx @@ -38,13 +38,6 @@ function Detail() { data: {data: reviewsRating}, } = useGetReviewsRating(Number(params?.split(' ')[0]), Number(params?.split(' ')[1]), placeInfo.title); - // const reviewsRating = { - // rating: 5.0, - // userRatingCount: 5, - // }; - - console.log(reviewsRating); - console.log(placeInfo); const onBottomSlideOpen = (content: ReactNode, isReview: boolean) => {