Fork of the excellent esp8266-react - https://github.com/rjwats/esp8266-react
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

176 lines
5.7 KiB

  1. import React, { Component, Fragment } from 'react';
  2. import { withStyles } from '@material-ui/core/styles';
  3. import Button from '@material-ui/core/Button';
  4. import LinearProgress from '@material-ui/core/LinearProgress';
  5. import Typography from '@material-ui/core/Typography';
  6. import List from '@material-ui/core/List';
  7. import ListItem from '@material-ui/core/ListItem';
  8. import ListItemText from '@material-ui/core/ListItemText';
  9. import ListItemAvatar from '@material-ui/core/ListItemAvatar';
  10. import Avatar from '@material-ui/core/Avatar';
  11. import Divider from '@material-ui/core/Divider';
  12. import WifiIcon from '@material-ui/icons/Wifi';
  13. import DNSIcon from '@material-ui/icons/Dns';
  14. import SettingsInputComponentIcon from '@material-ui/icons/SettingsInputComponent';
  15. import SettingsInputAntennaIcon from '@material-ui/icons/SettingsInputAntenna';
  16. import DeviceHubIcon from '@material-ui/icons/DeviceHub';
  17. import SectionContent from '../components/SectionContent';
  18. import { WIFI_STATUS_ENDPOINT } from '../constants/Endpoints';
  19. import { isConnected, connectionStatus, connectionStatusHighlight } from '../constants/WiFiConnectionStatus';
  20. import * as Highlight from '../constants/Highlight';
  21. import { restComponent } from '../components/RestComponent';
  22. const styles = theme => ({
  23. ["wifiStatus_" + Highlight.IDLE]: {
  24. backgroundColor: theme.palette.highlight_idle
  25. },
  26. ["wifiStatus_" + Highlight.SUCCESS]: {
  27. backgroundColor: theme.palette.highlight_success
  28. },
  29. ["wifiStatus_" + Highlight.ERROR]: {
  30. backgroundColor: theme.palette.highlight_error
  31. },
  32. ["wifiStatus_" + Highlight.WARN]: {
  33. backgroundColor: theme.palette.highlight_warn
  34. },
  35. fetching: {
  36. margin: theme.spacing(4),
  37. textAlign: "center"
  38. },
  39. button: {
  40. marginRight: theme.spacing(2),
  41. marginTop: theme.spacing(2),
  42. }
  43. });
  44. class WiFiStatus extends Component {
  45. componentDidMount() {
  46. this.props.loadData();
  47. }
  48. dnsServers(status) {
  49. if (!status.dns_ip_1) {
  50. return "none";
  51. }
  52. return status.dns_ip_1 + (status.dns_ip_2 ? ',' + status.dns_ip_2 : '');
  53. }
  54. createListItems(data, classes) {
  55. return (
  56. <Fragment>
  57. <ListItem>
  58. <ListItemAvatar>
  59. <Avatar className={classes["wifiStatus_" + connectionStatusHighlight(data)]}>
  60. <WifiIcon />
  61. </Avatar>
  62. </ListItemAvatar>
  63. <ListItemText primary="Connection Status" secondary={connectionStatus(data)} />
  64. </ListItem>
  65. <Divider variant="inset" component="li" />
  66. {
  67. isConnected(data) &&
  68. <Fragment>
  69. <ListItem>
  70. <ListItemAvatar>
  71. <Avatar>
  72. <SettingsInputAntennaIcon />
  73. </Avatar>
  74. </ListItemAvatar>
  75. <ListItemText primary="SSID" secondary={data.ssid} />
  76. </ListItem>
  77. <Divider variant="inset" component="li" />
  78. <ListItem>
  79. <ListItemAvatar>
  80. <Avatar>IP</Avatar>
  81. </ListItemAvatar>
  82. <ListItemText primary="IP Address" secondary={data.local_ip} />
  83. </ListItem>
  84. <Divider variant="inset" component="li" />
  85. <ListItem>
  86. <ListItemAvatar>
  87. <Avatar>
  88. <DeviceHubIcon />
  89. </Avatar>
  90. </ListItemAvatar>
  91. <ListItemText primary="MAC Address" secondary={data.mac_address} />
  92. </ListItem>
  93. <Divider variant="inset" component="li" />
  94. <ListItem>
  95. <ListItemAvatar>
  96. <Avatar>#</Avatar>
  97. </ListItemAvatar>
  98. <ListItemText primary="Subnet Mask" secondary={data.subnet_mask} />
  99. </ListItem>
  100. <Divider variant="inset" component="li" />
  101. <ListItem>
  102. <ListItemAvatar>
  103. <Avatar>
  104. <SettingsInputComponentIcon />
  105. </Avatar>
  106. </ListItemAvatar>
  107. <ListItemText primary="Gateway IP" secondary={data.gateway_ip ? data.gateway_ip : "none"} />
  108. </ListItem>
  109. <Divider variant="inset" component="li" />
  110. <ListItem>
  111. <ListItemAvatar>
  112. <Avatar>
  113. <DNSIcon />
  114. </Avatar>
  115. </ListItemAvatar>
  116. <ListItemText primary="DNS Server IP" secondary={this.dnsServers(data)} />
  117. </ListItem>
  118. <Divider variant="inset" component="li" />
  119. </Fragment>
  120. }
  121. </Fragment>
  122. );
  123. }
  124. renderWiFiStatus(data, classes) {
  125. return (
  126. <div>
  127. <List>
  128. {this.createListItems(data, classes)}
  129. </List>
  130. <Button variant="contained" color="secondary" className={classes.button} onClick={this.props.loadData}>
  131. Refresh
  132. </Button>
  133. </div>
  134. );
  135. }
  136. render() {
  137. const { data, fetched, errorMessage, classes } = this.props;
  138. return (
  139. <SectionContent title="WiFi Status">
  140. {
  141. !fetched ?
  142. <div>
  143. <LinearProgress className={classes.fetching} />
  144. <Typography variant="h4" className={classes.fetching}>
  145. Loading...
  146. </Typography>
  147. </div>
  148. :
  149. data ? this.renderWiFiStatus(data, classes)
  150. :
  151. <div>
  152. <Typography variant="h4" className={classes.fetching}>
  153. {errorMessage}
  154. </Typography>
  155. <Button variant="contained" color="secondary" className={classes.button} onClick={this.props.loadData}>
  156. Refresh
  157. </Button>
  158. </div>
  159. }
  160. </SectionContent>
  161. )
  162. }
  163. }
  164. export default restComponent(WIFI_STATUS_ENDPOINT, withStyles(styles)(WiFiStatus));