display the kakao map in main page
- display the kakao map in main page - add search location box - create the marker to each map
Showing
4 changed files
with
372 additions
and
4 deletions
... | @@ -1274,6 +1274,24 @@ | ... | @@ -1274,6 +1274,24 @@ |
1274 | "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-10.1.0.tgz", | 1274 | "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-10.1.0.tgz", |
1275 | "integrity": "sha512-ij4wRiunFfaJxjB0BdrYHIH8FxBJpOwNPhhAcunlmPdXudL1WQV1qoP9un6JsEBAgQH+7UXyyjh0g7jTxXK6tg==" | 1275 | "integrity": "sha512-ij4wRiunFfaJxjB0BdrYHIH8FxBJpOwNPhhAcunlmPdXudL1WQV1qoP9un6JsEBAgQH+7UXyyjh0g7jTxXK6tg==" |
1276 | }, | 1276 | }, |
1277 | + "@emotion/is-prop-valid": { | ||
1278 | + "version": "0.8.8", | ||
1279 | + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz", | ||
1280 | + "integrity": "sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==", | ||
1281 | + "requires": { | ||
1282 | + "@emotion/memoize": "0.7.4" | ||
1283 | + } | ||
1284 | + }, | ||
1285 | + "@emotion/memoize": { | ||
1286 | + "version": "0.7.4", | ||
1287 | + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz", | ||
1288 | + "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==" | ||
1289 | + }, | ||
1290 | + "@emotion/unitless": { | ||
1291 | + "version": "0.7.5", | ||
1292 | + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", | ||
1293 | + "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" | ||
1294 | + }, | ||
1277 | "@hapi/address": { | 1295 | "@hapi/address": { |
1278 | "version": "2.1.4", | 1296 | "version": "2.1.4", |
1279 | "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz", | 1297 | "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz", |
... | @@ -2848,6 +2866,22 @@ | ... | @@ -2848,6 +2866,22 @@ |
2848 | "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.6.tgz", | 2866 | "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.6.tgz", |
2849 | "integrity": "sha512-1aGDUfL1qOOIoqk9QKGIo2lANk+C7ko/fqH0uIyC71x3PEGz0uVP8ISgfEsFuG+FKmjHTvFK/nNM8dowpmUxLA==" | 2867 | "integrity": "sha512-1aGDUfL1qOOIoqk9QKGIo2lANk+C7ko/fqH0uIyC71x3PEGz0uVP8ISgfEsFuG+FKmjHTvFK/nNM8dowpmUxLA==" |
2850 | }, | 2868 | }, |
2869 | + "babel-plugin-styled-components": { | ||
2870 | + "version": "1.10.7", | ||
2871 | + "resolved": "https://registry.npmjs.org/babel-plugin-styled-components/-/babel-plugin-styled-components-1.10.7.tgz", | ||
2872 | + "integrity": "sha512-MBMHGcIA22996n9hZRf/UJLVVgkEOITuR2SvjHLb5dSTUyR4ZRGn+ngITapes36FI3WLxZHfRhkA1ffHxihOrg==", | ||
2873 | + "requires": { | ||
2874 | + "@babel/helper-annotate-as-pure": "^7.0.0", | ||
2875 | + "@babel/helper-module-imports": "^7.0.0", | ||
2876 | + "babel-plugin-syntax-jsx": "^6.18.0", | ||
2877 | + "lodash": "^4.17.11" | ||
2878 | + } | ||
2879 | + }, | ||
2880 | + "babel-plugin-syntax-jsx": { | ||
2881 | + "version": "6.18.0", | ||
2882 | + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", | ||
2883 | + "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=" | ||
2884 | + }, | ||
2851 | "babel-plugin-syntax-object-rest-spread": { | 2885 | "babel-plugin-syntax-object-rest-spread": { |
2852 | "version": "6.13.0", | 2886 | "version": "6.13.0", |
2853 | "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", | 2887 | "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", |
... | @@ -3160,6 +3194,11 @@ | ... | @@ -3160,6 +3194,11 @@ |
3160 | "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", | 3194 | "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", |
3161 | "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" | 3195 | "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" |
3162 | }, | 3196 | }, |
3197 | + "bootstrap": { | ||
3198 | + "version": "3.4.1", | ||
3199 | + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-3.4.1.tgz", | ||
3200 | + "integrity": "sha512-yN5oZVmRCwe5aKwzRj6736nSmKDX7pLYwsXiCj/EYmo16hODaBiT4En5btW/jhBF/seV+XMx3aYwukYC3A49DA==" | ||
3201 | + }, | ||
3163 | "brace-expansion": { | 3202 | "brace-expansion": { |
3164 | "version": "1.1.11", | 3203 | "version": "1.1.11", |
3165 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", | 3204 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", |
... | @@ -3447,6 +3486,11 @@ | ... | @@ -3447,6 +3486,11 @@ |
3447 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", | 3486 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", |
3448 | "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" | 3487 | "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" |
3449 | }, | 3488 | }, |
3489 | + "camelize": { | ||
3490 | + "version": "1.0.0", | ||
3491 | + "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.0.tgz", | ||
3492 | + "integrity": "sha1-FkpUg+Yw+kMh5a8HAg5TGDGyYJs=" | ||
3493 | + }, | ||
3450 | "caniuse-api": { | 3494 | "caniuse-api": { |
3451 | "version": "3.0.0", | 3495 | "version": "3.0.0", |
3452 | "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", | 3496 | "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", |
... | @@ -4087,6 +4131,11 @@ | ... | @@ -4087,6 +4131,11 @@ |
4087 | "postcss": "^7.0.5" | 4131 | "postcss": "^7.0.5" |
4088 | } | 4132 | } |
4089 | }, | 4133 | }, |
4134 | + "css-color-keywords": { | ||
4135 | + "version": "1.0.0", | ||
4136 | + "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", | ||
4137 | + "integrity": "sha1-/qJhbcZ2spYmhrOvjb2+GAskTgU=" | ||
4138 | + }, | ||
4090 | "css-color-names": { | 4139 | "css-color-names": { |
4091 | "version": "0.0.4", | 4140 | "version": "0.0.4", |
4092 | "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", | 4141 | "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", |
... | @@ -4170,6 +4219,23 @@ | ... | @@ -4170,6 +4219,23 @@ |
4170 | "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", | 4219 | "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", |
4171 | "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==" | 4220 | "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==" |
4172 | }, | 4221 | }, |
4222 | + "css-to-react-native": { | ||
4223 | + "version": "2.3.2", | ||
4224 | + "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-2.3.2.tgz", | ||
4225 | + "integrity": "sha512-VOFaeZA053BqvvvqIA8c9n0+9vFppVBAHCp6JgFTtTMU3Mzi+XnelJ9XC9ul3BqFzZyQ5N+H0SnwsWT2Ebchxw==", | ||
4226 | + "requires": { | ||
4227 | + "camelize": "^1.0.0", | ||
4228 | + "css-color-keywords": "^1.0.0", | ||
4229 | + "postcss-value-parser": "^3.3.0" | ||
4230 | + }, | ||
4231 | + "dependencies": { | ||
4232 | + "postcss-value-parser": { | ||
4233 | + "version": "3.3.1", | ||
4234 | + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", | ||
4235 | + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" | ||
4236 | + } | ||
4237 | + } | ||
4238 | + }, | ||
4173 | "css-tree": { | 4239 | "css-tree": { |
4174 | "version": "1.0.0-alpha.37", | 4240 | "version": "1.0.0-alpha.37", |
4175 | "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", | 4241 | "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", |
... | @@ -4361,6 +4427,11 @@ | ... | @@ -4361,6 +4427,11 @@ |
4361 | } | 4427 | } |
4362 | } | 4428 | } |
4363 | }, | 4429 | }, |
4430 | + "daum-map-api": { | ||
4431 | + "version": "1.0.2", | ||
4432 | + "resolved": "https://registry.npmjs.org/daum-map-api/-/daum-map-api-1.0.2.tgz", | ||
4433 | + "integrity": "sha1-3hbrEB11Ea5dZC/CZsl/lHmJiqQ=" | ||
4434 | + }, | ||
4364 | "debug": { | 4435 | "debug": { |
4365 | "version": "2.6.9", | 4436 | "version": "2.6.9", |
4366 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", | 4437 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", |
... | @@ -7391,6 +7462,11 @@ | ... | @@ -7391,6 +7462,11 @@ |
7391 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", | 7462 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", |
7392 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" | 7463 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" |
7393 | }, | 7464 | }, |
7465 | + "is-what": { | ||
7466 | + "version": "3.8.0", | ||
7467 | + "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.8.0.tgz", | ||
7468 | + "integrity": "sha512-UKeBoQfV8bjlM4pmx1FLDHdxslW/1mTksEs8ReVsilPmUv5cORd4+2/wFcviI3cUjrLybxCjzc8DnodAzJ/Wrg==" | ||
7469 | + }, | ||
7394 | "is-windows": { | 7470 | "is-windows": { |
7395 | "version": "1.0.2", | 7471 | "version": "1.0.2", |
7396 | "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", | 7472 | "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", |
... | @@ -8453,6 +8529,11 @@ | ... | @@ -8453,6 +8529,11 @@ |
8453 | "p-is-promise": "^2.0.0" | 8529 | "p-is-promise": "^2.0.0" |
8454 | } | 8530 | } |
8455 | }, | 8531 | }, |
8532 | + "memoize-one": { | ||
8533 | + "version": "5.1.1", | ||
8534 | + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.1.1.tgz", | ||
8535 | + "integrity": "sha512-HKeeBpWvqiVJD57ZUAsJNm71eHTykffzcLZVYWiVfQeI1rJtuEaS7hQiEpWfVVk18donPwJEcFKIkCmPJNOhHA==" | ||
8536 | + }, | ||
8456 | "memory-fs": { | 8537 | "memory-fs": { |
8457 | "version": "0.4.1", | 8538 | "version": "0.4.1", |
8458 | "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", | 8539 | "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", |
... | @@ -8491,6 +8572,14 @@ | ... | @@ -8491,6 +8572,14 @@ |
8491 | } | 8572 | } |
8492 | } | 8573 | } |
8493 | }, | 8574 | }, |
8575 | + "merge-anything": { | ||
8576 | + "version": "2.4.4", | ||
8577 | + "resolved": "https://registry.npmjs.org/merge-anything/-/merge-anything-2.4.4.tgz", | ||
8578 | + "integrity": "sha512-l5XlriUDJKQT12bH+rVhAHjwIuXWdAIecGwsYjv2LJo+dA1AeRTmeQS+3QBpO6lEthBMDi2IUMpLC1yyRvGlwQ==", | ||
8579 | + "requires": { | ||
8580 | + "is-what": "^3.3.1" | ||
8581 | + } | ||
8582 | + }, | ||
8494 | "merge-deep": { | 8583 | "merge-deep": { |
8495 | "version": "3.0.2", | 8584 | "version": "3.0.2", |
8496 | "resolved": "https://registry.npmjs.org/merge-deep/-/merge-deep-3.0.2.tgz", | 8585 | "resolved": "https://registry.npmjs.org/merge-deep/-/merge-deep-3.0.2.tgz", |
... | @@ -11132,6 +11221,19 @@ | ... | @@ -11132,6 +11221,19 @@ |
11132 | "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", | 11221 | "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", |
11133 | "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" | 11222 | "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" |
11134 | }, | 11223 | }, |
11224 | + "react-kakao-maps": { | ||
11225 | + "version": "0.0.13", | ||
11226 | + "resolved": "https://registry.npmjs.org/react-kakao-maps/-/react-kakao-maps-0.0.13.tgz", | ||
11227 | + "integrity": "sha512-1ZHGbdvucFpq3rPSee1UB8cY/61QloQeH2Kh1SMSvIoL2kIUIo1lbF8FnwkHo3zrbpqcS4kIFPvvDB5xs27MdA==", | ||
11228 | + "requires": { | ||
11229 | + "@babel/runtime-corejs3": "^7.6.2", | ||
11230 | + "babel-runtime": "^6.26.0", | ||
11231 | + "react": "^16.9.0", | ||
11232 | + "react-dom": "^16.9.0", | ||
11233 | + "scriptjs": "^2.5.9", | ||
11234 | + "styled-components": "^4.3.2" | ||
11235 | + } | ||
11236 | + }, | ||
11135 | "react-lifecycles-compat": { | 11237 | "react-lifecycles-compat": { |
11136 | "version": "3.0.4", | 11238 | "version": "3.0.4", |
11137 | "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", | 11239 | "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", |
... | @@ -11867,6 +11969,11 @@ | ... | @@ -11867,6 +11969,11 @@ |
11867 | "ajv-keywords": "^3.4.1" | 11969 | "ajv-keywords": "^3.4.1" |
11868 | } | 11970 | } |
11869 | }, | 11971 | }, |
11972 | + "scriptjs": { | ||
11973 | + "version": "2.5.9", | ||
11974 | + "resolved": "https://registry.npmjs.org/scriptjs/-/scriptjs-2.5.9.tgz", | ||
11975 | + "integrity": "sha512-qGVDoreyYiP1pkQnbnFAUIS5AjenNwwQBdl7zeos9etl+hYKWahjRTfzAZZYBv5xNHx7vNKCmaLDQZ6Fr2AEXg==" | ||
11976 | + }, | ||
11870 | "select-hose": { | 11977 | "select-hose": { |
11871 | "version": "2.0.0", | 11978 | "version": "2.0.0", |
11872 | "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", | 11979 | "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", |
... | @@ -12817,6 +12924,36 @@ | ... | @@ -12817,6 +12924,36 @@ |
12817 | } | 12924 | } |
12818 | } | 12925 | } |
12819 | }, | 12926 | }, |
12927 | + "styled-components": { | ||
12928 | + "version": "4.4.1", | ||
12929 | + "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-4.4.1.tgz", | ||
12930 | + "integrity": "sha512-RNqj14kYzw++6Sr38n7197xG33ipEOktGElty4I70IKzQF1jzaD1U4xQ+Ny/i03UUhHlC5NWEO+d8olRCDji6g==", | ||
12931 | + "requires": { | ||
12932 | + "@babel/helper-module-imports": "^7.0.0", | ||
12933 | + "@babel/traverse": "^7.0.0", | ||
12934 | + "@emotion/is-prop-valid": "^0.8.1", | ||
12935 | + "@emotion/unitless": "^0.7.0", | ||
12936 | + "babel-plugin-styled-components": ">= 1", | ||
12937 | + "css-to-react-native": "^2.2.2", | ||
12938 | + "memoize-one": "^5.0.0", | ||
12939 | + "merge-anything": "^2.2.4", | ||
12940 | + "prop-types": "^15.5.4", | ||
12941 | + "react-is": "^16.6.0", | ||
12942 | + "stylis": "^3.5.0", | ||
12943 | + "stylis-rule-sheet": "^0.0.10", | ||
12944 | + "supports-color": "^5.5.0" | ||
12945 | + }, | ||
12946 | + "dependencies": { | ||
12947 | + "supports-color": { | ||
12948 | + "version": "5.5.0", | ||
12949 | + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", | ||
12950 | + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", | ||
12951 | + "requires": { | ||
12952 | + "has-flag": "^3.0.0" | ||
12953 | + } | ||
12954 | + } | ||
12955 | + } | ||
12956 | + }, | ||
12820 | "stylehacks": { | 12957 | "stylehacks": { |
12821 | "version": "4.0.3", | 12958 | "version": "4.0.3", |
12822 | "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz", | 12959 | "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz", |
... | @@ -12839,6 +12976,16 @@ | ... | @@ -12839,6 +12976,16 @@ |
12839 | } | 12976 | } |
12840 | } | 12977 | } |
12841 | }, | 12978 | }, |
12979 | + "stylis": { | ||
12980 | + "version": "3.5.4", | ||
12981 | + "resolved": "https://registry.npmjs.org/stylis/-/stylis-3.5.4.tgz", | ||
12982 | + "integrity": "sha512-8/3pSmthWM7lsPBKv7NXkzn2Uc9W7NotcwGNpJaa3k7WMM1XDCA4MgT5k/8BIexd5ydZdboXtU90XH9Ec4Bv/Q==" | ||
12983 | + }, | ||
12984 | + "stylis-rule-sheet": { | ||
12985 | + "version": "0.0.10", | ||
12986 | + "resolved": "https://registry.npmjs.org/stylis-rule-sheet/-/stylis-rule-sheet-0.0.10.tgz", | ||
12987 | + "integrity": "sha512-nTbZoaqoBnmK+ptANthb10ZRZOGC+EmTLLUxeYIuHNkEKcmKgXX1XWKkUBT2Ac4es3NybooPe0SmvKdhKJZAuw==" | ||
12988 | + }, | ||
12842 | "supports-color": { | 12989 | "supports-color": { |
12843 | "version": "6.1.0", | 12990 | "version": "6.1.0", |
12844 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", | 12991 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", | ... | ... |
... | @@ -6,9 +6,12 @@ | ... | @@ -6,9 +6,12 @@ |
6 | "@testing-library/jest-dom": "^4.2.4", | 6 | "@testing-library/jest-dom": "^4.2.4", |
7 | "@testing-library/react": "^9.3.2", | 7 | "@testing-library/react": "^9.3.2", |
8 | "@testing-library/user-event": "^7.1.2", | 8 | "@testing-library/user-event": "^7.1.2", |
9 | + "bootstrap": "^3.4.1", | ||
10 | + "daum-map-api": "^1.0.2", | ||
9 | "react": "^16.13.1", | 11 | "react": "^16.13.1", |
10 | "react-bootstrap": "^1.0.1", | 12 | "react-bootstrap": "^1.0.1", |
11 | "react-dom": "^16.13.1", | 13 | "react-dom": "^16.13.1", |
14 | + "react-kakao-maps": "0.0.13", | ||
12 | "react-router-dom": "^5.2.0", | 15 | "react-router-dom": "^5.2.0", |
13 | "react-scripts": "3.4.1" | 16 | "react-scripts": "3.4.1" |
14 | }, | 17 | }, | ... | ... |
... | @@ -10,6 +10,16 @@ | ... | @@ -10,6 +10,16 @@ |
10 | content="Web site created using create-react-app" | 10 | content="Web site created using create-react-app" |
11 | /> | 11 | /> |
12 | <link rel="apple-touch-icon" href="%PUBLIC_URL%/logo192.png" /> | 12 | <link rel="apple-touch-icon" href="%PUBLIC_URL%/logo192.png" /> |
13 | + <script | ||
14 | + type="text/javascript" | ||
15 | + src="//dapi.kakao.com/v2/maps/sdk.js?appkey=61abec34d0855ba1d434ea222263d4a5&libraries=services,clusterer,drawing" | ||
16 | + ></script> | ||
17 | + <link | ||
18 | + rel="stylesheet" | ||
19 | + href="https://maxcdn.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" | ||
20 | + integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" | ||
21 | + crossorigin="anonymous" | ||
22 | + /> | ||
13 | <!-- | 23 | <!-- |
14 | manifest.json provides metadata used when your web app is installed on a | 24 | manifest.json provides metadata used when your web app is installed on a |
15 | user's mobile device or desktop. See https://developers.google.com/web/fundamentals/web-app-manifest/ | 25 | user's mobile device or desktop. See https://developers.google.com/web/fundamentals/web-app-manifest/ |
... | @@ -24,7 +34,7 @@ | ... | @@ -24,7 +34,7 @@ |
24 | work correctly both with client-side routing and a non-root public URL. | 34 | work correctly both with client-side routing and a non-root public URL. |
25 | Learn how to configure a non-root public URL by running `npm run build`. | 35 | Learn how to configure a non-root public URL by running `npm run build`. |
26 | --> | 36 | --> |
27 | - <title>React App</title> | 37 | + <title>HowsTheWeather</title> |
28 | </head> | 38 | </head> |
29 | <body> | 39 | <body> |
30 | <noscript>You need to enable JavaScript to run this app.</noscript> | 40 | <noscript>You need to enable JavaScript to run this app.</noscript> | ... | ... |
... | @@ -3,6 +3,10 @@ import logo from "./logo.svg"; | ... | @@ -3,6 +3,10 @@ import logo from "./logo.svg"; |
3 | import "./App.css"; | 3 | import "./App.css"; |
4 | import Button from "react-bootstrap/Button"; | 4 | import Button from "react-bootstrap/Button"; |
5 | import "./home.css"; | 5 | import "./home.css"; |
6 | +import { Map, Marker, MarkerClusterer, Polyline } from "react-kakao-maps"; | ||
7 | +import "bootstrap/dist/css/bootstrap.min.css"; | ||
8 | + | ||
9 | +/* global kakao */ | ||
6 | 10 | ||
7 | export default class Home extends Component { | 11 | export default class Home extends Component { |
8 | constructor(props) { | 12 | constructor(props) { |
... | @@ -10,10 +14,210 @@ export default class Home extends Component { | ... | @@ -10,10 +14,210 @@ export default class Home extends Component { |
10 | this.state = { | 14 | this.state = { |
11 | map: null, | 15 | map: null, |
12 | markers: [], | 16 | markers: [], |
17 | + markers: [], | ||
18 | + curMarker: new kakao.maps.Marker({ | ||
19 | + position: new kakao.maps.LatLng(37.503716, 127.044844), | ||
20 | + }), | ||
21 | + placeSearch: new kakao.maps.services.Places(), | ||
22 | + infoWindow: new kakao.maps.CustomOverlay({}), | ||
23 | + region: "은평구청", | ||
24 | + | ||
25 | + // curAirCondition: null, | ||
26 | + // routeInformation: null, | ||
27 | + }; | ||
28 | + this.removeAllChildNods = this.removeAllChildNods.bind(this); | ||
29 | + } | ||
30 | + | ||
31 | + searchPlaces() { | ||
32 | + var keyword = document.getElementById("keyword").value; | ||
33 | + | ||
34 | + if (!keyword.replace(/^\s+|\s+$/g, "")) { | ||
35 | + alert("키워드를 입력해주세요!"); | ||
36 | + return false; | ||
37 | + } | ||
38 | + // 장소검색 객체를 통해 키워드로 장소검색을 요청합니다 | ||
39 | + this.state.placeSearch.keywordSearch( | ||
40 | + keyword, | ||
41 | + this.placesSearchCB.bind(this) | ||
42 | + ); | ||
43 | + } | ||
44 | + | ||
45 | + // 장소검색이 완료됐을 때 호출되는 콜백함수 입니다 | ||
46 | + placesSearchCB(data, status, pagination) { | ||
47 | + if (status === kakao.maps.services.Status.OK) { | ||
48 | + // 정상적으로 검색이 완료됐으면 | ||
49 | + // 검색 목록과 마커를 표출합니다 | ||
50 | + this.displayPlaces(data); | ||
51 | + | ||
52 | + // 페이지 번호를 표출합니다 | ||
53 | + this.displayPagination(pagination); | ||
54 | + } else if (status === kakao.maps.services.Status.ZERO_RESULT) { | ||
55 | + alert("검색 결과가 존재하지 않습니다."); | ||
56 | + return; | ||
57 | + } else if (status === kakao.maps.services.Status.ERROR) { | ||
58 | + alert("검색 결과 중 오류가 발생했습니다."); | ||
59 | + return; | ||
60 | + } | ||
61 | + } | ||
62 | + | ||
63 | + displayPlaces(places) { | ||
64 | + var listEl = document.getElementById("placesList"), | ||
65 | + menuEl = document.getElementById("menu_wrap"), | ||
66 | + fragment = document.createDocumentFragment(), | ||
67 | + bounds = new kakao.maps.LatLngBounds(), | ||
68 | + listStr = ""; | ||
69 | + | ||
70 | + // 검색 결과 목록에 추가된 항목들을 제거합니다 | ||
71 | + // 페이지별로 보여주기 때문에 추가한 것 같음. | ||
72 | + this.removeAllChildNods(listEl); | ||
73 | + | ||
74 | + // 지도에 표시되고 있는 마커를 제거합니다 | ||
75 | + this.removeMarker(); | ||
76 | + | ||
77 | + for (var i = 0; i < places.length; i++) { | ||
78 | + // 마커를 생성하고 지도에 표시합니다 | ||
79 | + var placePosition = new kakao.maps.LatLng(places[i].y, places[i].x), | ||
80 | + marker = this.addMarker(placePosition, i), | ||
81 | + itemEl = this.getListItem(i, places[i]); // 검색 결과 항목 Element를 생성합니다 | ||
82 | + | ||
83 | + // 검색된 장소 위치를 기준으로 지도 범위를 재설정하기위해 | ||
84 | + // LatLngBounds 객체에 좌표를 추가합니다 | ||
85 | + bounds.extend(placePosition); | ||
86 | + | ||
87 | + // 마커와 검색결과 항목에 mouseover 했을때 | ||
88 | + // 해당 장소에 인포윈도우에 장소명을 표시합니다 | ||
89 | + // mouseout 했을 때는 인포윈도우를 닫습니다 | ||
90 | + | ||
91 | + // 함수를 조건문처럼 사용하여 해당 함수가 true일때 marker,places[i].place_name함수가 불리워짐. | ||
92 | + | ||
93 | + fragment.appendChild(itemEl); | ||
94 | + } | ||
95 | + | ||
96 | + // 검색결과 항목들을 검색결과 목록 Elemnet에 추가합니다 | ||
97 | + listEl.appendChild(fragment); | ||
98 | + menuEl.scrollTop = 0; | ||
99 | + | ||
100 | + // 검색된 장소 위치를 기준으로 지도 범위를 재설정합니다 | ||
101 | + this.state.map.setBounds(bounds); | ||
102 | + } | ||
103 | + // 커스텀 오버레이를 닫기 위해 호출되는 함수입니다 | ||
104 | + closeOverlay() { | ||
105 | + this.state.infoWindow.setMap(null); | ||
106 | + } | ||
107 | + | ||
108 | + getListItem(index, places) { | ||
109 | + var el = document.createElement("li"), | ||
110 | + itemStr = | ||
111 | + '<span class="markerbg marker_' + | ||
112 | + (index + 1) + | ||
113 | + '"></span>' + | ||
114 | + '<div class="info">' + | ||
115 | + " <h5>" + | ||
116 | + places.place_name + | ||
117 | + "</h5>"; | ||
118 | + | ||
119 | + if (places.road_address_name) { | ||
120 | + itemStr += | ||
121 | + " <span>" + | ||
122 | + places.road_address_name + | ||
123 | + "</span>" + | ||
124 | + ' <span class="jibun gray">' + | ||
125 | + places.address_name + | ||
126 | + "</span>"; | ||
127 | + } else { | ||
128 | + itemStr += " <span>" + places.address_name + "</span>"; | ||
129 | + } | ||
130 | + | ||
131 | + itemStr += ' <span class="tel">' + places.phone + "</span>" + "</div>"; | ||
132 | + | ||
133 | + el.innerHTML = itemStr; | ||
134 | + el.className = "item"; | ||
135 | + | ||
136 | + return el; | ||
137 | + } | ||
138 | + | ||
139 | + addMarker(position, idx, title) { | ||
140 | + var imageSrc = | ||
141 | + "http://t1.daumcdn.net/localimg/localimages/07/mapapidoc/marker_number_blue.png", // 마커 이미지 url, 스프라이트 이미지를 씁니다 | ||
142 | + imageSize = new kakao.maps.Size(36, 37), // 마커 이미지의 크기 | ||
143 | + imgOptions = { | ||
144 | + spriteSize: new kakao.maps.Size(36, 691), // 스프라이트 이미지의 크기 | ||
145 | + spriteOrigin: new kakao.maps.Point(0, idx * 46 + 10), // 스프라이트 이미지 중 사용할 영역의 좌상단 좌표 | ||
146 | + offset: new kakao.maps.Point(13, 37), // 마커 좌표에 일치시킬 이미지 내에서의 좌표 | ||
147 | + }, | ||
148 | + markerImage = new kakao.maps.MarkerImage(imageSrc, imageSize, imgOptions), | ||
149 | + marker = new kakao.maps.Marker({ | ||
150 | + position: position, // 마커의 위치 | ||
151 | + image: markerImage, | ||
152 | + }); | ||
153 | + | ||
154 | + marker.setMap(this.state.map); // 지도 위에 마커를 표출합니다 | ||
155 | + this.setState({ curMarker: marker }); | ||
156 | + this.state.markers.push(marker); // 배열에 생성된 마커를 추가합니다 | ||
157 | + | ||
158 | + return marker; | ||
159 | + } | ||
160 | + | ||
161 | + // 지도 위에 표시되고 있는 마커를 모두 제거합니다 | ||
162 | + removeMarker() { | ||
163 | + for (var i = 0; i < this.state.markers.length; i++) { | ||
164 | + this.state.markers[i].setMap(null); | ||
165 | + } | ||
166 | + this.setState({ | ||
167 | + markers: [], | ||
168 | + }); | ||
169 | + } | ||
170 | + | ||
171 | + // 검색결과 목록 하단에 페이지번호를 표시는 함수입니다 | ||
172 | + displayPagination(pagination) { | ||
173 | + var paginationEl = document.getElementById("pagination"), | ||
174 | + fragment = document.createDocumentFragment(), | ||
175 | + i; | ||
176 | + | ||
177 | + // 기존에 추가된 페이지번호를 삭제합니다 | ||
178 | + while (paginationEl.hasChildNodes()) { | ||
179 | + paginationEl.removeChild(paginationEl.lastChild); | ||
180 | + } | ||
13 | 181 | ||
14 | - curAirCondition: null, | 182 | + for (i = 1; i <= pagination.last; i++) { |
15 | - routeInformation: null, | 183 | + var el = document.createElement("a"); |
184 | + el.href = "#"; | ||
185 | + el.innerHTML = i; | ||
186 | + | ||
187 | + if (i === pagination.current) { | ||
188 | + el.className = "on"; | ||
189 | + } else { | ||
190 | + el.onclick = (function (i) { | ||
191 | + return function () { | ||
192 | + pagination.gotoPage(i); | ||
16 | }; | 193 | }; |
194 | + })(i); | ||
195 | + } | ||
196 | + | ||
197 | + fragment.appendChild(el); | ||
198 | + } | ||
199 | + paginationEl.appendChild(fragment); | ||
200 | + } | ||
201 | + | ||
202 | + removeAllChildNods(el) { | ||
203 | + while (el.hasChildNodes()) { | ||
204 | + el.removeChild(el.lastChild); | ||
205 | + } | ||
206 | + } | ||
207 | + | ||
208 | + componentDidMount() { | ||
209 | + // 컴포넌트가 만들어지고, render 함수가 호출된 이후에 호출되는 메소 | ||
210 | + // AJAX나 타이머를 생성하는 코드를 작성하는 파트이다. | ||
211 | + let el = document.getElementById("map"); | ||
212 | + this.setState({ | ||
213 | + map: new kakao.maps.Map(el, { | ||
214 | + //map option 설정 | ||
215 | + center: new kakao.maps.LatLng(37.503716, 127.044844), | ||
216 | + level: 3, | ||
217 | + }), | ||
218 | + }); | ||
219 | + this.searchPlaces(); | ||
220 | + // marker.setMap(map); | ||
17 | } | 221 | } |
18 | 222 | ||
19 | render() { | 223 | render() { |
... | @@ -28,7 +232,11 @@ export default class Home extends Component { | ... | @@ -28,7 +232,11 @@ export default class Home extends Component { |
28 | <div className="map_wrap"> | 232 | <div className="map_wrap"> |
29 | <div | 233 | <div |
30 | id="map" | 234 | id="map" |
31 | - style={{ width: "1000px", height: "600px", align: "middle" }} | 235 | + style={{ |
236 | + width: "1000px", | ||
237 | + height: "600px", | ||
238 | + align: "middle", | ||
239 | + }} | ||
32 | ></div> | 240 | ></div> |
33 | <div id="menu_wrap" className="bg_white"> | 241 | <div id="menu_wrap" className="bg_white"> |
34 | <div className="option"> | 242 | <div className="option"> | ... | ... |
-
Please register or login to post a comment