Skip to content

Commit ce7cd14

Browse files
committed
fix(list): pause list render on panel open to prevent flicker
1 parent 5bd3253 commit ce7cd14

File tree

3 files changed

+74
-41
lines changed

3 files changed

+74
-41
lines changed

src/components/common/list/use-list-scroll.ts

+68-37
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { type TraktClientPagination, TraktEpisodeType, type TraktEpisodeTypes } from '@dvcol/trakt-http-client/models';
22

3-
import { computed, isRef, ref } from 'vue';
3+
import { computed, isRef, ref, watch } from 'vue';
44

55
import type { Ref } from 'vue';
66

@@ -181,51 +181,82 @@ export const getTags = (item: Pick<ListScrollSourceItem, 'episode' | 'season'>,
181181
return tags;
182182
};
183183

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+
184226
export const useListScroll = <T extends ListScrollSourceItemWithDate<D>, D extends string | never = never>(
185227
items: Ref<T[]>,
186228
dateFn?: D | ((item: T) => T[D]),
187229
): Ref<ListScrollItem[]> => {
188230
return computed<ListScrollItem[]>(() => {
189231
const array = items.value;
190232
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+
};
225236

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;
228250
});
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+
};
229260
};
230261

231262
export const useListScrollEvents = (

src/components/views/panel/MoviePanel.vue

+3-2
Original file line numberDiff line numberDiff line change
@@ -142,12 +142,15 @@ const activeLists = computed(() => {
142142
.map(list => list.id);
143143
});
144144
145+
const { panelDirty } = useAppStateStoreRefs();
146+
145147
const onListUpdate = async (value: ListEntity['id'], remove: boolean) => {
146148
if (!movie.value?.ids) return;
147149
148150
const _list = myLists.value.find(list => list.id === value);
149151
if (!_list) return;
150152
153+
panelDirty.value = true;
151154
await addToOrRemoveFromList({
152155
list: _list,
153156
itemType: 'movie',
@@ -158,8 +161,6 @@ const onListUpdate = async (value: ListEntity['id'], remove: boolean) => {
158161
159162
const releaseDate = computed(() => movie.value?.released);
160163
161-
const { panelDirty } = useAppStateStoreRefs();
162-
163164
const onCollectionUpdate = async (
164165
value: PanelButtonsOptions,
165166
date?: string | number | Date,

src/components/views/watchlist/WatchlistComponent.vue

+3-2
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { useBackToTop } from '~/components/common/buttons/use-back-to-top';
66
import ListScroll from '~/components/common/list/ListScroll.vue';
77
import {
88
addLoadMore,
9-
useListScroll,
9+
useBufferedListScroll,
1010
useListScrollEvents,
1111
} from '~/components/common/list/use-list-scroll';
1212
import { usePanelItem } from '~/components/views/panel/use-panel-item';
@@ -49,9 +49,10 @@ const { active } = watchUserChange({
4949
clear: clearState,
5050
});
5151
52-
const list = useListScroll<AnyList, AnyListDateTypes>(
52+
const { list } = useBufferedListScroll<AnyList, AnyListDateTypes>(
5353
filteredListItems,
5454
anyListDateGetter,
55+
panelOpen,
5556
);
5657
5758
const listItems = addLoadMore(list, pagination, searchList);

0 commit comments

Comments
 (0)