From dd35a97be5cda796394e58cc558f0dad5c19658a Mon Sep 17 00:00:00 2001 From: Dan Niles <56271899+dan-niles@users.noreply.github.com> Date: Thu, 8 Aug 2024 18:25:26 +0530 Subject: [PATCH 1/3] Implement infinite scroll for video/playlist lists --- .../components/channel/tabs/PlaylistsTab.vue | 24 +++++---- .../src/components/channel/tabs/VideosTab.vue | 22 +++++--- .../src/components/playlist/PlaylistGrid.vue | 51 ++++++++++++++----- .../playlist/panel/PlaylistPanel.vue | 50 ++++++++++++++---- zimui/src/components/video/VideoGrid.vue | 51 ++++++++++++++----- zimui/src/views/PlaylistView.vue | 7 ++- 6 files changed, 149 insertions(+), 56 deletions(-) diff --git a/zimui/src/components/channel/tabs/PlaylistsTab.vue b/zimui/src/components/channel/tabs/PlaylistsTab.vue index 70cb4a7e..e67a110e 100644 --- a/zimui/src/components/channel/tabs/PlaylistsTab.vue +++ b/zimui/src/components/channel/tabs/PlaylistsTab.vue @@ -1,5 +1,5 @@ diff --git a/zimui/src/components/channel/tabs/VideosTab.vue b/zimui/src/components/channel/tabs/VideosTab.vue index 71533f98..26e25174 100644 --- a/zimui/src/components/channel/tabs/VideosTab.vue +++ b/zimui/src/components/channel/tabs/VideosTab.vue @@ -1,5 +1,5 @@ diff --git a/zimui/src/components/playlist/PlaylistGrid.vue b/zimui/src/components/playlist/PlaylistGrid.vue index 6f909ac4..ad0619fb 100644 --- a/zimui/src/components/playlist/PlaylistGrid.vue +++ b/zimui/src/components/playlist/PlaylistGrid.vue @@ -1,4 +1,5 @@ diff --git a/zimui/src/components/playlist/panel/PlaylistPanel.vue b/zimui/src/components/playlist/panel/PlaylistPanel.vue index 0973d147..c8b5aa75 100644 --- a/zimui/src/components/playlist/panel/PlaylistPanel.vue +++ b/zimui/src/components/playlist/panel/PlaylistPanel.vue @@ -6,6 +6,7 @@ import type { Playlist } from '@/types/Playlists' import { LoopOptions } from '@/types/Playlists' import PlaylistPanelItem from './PlaylistPanelItem.vue' +import type { VideoPreview } from '@/types/Videos' const { smAndDown } = useDisplay() @@ -19,6 +20,8 @@ const props = defineProps<{ shuffle: boolean }>() +const isLoading = computed(() => props.playlist.videos.length === 0) + const windowHeight = ref( window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight ) @@ -51,10 +54,35 @@ const scrollToCurrentVideo = () => { } const emit = defineEmits(['shuffle', 'loop', 'hide-panel']) + +const items = computed(() => props.playlist.videos.slice(0, 48)) + +const loadMoreItems = async () => { + return new Promise((resolve) => { + setTimeout(() => { + resolve(props.playlist.videos.slice(items.value.length, items.value.length + 12)) + }, 100) + }) +} + +const load = async ({ done }: { done: (status: 'ok' | 'empty') => void }) => { + const res = await loadMoreItems() + items.value.push(...res) + if ( + items.value[items.value.length - 1] == props.playlist.videos[props.playlist.videos.length - 1] + ) { + done('empty') + return + } + done('ok') +}