diff --git a/src/components/settings/settings.js b/src/components/settings/settings.js index 4d0528b6ef0b9bcdc5788bcb2b8c523a536041b1..cfceedde3135918aae332af16ce6b12c0d1df04d 100644 --- a/src/components/settings/settings.js +++ b/src/components/settings/settings.js @@ -7,6 +7,7 @@ const settings = { hideAttachmentsLocal: this.$store.state.config.hideAttachments, hideAttachmentsInConvLocal: this.$store.state.config.hideAttachmentsInConv, hideNsfwLocal: this.$store.state.config.hideNsfw, + autoLoadLocal: this.$store.state.config.autoLoad, muteWordsString: this.$store.state.config.muteWords.join('\n') } }, @@ -23,6 +24,9 @@ const settings = { hideNsfwLocal (value) { this.$store.dispatch('setOption', { name: 'hideNsfw', value }) }, + autoLoadLocal (value) { + this.$store.dispatch('setOption', { name: 'autoLoad', value }) + }, muteWordsString (value) { value = filter(value.split('\n'), (word) => trim(word).length > 0) this.$store.dispatch('setOption', { name: 'muteWords', value }) diff --git a/src/components/settings/settings.vue b/src/components/settings/settings.vue index 33d46e7e3b9c3b2eff5549e834460da712594bcf..3fab1c1ce6da18cc536cbaa52743074dff562608 100644 --- a/src/components/settings/settings.vue +++ b/src/components/settings/settings.vue @@ -28,6 +28,10 @@ <input type="checkbox" id="hideNsfw" v-model="hideNsfwLocal"> <label for="hideNsfw">Enable clickthrough NSFW attachment hiding</label> </li> + <li> + <input type="checkbox" id="autoLoad" v-model="autoLoadLocal"> + <label for="autoLoad">Enable automatic loading when scrolled to the bottom</label> + </li> </ul> </div> </div> diff --git a/src/components/timeline/timeline.js b/src/components/timeline/timeline.js index d5a9adcc8ea1a97974cb558f964ed4b5f527e864..6070e4423c0d3a4d27b943d497fb1d5db658dbee 100644 --- a/src/components/timeline/timeline.js +++ b/src/components/timeline/timeline.js @@ -20,6 +20,8 @@ const Timeline = { const credentials = store.state.users.currentUser.credentials const showImmediately = this.timeline.visibleStatuses.length === 0 + window.onscroll = this.scrollLoad + timelineFetcher.fetchAndUpdate({ store, credentials, @@ -42,6 +44,11 @@ const Timeline = { older: true, showImmediately: true }).then(() => store.commit('setLoading', { timeline: this.timelineName, value: false })) + }, + scrollLoad (e) { + if (this.timeline.loading === false && this.$store.state.config.autoLoad && (window.innerHeight + window.pageYOffset) >= (document.body.scrollHeight - 750)) { + this.fetchOlderStatuses() + } } } } diff --git a/src/main.js b/src/main.js index 35261578c1d2ff29b6ed2d7c0a58c7b58a85ce7a..351149f18073328ca062bd086f1aa186313c7b35 100644 --- a/src/main.js +++ b/src/main.js @@ -33,6 +33,7 @@ const persistedStateOptions = { 'config.hideAttachments', 'config.hideAttachmentsInConv', 'config.hideNsfw', + 'config.autoLoad', 'config.muteWords', 'statuses.notifications', 'users.users' diff --git a/src/modules/config.js b/src/modules/config.js index f59dc6f0d753353f4142ab4a39954a2982e4d538..c9152eccc618f2169c423bd2e62fb79e27221bff 100644 --- a/src/modules/config.js +++ b/src/modules/config.js @@ -7,6 +7,7 @@ const defaultState = { hideAttachments: false, hideAttachmentsInConv: false, hideNsfw: true, + autoLoad: true, muteWords: [] }