From 3333250ede3d4b9216ea8b446a14ef4d1d79b36a Mon Sep 17 00:00:00 2001 From: ThibG Date: Wed, 29 May 2019 16:33:15 +0200 Subject: [PATCH] Fix React warning about legacy lifecycle calls and sensitive status resetting (#10872) --- app/javascript/mastodon/components/status.js | 13 +++++++++---- app/javascript/mastodon/features/status/index.js | 5 +++-- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/app/javascript/mastodon/components/status.js b/app/javascript/mastodon/components/status.js index 28738105a..6e944dc9e 100644 --- a/app/javascript/mastodon/components/status.js +++ b/app/javascript/mastodon/components/status.js @@ -18,7 +18,6 @@ import classNames from 'classnames'; import Icon from 'mastodon/components/icon'; import PollContainer from 'mastodon/containers/poll_container'; import { displayMedia } from '../initial_state'; -import { is } from 'immutable'; // We use the component (and not the container) since we do not want // to use the progress bar to show download progress @@ -101,6 +100,7 @@ class Status extends ImmutablePureComponent { state = { showMedia: defaultMediaVisibility(this.props.status), + statusId: undefined, }; // Track height changes we know about to compensate scrolling @@ -116,9 +116,14 @@ class Status extends ImmutablePureComponent { } } - componentWillReceiveProps (nextProps) { - if (!is(nextProps.status, this.props.status) && nextProps.status) { - this.setState({ showMedia: defaultMediaVisibility(nextProps.status) }); + static getDerivedStateFromProps(nextProps, prevState) { + if (nextProps.status && nextProps.status.get('id') !== prevState.statusId) { + return { + showMedia: defaultMediaVisibility(nextProps.status), + statusId: nextProps.status.get('id'), + }; + } else { + return null; } } diff --git a/app/javascript/mastodon/features/status/index.js b/app/javascript/mastodon/features/status/index.js index d8c4c50dc..981eb9d58 100644 --- a/app/javascript/mastodon/features/status/index.js +++ b/app/javascript/mastodon/features/status/index.js @@ -132,6 +132,7 @@ class Status extends ImmutablePureComponent { state = { fullscreen: false, showMedia: defaultMediaVisibility(this.props.status), + loadedStatusId: undefined, }; componentWillMount () { @@ -148,8 +149,8 @@ class Status extends ImmutablePureComponent { this.props.dispatch(fetchStatus(nextProps.params.statusId)); } - if (!Immutable.is(nextProps.status, this.props.status) && nextProps.status) { - this.setState({ showMedia: defaultMediaVisibility(nextProps.status) }); + if (nextProps.status && nextProps.status.get('id') !== this.state.loadedStatusId) { + this.setState({ showMedia: defaultMediaVisibility(nextProps.status), loadedStatusId: nextProps.status.get('id') }); } }