import type { Ref } from 'vue' import { computed, ref, unref } from 'vue' /** * Paginates an array of items * @param list The array to paginate * @param pageNo The current page number (1-based) * @param pageSize Number of items per page * @returns Paginated array slice * @throws {Error} If pageNo or pageSize are invalid */ function pagination(list: T[], pageNo: number, pageSize: number): T[] { if (pageNo < 1) throw new Error('Page number must be positive') if (pageSize < 1) throw new Error('Page size must be positive') const offset = (pageNo - 1) * Number(pageSize) const ret = offset + pageSize >= list.length ? list.slice(offset) : list.slice(offset, offset + pageSize) return ret } export function usePagination(list: Ref, pageSize: number) { const currentPage = ref(1) const pageSizeRef = ref(pageSize) const totalPages = computed(() => Math.ceil(unref(list).length / unref(pageSizeRef)), ) const paginationList = computed(() => { return pagination(unref(list), unref(currentPage), unref(pageSizeRef)) }) const total = computed(() => { return unref(list).length }) function setCurrentPage(page: number) { if (page < 1 || page > unref(totalPages)) { throw new Error('Invalid page number') } currentPage.value = page } function setPageSize(pageSize: number) { if (pageSize < 1) { throw new Error('Page size must be positive') } pageSizeRef.value = pageSize // Reset to first page to prevent invalid state currentPage.value = 1 } return { setCurrentPage, total, setPageSize, paginationList } }