Added Device Context (not working)
This commit is contained in:
		
							
								
								
									
										5
									
								
								Birdmap.API/ClientApp/src/common/Constants.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								Birdmap.API/ClientApp/src/common/Constants.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,5 @@ | |||||||
|  | export default { | ||||||
|  |     probability_method_name: 'NotifyDeviceAsync', | ||||||
|  |     update_method_name: 'NotifyDeviceUpdatedAsync', | ||||||
|  |     update_all_method_name: 'NotifyAllUpdatedAsync', | ||||||
|  | }; | ||||||
							
								
								
									
										11
									
								
								Birdmap.API/ClientApp/src/contexts/DevicesContext.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								Birdmap.API/ClientApp/src/contexts/DevicesContext.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,11 @@ | |||||||
|  | import React from 'react'; | ||||||
|  |  | ||||||
|  | export default React.createContext({ | ||||||
|  |     devices: [], | ||||||
|  |     heatmapPoints: [], | ||||||
|  |  | ||||||
|  |     addDevice: () => { }, | ||||||
|  |     addPoint: () => { }, | ||||||
|  |  | ||||||
|  |     addHandler: (_, __) => { }, | ||||||
|  | }); | ||||||
							
								
								
									
										129
									
								
								Birdmap.API/ClientApp/src/contexts/DevicesContextProvider.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										129
									
								
								Birdmap.API/ClientApp/src/contexts/DevicesContextProvider.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,129 @@ | |||||||
|  | import Context from './DevicesContext' | ||||||
|  | import { HubConnectionBuilder } from '@microsoft/signalr'; | ||||||
|  | import { DeviceService } from '../components/devices/DeviceService'; | ||||||
|  | import Constants from '../common/Constants' | ||||||
|  | import React, { Component } from 'react' | ||||||
|  |  | ||||||
|  |  | ||||||
|  | const hub_url = '/hubs/devices'; | ||||||
|  |  | ||||||
|  | export default class DevicesContextProvider extends Component { | ||||||
|  |     state = { | ||||||
|  |         hubConnection: null, | ||||||
|  |         devices: [], | ||||||
|  |         heatmapPoints: [], | ||||||
|  |         handlers: {}, | ||||||
|  |     }; | ||||||
|  |  | ||||||
|  |     addPoint = point => { | ||||||
|  |         const updatedPoints = [...this.state.heatmapPoints]; | ||||||
|  |         updatedPoints.push(point); | ||||||
|  |         this.setState({ heatmapPoints: updatedPoints }); | ||||||
|  |     }; | ||||||
|  |  | ||||||
|  |     addDevice = device => { | ||||||
|  |         const updatedDevices = [...this.state.devices]; | ||||||
|  |         updatedDevices.push(device); | ||||||
|  |         this.setState({ devices: updatedDevices }); | ||||||
|  |     }; | ||||||
|  |  | ||||||
|  |     addHandler = (methodName, handler) => { | ||||||
|  |         const updatedHandlers = [...this.state.handlers]; | ||||||
|  |         var methodHandlers = updatedHandlers[methodName]; | ||||||
|  |         if (methodHandlers == null) { | ||||||
|  |             methodHandlers = []; | ||||||
|  |         }; | ||||||
|  |         const updatedMethodHandlers = [...methodHandlers]; | ||||||
|  |         updatedMethodHandlers.push(handler); | ||||||
|  |         updatedHandlers[methodName] = updatedMethodHandlers; | ||||||
|  |         this.setState({ handlers: updatedHandlers }); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     invokeHandlers(methodName, context) { | ||||||
|  |         this.state.handlers[methodName].forEach(function (handler) { | ||||||
|  |             handler(context); | ||||||
|  |         }); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     handleAllDevicesUpdated(service = null) { | ||||||
|  |         if (service === null) { | ||||||
|  |             service = new DeviceService(); | ||||||
|  |         } | ||||||
|  |         service.getall().then(result => { | ||||||
|  |             this.setState({ devices: result }); | ||||||
|  |         }).catch(ex => { | ||||||
|  |             console.log(ex); | ||||||
|  |         }); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     componentDidMount() { | ||||||
|  |         const service = new DeviceService(); | ||||||
|  |         this.handleAllDevicesUpdated(service); | ||||||
|  |  | ||||||
|  |         const newConnection = new HubConnectionBuilder() | ||||||
|  |             .withUrl(hub_url) | ||||||
|  |             .withAutomaticReconnect() | ||||||
|  |             .build(); | ||||||
|  |  | ||||||
|  |         this.setState({ hubConnection: newConnection }); | ||||||
|  |  | ||||||
|  |         newConnection.start() | ||||||
|  |             .then(_ => { | ||||||
|  |                 console.log('Hub Connected!'); | ||||||
|  |  | ||||||
|  |                 newConnection.on(Constants.probability_method_name, (id, date, prob) => { | ||||||
|  |                     //console.log(method_name + " recieved: [id: " + id + ", date: " + date + ", prob: " + prob + "]"); | ||||||
|  |                     if (prob > 0.5) { | ||||||
|  |                         var device = this.state.devices.filter(function (x) { return x.id === id })[0] | ||||||
|  |                         var newPoint = { lat: device.coordinates.latitude, lng: device.coordinates.longitude }; | ||||||
|  |                         this.setState({ | ||||||
|  |                             heatmapPoints: [...this.state.heatmapPoints, newPoint] | ||||||
|  |                         }); | ||||||
|  |                     } | ||||||
|  |  | ||||||
|  |                     this.invokeHandlers(Constants.probability_method_name, { point: newPoint, probability: prob }); | ||||||
|  |                 }); | ||||||
|  |  | ||||||
|  |                 newConnection.on(Constants.update_all_method_name, () => { | ||||||
|  |                     this.handleAllDevicesUpdated(service); | ||||||
|  |                     this.invokeHandlers(Constants.update_all_method_name, null); | ||||||
|  |                 }); | ||||||
|  |  | ||||||
|  |                 newConnection.on(Constants.update_method_name, (id) => { | ||||||
|  |                     service.getdevice(id).then(result => { | ||||||
|  |                         var index = this.state.devices.findIndex((d => d.id == id)); | ||||||
|  |                         const newDevices = [...this.state.devices]; | ||||||
|  |                         newDevices[index] = result; | ||||||
|  |                         this.setState({ devices: newDevices }); | ||||||
|  |                         this.invokeHandlers(Constants.update_method_name, result); | ||||||
|  |                     }).catch(ex => console.log("Device update failed.", ex)); | ||||||
|  |                 }) | ||||||
|  |             }).catch(e => console.log('Hub Connection failed: ', e)); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     componentWillUnmount() { | ||||||
|  |         if (this.state.hubConnection != null) { | ||||||
|  |             this.state.hubConnection.off(Constants.probability_method_name); | ||||||
|  |             this.state.hubConnection.off(Constants.update_all_method_name); | ||||||
|  |             this.state.hubConnection.off(Constants.update_method_name); | ||||||
|  |             console.log('Hub Disconnected!'); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     render() { | ||||||
|  |         return ( | ||||||
|  |             <Context.Provider | ||||||
|  |                 value={{ | ||||||
|  |                     devices: this.state.devices, | ||||||
|  |                     heatmapPoints: this.state.heatmapPoints, | ||||||
|  |                     addDevice: this.addDevice, | ||||||
|  |                     addPoint: this.addPoint, | ||||||
|  |  | ||||||
|  |                     addHandler: this.addHandler | ||||||
|  |                 }} | ||||||
|  |             > | ||||||
|  |                 {this.props.children} | ||||||
|  |                 </Context.Provider> | ||||||
|  |             ); | ||||||
|  |     }; | ||||||
|  | } | ||||||
		Reference in New Issue
	
	Block a user