Created
June 1, 2020 17:09
-
-
Save mreigen/f3c04585f0f5730856e8387b9470914a to your computer and use it in GitHub Desktop.
Auto save in ReactJS using setTimeout
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import RichText from "../controls/rich_text"; | |
const SavingState = Object.freeze({ | |
NOT_SAVED: 0, | |
SAVING: 1, | |
SAVED: 2 | |
}); | |
class TextQuestion extends React.Component { | |
constructor(props) { | |
super(props); | |
this.state = { | |
text: "", | |
saving: SavingState.NOT_SAVED | |
}; | |
this.update = this.update.bind(this); | |
} | |
componentDidMount() { | |
this.timer = null; | |
} | |
update(text) { | |
clearTimeout(this.timer); | |
this.setState({ text, saving: SavingState.NOT_SAVED }); | |
this.timer = setTimeout(() => { | |
this.setState({ text, saving: SavingState.SAVING }); | |
// calls API | |
callAPIToSaveText({ answer: text }).then(() => this.setState({ saving: SavingState.SAVED })); | |
}, 500); | |
} | |
render() { | |
<RichText.NoToolbar editorClass="small" value={this.state.text} onChange={this.update} /> | |
<AutoSaveDisplay saving={this.state.saving} /> | |
} | |
} | |
const AutoSaveDisplay = ({ saving }) => { | |
let display; | |
switch (saving) { | |
case SavingState.SAVING: | |
display = <em>saving...</em>; | |
break; | |
case SavingState.SAVED: | |
display = ( | |
<> | |
<Icon check /> <em>saved!</em> | |
</> | |
); | |
break; | |
default: | |
display = <br />; | |
} | |
return <div className="auto-save-display">{display}</div>; | |
}; | |
AutoSaveDisplay.propTypes = { | |
saving: PropTypes.oneOf(Object.values(SavingState)) | |
}; | |
// styles I use for auto-save-display | |
// .auto-save-display { | |
// display: block; | |
// height: 25px; | |
//} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment