1
1
<script lang="ts" setup>
2
- import { NTimeline , NVirtualList } from ' naive-ui' ;
2
+ import { NFlex , NTimeline , NVirtualList } from ' naive-ui' ;
3
3
4
4
import { ref , toRefs } from ' vue' ;
5
5
@@ -14,6 +14,7 @@ import type { TraktClientPagination } from '~/models/trakt/trakt-client.model';
14
14
15
15
import ListEmpty from ' ~/components/common/list/ListEmpty.vue' ;
16
16
import ListItem from ' ~/components/common/list/ListItem.vue' ;
17
+ import ListLoadMore from ' ~/components/common/list/ListLoadMore.vue' ;
17
18
18
19
const listRef = ref <VirtualListRef >();
19
20
@@ -54,6 +55,15 @@ const emits = defineEmits<{
54
55
(e : ' onScrollTop' , listRef : Ref <VirtualListRef | undefined >): void ;
55
56
(e : ' onScroll' , listRef : Ref <VirtualListRef | undefined >): void ;
56
57
(e : ' onUpdated' , listRef : Ref <VirtualListRef | undefined >): void ;
58
+ (
59
+ e : ' onloadMore' ,
60
+ payload : {
61
+ listRef: Ref <VirtualListRef | undefined >;
62
+ page: number ;
63
+ pageCount: number ;
64
+ pageSize: number ;
65
+ },
66
+ ): void ;
57
67
}>();
58
68
59
69
defineExpose ({
@@ -90,6 +100,10 @@ const hoverDate = ref<string>();
90
100
const onHover = ({ item , hover }: { item: ListScrollItem ; hover: boolean }) => {
91
101
if (hover ) hoverDate .value = item .date ?.current ?.toDateString ();
92
102
};
103
+
104
+ const onLoadMore = (payload : { page: number ; pageCount: number ; pageSize: number }) => {
105
+ emits (' onloadMore' , { listRef , ... payload });
106
+ };
93
107
</script >
94
108
95
109
<template >
@@ -115,7 +129,25 @@ const onHover = ({ item, hover }: { item: ListScrollItem; hover: boolean }) => {
115
129
@vue:updated =" onUpdatedHandler"
116
130
>
117
131
<template #default =" { item } " >
132
+ <NFlex
133
+ v-if =" item.id === 'load-more'"
134
+ class =" load-more"
135
+ justify =" center"
136
+ align =" center"
137
+ vertical
138
+ size =" small"
139
+ :theme-overrides =" { gapSmall: '0' }"
140
+ :style =" `height: ${listOptions?.itemSize ?? 145}px;`"
141
+ >
142
+ <ListLoadMore
143
+ :page =" pagination?.page"
144
+ :page-count =" pagination?.pageCount"
145
+ :page-size =" pageSize"
146
+ @on-load-more =" onLoadMore"
147
+ />
148
+ </NFlex >
118
149
<ListItem
150
+ v-else
119
151
:key =" item.id"
120
152
:item =" item"
121
153
:index =" item.index"
@@ -133,18 +165,28 @@ const onHover = ({ item, hover }: { item: ListScrollItem; hover: boolean }) => {
133
165
:page =" pagination?.page"
134
166
:page-count =" pagination?.pageCount"
135
167
:page-size =" pageSize"
168
+ @on-load-more =" onLoadMore"
136
169
/>
137
170
</Transition >
138
171
</template >
139
172
140
173
<style lang="scss" scoped>
141
174
@use ' ~/styles/layout' as layout ;
142
175
@use ' ~/styles/transition' as transition ;
176
+ @use ' ~/styles/animation' as animation ;
143
177
@include transition .fade ;
178
+ @include animation .fade-in ;
144
179
145
180
.list-scroll {
146
181
height : calc (100 dvh - 8px );
147
182
margin-top : - #{layout .$header-navbar-height } ;
148
183
margin-bottom : 8px ;
184
+
185
+ .load-more {
186
+ margin-top : 1rem ;
187
+ opacity : 0 ;
188
+ animation : fade- in 0.5s forwards ;
189
+ animation-delay : 0.25s ;
190
+ }
149
191
}
150
192
</style >
0 commit comments