Revert infinite scroll in timelines back to looking at ID of oldest

loaded status; do not preload submitted statuses into community/public
timelines, unless those timelines have already been loaded; do not
close streaming API connections for community/public timelines, once
they have been established (most users navigate back to them eventually)
rebase/4.0.0rc2
Eugen Rochko 2017-03-01 01:43:29 +01:00
parent e1b00757a6
commit fbdb3bcf1e
5 changed files with 37 additions and 17 deletions

View File

@ -85,8 +85,13 @@ export function submitCompose() {
dispatch(updateTimeline('home', { ...response.data })); dispatch(updateTimeline('home', { ...response.data }));
if (response.data.in_reply_to_id === null && response.data.visibility === 'public') { if (response.data.in_reply_to_id === null && response.data.visibility === 'public') {
dispatch(updateTimeline('community', { ...response.data })); if (getState.getIn(['timelines', 'community', 'loaded'])) {
dispatch(updateTimeline('public', { ...response.data })); dispatch(updateTimeline('community', { ...response.data }));
}
if (getState.getIn(['timelines', 'public', 'loaded'])) {
dispatch(updateTimeline('public', { ...response.data }));
}
} }
}).catch(function (error) { }).catch(function (error) {
dispatch(submitComposeFail(error)); dispatch(submitComposeFail(error));

View File

@ -106,18 +106,20 @@ export function expandTimeline(timeline) {
return; return;
} }
const next = getState().getIn(['timelines', timeline, 'next']); if (getState().getIn(['timelines', timeline, 'items']).size === 0) {
const params = getState().getIn(['timelines', timeline, 'params'], {});
if (next === null) {
return; return;
} }
const path = getState().getIn(['timelines', timeline, 'path'])(getState().getIn(['timelines', timeline, 'id']));
const params = getState().getIn(['timelines', timeline, 'params'], {});
const lastId = getState().getIn(['timelines', timeline, 'items']).last();
dispatch(expandTimelineRequest(timeline)); dispatch(expandTimelineRequest(timeline));
api(getState).get(next, { api(getState).get(path, {
params: { params: {
...params, ...params,
max_id: lastId,
limit: 10 limit: 10
} }
}).then(response => { }).then(response => {

View File

@ -20,6 +20,8 @@ const mapStateToProps = state => ({
accessToken: state.getIn(['meta', 'access_token']) accessToken: state.getIn(['meta', 'access_token'])
}); });
let subscription;
const CommunityTimeline = React.createClass({ const CommunityTimeline = React.createClass({
propTypes: { propTypes: {
@ -36,7 +38,11 @@ const CommunityTimeline = React.createClass({
dispatch(refreshTimeline('community')); dispatch(refreshTimeline('community'));
this.subscription = createStream(accessToken, 'public:local', { if (typeof subscription !== 'undefined') {
return;
}
subscription = createStream(accessToken, 'public:local', {
received (data) { received (data) {
switch(data.event) { switch(data.event) {
@ -53,10 +59,10 @@ const CommunityTimeline = React.createClass({
}, },
componentWillUnmount () { componentWillUnmount () {
if (typeof this.subscription !== 'undefined') { // if (typeof subscription !== 'undefined') {
this.subscription.close(); // subscription.close();
this.subscription = null; // subscription = null;
} // }
}, },
render () { render () {

View File

@ -20,6 +20,8 @@ const mapStateToProps = state => ({
accessToken: state.getIn(['meta', 'access_token']) accessToken: state.getIn(['meta', 'access_token'])
}); });
let subscription;
const PublicTimeline = React.createClass({ const PublicTimeline = React.createClass({
propTypes: { propTypes: {
@ -36,7 +38,11 @@ const PublicTimeline = React.createClass({
dispatch(refreshTimeline('public')); dispatch(refreshTimeline('public'));
this.subscription = createStream(accessToken, 'public', { if (typeof subscription !== 'undefined') {
return;
}
subscription = createStream(accessToken, 'public', {
received (data) { received (data) {
switch(data.event) { switch(data.event) {
@ -53,10 +59,10 @@ const PublicTimeline = React.createClass({
}, },
componentWillUnmount () { componentWillUnmount () {
if (typeof this.subscription !== 'undefined') { // if (typeof subscription !== 'undefined') {
this.subscription.close(); // subscription.close();
this.subscription = null; // subscription = null;
} // }
}, },
render () { render () {

View File

@ -576,6 +576,7 @@ a.status__content__spoiler-link {
color: $color1; color: $color1;
overflow: hidden; overflow: hidden;
text-overflow: ellipsis; text-overflow: ellipsis;
white-space: nowrap;
&:focus { &:focus {
outline: none; outline: none;