From bf60f2898d8c9dcf880bd14c187caf90b9549a2a Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Tue, 31 Jan 2017 22:34:33 +0100 Subject: [PATCH] Fix #529 - Make hashtag timelines show conversations, fix hashtag loading in the UI --- app/assets/javascripts/components/actions/timelines.jsx | 9 +++++---- .../components/features/account_timeline/index.jsx | 5 +++-- .../javascripts/components/features/followers/index.jsx | 1 + .../javascripts/components/features/following/index.jsx | 1 + app/models/status.rb | 1 - app/services/fan_out_on_write_service.rb | 5 ++++- 6 files changed, 14 insertions(+), 8 deletions(-) diff --git a/app/assets/javascripts/components/actions/timelines.jsx b/app/assets/javascripts/components/actions/timelines.jsx index 29a060e87ab..1531b89a33d 100644 --- a/app/assets/javascripts/components/actions/timelines.jsx +++ b/app/assets/javascripts/components/actions/timelines.jsx @@ -74,7 +74,7 @@ export function refreshTimeline(timeline, id = null) { let path = timeline; let skipLoading = false; - if (newestId !== null && getState().getIn(['timelines', timeline, 'loaded'])) { + if (newestId !== null && getState().getIn(['timelines', timeline, 'loaded']) && (id === null || getState().getIn(['timelines', timeline, 'id']) === id)) { params = `?since_id=${newestId}`; skipLoading = true; } @@ -112,7 +112,7 @@ export function expandTimeline(timeline, id = null) { return; } - dispatch(expandTimelineRequest(timeline)); + dispatch(expandTimelineRequest(timeline, id)); let path = timeline; @@ -133,10 +133,11 @@ export function expandTimeline(timeline, id = null) { }; }; -export function expandTimelineRequest(timeline) { +export function expandTimelineRequest(timeline, id) { return { type: TIMELINE_EXPAND_REQUEST, - timeline + timeline, + id }; }; diff --git a/app/assets/javascripts/components/features/account_timeline/index.jsx b/app/assets/javascripts/components/features/account_timeline/index.jsx index 6613600ccea..3495102956c 100644 --- a/app/assets/javascripts/components/features/account_timeline/index.jsx +++ b/app/assets/javascripts/components/features/account_timeline/index.jsx @@ -11,9 +11,10 @@ import LoadingIndicator from '../../components/loading_indicator'; import Column from '../ui/components/column'; import HeaderContainer from './containers/header_container'; import ColumnBackButton from '../../components/column_back_button'; +import Immutable from 'immutable'; const mapStateToProps = (state, props) => ({ - statusIds: state.getIn(['timelines', 'accounts_timelines', Number(props.params.accountId), 'items']), + statusIds: state.getIn(['timelines', 'accounts_timelines', Number(props.params.accountId), 'items'], Immutable.List()), isLoading: state.getIn(['timelines', 'accounts_timelines', Number(props.params.accountId), 'isLoading']), me: state.getIn(['meta', 'me']) }); @@ -49,7 +50,7 @@ const AccountTimeline = React.createClass({ render () { const { statusIds, isLoading, me } = this.props; - if (!statusIds) { + if (!statusIds && isLoading) { return ( diff --git a/app/assets/javascripts/components/features/followers/index.jsx b/app/assets/javascripts/components/features/followers/index.jsx index 1b9548c7e7c..bcadf601040 100644 --- a/app/assets/javascripts/components/features/followers/index.jsx +++ b/app/assets/javascripts/components/features/followers/index.jsx @@ -67,6 +67,7 @@ const Followers = React.createClass({ return ( +
diff --git a/app/assets/javascripts/components/features/following/index.jsx b/app/assets/javascripts/components/features/following/index.jsx index 2a799ac42f7..f67cc797f67 100644 --- a/app/assets/javascripts/components/features/following/index.jsx +++ b/app/assets/javascripts/components/features/following/index.jsx @@ -67,6 +67,7 @@ const Following = React.createClass({ return ( +
diff --git a/app/models/status.rb b/app/models/status.rb index 651d0dbc9ac..99e167bc92e 100644 --- a/app/models/status.rb +++ b/app/models/status.rb @@ -119,7 +119,6 @@ class Status < ApplicationRecord query = tag.statuses .joins('LEFT OUTER JOIN accounts ON statuses.account_id = accounts.id') .where(visibility: :public) - .where('(statuses.in_reply_to_id IS NULL OR statuses.in_reply_to_account_id = statuses.account_id)') .where('statuses.reblog_of_id IS NULL') account.nil? ? filter_timeline_default(query) : filter_timeline_default(filter_timeline(query, account)) diff --git a/app/services/fan_out_on_write_service.rb b/app/services/fan_out_on_write_service.rb index fc2ad679419..4f387c6c242 100644 --- a/app/services/fan_out_on_write_service.rb +++ b/app/services/fan_out_on_write_service.rb @@ -8,9 +8,12 @@ class FanOutOnWriteService < BaseService deliver_to_followers(status) deliver_to_mentioned(status) - return if status.account.silenced? || !status.public_visibility? || status.reblog? || (status.reply? && status.in_reply_to_account_id != status.account_id) + return if status.account.silenced? || !status.public_visibility? || status.reblog? deliver_to_hashtags(status) + + return if status.reply? && status.in_reply_to_account_id != status.account_id + deliver_to_public(status) end