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 (
Search by Device Name { devices.map(device => { return( ) }) } Search by Event Type
} /> { !isMinimized && { thArray.map((prop, key) => { return ( {prop} ); }) } {/* If there is no event, showing no event found */} { events.length === 0 && !isLoading && !hasMore && No event found. } { events.map(event => { return (
{event.deviceName}
{ event.type === 'info' && } { event.type === 'warning' && } { event.type === 'error' && } { event.type === 'diagnostic' && } { isPacked && this.props.handleDateSize(event.createdAt) } { !isPacked && event.createdAt } ); }) } } /> } { isMinimized && {/* If there is no event, showing no event found */} { events.length === 0 && !isLoading && !hasMore &&
No event found.
} { events.map(event => { return (
this.handleEventDetailShow(event.deviceId, event.id)}> {this.props.handleDateSize(event.createdAt)} {event.deviceName} { event.type === 'info' && } { event.type === 'warning' && } { event.type === 'error' && } { event.type === 'diagnostic' && }
); }) }
} /> }
{ isLoading &&
} { error && {this.state.error} }
Event Detail { eventDetailLoading &&
} { eventDetailError && {this.state.eventDetailError} } { eventDetail &&
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"}
}
); } } export default History;