Showing
35 changed files
with
213 additions
and
52 deletions
3.49 KB
3.36 KB
3.4 KB
3.35 KB
3.43 KB
3.41 KB
3.48 KB
3.59 KB
3.58 KB
3.38 KB
3.41 KB
3.38 KB
3.45 KB
3.45 KB
3.49 KB
3.61 KB
3.62 KB
3.41 KB
3.43 KB
3.41 KB
3.47 KB
3.49 KB
3.52 KB
3.63 KB
3.6 KB
3.4 KB
3.41 KB
3.41 KB
3.45 KB
3.47 KB
3.51 KB
3.61 KB
1 | import React, {useEffect} from "react"; | 1 | import React, {useEffect} from "react"; |
2 | import Dimensions from "react-dimensions"; | 2 | import Dimensions from "react-dimensions"; |
3 | +import res from './res'; | ||
3 | 4 | ||
4 | -let map, infoWindow; | 5 | +let map; |
6 | +let markers = []; | ||
7 | +let infoWindow; | ||
5 | 8 | ||
6 | -const GoogleMap = (props) => { | 9 | +const getGroupUrlStringByGroup = group => { |
7 | - useEffect(() => { | 10 | + if (group === "renting") { |
8 | - console.log('mount'); | 11 | + // 사용중 |
9 | - const { google } = window; | 12 | + return "_inuse"; |
13 | + } else if (group === "ready") { | ||
14 | + // 대기중 | ||
15 | + return ""; | ||
16 | + } else if (group === "target") { | ||
17 | + // 수거대상 | ||
18 | + return "_pickup"; | ||
19 | + } else if (group === "collect") { | ||
20 | + // 수거 | ||
21 | + return "_deactive"; | ||
22 | + } | ||
23 | +}; | ||
24 | + | ||
25 | +const getBatteryUrlStringByBattery = battery => { | ||
26 | + if (battery >= 0 && battery < 25) { | ||
27 | + return "0-25"; | ||
28 | + } else if (battery >= 25 && battery < 50) { | ||
29 | + return "25-50"; | ||
30 | + } else if (battery >= 50 && battery < 75) { | ||
31 | + return "50-75"; | ||
32 | + } | ||
33 | + return "75-100"; | ||
34 | +}; | ||
35 | + | ||
36 | +class GoogleMap extends React.Component { | ||
37 | + constructor(props) { | ||
38 | + super(props); | ||
39 | + this.state = { | ||
40 | + kickboards: [] | ||
41 | + }; | ||
42 | + } | ||
43 | + | ||
44 | + componentDidMount() { | ||
45 | + // fetch('http://1.201.143.67:5901/kickboard/all') | ||
46 | + // .then(r => r.json()) | ||
47 | + // .then(d => { | ||
48 | + // if(!d.success || !d.data.length) return; | ||
49 | + // | ||
50 | + // console.log(d.data) | ||
51 | + // this.setState({ | ||
52 | + // kickboards: d.data | ||
53 | + // }) | ||
54 | + // }) | ||
55 | + // .then(d => { | ||
56 | + // const { google } = window; | ||
57 | + // | ||
58 | + // infoWindow = new window.google.maps.InfoWindow({}); | ||
59 | + // | ||
60 | + // map = new google.maps.Map(document.getElementById("map"), { | ||
61 | + // zoom: 11, | ||
62 | + // center: {lat: -34.397, lng: 150.644}, | ||
63 | + // disableDefaultUI: true, | ||
64 | + // zoomControl: true | ||
65 | + // }); | ||
66 | + // | ||
67 | + // google.maps.event.addListenerOnce(map, "idle", () => { | ||
68 | + // this.getCurrentLocation(); | ||
69 | + // }); | ||
70 | + // }) | ||
71 | + // .catch(err => console.log(err)); | ||
72 | + | ||
73 | + const response = JSON.parse(res); | ||
74 | + this.setState({ | ||
75 | + kickboards: response.data | ||
76 | + }); | ||
10 | 77 | ||
78 | + const { google } = window; | ||
11 | infoWindow = new window.google.maps.InfoWindow({}); | 79 | infoWindow = new window.google.maps.InfoWindow({}); |
12 | 80 | ||
13 | map = new google.maps.Map(document.getElementById("map"), { | 81 | map = new google.maps.Map(document.getElementById("map"), { |
... | @@ -16,12 +84,100 @@ const GoogleMap = (props) => { | ... | @@ -16,12 +84,100 @@ const GoogleMap = (props) => { |
16 | disableDefaultUI: true, | 84 | disableDefaultUI: true, |
17 | zoomControl: true | 85 | zoomControl: true |
18 | }); | 86 | }); |
19 | - }, []); | ||
20 | 87 | ||
21 | - return ( | 88 | + google.maps.event.addListenerOnce(map, "idle", () => { |
22 | - <div id="map" style={{height:props.containerWidth, backgroundColor:'pink'}}> | 89 | + this.getCurrentLocation(); |
23 | - </div> | 90 | + }); |
24 | - ) | 91 | + } |
92 | + | ||
93 | + getCurrentLocation() { | ||
94 | + if (navigator.geolocation) { | ||
95 | + map.setCenter( | ||
96 | + new window.google.maps.LatLng({ | ||
97 | + lat: 37.2441088, | ||
98 | + lng: 127.05054720000001 | ||
99 | + }) | ||
100 | + ); | ||
101 | + } else { | ||
102 | + map.setCenter( | ||
103 | + new window.google.maps.LatLng({ | ||
104 | + lat: 37.2441088, | ||
105 | + lng: 127.05054720000001 | ||
106 | + }) | ||
107 | + ); | ||
108 | + } | ||
109 | + } | ||
110 | + | ||
111 | + drawMarkers() { | ||
112 | + if (map == null) return; | ||
113 | + const selectedMarker = new window.google.maps.Marker({}); | ||
114 | + | ||
115 | + markers = this.state.kickboards.map(item => { | ||
116 | + const marker = new window.google.maps.Marker({ | ||
117 | + position: new window.google.maps.LatLng({ | ||
118 | + lat: item.coordinates.lat, | ||
119 | + lng: item.coordinates.lon | ||
120 | + }) | ||
121 | + }); | ||
122 | + | ||
123 | + const markerContent = ` | ||
124 | + <div> | ||
125 | + <div style="color:black"> 시리얼번호: ${item.serialNumber} </div> | ||
126 | + </div> | ||
127 | + `; | ||
128 | + | ||
129 | + marker.item = item; | ||
130 | + | ||
131 | + this.renderMarker(marker); | ||
132 | + | ||
133 | + window.google.maps.event.addListener(marker, "click", () => { | ||
134 | + infoWindow.close(); | ||
135 | + infoWindow.setContent(markerContent); | ||
136 | + infoWindow.open(map, marker); | ||
137 | + }); | ||
138 | + | ||
139 | + window.google.maps.event.addListener(marker, "mouseover", () => { | ||
140 | + this.highlightMarker(marker); | ||
141 | + }); | ||
142 | + | ||
143 | + window.google.maps.event.addListener(marker, "mouseout", () => { | ||
144 | + this.renderMarker(marker); | ||
145 | + }); | ||
146 | + | ||
147 | + marker.setMap(map); | ||
148 | + return marker; | ||
149 | + }); | ||
150 | + } | ||
151 | + | ||
152 | + renderMarker(marker) { | ||
153 | + const { group, battery } = marker.item; | ||
154 | + | ||
155 | + const groupString = getGroupUrlStringByGroup(group); | ||
156 | + const batteryString = getBatteryUrlStringByBattery(battery); | ||
157 | + | ||
158 | + const iconUrl = require(`../../assets/marker/ic_map_pin_battery${batteryString}${groupString}.png`); | ||
159 | + marker.setIcon(iconUrl); | ||
160 | + } | ||
161 | + | ||
162 | + | ||
163 | + highlightMarker(marker) { | ||
164 | + const { group, battery } = marker.item; | ||
165 | + | ||
166 | + const groupString = getGroupUrlStringByGroup(group); | ||
167 | + const batteryString = getBatteryUrlStringByBattery(battery); | ||
168 | + | ||
169 | + const iconUrl = require(`../../assets/marker/ic_map_pin_battery${batteryString}${groupString}_selected.png`); | ||
170 | + marker.setIcon(iconUrl); | ||
171 | + } | ||
172 | + | ||
173 | + render() { | ||
174 | + this.drawMarkers(); | ||
175 | + | ||
176 | + return ( | ||
177 | + <div id="map" style={{height:this.props.containerWidth, backgroundColor:'pink'}}> | ||
178 | + </div> | ||
179 | + ) | ||
180 | + } | ||
25 | }; | 181 | }; |
26 | 182 | ||
27 | export default Dimensions()(GoogleMap) // Enhanced component | 183 | export default Dimensions()(GoogleMap) // Enhanced component |
... | \ No newline at end of file | ... | \ No newline at end of file | ... | ... |
frontend/src/components/Kickboard/res.js
0 → 100644
1 | +const res = ` | ||
2 | +{"success":true,"data":[{"serialNumber":"000000","battery":0,"dailyDrivenDistance":0,"dailyDrivenTime":0,"coordinates":{"lon":126.885654,"lat":37.480045},"modelName":"MA01","isGoodReception":false,"isGoodPosture":false,"connected":false,"createdAt":"2020-02-13T09:59:22.303Z","group":"target","state":"알 수 없는 오류"},{"serialNumber":"000001","battery":0,"dailyDrivenDistance":0,"dailyDrivenTime":0,"coordinates":{"lon":127.078668,"lat":37.244634},"modelName":"MA01","isGoodReception":false,"isGoodPosture":false,"connected":false,"createdAt":"2020-02-13T09:59:24.316Z","group":"target","state":"알 수 없는 오류"},{"serialNumber":"000002","battery":0,"dailyDrivenDistance":0,"dailyDrivenTime":52257,"coordinates":{"lon":126.886552,"lat":37.479997},"modelName":"MA01","isGoodReception":false,"isGoodPosture":true,"connected":true,"createdAt":"2020-04-16T08:40:51.817Z","group":"ready","state":"대기 중"},{"serialNumber":"000003","battery":78,"dailyDrivenDistance":0,"dailyDrivenTime":0,"coordinates":{"lon":127.05006,"lat":37.545254},"modelName":"MA01","isGoodReception":false,"isGoodPosture":false,"connected":false,"createdAt":"2020-02-04T01:57:45.032Z","group":"collect","state":"수거됨"},{"serialNumber":"000004","battery":0,"dailyDrivenDistance":0,"dailyDrivenTime":0,"coordinates":{"lon":127.078668,"lat":37.244634},"modelName":"MA01","isGoodReception":false,"isGoodPosture":false,"connected":false,"createdAt":"2020-02-13T09:59:26.569Z","group":"target","state":"알 수 없는 오류"},{"serialNumber":"000005","battery":0,"dailyDrivenDistance":0,"dailyDrivenTime":0,"coordinates":{"lon":127.050652,"lat":37.545297},"modelName":"MA01","isGoodReception":false,"isGoodPosture":false,"connected":false,"createdAt":"2020-02-13T15:02:15.601Z","group":"collect","state":"수거됨"},{"serialNumber":"000006","battery":94,"dailyDrivenDistance":0,"dailyDrivenTime":439119,"coordinates":{"lon":126.885743,"lat":37.479925},"modelName":"MA01","isGoodReception":false,"isGoodPosture":false,"connected":true,"createdAt":"2020-02-13T15:02:15.601Z","group":"ready","state":"서비스 종료"},{"serialNumber":"000007","battery":0,"dailyDrivenDistance":0,"dailyDrivenTime":0,"coordinates":{"lon":126.87614,"lat":37.482151},"modelName":"MA01","isGoodReception":false,"isGoodPosture":false,"connected":false,"createdAt":"2020-02-13T15:02:15.601Z","group":"target","state":"알 수 없는 오류"},{"serialNumber":"000008","battery":40,"dailyDrivenDistance":0,"dailyDrivenTime":29,"coordinates":{"lon":127.050652,"lat":37.545297},"modelName":"MA01","isGoodReception":false,"isGoodPosture":false,"connected":true,"createdAt":"2020-02-13T15:02:15.601Z","group":"collect","state":"수거됨"}]}` | ||
3 | + | ||
4 | + | ||
5 | +export default res; | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
... | @@ -8,20 +8,20 @@ import Notifications from "views/Notifications.jsx"; | ... | @@ -8,20 +8,20 @@ import Notifications from "views/Notifications.jsx"; |
8 | import Kickboard from "views/Kickboard" | 8 | import Kickboard from "views/Kickboard" |
9 | 9 | ||
10 | const dashboardRoutes = [ | 10 | const dashboardRoutes = [ |
11 | - { | 11 | + // { |
12 | - path: "/dashboard", | 12 | + // path: "/dashboard", |
13 | - name: "Dashboard", | 13 | + // name: "Dashboard", |
14 | - icon: "pe-7s-graph", | 14 | + // icon: "pe-7s-graph", |
15 | - component: Dashboard, | 15 | + // component: Dashboard, |
16 | - layout: "/admin" | 16 | + // layout: "/admin" |
17 | - }, | 17 | + // }, |
18 | - { | 18 | + // { |
19 | - path: "/user", | 19 | + // path: "/user", |
20 | - name: "User Profile", | 20 | + // name: "User Profile", |
21 | - icon: "pe-7s-user", | 21 | + // icon: "pe-7s-user", |
22 | - component: UserProfile, | 22 | + // component: UserProfile, |
23 | - layout: "/admin" | 23 | + // layout: "/admin" |
24 | - }, | 24 | + // }, |
25 | { | 25 | { |
26 | path: "/table", | 26 | path: "/table", |
27 | name: "사용자 정보", | 27 | name: "사용자 정보", |
... | @@ -29,34 +29,34 @@ const dashboardRoutes = [ | ... | @@ -29,34 +29,34 @@ const dashboardRoutes = [ |
29 | component: UserHistory, | 29 | component: UserHistory, |
30 | layout: "/admin" | 30 | layout: "/admin" |
31 | }, | 31 | }, |
32 | - { | 32 | + // { |
33 | - path: "/typography", | 33 | + // path: "/typography", |
34 | - name: "Typography", | 34 | + // name: "Typography", |
35 | - icon: "pe-7s-news-paper", | 35 | + // icon: "pe-7s-news-paper", |
36 | - component: Typography, | 36 | + // component: Typography, |
37 | - layout: "/admin" | 37 | + // layout: "/admin" |
38 | - }, | 38 | + // }, |
39 | - { | 39 | + // { |
40 | - path: "/icons", | 40 | + // path: "/icons", |
41 | - name: "Icons", | 41 | + // name: "Icons", |
42 | - icon: "pe-7s-science", | 42 | + // icon: "pe-7s-science", |
43 | - component: Icons, | 43 | + // component: Icons, |
44 | - layout: "/admin" | 44 | + // layout: "/admin" |
45 | - }, | 45 | + // }, |
46 | - { | 46 | + // { |
47 | - path: "/maps", | 47 | + // path: "/maps", |
48 | - name: "Maps", | 48 | + // name: "Maps", |
49 | - icon: "pe-7s-map-marker", | 49 | + // icon: "pe-7s-map-marker", |
50 | - component: Maps, | 50 | + // component: Maps, |
51 | - layout: "/admin" | 51 | + // layout: "/admin" |
52 | - }, | 52 | + // }, |
53 | - { | 53 | + // { |
54 | - path: "/notifications", | 54 | + // path: "/notifications", |
55 | - name: "Notifications", | 55 | + // name: "Notifications", |
56 | - icon: "pe-7s-bell", | 56 | + // icon: "pe-7s-bell", |
57 | - component: Notifications, | 57 | + // component: Notifications, |
58 | - layout: "/admin" | 58 | + // layout: "/admin" |
59 | - }, | 59 | + // }, |
60 | { | 60 | { |
61 | path: "/kickboard", | 61 | path: "/kickboard", |
62 | name: "킥보드 정보", | 62 | name: "킥보드 정보", | ... | ... |
-
Please register or login to post a comment