import { ref, type Ref } from 'vue' interface PaginatedResult { items: T[] total: number } interface AdminPaginatedTableOptions { fetchFn: (page: number, pageSize: number) => Promise> defaultPageSize?: number immediate?: boolean } interface AdminPaginatedTableResult { loading: Ref data: Ref total: Ref currentPage: Ref currentPageSize: Ref load: () => Promise handleSizeChange: () => void } export function useAdminPaginatedTable(options: AdminPaginatedTableOptions): AdminPaginatedTableResult { const loading = ref(false) const data = ref([]) as Ref const total = ref(0) const currentPage = ref(1) const currentPageSize = ref(options.defaultPageSize || 20) async function load() { loading.value = true try { const result = await options.fetchFn(currentPage.value, currentPageSize.value) data.value = result.items total.value = result.total } finally { loading.value = false } } function handleSizeChange() { currentPage.value = 1 load() } if (options.immediate !== false) { load() } return { loading, data, total, currentPage, currentPageSize, load, handleSizeChange } }