22
33import Image from 'next/image' ;
44import { useEffect , useState } from 'react' ;
5- import { Map , MapMarker , useKakaoLoader } from 'react-kakao-maps-sdk' ;
5+ import { CustomOverlayMap , Map , useKakaoLoader } from 'react-kakao-maps-sdk' ;
66
77import { ErrorMessage } from '@/shared/components/error-message/error-message' ;
8- import LoadingSpinner from '@/shared/components/loading-spinner/loading-spinner ' ;
8+ import { DetailKakaoMapSkeleton } from '@/shared/components/skeleton/skeleton ' ;
99
1010//현재 로컬에 대한 키를 발급 받은거라, 머지할때는 배포 주소로 다시 받아야 함
1111const KakaoMap = ( { address } : { address : string | undefined } ) => {
12- const [ coordinates , setCoordinates ] = useState <
13- { lat : number ; lng : number } | { x : number ; y : number }
14- > ( ) ;
12+ const [ placeName , setPlaceName ] = useState < string | null > ( null ) ;
13+ const [ coordinates , setCoordinates ] = useState < {
14+ lat : number ;
15+ lng : number ;
16+ } > ( ) ;
1517
1618 const [ loading , error ] = useKakaoLoader ( {
1719 appkey : process . env . NEXT_PUBLIC_KAKAO ! ,
@@ -42,16 +44,23 @@ const KakaoMap = ({ address }: { address: string | undefined }) => {
4244 const geocoder = new kakao . maps . services . Geocoder ( ) ;
4345 geocoder . addressSearch ( address , ( result , status ) => {
4446 if ( status === kakao . maps . services . Status . OK ) {
45- const { x, y } = result [ 0 ] ;
47+ const { x, y, road_address , address_name } = result [ 0 ] ;
4648 setCoordinates ( { lat : parseFloat ( y ) , lng : parseFloat ( x ) } ) ;
49+
50+ // 건물 이름 우선, 없으면 전체 주소 사용
51+ if ( road_address ?. building_name ) {
52+ setPlaceName ( road_address . building_name ) ;
53+ } else {
54+ setPlaceName ( address_name ) ;
55+ }
4756 }
4857 } ) ;
4958 } ;
5059
5160 tryGeocode ( ) ;
5261 } , [ loading , error , address ] ) ;
5362
54- if ( loading ) return < LoadingSpinner /> ;
63+ if ( loading ) return < DetailKakaoMapSkeleton /> ;
5564 if ( error ) return < ErrorMessage className = "h-full" /> ;
5665 if ( coordinates ) {
5766 return (
@@ -61,22 +70,27 @@ const KakaoMap = ({ address }: { address: string | undefined }) => {
6170 center = { coordinates }
6271 style = { { width : '100%' , height : '100%' } }
6372 >
64- < MapMarker position = { coordinates } > </ MapMarker >
73+ < CustomOverlayMap position = { coordinates } >
74+ < div className = "border-sub-300 flex-center relative gap-[0.6rem] rounded-full border-2 bg-white p-3 text-[1.4rem] font-semibold text-gray-950 shadow-lg" >
75+ < Image
76+ src = { '/images/icons/profile-default.svg' }
77+ alt = "map-icon"
78+ width = { 30 }
79+ height = { 30 }
80+ className = "shrink-0"
81+ />
82+ < p className = "shrink-0 pr-[0.2rem]" > { placeName } </ p >
83+ </ div >
84+ </ CustomOverlayMap >
6585 </ Map >
6686 </ >
6787 ) ;
6888 } else {
6989 return (
70- < div className = "flex-center inset-0 flex-col gap-[1rem] md:gap-[4rem] " >
71- < div className = "mt-[0.6rem] text-[1.4rem] text-gray-500 md:mt-[8rem] md: text-[1.6rem] lg:mt-[12rem] lg:text-3xl " >
72- 해당 주소를 찾을 수 없습니다
90+ < div className = "flex-center size-full " >
91+ < div className = "text-[1.4rem] text-gray-500 md:text-[1.8rem] " >
92+ 지도를 찾고 있습니다.
7393 </ div >
74- < Image
75- src = "/images/sad-laptop.svg"
76- width = { 200 }
77- height = { 100 }
78- alt = "failed-load-map"
79- />
8094 </ div >
8195 ) ;
8296 }
0 commit comments