1
1
import styled from '@emotion/styled' ;
2
2
import { useEffect , useRef } from 'react' ;
3
3
4
+ import defaultMap from '@/assets/images/default-compare-map.webp' ;
4
5
import Marker from '@/components/_common/Marker/Marker' ;
5
6
import theme from '@/styles/theme' ;
6
7
import { Position } from '@/types/address' ;
@@ -14,56 +15,105 @@ const RoomCompareMap = ({ positions }: { positions: Position[] }) => {
14
15
const mapElement = useRef < HTMLDivElement > ( null ) ;
15
16
const mapRef = useRef < any > ( null ) ;
16
17
18
+ const [ { latitude : room1Latitude , longitude : room1Logitude } , { latitude : room2Latitude , longitude : room2Logitude } ] =
19
+ positions ;
20
+
21
+ const hasAddressRoom1 = room1Latitude && room1Logitude ;
22
+ const hasAddressRoom2 = room2Latitude && room2Logitude ;
23
+
17
24
useEffect ( ( ) => {
18
25
const initializeMap = ( ) => {
19
26
const { kakao } = window as any ;
20
27
21
- const centerOfPosition = {
22
- latitude : ( positions [ 0 ] . latitude + positions [ 1 ] . latitude ) / 2 ,
23
- longitude : ( positions [ 0 ] . longitude + positions [ 1 ] . longitude ) / 2 ,
24
- } ;
25
-
26
- const diff = getDistanceFromLatLonInKm (
27
- positions [ 0 ] . latitude ,
28
- positions [ 0 ] . longitude ,
29
- positions [ 1 ] . latitude ,
30
- positions [ 1 ] . longitude ,
31
- ) ;
32
-
33
- /* 두 지점의 거리를 재서 적당한 Map level 설정 */
34
- const mapLevel = getMapLevel ( diff ) ;
35
-
36
- kakao . maps . load ( ( ) => {
37
- if ( ! mapElement . current ) return ;
38
- const mapOption = {
39
- center : new kakao . maps . LatLng ( centerOfPosition . latitude , centerOfPosition . longitude ) ,
40
- level : mapLevel ,
28
+ if ( hasAddressRoom1 && ! hasAddressRoom2 ) {
29
+ kakao . maps . load ( ( ) => {
30
+ if ( ! mapElement . current ) return ;
31
+ const mapOption = {
32
+ center : new kakao . maps . LatLng ( room1Latitude , room1Logitude ) ,
33
+ level : 3 ,
34
+ } ;
35
+
36
+ const map = new kakao . maps . Map ( mapElement . current , mapOption ) ;
37
+ mapRef . current = map ;
38
+
39
+ const { createMarker } = createKakaoMapElements ( ) ;
40
+
41
+ const marker2 = createMarker (
42
+ kakao ,
43
+ map ,
44
+ new kakao . maps . LatLng ( room1Latitude , room1Logitude ) ,
45
+ 'primary' ,
46
+ 'first' ,
47
+ ) ;
48
+ marker2 . setMap ( map ) ;
49
+ } ) ;
50
+ }
51
+
52
+ if ( ! hasAddressRoom1 && hasAddressRoom2 ) {
53
+ kakao . maps . load ( ( ) => {
54
+ if ( ! mapElement . current ) return ;
55
+ const mapOption = {
56
+ center : new kakao . maps . LatLng ( room2Latitude , room2Logitude ) ,
57
+ level : 3 ,
58
+ } ;
59
+
60
+ const map = new kakao . maps . Map ( mapElement . current , mapOption ) ;
61
+ mapRef . current = map ;
62
+
63
+ const { createMarker } = createKakaoMapElements ( ) ;
64
+
65
+ const marker2 = createMarker (
66
+ kakao ,
67
+ map ,
68
+ new kakao . maps . LatLng ( room2Latitude , room2Logitude ) ,
69
+ 'secondary' ,
70
+ 'second' ,
71
+ ) ;
72
+ marker2 . setMap ( map ) ;
73
+ } ) ;
74
+ }
75
+
76
+ if ( hasAddressRoom1 && hasAddressRoom2 ) {
77
+ const centerOfPosition = {
78
+ latitude : ( room1Latitude + room2Latitude ) / 2 ,
79
+ longitude : ( room1Logitude + room2Logitude ) / 2 ,
41
80
} ;
42
81
43
- const map = new kakao . maps . Map ( mapElement . current , mapOption ) ;
44
- mapRef . current = map ;
45
-
46
- const { createMarker } = createKakaoMapElements ( ) ;
47
-
48
- const marker1 = createMarker (
49
- kakao ,
50
- map ,
51
- new kakao . maps . LatLng ( positions [ 0 ] . latitude , positions [ 0 ] . longitude ) ,
52
- 'primary' ,
53
- 'first' ,
54
- ) ;
55
-
56
- const marker2 = createMarker (
57
- kakao ,
58
- map ,
59
- new kakao . maps . LatLng ( positions [ 1 ] . latitude , positions [ 1 ] . longitude ) ,
60
- 'secondary' ,
61
- 'second' ,
62
- ) ;
63
-
64
- marker1 . setMap ( map ) ;
65
- marker2 . setMap ( map ) ;
66
- } ) ;
82
+ const diff = getDistanceFromLatLonInKm ( room1Latitude , room1Logitude , room2Latitude , room2Logitude ) ;
83
+ /* 두 지점의 거리를 재서 적당한 Map level 설정 */
84
+ const mapLevel = getMapLevel ( diff ) ;
85
+
86
+ kakao . maps . load ( ( ) => {
87
+ if ( ! mapElement . current ) return ;
88
+ const mapOption = {
89
+ center : new kakao . maps . LatLng ( centerOfPosition . latitude , centerOfPosition . longitude ) ,
90
+ level : mapLevel ,
91
+ } ;
92
+
93
+ const map = new kakao . maps . Map ( mapElement . current , mapOption ) ;
94
+ mapRef . current = map ;
95
+
96
+ const { createMarker } = createKakaoMapElements ( ) ;
97
+ const marker1 = createMarker (
98
+ kakao ,
99
+ map ,
100
+ new kakao . maps . LatLng ( room1Latitude , room1Logitude ) ,
101
+ 'primary' ,
102
+ 'first' ,
103
+ ) ;
104
+ marker1 . setMap ( map ) ;
105
+
106
+ const marker2 = createMarker (
107
+ kakao ,
108
+ map ,
109
+ new kakao . maps . LatLng ( room2Latitude , room2Logitude ) ,
110
+ 'secondary' ,
111
+ 'second' ,
112
+ ) ;
113
+
114
+ marker2 . setMap ( map ) ;
115
+ } ) ;
116
+ }
67
117
} ;
68
118
69
119
if ( location ) {
@@ -85,20 +135,34 @@ const RoomCompareMap = ({ positions }: { positions: Position[] }) => {
85
135
}
86
136
} ;
87
137
138
+ if ( ! hasAddressRoom1 && ! hasAddressRoom2 ) {
139
+ return (
140
+ < S . Box >
141
+ < S . DefaultImgBox src = { defaultMap } />
142
+ < S . CenterText >
143
+ 주소를 설정하시면 < br />
144
+ 지도가 표시됩니다.
145
+ </ S . CenterText >
146
+ </ S . Box >
147
+ ) ;
148
+ }
149
+
88
150
return (
89
151
< >
90
152
{ location && (
91
153
< S . Box >
92
154
< S . Map ref = { mapElement } >
93
155
< S . RoomMarkBox >
94
156
< Marker
157
+ disabled = { ! hasAddressRoom1 }
95
158
isCircle = { false }
96
159
backgroundColor = { theme . palette . yellow500 }
97
160
text = { 'A방' }
98
161
size = { 'medium' }
99
162
onClick = { ( ) => handleRoomMarkerClick ( 0 ) }
100
163
/>
101
164
< Marker
165
+ disabled = { ! hasAddressRoom2 }
102
166
isCircle = { false }
103
167
backgroundColor = { theme . palette . green500 }
104
168
text = { 'B방' }
@@ -115,6 +179,7 @@ const RoomCompareMap = ({ positions }: { positions: Position[] }) => {
115
179
116
180
const S = {
117
181
Box : styled . div `
182
+ position: relative;
118
183
width: 100%;
119
184
height: 20rem;
120
185
@@ -138,6 +203,17 @@ const S = {
138
203
gap: 1rem;
139
204
border-radius: 0.3rem;
140
205
` ,
206
+ CenterText : styled . span `
207
+ position: absolute;
208
+ top: 50%;
209
+ left: 50%;
210
+ transform: translate(-50%, -50%);
211
+ ` ,
212
+ DefaultImgBox : styled . img `
213
+ width: 100%;
214
+ height: 100%;
215
+ object-fit: cover;
216
+ ` ,
141
217
} ;
142
218
143
219
export default RoomCompareMap ;
0 commit comments