import {computed, type ComputedRef, type MaybeRef, ref, type Ref, toValue} from 'vue'; import {type ReadonlyOr} from '@myparcel/ts-utils'; export type UseLoadMoreOptions = { step?: number; start?: number; items: ReadonlyOr>; }; export type UseLoadMore = { loadMore(): void; hasMore: ComputedRef; loaded: Ref; items: ComputedRef; }; export const useLoadMore = (options: UseLoadMoreOptions): UseLoadMore => { const loaded = ref(options.start ?? options.step ?? toValue(options.items).length - 1); const hasMore = computed(() => loaded.value < toValue(options.items).length - 1); const loadMore = () => { if (!hasMore.value) { return; } const step = options.step ?? 1; const maxLength = toValue(options.items).length; if (loaded.value + step > maxLength) { loaded.value = maxLength; } else { loaded.value += step; } }; const items = computed(() => toValue(options.items).slice(0, loaded.value)); return { items, loaded, hasMore, loadMore, }; };