1
0
Fork 0

🐛 Moved state change in DraftConfigurator from render loop to useState. Fixes #105

This commit is contained in:
Joost De Cock 2019-09-06 18:03:09 +02:00
parent 9fa423bce7
commit 983886df83
5 changed files with 43 additions and 38 deletions

View file

@ -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) - [#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 - Workbench now also lets you preload a `withBreasts` set of measurements
- DraftConfigurator now properly styles pattern options 3 levels deep - 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 ### create-freesewing-pattern

View file

@ -20,6 +20,8 @@ Unreleased:
(change in material-ui API when slider came out of beta)" (change in material-ui API when slider came out of beta)"
- Workbench now also lets you preload a `withBreasts` set of measurements - Workbench now also lets you preload a `withBreasts` set of measurements
- DraftConfigurator now properly styles pattern options 3 levels deep - 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: create-freesewing-pattern:
- Added missing `file-saver` dependency - Added missing `file-saver` dependency
jaeger: jaeger:

View file

@ -1,48 +1,49 @@
import React, { useState } from "react"; import React, { useState, useEffect } from 'react'
import PropTypes from "prop-types"; import PropTypes from 'prop-types'
import Radio from "@material-ui/core/Radio"; import Radio from '@material-ui/core/Radio'
import RadioGroup from "@material-ui/core/RadioGroup"; import RadioGroup from '@material-ui/core/RadioGroup'
import FormControlLabel from "@material-ui/core/FormControlLabel"; import FormControlLabel from '@material-ui/core/FormControlLabel'
const Bool = props => { 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 = () => { const toggle = () => {
props.updateValue(props.name, !value); props.updateValue(props.name, !value)
setValue(!value); setValue(!value)
}; }
// Force state update when rerendering due to props change
if (props.value !== value) setValue(props.value);
return ( return (
<RadioGroup onChange={toggle} value={JSON.stringify(value)}> <RadioGroup onChange={toggle} value={JSON.stringify(value)}>
<FormControlLabel <FormControlLabel
control={<Radio color="primary" />} control={<Radio color="primary" />}
value="false" value="false"
checked={value === "false" || value === false ? true : false} checked={value === 'false' || value === false ? true : false}
label={props.labels[0]} label={props.labels[0]}
className="po-list-item" className="po-list-item"
/> />
<FormControlLabel <FormControlLabel
control={<Radio color="primary" />} control={<Radio color="primary" />}
value="true" value="true"
checked={value === "true" || value === true ? true : false} checked={value === 'true' || value === true ? true : false}
label={props.labels[1]} label={props.labels[1]}
className="po-list-item" className="po-list-item"
/> />
</RadioGroup> </RadioGroup>
); )
}; }
Bool.propTypes = { Bool.propTypes = {
dflt: PropTypes.bool, dflt: PropTypes.bool,
labels: PropTypes.array, labels: PropTypes.array,
updateValue: PropTypes.func.isRequired, updateValue: PropTypes.func.isRequired,
name: PropTypes.string.isRequired name: PropTypes.string.isRequired
}; }
Bool.defaultProps = { Bool.defaultProps = {
dflt: false, dflt: false,
labels: ["false", "true"] labels: ['false', 'true']
}; }
export default Bool; export default Bool

View file

@ -1,17 +1,18 @@
import React, { useState } from "react"; import React, { useState, useEffect } from 'react'
import PropTypes from "prop-types"; import PropTypes from 'prop-types'
import Radio from "@material-ui/core/Radio"; import Radio from '@material-ui/core/Radio'
import RadioGroup from "@material-ui/core/RadioGroup"; import RadioGroup from '@material-ui/core/RadioGroup'
import FormControlLabel from "@material-ui/core/FormControlLabel"; import FormControlLabel from '@material-ui/core/FormControlLabel'
const FormFieldList = props => { 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 => { const update = evt => {
props.updateValue(props.name, evt.target.value); props.updateValue(props.name, evt.target.value)
setValue(evt.target.value); setValue(evt.target.value)
}; }
// Force state update when rerendering due to props change
if (props.value !== value) setValue(props.value);
return ( return (
<RadioGroup onChange={update} value={value}> <RadioGroup onChange={update} value={value}>
@ -26,8 +27,8 @@ const FormFieldList = props => {
/> />
))} ))}
</RadioGroup> </RadioGroup>
); )
}; }
FormFieldList.propTypes = { FormFieldList.propTypes = {
dflt: PropTypes.oneOfType([ dflt: PropTypes.oneOfType([
@ -38,6 +39,6 @@ FormFieldList.propTypes = {
list: PropTypes.object, list: PropTypes.object,
updateValue: PropTypes.func.isRequired, updateValue: PropTypes.func.isRequired,
name: PropTypes.string.isRequired name: PropTypes.string.isRequired
}; }
export default FormFieldList; export default FormFieldList

View file

@ -1,4 +1,4 @@
import React, { useState } from 'react' import React, { useState, useEffect } from 'react'
import PropTypes from 'prop-types' import PropTypes from 'prop-types'
import Slider from '@material-ui/core/Slider' import Slider from '@material-ui/core/Slider'
import { withStyles } from '@material-ui/core/styles' import { withStyles } from '@material-ui/core/styles'
@ -13,15 +13,15 @@ const PaddedSlider = withStyles({
const FormFieldSlider = props => { const FormFieldSlider = props => {
const [value, setValue] = useState(props.value) const [value, setValue] = useState(props.value)
useEffect(() => {
if (props.value !== value) setValue(props.value)
}, [props.value])
const update = (evt, newValue) => { const update = (evt, newValue) => {
props.updateValue(props.name, newValue, evt) props.updateValue(props.name, newValue, evt)
setValue(newValue) setValue(newValue)
} }
// Force state update when rerendering due to props change
if (props.value !== value) setValue(props.value)
return ( return (
<PaddedSlider <PaddedSlider
value={value} value={value}