@@ -13,6 +13,7 @@ import type { TraktClientPagination } from '~/models/trakt/trakt-client.model';
13
13
14
14
import ListEmpty from ' ~/components/common/list/ListEmpty.vue' ;
15
15
import ListItem from ' ~/components/common/list/ListItem.vue' ;
16
+ import { debounce } from ' ~/utils/debounce.utils' ;
16
17
17
18
const virtualList = ref <VirtualListRef >();
18
19
@@ -40,7 +41,8 @@ const props = defineProps({
40
41
});
41
42
42
43
const emits = defineEmits <{
43
- (e : ' onScroll' , listRef : Ref <VirtualListRef | undefined >): void ;
44
+ (e : ' onScrollBottom' , listRef : Ref <VirtualListRef | undefined >): void ;
45
+ (e : ' onScrollTop' , listRef : Ref <VirtualListRef | undefined >): void ;
44
46
(e : ' onUpdated' , listRef : Ref <VirtualListRef | undefined >): void ;
45
47
}>();
46
48
@@ -49,16 +51,19 @@ const { items, loading, pagination } = toRefs(props);
49
51
const onScrollHandler = async (e : Event ) => {
50
52
if (loading .value ) return ;
51
53
if (! e ?.target ) return ;
52
- const { scrollTop, scrollHeight, clientHeight } = e .target as HTMLDivElement ;
53
- if (! scrollTop || scrollHeight !== scrollTop + clientHeight ) return ;
54
+ const { scrollTop, scrollHeight, clientHeight } = e .target as HTMLElement ;
55
+ if (scrollHeight === clientHeight ) return ;
56
+ if (! scrollTop ) return emits (' onScrollTop' , virtualList );
57
+ if (scrollHeight !== scrollTop + clientHeight ) return ;
54
58
if (pagination ?.value ?.page === pagination ?.value ?.pageCount ) return ;
55
-
56
- return emits (' onScroll' , virtualList );
59
+ return emits (' onScrollBottom' , virtualList );
57
60
};
58
61
59
62
const onUpdatedHandler = () => {
60
63
return emits (' onUpdated' , virtualList );
61
64
};
65
+
66
+ const debounceLog = debounce (e => console .info (' top' , e ), 100 );
62
67
</script >
63
68
64
69
<template >
@@ -69,11 +74,14 @@ const onUpdatedHandler = () => {
69
74
class =" list-scroll"
70
75
:data-length =" items.length"
71
76
:data-page-size =" pageSize"
72
- :item-size =" listOptions?.itemSize ?? 148 "
77
+ :item-size =" listOptions?.itemSize ?? 145 "
73
78
:items =" items"
74
79
:visible-items-tag =" listOptions?.visibleItemsTag ?? NTimeline"
75
- :visible-items-props =" { size: 'large', ...listOptions?.visibleItemsProps }"
76
- :padding-top =" listOptions?.paddingTop ?? 56"
80
+ :visible-items-props =" {
81
+ size: 'large',
82
+ ...listOptions?.visibleItemsProps,
83
+ }"
84
+ :padding-top =" listOptions?.paddingTop ?? 60"
77
85
:padding-bottom =" listOptions?.paddingBottom ?? 16"
78
86
@scroll =" onScrollHandler"
79
87
@vue:updated =" onUpdatedHandler"
0 commit comments