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 Alerts extends Component { constructor(props) { super(props); this.handleDeviceNameChange = this.handleDeviceNameChange.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: [], alerts: [], lastevalkey: null, deviceId: '', updatedDeviceId: '', show: false, eventDetail: false, eventDetailError: false, eventDetailLoading: false, isInit: true, isMinimized: false, isPacked: false, }; } componentDidMount() { this.handleResize(); this.getDevices(); this.getAlerts(); 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.getAlerts(); } 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({ alerts: [], lastevalkey: null, error: false, deviceId: this.state.updatedDeviceId, }); this.getAlerts(); }; // 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 alerts for the user getAlerts = async () => { this.setState({ isLoading: true }); let token = await this.props.getToken(); let apiName = 'smart-product-api'; let path = 'devices/alerts'; let params = { headers: { 'Authorization': token, }, response: true, queryStringParameters: { lastevalkey: JSON.stringify(this.state.lastevalkey), deviceId : this.state.deviceId, } }; 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, alerts: [ ...this.state.alerts, ...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 }); }; // 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) .then(response => { let updatedAlerts = this.state.alerts.filter(alert => alert.id !== eventId ); this.setState({ alerts: updatedAlerts }); }) .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, alerts, deviceId, 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( ) }) }
} /> { !isMinimized && { thArray.map((prop, key) => { return ( {prop} ); }) } {/* If there is no event, showing no event found */} { alerts.length === 0 && !isLoading && !hasMore && No event found. } { alerts.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 */} { alerts.length === 0 && !isLoading && !hasMore &&
No event found.
} { alerts.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 Alerts;