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.

201 lines
7.0 KiB

  1. import React, { Fragment } from 'react';
  2. import PropTypes from 'prop-types';
  3. import { withStyles } from '@material-ui/core/styles';
  4. import Button from '@material-ui/core/Button';
  5. import Checkbox from '@material-ui/core/Checkbox';
  6. import FormControlLabel from '@material-ui/core/FormControlLabel';
  7. import List from '@material-ui/core/List';
  8. import ListItem from '@material-ui/core/ListItem';
  9. import ListItemText from '@material-ui/core/ListItemText';
  10. import ListItemAvatar from '@material-ui/core/ListItemAvatar';
  11. import ListItemSecondaryAction from '@material-ui/core/ListItemSecondaryAction';
  12. import Avatar from '@material-ui/core/Avatar';
  13. import IconButton from '@material-ui/core/IconButton';
  14. import LockIcon from '@material-ui/icons/Lock';
  15. import LockOpenIcon from '@material-ui/icons/LockOpen';
  16. import DeleteIcon from '@material-ui/icons/Delete';
  17. import SaveIcon from '@material-ui/icons/Save';
  18. import { TextValidator, ValidatorForm } from 'react-material-ui-form-validator';
  19. import { isNetworkOpen, networkSecurityMode } from '../constants/WiFiSecurityModes';
  20. import isIP from '../validators/isIP';
  21. import isHostname from '../validators/isHostname';
  22. import optional from '../validators/optional';
  23. import PasswordValidator from '../components/PasswordValidator';
  24. const styles = theme => ({
  25. textField: {
  26. width: "100%"
  27. },
  28. checkboxControl: {
  29. width: "100%"
  30. },
  31. button: {
  32. marginRight: theme.spacing(2),
  33. marginTop: theme.spacing(2),
  34. }
  35. });
  36. class WiFiSettingsForm extends React.Component {
  37. componentWillMount() {
  38. ValidatorForm.addValidationRule('isIP', isIP);
  39. ValidatorForm.addValidationRule('isHostname', isHostname);
  40. ValidatorForm.addValidationRule('isOptionalIP', optional(isIP));
  41. }
  42. renderSelectedNetwork() {
  43. const { selectedNetwork, deselectNetwork } = this.props;
  44. return (
  45. <List>
  46. <ListItem>
  47. <ListItemAvatar>
  48. <Avatar>
  49. {isNetworkOpen(selectedNetwork) ? <LockOpenIcon /> : <LockIcon />}
  50. </Avatar>
  51. </ListItemAvatar>
  52. <ListItemText
  53. primary={selectedNetwork.ssid}
  54. secondary={"Security: " + networkSecurityMode(selectedNetwork) + ", Ch: " + selectedNetwork.channel}
  55. />
  56. <ListItemSecondaryAction>
  57. <IconButton aria-label="Manual Config" onClick={deselectNetwork}>
  58. <DeleteIcon />
  59. </IconButton>
  60. </ListItemSecondaryAction>
  61. </ListItem>
  62. </List>
  63. );
  64. }
  65. render() {
  66. const { classes, wifiSettings, selectedNetwork, handleValueChange, handleCheckboxChange, onSubmit, onReset } = this.props;
  67. return (
  68. <ValidatorForm onSubmit={onSubmit} ref="WiFiSettingsForm">
  69. {
  70. selectedNetwork ? this.renderSelectedNetwork() :
  71. <TextValidator
  72. validators={['matchRegexp:^.{0,32}$']}
  73. errorMessages={['SSID must be 32 characters or less']}
  74. name="ssid"
  75. label="SSID"
  76. className={classes.textField}
  77. value={wifiSettings.ssid}
  78. onChange={handleValueChange('ssid')}
  79. margin="normal"
  80. />
  81. }
  82. {
  83. !isNetworkOpen(selectedNetwork) &&
  84. <PasswordValidator
  85. validators={['matchRegexp:^.{0,64}$']}
  86. errorMessages={['Password must be 64 characters or less']}
  87. name="password"
  88. label="Password"
  89. className={classes.textField}
  90. value={wifiSettings.password}
  91. onChange={handleValueChange('password')}
  92. margin="normal"
  93. />
  94. }
  95. <TextValidator
  96. validators={['required', 'isHostname']}
  97. errorMessages={['Hostname is required', "Not a valid hostname"]}
  98. name="hostname"
  99. label="Hostname"
  100. className={classes.textField}
  101. value={wifiSettings.hostname}
  102. onChange={handleValueChange('hostname')}
  103. margin="normal"
  104. />
  105. <FormControlLabel className={classes.checkboxControl}
  106. control={
  107. <Checkbox
  108. value="static_ip_config"
  109. checked={wifiSettings.static_ip_config}
  110. onChange={handleCheckboxChange("static_ip_config")}
  111. />
  112. }
  113. label="Static IP Config?"
  114. />
  115. {
  116. wifiSettings.static_ip_config &&
  117. <Fragment>
  118. <TextValidator
  119. validators={['required', 'isIP']}
  120. errorMessages={['Local IP is required', 'Must be an IP address']}
  121. name="local_ip"
  122. label="Local IP"
  123. className={classes.textField}
  124. value={wifiSettings.local_ip}
  125. onChange={handleValueChange('local_ip')}
  126. margin="normal"
  127. />
  128. <TextValidator
  129. validators={['required', 'isIP']}
  130. errorMessages={['Gateway IP is required', 'Must be an IP address']}
  131. name="gateway_ip"
  132. label="Gateway"
  133. className={classes.textField}
  134. value={wifiSettings.gateway_ip}
  135. onChange={handleValueChange('gateway_ip')}
  136. margin="normal"
  137. />
  138. <TextValidator
  139. validators={['required', 'isIP']}
  140. errorMessages={['Subnet mask is required', 'Must be an IP address']}
  141. name="subnet_mask"
  142. label="Subnet"
  143. className={classes.textField}
  144. value={wifiSettings.subnet_mask}
  145. onChange={handleValueChange('subnet_mask')}
  146. margin="normal"
  147. />
  148. <TextValidator
  149. validators={['isOptionalIP']}
  150. errorMessages={['Must be an IP address']}
  151. name="dns_ip_1"
  152. label="DNS IP #1"
  153. className={classes.textField}
  154. value={wifiSettings.dns_ip_1}
  155. onChange={handleValueChange('dns_ip_1')}
  156. margin="normal"
  157. />
  158. <TextValidator
  159. validators={['isOptionalIP']}
  160. errorMessages={['Must be an IP address']}
  161. name="dns_ip_2"
  162. label="DNS IP #2"
  163. className={classes.textField}
  164. value={wifiSettings.dns_ip_2}
  165. onChange={handleValueChange('dns_ip_2')}
  166. margin="normal"
  167. />
  168. </Fragment>
  169. }
  170. <Button startIcon={<SaveIcon />} variant="contained" color="primary" className={classes.button} type="submit">
  171. Save
  172. </Button>
  173. <Button variant="contained" color="secondary" className={classes.button} onClick={onReset}>
  174. Reset
  175. </Button>
  176. </ValidatorForm>
  177. );
  178. }
  179. }
  180. WiFiSettingsForm.propTypes = {
  181. classes: PropTypes.object.isRequired,
  182. wifiSettings: PropTypes.object,
  183. deselectNetwork: PropTypes.func,
  184. selectedNetwork: PropTypes.object,
  185. onSubmit: PropTypes.func.isRequired,
  186. onReset: PropTypes.func.isRequired,
  187. handleValueChange: PropTypes.func.isRequired,
  188. handleCheckboxChange: PropTypes.func.isRequired
  189. };
  190. export default withStyles(styles)(WiFiSettingsForm);