Skip to content

Commit

Permalink
๐Ÿ› Fix: ์‚ญ์ œ๋œ ์ฝ”๋“œ ์žฌ์—… feat/#43
Browse files Browse the repository at this point in the history
  • Loading branch information
ryan-g00 committed Dec 4, 2024
1 parent 7d98fa6 commit 9429661
Show file tree
Hide file tree
Showing 2 changed files with 169 additions and 11 deletions.
166 changes: 155 additions & 11 deletions src/components/common/UserLocationMap.jsx
Original file line number Diff line number Diff line change
@@ -1,12 +1,130 @@
import { useKakaoLoader, Map, MapMarker } from 'react-kakao-maps-sdk';
import { useState, useEffect, useRef } from 'react';
import { Map, MapMarker, useKakaoLoader } from 'react-kakao-maps-sdk';
import Remix from './Remix';

const UserLocationMap = () => {
const { kakao } = window;

const UserLocationMap = ({
locationType = 'address',
onLocationSelect = () => {},
}) => {
useKakaoLoader({
appkey: import.meta.env.VITE_KAKAO_APP_KEY,
libraries: ['drawing'],
libraries: ['services'],
});

const defaultCenter = {
lat: 35.183749,
lng: 129.042256,
};

const mapRef = useRef();
const [mapCenter, setMapCenter] = useState(defaultCenter);
const [locationInfo, setLocationInfo] = useState({
administrativeDong: '',
roadAddress: '',
jibunAddress: '',
coordinates: null,
});

useEffect(() => {
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(
(position) => {
setMapCenter({
lat: position.coords.latitude,
lng: position.coords.longitude,
});
},
(error) => {
console.log('์‚ฌ์šฉ์ž ์œ„์น˜๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค:', error);
},
);
}
}, []);

const handleClick = (_, mouseEvent) => {
const latlng = mouseEvent.latLng;
const newCoordinates = {
lat: latlng.getLat(),
lng: latlng.getLng(),
};

if (mapRef.current) {
mapRef.current.panTo(
new kakao.maps.LatLng(newCoordinates.lat, newCoordinates.lng),
);
}

const geocoder = new kakao.maps.services.Geocoder();

if (locationType === 'administrativeDong') {
geocoder.coord2RegionCode(
latlng.getLng(),
latlng.getLat(),
(result, status) => {
if (status === kakao.maps.services.Status.OK) {
const region = result.find(
(item) => item.region_type === 'H',
);

const newLocationInfo = {
administrativeDong: region
? region.address_name
: '',
roadAddress: '',
jibunAddress: '',
coordinates: newCoordinates,
};

setLocationInfo(newLocationInfo);
onLocationSelect?.(newLocationInfo);
}
},
);
} else {
geocoder.coord2Address(
latlng.getLng(),
latlng.getLat(),
(result, status) => {
if (status === kakao.maps.services.Status.OK) {
const newLocationInfo = {
administrativeDong: '',
roadAddress: result[0].road_address
? `๋„๋กœ๋ช…์ฃผ์†Œ: ${result[0].road_address.address_name}`
: '',
jibunAddress: `์ง€๋ฒˆ์ฃผ์†Œ: ${result[0].address.address_name}`,
coordinates: newCoordinates,
};

setLocationInfo(newLocationInfo);
onLocationSelect?.(newLocationInfo);
}
},
);
}
};

const getDisplayText = () => {
if (!locationInfo.coordinates) return '์œ„์น˜๋ฅผ ์ง€๋„์— ํ‘œ์‹œํ•ด ์ฃผ์„ธ์š”.';

if (locationType === 'administrativeDong') {
return locationInfo.administrativeDong || 'ํ–‰์ •๋™์„ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์ค‘...';
} else {
if (!locationInfo.roadAddress && !locationInfo.jibunAddress) {
return '์ฃผ์†Œ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์ค‘...';
}
return (
<div>
{locationInfo.roadAddress && (
<div>{locationInfo.roadAddress}</div>
)}
<div>{locationInfo.jibunAddress}</div>
</div>
);
}
};

return (
<div className="user-location-container">
<div className="section-titlebar">
Expand All @@ -18,25 +136,51 @@ const UserLocationMap = () => {
<div id="user-location-map-container">
<Map
id="user-location-map"
center={{ lat: 35.183749, lng: 129.042256 }}
center={mapCenter}
level={3}
onClick={handleClick}
ref={mapRef}
>
<MapMarker position={{ lat: 35.183749, lng: 129.042256 }}>
<div className="temp-location-marker">๋งˆ์ปค๋‹ค</div>
</MapMarker>
{locationInfo.coordinates && (
<MapMarker position={locationInfo.coordinates}>
<div className="temp-location-marker">
{getDisplayText()}
</div>
</MapMarker>
)}
</Map>
</div>
<div className="map-bottom-content">
<div className="notification-map-content">
<div className="icon-location-area">
<Remix iconName={'map-pin-range-fill'} />
</div>
<span className="map-marker">
๋ชฉ๊ฒฉ ์œ„์น˜ ์ง์ ‘ ํ‘œ์‹œ์ผ๊นŒ ํ˜„์žฌ ์œ„์น˜ ํ‘œ์‹œ์ผ๊นŒ
</span>
<div className="map-marker">{getDisplayText()}</div>
</div>
<div className="button-map-content">
<button className="button-selection-submit">
<button
className="button-selection-submit"
onClick={() => {
if (locationInfo.coordinates) {
console.log(
'Selected Coordinates:',
locationInfo.coordinates,
);
console.log(
'Selected Road Address:',
locationInfo.roadAddress,
);
console.log(
'Selected Jibun Address:',
locationInfo.jibunAddress,
);
console.log(
'Selected Administrative Dong:',
locationInfo.administrativeDong,
);
}
}}
>
<div className="icon-check">
<Remix iconName={'check-line'} />
</div>
Expand Down
14 changes: 14 additions & 0 deletions src/pages/ComponentMuseum.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,14 @@ import ModalFormInput from '../components/common/ModalFormInput';
import ReplyItem from '../components/common/ReplyItem';
import StarRating from '../components/common/StarRating';
import ChatItem from '../components/common/ChatItem';
import UserLocationMap from '../components/common/UserLocationMap';

const ComponentMuseum = () => {
// ์œ„์น˜ ์„ ํƒ ์‹œ ์‹คํ–‰๋  ํ•ธ๋“ค๋Ÿฌ ํ•จ์ˆ˜
const handleLocationSelect = (locationInfo) => {
console.log('์„ ํƒ๋œ ์œ„์น˜:', locationInfo);
};

return (
<aside
className="inner-wrapper"
Expand Down Expand Up @@ -101,6 +107,14 @@ const ComponentMuseum = () => {
<ArticleItem index={2} isEditMode={true} />
</div>
</div>
<div>
<UserLocationMap
locationType="address"
// ์ฃผ์†Œ ์ •๋ณด๋ฅผ ์›ํ•  ๋•Œ address (๋„๋กœ๋ช…์ฃผ์†Œ, ์ง€๋ฒˆ์ฃผ์†Œ ํ‘œ์‹œ)
// ํ–‰์ •๋™ ์ •๋ณด๋ฅผ ์›ํ•  ๋•Œ administrativeDong๋Š”
onLocationSelect={handleLocationSelect}
/>
</div>
</aside>
);
};
Expand Down

0 comments on commit 9429661

Please sign in to comment.