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