Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Keep scroll position when loading missing statuses #3000
Keep scroll position when loading missing statuses #3000
Changes from all commits
b45d574
34c5622
8d05e0a
0808099
9c5ba19
a1c17b4
dbfc9e4
465fbff
b87961d
c871fc8
90cb7b8
7f8fe7d
ae413e8
edaa54b
1480c6a
528e74a
d517514
26622ca
a9e585f
5a4a7b8
86d780e
2c102db
7b42ef1
3c36dab
826ce0d
90287f1
82350b2
854cddc
6fd0682
a2ab730
5928159
5eebe05
3d70fc6
3f7db5f
a8e4d72
d12c319
File filter
Filter by extension
Conversations
Jump to
There are no files selected for viewing
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
NEWEST_FIRST is the current behavior, right? Can we have it as the default please?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think NEWEST_FIRST is a bug, that this fixes.
From what I can tell, up to and including v16 beta 1 Tusky OLDEST_FIRST behaviour. I verified this by checking out 31da851, adding the DeveloperTools functionality, and experimenting with creating "Load more" gaps of different sizes and seeing how the app behaved when I clicked the button. It kept the position in the list.
I think the NEWEST_FIRST behaviour was introduced in 6d4f5ad with the migration to Paging3.
I can't see anything that suggests that this was a deliberate change, it's just how Paging3 works by default.
This change rapidly started annoying users, and they submitted issues about it. The earliest issue I can see is #2423 from Apr 7th.
I can't find any issues from before the change where users were asking for "Load more" to have its current behaviour. Only issues from after the change with users asking for the behaviour to be reverted.
This is why I think the best thing to do for the users is for the default to be the previous behaviour, which fixes the bug introduced in 6d4f5ad.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
But OLDEST_FIRST is loading the oldest statuses in the gap, we never did that?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If you don't do that (i.e,. use
since_id
), with this you can get the experience where you click "Load more", the statuses load, but they don't reach the bottom of the gap (i.e., the gap is more than LOAD_AT_ONCE statuses in size).So then there's a new "Load more" button, and you have to click again. And potentially again.
This code, using
min_id
(and withOLDEST_FIRST
) means the UX is to click "Load more", then scroll up and read the loaded statuses, eventually encounter another "Load more", click that, and repeat, which seems like the right way to do it (and is requested from the filed issues).There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Using
min_id
is also consistent with Mastodon's paging in thelink
headers in HTTP responses.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The default usage behavior is to read from newest to oldest - that's why the timeline is in reverse chronological order.
In that case, we want to load the newest statuses in the gap by default, so that the user who reads from newest to oldest gets an uninterrupted stream of posts. It's possible that there was a bug or otherwise incorrect behavior here in the past, but I believe that today's behavior is correct for this use case
I get that we want to have better support for the vocal minority of users who want to read every post on their timelines from oldest to newest, but we should absolutely not change such a fundamental default behavior on a whim or due to selection bias.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
As a side note, I have felt like I have maybe been coming across as adversarial in some of these discussions, and I've been trying to limit my participation for that reason. However, I also feel like there's an abnormally high amount of talking past each other going on, and I don't understand whether it's because one or more of us are fundamentally misunderstanding what the others are saying, or there's some hidden assumption, or something else.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If it helps, I haven't been interpreting your feedback as adversarial.
To address what I believe are your key points:
"The default usage behavior is to read from newest to oldest"
That's not always true, the app is inconsistent about this behaviour.
For example:
develop
(eb02d0b at the time I'm writing this)You should observe that your position in the timeline is retained, and the new statuses are loaded above the one you are currently looking at. This is oldest-first behaviour.
This behaviour is the same on at least the Federated, Local, and Home timelines.
If "the default usage behaviour is to read from newest to oldest" was correct, refreshing any of these timelines should take you to the newest of the freshly loaded statuses.
I suspect this is the source of some of the demand for this behaviour from users. They observe that, in some situations the app behaves the way that they expect, but in others it doesn't.
This also gets weird if there were more than LOAD_AT_ONCE statuses loaded and there's also a "Load more" placeholder. Because if the user clicks that then the statuses are loaded below their current position.
So swipe = load above and keep my position, "Load more" = load below and lose my position
"vocal minority"
I agree about "vocal". There are at least 14 issues that reference this, many of which either have comments from other users saying they also want the oldest-first behaviour, or heart / thumbs-up emoji from people who haven't commented but also indicating that they want the oldest-first behaviour.
I don't think the assertion that it's a minority is knowable.
Creating a Github issue or commenting on it has a fairly high barrier to entry -- you have to know where to file the issue, you have to create a Github account if you don't already have one, and you have to take the time to actually write the issue.
Participation inequality is a thing (https://www.nngroup.com/articles/participation-inequality/), and I think it's reasonable to assume that for every 1 user who has taken the time to report this issue, there are N other users who either have the same problem, or have abandoned using the app in favour of a different one.
Unfortunately, we don't know what N is. Could be 10, could be 100, could be 1,000, or more, or less.
This also extends to Play reviews. It doesn't appear to be possible to link to individual reviews, so, from the last month or so:
"Tusky experience (if you try to read from oldest to newest): Scrolling up. Tap "Load more". Scroll down to find where you stopped before it loaded newest posts and lost scrolling position. Tap "Load more" again, rushing to scroll down so that you don't lose scrolling progress. "Load more". "Load more". Repeat 15 times [...]" 2 stars, "3 people found this review helpful"
"Looks pretty good. Nice and clean view. However the load more button defaults to going to the top of your feed losing position. Can this be switched or an option included?", 3 stars, "4 people found this review helpful"
"This App is okay for the most cases. But the main feature is complety insane. The timeline is always at the latest twee...äh..toot(?). You can't continue reading the toots from the place were you stopped reading. You always have to start at the newest toot and must search were you left", 2 stars, "25 people found this review helpful"
My intuition from all this is that N is a large number, and that changing the default approach to oldest-first is a net-win for the majority of the userbase.
You, reasonably, disagree.
We can't both be right.
Proposal
The Tusky Mastodon account has about 15K followers.
Create a poll, run it for 7 days, and boost it once per day for those 7 days. Suggested text:
Use the result of that to determine the default.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
"There are behavioral inconsistencies" is not the same as "the default is secretly the opposite of what you think".
I agree that when the user actively refreshes, the timeline should move to the top (in the default newest-first order).
There's no point in having a poll about the load more behavior, because it should be determined by the reading order, where it doesn't "jump" in either case, but remains at the user's last-read (from the default top or optional bottom) post.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
That is true.
But that's not what I'm saying.
I'm saying that the default behaviour is inconsistent and is a source (probably a significant one) of user confusion and dissatisfaction with the app.
By pointing out the inconsistency, I intend to suggest that when you say "I believe that today's behavior is correct for this use case" I think you may not have considered all the ways that the app behaves.
In response, you suggested "I agree that when the user actively refreshes, the timeline should move to the top (in the default newest-first order)."
That is something that we could do (not in this PR, and I'm not suggesting we actually do it, I'm using "could" to mean only "This is a technically possible change").
But you've also said (about default reading order) "we should absolutely not change such a fundamental default behavior on a whim or due to selection bias."
I agree with that too -- that's why I suggested the poll, so that it's not a whim, or selection bias.
But I feel this is also inconsistent. On one hand you are suggesting that we should not change fundamental default behaviour like this, on the other hand you suggest we should change the user's reading position when they swipe-to-refresh, which I think would definitely be a change to fundamental behaviour.
I think that may be why some of this discussion is challenging; it feels like you are arguing two different and opposite positions, depending on the behaviour that you want to see, and it's difficult to address your concerns because of that.
Aside: As I've already said, I agree with you when you say "absolutely not change such a fundamental default behaviour on a whim or due to selection bias".
And I absolutely do not want to discuss the specific decision here and derail the conversation, but I'll note that has absolutely happened in the past, probably most recently with #2552.
Finally:
That's exactly what this PR does (once I revert 1480c6a, see my other reply #3000 (comment) about that).
[Edit: I have now reverted that change]
The only thing the poll would be for is to decide the default value for the preference,
OLDEST_FIRST
orNEWEST_FIRST
.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Remove?