@@ 196,8 196,8 @@ class Status extends ImmutablePureComponent {
dispatch: PropTypes.func.isRequired,
status: ImmutablePropTypes.map,
isLoading: PropTypes.bool,
- ancestorsIds: ImmutablePropTypes.list,
- descendantsIds: ImmutablePropTypes.list,
+ ancestorsIds: ImmutablePropTypes.list.isRequired,
+ descendantsIds: ImmutablePropTypes.list.isRequired,
intl: PropTypes.object.isRequired,
askReplyConfirmation: PropTypes.bool,
multiColumn: PropTypes.bool,
@@ 224,14 224,9 @@ class Status extends ImmutablePureComponent {
UNSAFE_componentWillReceiveProps (nextProps) {
if (nextProps.params.statusId !== this.props.params.statusId && nextProps.params.statusId) {
- this._scrolledIntoView = false;
this.props.dispatch(fetchStatus(nextProps.params.statusId));
}
- if (nextProps.params.statusId && nextProps.ancestorsIds.size > this.props.ancestorsIds.size) {
- this._scrolledIntoView = false;
- }
-
if (nextProps.status && nextProps.status.get('id') !== this.state.loadedStatusId) {
this.setState({ showMedia: defaultMediaVisibility(nextProps.status), loadedStatusId: nextProps.status.get('id') });
}
@@ 584,20 579,23 @@ class Status extends ImmutablePureComponent {
this.node = c;
};
- componentDidUpdate () {
- if (this._scrolledIntoView) {
- return;
- }
-
- const { status, ancestorsIds } = this.props;
-
- if (status && ancestorsIds && ancestorsIds.size > 0) {
- const element = this.node.querySelectorAll('.focusable')[ancestorsIds.size - 1];
+ componentDidUpdate (prevProps) {
+ const { status, ancestorsIds, multiColumn } = this.props;
+ if (status && (ancestorsIds.size > prevProps.ancestorsIds.size || prevProps.status?.get('id') !== status.get('id'))) {
window.requestAnimationFrame(() => {
- element.scrollIntoView(true);
+ this.node?.querySelector('.detailed-status__wrapper')?.scrollIntoView(true);
+
+ // In the single-column interface, `scrollIntoView` will put the post behind the header,
+ // so compensate for that.
+ if (!multiColumn) {
+ const offset = document.querySelector('.column-header__wrapper')?.getBoundingClientRect()?.bottom;
+ if (offset) {
+ const scrollingElement = document.scrollingElement || document.body;
+ scrollingElement.scrollBy(0, -offset);
+ }
+ }
});
- this._scrolledIntoView = true;
}
}