|
1 | 1 | import { type TraktClientPagination, TraktEpisodeType, type TraktEpisodeTypes } from '@dvcol/trakt-http-client/models';
|
2 | 2 |
|
3 |
| -import { computed, isRef, ref } from 'vue'; |
| 3 | +import { computed, isRef, ref, watch } from 'vue'; |
4 | 4 |
|
5 | 5 | import type { Ref } from 'vue';
|
6 | 6 |
|
@@ -181,51 +181,82 @@ export const getTags = (item: Pick<ListScrollSourceItem, 'episode' | 'season'>,
|
181 | 181 | return tags;
|
182 | 182 | };
|
183 | 183 |
|
| 184 | +export const computeNewArray = <T extends ListScrollSourceItemWithDate<D>, D extends string | never = never>( |
| 185 | + array: T[], |
| 186 | + dateFn?: D | ((item: T) => T[D]), |
| 187 | +): ListScrollItem[] => |
| 188 | + array.map((item, index) => { |
| 189 | + const _item: ListScrollItem<ListScrollItemMeta> = { |
| 190 | + ...item, |
| 191 | + index, |
| 192 | + key: `${index}-${item.id}`, |
| 193 | + loading: (typeof item.id === 'number' && item.id < 0) || item.type === ListScrollItemType.loading, |
| 194 | + }; |
| 195 | + |
| 196 | + if (!_item.type) _item.type = getType(item); |
| 197 | + if (!_item.title) _item.title = getTitle(item); |
| 198 | + if (!_item.content) _item.content = getContent(item); |
| 199 | + if (!_item.posterRef) _item.posterRef = ref<string>(); |
| 200 | + if (!_item.getPosterQuery) _item.getPosterQuery = getPosterQuery(item, _item.type); |
| 201 | + if (!_item.getProgressQuery) _item.getProgressQuery = getProgressQuery(item); |
| 202 | + if (!_item.tags) _item.tags = getTags(item, _item.type); |
| 203 | + |
| 204 | + _item.date = getDate(item, array, index, dateFn); |
| 205 | + _item.meta = { |
| 206 | + source: item, |
| 207 | + ids: { |
| 208 | + movie: item.movie?.ids, |
| 209 | + show: item.show?.ids, |
| 210 | + season: item.season?.ids, |
| 211 | + episode: item.episode?.ids, |
| 212 | + person: item.person?.ids, |
| 213 | + }, |
| 214 | + }; |
| 215 | + |
| 216 | + if (_item.type === 'episode' || _item.type === 'season') { |
| 217 | + _item.meta!.number = { |
| 218 | + season: item.episode?.season ?? item.season?.number, |
| 219 | + episode: item.episode?.number, |
| 220 | + }; |
| 221 | + } |
| 222 | + |
| 223 | + return _item; |
| 224 | + }); |
| 225 | + |
184 | 226 | export const useListScroll = <T extends ListScrollSourceItemWithDate<D>, D extends string | never = never>(
|
185 | 227 | items: Ref<T[]>,
|
186 | 228 | dateFn?: D | ((item: T) => T[D]),
|
187 | 229 | ): Ref<ListScrollItem[]> => {
|
188 | 230 | return computed<ListScrollItem[]>(() => {
|
189 | 231 | const array = items.value;
|
190 | 232 | if (!array.length) return [];
|
191 |
| - return array.map((item, index) => { |
192 |
| - const _item: ListScrollItem<ListScrollItemMeta> = { |
193 |
| - ...item, |
194 |
| - index, |
195 |
| - key: `${index}-${item.id}`, |
196 |
| - loading: (typeof item.id === 'number' && item.id < 0) || item.type === ListScrollItemType.loading, |
197 |
| - }; |
198 |
| - |
199 |
| - if (!_item.type) _item.type = getType(item); |
200 |
| - if (!_item.title) _item.title = getTitle(item); |
201 |
| - if (!_item.content) _item.content = getContent(item); |
202 |
| - if (!_item.posterRef) _item.posterRef = ref<string>(); |
203 |
| - if (!_item.getPosterQuery) _item.getPosterQuery = getPosterQuery(item, _item.type); |
204 |
| - if (!_item.getProgressQuery) _item.getProgressQuery = getProgressQuery(item); |
205 |
| - if (!_item.tags) _item.tags = getTags(item, _item.type); |
206 |
| - |
207 |
| - _item.date = getDate(item, array, index, dateFn); |
208 |
| - _item.meta = { |
209 |
| - source: item, |
210 |
| - ids: { |
211 |
| - movie: item.movie?.ids, |
212 |
| - show: item.show?.ids, |
213 |
| - season: item.season?.ids, |
214 |
| - episode: item.episode?.ids, |
215 |
| - person: item.person?.ids, |
216 |
| - }, |
217 |
| - }; |
218 |
| - |
219 |
| - if (_item.type === 'episode' || _item.type === 'season') { |
220 |
| - _item.meta!.number = { |
221 |
| - season: item.episode?.season ?? item.season?.number, |
222 |
| - episode: item.episode?.number, |
223 |
| - }; |
224 |
| - } |
| 233 | + return computeNewArray(array, dateFn); |
| 234 | + }); |
| 235 | +}; |
225 | 236 |
|
226 |
| - return _item; |
227 |
| - }); |
| 237 | +export const useBufferedListScroll = <T extends ListScrollSourceItemWithDate<D>, D extends string | never = never>( |
| 238 | + items: Ref<T[]>, |
| 239 | + dateFn?: D | ((item: T) => T[D]), |
| 240 | + paused: Ref<boolean> = ref(false), |
| 241 | +): { |
| 242 | + paused: Ref<boolean>; |
| 243 | + list: Ref<ListScrollItem[]>; |
| 244 | +} => { |
| 245 | + const list: Ref<ListScrollItem[]> = useListScroll(items, dateFn); |
| 246 | + let previous: ListScrollItem[] = []; |
| 247 | + watch([list, paused], () => { |
| 248 | + if (paused.value) return; |
| 249 | + previous = list.value; |
228 | 250 | });
|
| 251 | + |
| 252 | + return { |
| 253 | + paused, |
| 254 | + list: computed<ListScrollItem[]>(() => { |
| 255 | + console.info('paused', paused.value, { previous, list: list.value }); |
| 256 | + if (paused.value) return previous; |
| 257 | + return list.value; |
| 258 | + }), |
| 259 | + }; |
229 | 260 | };
|
230 | 261 |
|
231 | 262 | export const useListScrollEvents = (
|
|
0 commit comments