mirror of
				https://github.com/TeamPiped/Piped.git
				synced 2024-08-14 23:57:27 +00:00 
			
		
		
		
	Implement support for feed pagination.
This commit is contained in:
		
							parent
							
								
									8983745bbb
								
							
						
					
					
						commit
						d320cca0d9
					
				
					 1 changed files with 33 additions and 12 deletions
				
			
		| 
						 | 
					@ -24,7 +24,7 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <hr />
 | 
					    <hr />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <LoadingIndicatorPage :show-content="videosStore != null" class="video-grid">
 | 
					    <LoadingIndicatorPage :show-content="videos != null" class="video-grid">
 | 
				
			||||||
        <template v-for="video in videos" :key="video.url">
 | 
					        <template v-for="video in videos" :key="video.url">
 | 
				
			||||||
            <VideoItem v-if="shouldShowVideo(video)" :is-feed="true" :item="video" />
 | 
					            <VideoItem v-if="shouldShowVideo(video)" :is-feed="true" :item="video" />
 | 
				
			||||||
        </template>
 | 
					        </template>
 | 
				
			||||||
| 
						 | 
					@ -44,12 +44,11 @@ export default {
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    data() {
 | 
					    data() {
 | 
				
			||||||
        return {
 | 
					        return {
 | 
				
			||||||
            currentVideoCount: 0,
 | 
					            videos: null,
 | 
				
			||||||
            videoStep: 100,
 | 
					            videosCount: 0,
 | 
				
			||||||
            videosStore: null,
 | 
					 | 
				
			||||||
            videos: [],
 | 
					 | 
				
			||||||
            availableFilters: ["all", "shorts", "videos"],
 | 
					            availableFilters: ["all", "shorts", "videos"],
 | 
				
			||||||
            selectedFilter: "all",
 | 
					            selectedFilter: "all",
 | 
				
			||||||
 | 
					            loading: false,
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    computed: {
 | 
					    computed: {
 | 
				
			||||||
| 
						 | 
					@ -60,8 +59,8 @@ export default {
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    mounted() {
 | 
					    mounted() {
 | 
				
			||||||
        this.fetchFeed().then(videos => {
 | 
					        this.fetchFeed().then(videos => {
 | 
				
			||||||
            this.videosStore = videos;
 | 
					            this.videos = videos;
 | 
				
			||||||
            this.loadMoreVideos();
 | 
					            this.videosCount = videos.length;
 | 
				
			||||||
            this.updateWatched(this.videos);
 | 
					            this.updateWatched(this.videos);
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -69,7 +68,7 @@ export default {
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    activated() {
 | 
					    activated() {
 | 
				
			||||||
        document.title = this.$t("titles.feed") + " - Piped";
 | 
					        document.title = this.$t("titles.feed") + " - Piped";
 | 
				
			||||||
        if (this.videos.length > 0) this.updateWatched(this.videos);
 | 
					        if (this.videos?.length > 0) this.updateWatched(this.videos);
 | 
				
			||||||
        window.addEventListener("scroll", this.handleScroll);
 | 
					        window.addEventListener("scroll", this.handleScroll);
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    deactivated() {
 | 
					    deactivated() {
 | 
				
			||||||
| 
						 | 
					@ -90,13 +89,35 @@ export default {
 | 
				
			||||||
                });
 | 
					                });
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        loadMoreVideos() {
 | 
					        async loadMoreVideos() {
 | 
				
			||||||
            this.currentVideoCount = Math.min(this.currentVideoCount + this.videoStep, this.videosStore.length);
 | 
					            const start = this.videos[this.videos.length - 1].uploaded;
 | 
				
			||||||
            if (this.videos.length != this.videosStore.length)
 | 
					            if (this.authenticated) {
 | 
				
			||||||
                this.videos = this.videosStore.slice(0, this.currentVideoCount);
 | 
					                return await this.fetchJson(this.authApiUrl() + "/feed", {
 | 
				
			||||||
 | 
					                    authToken: this.getAuthToken(),
 | 
				
			||||||
 | 
					                    start,
 | 
				
			||||||
 | 
					                }).then(videos => {
 | 
				
			||||||
 | 
					                    this.videos = this.videos.concat(videos);
 | 
				
			||||||
 | 
					                    this.videosCount = videos.length > 0 ? this.videos.length : -1;
 | 
				
			||||||
 | 
					                    this.loading = false;
 | 
				
			||||||
 | 
					                });
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                return await this.fetchJson(this.authApiUrl() + "/feed/unauthenticated", {
 | 
				
			||||||
 | 
					                    channels: this.getUnauthenticatedChannels(),
 | 
				
			||||||
 | 
					                    start,
 | 
				
			||||||
 | 
					                }).then(videos => {
 | 
				
			||||||
 | 
					                    this.videos = this.videos.concat(videos);
 | 
				
			||||||
 | 
					                    this.videosCount = videos.length > 0 ? this.videos.length : -1;
 | 
				
			||||||
 | 
					                    this.loading = false;
 | 
				
			||||||
 | 
					                });
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        handleScroll() {
 | 
					        handleScroll() {
 | 
				
			||||||
            if (window.innerHeight + window.scrollY >= document.body.offsetHeight - window.innerHeight) {
 | 
					            if (window.innerHeight + window.scrollY >= document.body.offsetHeight - window.innerHeight) {
 | 
				
			||||||
 | 
					                if (this.loading) return;
 | 
				
			||||||
 | 
					                if (this.videos == null) return;
 | 
				
			||||||
 | 
					                if (this.videosCount % 100 != 0) return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                this.loading = true;
 | 
				
			||||||
                this.loadMoreVideos();
 | 
					                this.loadMoreVideos();
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue