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.

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