diff --git a/CHANGELOG.md b/CHANGELOG.md index 2676d58e022..a53da0b218f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ - [#104](https://github.com/freesewing/freesewing.org/issues/104): Changed `onDragEnd` to `onChangeCommitted` in slider element (change in material-ui API when slider came out of beta) - Workbench now also lets you preload a `withBreasts` set of measurements - DraftConfigurator now properly styles pattern options 3 levels deep + - [#105](https://github.com/freesewing/freesewing.org/issues/105): Moved state change in render loop to useEffect ### create-freesewing-pattern diff --git a/config/changelog.yaml b/config/changelog.yaml index c422303f73a..cf783b59e05 100644 --- a/config/changelog.yaml +++ b/config/changelog.yaml @@ -20,6 +20,8 @@ Unreleased: (change in material-ui API when slider came out of beta)" - Workbench now also lets you preload a `withBreasts` set of measurements - DraftConfigurator now properly styles pattern options 3 levels deep + - "[#105](https://github.com/freesewing/freesewing.org/issues/105): + Moved state change in render loop to useEffect" create-freesewing-pattern: - Added missing `file-saver` dependency jaeger: diff --git a/packages/components/src/.form/FormFieldBool/index.js b/packages/components/src/.form/FormFieldBool/index.js index 2f79998d47a..c4b23ecd92b 100644 --- a/packages/components/src/.form/FormFieldBool/index.js +++ b/packages/components/src/.form/FormFieldBool/index.js @@ -1,48 +1,49 @@ -import React, { useState } from "react"; -import PropTypes from "prop-types"; -import Radio from "@material-ui/core/Radio"; -import RadioGroup from "@material-ui/core/RadioGroup"; -import FormControlLabel from "@material-ui/core/FormControlLabel"; +import React, { useState, useEffect } from 'react' +import PropTypes from 'prop-types' +import Radio from '@material-ui/core/Radio' +import RadioGroup from '@material-ui/core/RadioGroup' +import FormControlLabel from '@material-ui/core/FormControlLabel' const Bool = props => { - const [value, setValue] = useState(props.dflt); + const [value, setValue] = useState(props.dflt) + useEffect(() => { + if (props.value !== value) setValue(props.value) + }, [props.value]) const toggle = () => { - props.updateValue(props.name, !value); - setValue(!value); - }; - // Force state update when rerendering due to props change - if (props.value !== value) setValue(props.value); + props.updateValue(props.name, !value) + setValue(!value) + } return ( } value="false" - checked={value === "false" || value === false ? true : false} + checked={value === 'false' || value === false ? true : false} label={props.labels[0]} className="po-list-item" /> } value="true" - checked={value === "true" || value === true ? true : false} + checked={value === 'true' || value === true ? true : false} label={props.labels[1]} className="po-list-item" /> - ); -}; + ) +} Bool.propTypes = { dflt: PropTypes.bool, labels: PropTypes.array, updateValue: PropTypes.func.isRequired, name: PropTypes.string.isRequired -}; +} Bool.defaultProps = { dflt: false, - labels: ["false", "true"] -}; + labels: ['false', 'true'] +} -export default Bool; +export default Bool diff --git a/packages/components/src/.form/FormFieldList/index.js b/packages/components/src/.form/FormFieldList/index.js index 72fedfe06ec..84cd273b653 100644 --- a/packages/components/src/.form/FormFieldList/index.js +++ b/packages/components/src/.form/FormFieldList/index.js @@ -1,17 +1,18 @@ -import React, { useState } from "react"; -import PropTypes from "prop-types"; -import Radio from "@material-ui/core/Radio"; -import RadioGroup from "@material-ui/core/RadioGroup"; -import FormControlLabel from "@material-ui/core/FormControlLabel"; +import React, { useState, useEffect } from 'react' +import PropTypes from 'prop-types' +import Radio from '@material-ui/core/Radio' +import RadioGroup from '@material-ui/core/RadioGroup' +import FormControlLabel from '@material-ui/core/FormControlLabel' const FormFieldList = props => { - const [value, setValue] = useState(props.dflt); + const [value, setValue] = useState(props.dflt) + useEffect(() => { + if (props.value !== value) setValue(props.value) + }, [props.value]) const update = evt => { - props.updateValue(props.name, evt.target.value); - setValue(evt.target.value); - }; - // Force state update when rerendering due to props change - if (props.value !== value) setValue(props.value); + props.updateValue(props.name, evt.target.value) + setValue(evt.target.value) + } return ( @@ -26,8 +27,8 @@ const FormFieldList = props => { /> ))} - ); -}; + ) +} FormFieldList.propTypes = { dflt: PropTypes.oneOfType([ @@ -38,6 +39,6 @@ FormFieldList.propTypes = { list: PropTypes.object, updateValue: PropTypes.func.isRequired, name: PropTypes.string.isRequired -}; +} -export default FormFieldList; +export default FormFieldList diff --git a/packages/components/src/.form/FormFieldSlider/index.js b/packages/components/src/.form/FormFieldSlider/index.js index 9d0c617fa69..03196f79126 100644 --- a/packages/components/src/.form/FormFieldSlider/index.js +++ b/packages/components/src/.form/FormFieldSlider/index.js @@ -1,4 +1,4 @@ -import React, { useState } from 'react' +import React, { useState, useEffect } from 'react' import PropTypes from 'prop-types' import Slider from '@material-ui/core/Slider' import { withStyles } from '@material-ui/core/styles' @@ -13,15 +13,15 @@ const PaddedSlider = withStyles({ const FormFieldSlider = props => { const [value, setValue] = useState(props.value) + useEffect(() => { + if (props.value !== value) setValue(props.value) + }, [props.value]) const update = (evt, newValue) => { props.updateValue(props.name, newValue, evt) setValue(newValue) } - // Force state update when rerendering due to props change - if (props.value !== value) setValue(props.value) - return (