diff --git a/opentech/static_src/src/app/src/containers/NoteListing.js b/opentech/static_src/src/app/src/containers/NoteListing.js index 0e4e12801a3d4a1a225306e9a6628fed0045f98a..eea06b58e25604fc053ac63e073d66bfb2c9522b 100644 --- a/opentech/static_src/src/app/src/containers/NoteListing.js +++ b/opentech/static_src/src/app/src/containers/NoteListing.js @@ -1,8 +1,10 @@ -import React from 'react'; +import React, { useEffect } from 'react'; import PropTypes from 'prop-types'; import { connect } from 'react-redux'; import { CSSTransition } from 'react-transition-group'; +import useInterval from "@rooks/use-interval" + import { fetchNewNotesForSubmission } from '@actions/notes'; import Listing from '@components/Listing'; import Note from '@containers/Note'; @@ -14,49 +16,24 @@ import { } from '@selectors/notes'; -class NoteListing extends React.Component { - static propTypes = { - loadNotes: PropTypes.func, - submissionID: PropTypes.number, - noteIDs: PropTypes.array, - isErrored: PropTypes.bool, - errorMessage: PropTypes.string, - isLoading: PropTypes.bool, - }; - - componentDidUpdate(prevProps) { - const { isLoading, loadNotes, submissionID } = this.props; - const prevSubmissionID = prevProps.submissionID; +const NoteListing = ({loadNotes, submissionID, noteIDs, isErrored, errorMessage, isLoading }) => { + const fetchNotes = () => loadNotes(submissionID) - if( - submissionID !== null && submissionID !== undefined && - prevSubmissionID !== submissionID && !isLoading - ) { - loadNotes(submissionID); + useEffect( () => { + if ( submissionID ) { + fetchNotes() } - } + }, [submissionID]) - componentDidMount() { - const { isLoading, loadNotes, submissionID } = this.props; + useInterval(fetchNotes, 30000) - if (submissionID && !isLoading) { - loadNotes(submissionID); - this.pollNotes = setInterval(() => loadNotes(submissionID), 30000) + const handleRetry = () => { + if (!isLoading || isErrored) { + fetchNotes() } } - componentWillUnmount() { - clearInterval(this.pollNotes) - } - - handleRetry = () => { - if (this.props.isLoading || !this.props.isErrored) { - return; - } - this.props.loadNotes(this.props.submissionID); - } - - renderItem = noteID => { + const renderItem = noteID => { return ( <CSSTransition key={`note-${noteID}`} timeout={200} classNames="add-note"> <Note key={`note-${noteID}`} noteID={noteID} /> @@ -64,22 +41,29 @@ class NoteListing extends React.Component { ); } - render() { - const { noteIDs, isLoading, isErrored, errorMessage } = this.props; - return ( - <Listing - isLoading={ isLoading } - isError={ isErrored } - error={ errorMessage } - handleRetry={ this.handleRetry } - renderItem={ this.renderItem } - items={ noteIDs } - column="notes" - /> - ); - } + return ( + <Listing + isLoading={ isLoading } + isError={ isErrored } + error={ errorMessage } + handleRetry={ handleRetry } + renderItem={ renderItem } + items={ noteIDs } + column="notes" + /> + ); } +NoteListing.propTypes = { + loadNotes: PropTypes.func, + submissionID: PropTypes.number, + noteIDs: PropTypes.array, + isErrored: PropTypes.bool, + errorMessage: PropTypes.string, + isLoading: PropTypes.bool, +}; + + const mapDispatchToProps = dispatch => ({ loadNotes: submissionID => dispatch(fetchNewNotesForSubmission(submissionID)), }); diff --git a/package-lock.json b/package-lock.json index 407c8c2cc2a5689eb9f05e8b66e40a3d8925f530..19268ff324e2a31f659e208d18d2d138b7e91404 100644 --- a/package-lock.json +++ b/package-lock.json @@ -813,6 +813,11 @@ "through2": "^2.0.3" } }, + "@rooks/use-interval": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@rooks/use-interval/-/use-interval-1.2.0.tgz", + "integrity": "sha512-gtYrJUNdYgflZRGwT7NjVqLRiD3EVT1ZxDqDCTStMN5jWtgIZulm8OJ3ZzZn62UTXtoSPcE/pJkQDccaD/NzhA==" + }, "@svgr/babel-plugin-add-jsx-attribute": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-4.0.0.tgz", @@ -8505,20 +8510,20 @@ } }, "react-dom": { - "version": "16.7.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.7.0.tgz", - "integrity": "sha512-D0Ufv1ExCAmF38P2Uh1lwpminZFRXEINJe53zRAbm4KPwSyd6DY/uDoS0Blj9jvPpn1+wivKpZYc8aAAN/nAkg==", + "version": "16.8.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.8.1.tgz", + "integrity": "sha512-N74IZUrPt6UiDjXaO7UbDDFXeUXnVhZzeRLy/6iqqN1ipfjrhR60Bp5NuBK+rv3GMdqdIuwIl22u1SYwf330bg==", "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1", "prop-types": "^15.6.2", - "scheduler": "^0.12.0" + "scheduler": "^0.13.1" } }, "react-hot-loader": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/react-hot-loader/-/react-hot-loader-4.6.3.tgz", - "integrity": "sha512-FUvRO8dwbeLnc3mgLn8ARuSh8NnLBYJyiRjFn+grY/5GupSyPqv0U7ixgwXro77hwDplhm8z9wU7FlJ8kZqiAQ==", + "version": "4.6.5", + "resolved": "https://registry.npmjs.org/react-hot-loader/-/react-hot-loader-4.6.5.tgz", + "integrity": "sha512-ZPAJEWVd8KDdm6dcK0iWrnJiGHruLrcbkIpqn/wQmNjnROpsm2nzrWh23Yh3I/XAjB+35pMa/ZgariwGqwFD9A==", "dev": true, "requires": { "fast-levenshtein": "^2.0.6", @@ -9439,9 +9444,9 @@ "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" }, "scheduler": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.12.0.tgz", - "integrity": "sha512-t7MBR28Akcp4Jm+QoR63XgAi9YgCUmgvDHqf5otgAj4QvdoBE4ImCX0ffehefePPG+aitiYHp0g/mW6s4Tp+dw==", + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.13.1.tgz", + "integrity": "sha512-VJKOkiKIN2/6NOoexuypwSrybx13MY7NSy9RNt8wPvZDMRT1CW6qlpF5jXRToXNHz3uWzbm2elNpZfXfGPqP9A==", "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1" diff --git a/package.json b/package.json index de38ee37b999164cb0a0d60975d79d09e9d0f1ae..a80398b653ac9d44a095ebeb03afd7cea9f11cd5 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,7 @@ ], "dependencies": { "@babel/polyfill": "^7.2.5", + "@rooks/use-interval": "^1.2.0", "@svgr/webpack": "^4.1.0", "del": "^3.0.0", "gulp": "^4.0.0", @@ -30,7 +31,7 @@ "node-sass-import-once": "^1.2.0", "prop-types": "^15.6.2", "react": "^16.8.1", - "react-dom": "^16.7.0", + "react-dom": "^16.8.1", "react-redux": "^6.0.0", "react-rte": "^0.16.1", "react-transition-group": "^2.5.3", @@ -55,7 +56,7 @@ "gulp-sass-lint": "^1.4.0", "gulp-sourcemaps": "^2.6.4", "node-sass": "^4.11.0", - "react-hot-loader": "^4.6.3", + "react-hot-loader": "^4.6.5", "redux-devtools-extension": "^2.13.7", "sass-loader": "^7.1.0", "style-loader": "^0.23.1",