import React, { Component } from "react"; import { API } from "aws-amplify"; import { Grid, Row, Col, Table, Alert, Button, Label, ProgressBar, FormControl, FormGroup, ControlLabel, Modal } from "react-bootstrap"; import Card from "components/Card/Card.jsx"; class History extends Component { constructor(props) { super(props); this.handleDeviceNameChange = this.handleDeviceNameChange.bind(this); this.handleEventTypeChange = this.handleEventTypeChange.bind(this); this.handleSubmit = this.handleSubmit.bind(this); this.handleEventDetailShow = this.handleEventDetailShow.bind(this); this.handleEventDetailClose = this.handleEventDetailClose.bind(this); // Sets up initial state this.state = { error: false, hasMore: true, isLoading: false, devices: [], events: [], lastevalkey: null, deviceId: '', updatedDeviceId: '', eventType: '', updatedEventType: '', show: false, eventDetail: false, eventDetailError: false, eventDetailLoading: false, isInit: true, isMinimized: false, isPacked: false, }; } componentDidMount() { this.handleResize(); this.getDevices(); this.getHistory(); window.addEventListener('scroll', this.handleScroll); window.addEventListener('resize', this.handleResize); } componentWillUnmount() { window.removeEventListener('scroll', this.handleScroll); window.removeEventListener('resize', this.handleResize); } // Handles scroll down to load more handleScroll = (_event) => { const {error, isLoading, hasMore} = this.state; if (error || isLoading || !hasMore) return; if (this.props.isScrollBottom() && !this.state.isInit) { this.getHistory(); } this.setState({ isInit: false }); }; // Handles window resize handleResize = (_event) => { if (window.innerWidth < 993) { this.setState({ isMinimized: true, }); } else { this.setState({ isMinimized: false, }); if (window.innerWidth < 1380) { this.setState({ isPacked: true, }); } else { this.setState({ isPacked: false, }); } } }; // Handles submit handleSubmit = async event => { event.preventDefault(); this.setState({ events: [], lastevalkey: null, error: false, eventType: this.state.updatedEventType, deviceId: this.state.updatedDeviceId, }); this.getHistory(); }; // Gets devices for the user getDevices = async() => { this.setState({ isLoading: true }); let token = await this.props.getToken(); let apiName = 'smart-product-api'; let path = 'registration'; let params = { headers: { 'Authorization': token, }, response: true, }; API.get(apiName, path, params) .then(response => { let devices = response.data; this.setState({ devices: devices }); }) .catch(error => { let message = error.response; if (message === undefined) { message = error.message; } else { message = error.response.data.message; } this.setState({ error: message, }); }) .finally(() => { this.setState({ isLoading: false, }); }); }; // Gets event history for the user getHistory = async () => { this.setState({ isLoading: true}); let token = await this.props.getToken(); let apiName = 'smart-product-api'; let path = 'devices/events'; let params = { headers: { 'Authorization': token, }, response: true, queryStringParameters: { lastevalkey: JSON.stringify(this.state.lastevalkey), deviceId : this.state.deviceId, eventType: this.state.eventType } }; API.get(apiName, path, params) .then(response => { /** * If response has no data and lastevalkey is null, there is no more data. * Otherwise, show the data. */ if (response.data.Items.length === 0 && (response.data.LastEvaluatedKey === null || response.data.LastEvaluatedKey === undefined)) { this.setState({ hasMore: false, }); } else { this.setState({ hasMore: response.data.LastEvaluatedKey !== undefined, lastevalkey: response.data.LastEvaluatedKey, deviceId: response.data.deviceId, eventType: response.data.eventType, events: [ ...this.state.events, ...response.data.Items ] }); } }) .catch(error => { let message = error.response; if (message === undefined) { message = error.message; } else { message = error.response.data.message; } this.setState({ error: message, }); }) .finally(() => { this.setState({ isLoading: false, }); }); }; // Handles input changes handleDeviceNameChange = (event) => { this.setState({ updatedDeviceId: event.target.value }); } handleEventTypeChange = (event) => { this.setState({ updatedEventType: event.target.value }); } // Handles event detail handleEventDetailShow = async (deviceId, eventId) => { this.setState({ eventDetailError: false, eventDetail: false, eventDetailLoading: true }); let token = await this.props.getToken(); let apiName = 'smart-product-api'; let path = `devices/${deviceId}/events/${eventId}`; let params = { headers: { 'Authorization': token, }, response: true }; API.get(apiName, path, params) .then(response => { this.setState({ eventDetail: response.data }); if (!response.data.ack) { this.updateEvent(deviceId, eventId); } }) .catch(error => { let message = error.response; if (message === undefined) { message = error.message; } else { message = error.response.data.message; } this.setState({ eventDetailError: message }); }) .finally(() => { this.setState({ eventDetailLoading: false }); }); this.setState({ show: true }); } // Handles event detail close handleEventDetailClose = () => { this.setState({ show: false }); } // Updates the event updateEvent = async (deviceId, eventId) => { let token = await this.props.getToken(); let apiName = 'smart-product-api'; let path = `devices/${deviceId}/events/${eventId}`; let params = { headers: { 'Authorization': token, }, body: { id: eventId, ack: true, suppress: true, }, }; API.put(apiName, path, params) .catch(error => { let message = error.response; if (message === undefined) { message = error.message; } else { message = error.response.data.message; } this.setState({ eventDetailError: message }); }); }; render() { const { error, isLoading, hasMore, devices, events, deviceId, eventType, eventDetailError, eventDetail, eventDetailLoading } = this.state; const { isMinimized, isPacked } = this.state; const thArray = ['Event Message', 'Device Name', 'Event Type', 'Created At']; return (
ID | {eventDetail.id} |
Device ID | {eventDetail.deviceId} |
Message | {eventDetail.message} |
Details |
{
Object.keys(eventDetail.details).map(key => {
return(
{eventDetail.details[key]}
)
})
}
|
Type | {eventDetail.type} |
Created At | {eventDetail.createdAt} |
Sent At | {eventDetail.sentAt} |
Updated At | {eventDetail.updatedAt} |
Acknowledged | {eventDetail.ack ? "Read" : "Unread"} |