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.

187 lines
5.3 KiB

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