diff --git a/apps/frontend/src/components.d.ts b/apps/frontend/src/components.d.ts index 7736bff5..d8330098 100644 --- a/apps/frontend/src/components.d.ts +++ b/apps/frontend/src/components.d.ts @@ -16,7 +16,6 @@ declare module 'vue' { AdminStatusTag: typeof import('./components/admin/AdminStatusTag.vue')['default'] ElAlert: typeof import('element-plus/es')['ElAlert'] ElButton: typeof import('element-plus/es')['ElButton'] - ElButtonGroup: typeof import('element-plus/es')['ElButtonGroup'] ElCard: typeof import('element-plus/es')['ElCard'] ElCheckbox: typeof import('element-plus/es')['ElCheckbox'] ElCol: typeof import('element-plus/es')['ElCol'] @@ -26,7 +25,6 @@ declare module 'vue' { ElDescriptions: typeof import('element-plus/es')['ElDescriptions'] ElDescriptionsItem: typeof import('element-plus/es')['ElDescriptionsItem'] ElDialog: typeof import('element-plus/es')['ElDialog'] - ElDivider: typeof import('element-plus/es')['ElDivider'] ElDropdown: typeof import('element-plus/es')['ElDropdown'] ElDropdownItem: typeof import('element-plus/es')['ElDropdownItem'] ElDropdownMenu: typeof import('element-plus/es')['ElDropdownMenu'] @@ -39,7 +37,6 @@ declare module 'vue' { ElMenu: typeof import('element-plus/es')['ElMenu'] ElMenuItem: typeof import('element-plus/es')['ElMenuItem'] ElOption: typeof import('element-plus/es')['ElOption'] - ElPageHeader: typeof import('element-plus/es')['ElPageHeader'] ElPagination: typeof import('element-plus/es')['ElPagination'] ElRadioButton: typeof import('element-plus/es')['ElRadioButton'] ElRadioGroup: typeof import('element-plus/es')['ElRadioGroup'] @@ -47,7 +44,6 @@ declare module 'vue' { ElRow: typeof import('element-plus/es')['ElRow'] ElSelect: typeof import('element-plus/es')['ElSelect'] ElSkeleton: typeof import('element-plus/es')['ElSkeleton'] - ElStatistic: typeof import('element-plus/es')['ElStatistic'] ElSwitch: typeof import('element-plus/es')['ElSwitch'] ElTable: typeof import('element-plus/es')['ElTable'] ElTableColumn: typeof import('element-plus/es')['ElTableColumn'] diff --git a/apps/frontend/src/composables/useAdminListPage.ts b/apps/frontend/src/composables/useAdminListPage.ts new file mode 100644 index 00000000..f9838368 --- /dev/null +++ b/apps/frontend/src/composables/useAdminListPage.ts @@ -0,0 +1,62 @@ +import { ref } from 'vue' + +import type { ApiEnvelope } from '@/lib/http' +import type { AdminPagination } from '@/types/admin' + +export interface AdminListPageData { + items: TItem[] + pagination: AdminPagination +} + +export interface UseAdminListPageOptions { + defaultErrorMessage: string + pageSize?: number + fetchPage: (page: number, pageSize: number) => Promise>> +} + +export function useAdminListPage(options: UseAdminListPageOptions) { + const loading = ref(true) + const errorMessage = ref('') + const items = ref([]) + const pagination = ref({ + page: 1, + pageSize: options.pageSize ?? 20, + total: 0, + }) + let latestRequestId = 0 + + async function loadPage(page = pagination.value.page) { + const requestId = ++latestRequestId + loading.value = true + errorMessage.value = '' + + try { + const response = await options.fetchPage(page, pagination.value.pageSize) + + if (requestId !== latestRequestId) { + return + } + + items.value = response.data.items + pagination.value = response.data.pagination + } catch (error) { + if (requestId !== latestRequestId) { + return + } + + errorMessage.value = error instanceof Error ? error.message : options.defaultErrorMessage + } finally { + if (requestId === latestRequestId) { + loading.value = false + } + } + } + + return { + loading, + errorMessage, + items, + pagination, + loadPage, + } +} diff --git a/apps/frontend/src/views/admin/orders/AdminOrdersView.vue b/apps/frontend/src/views/admin/orders/AdminOrdersView.vue index 68436f45..c7402eff 100644 --- a/apps/frontend/src/views/admin/orders/AdminOrdersView.vue +++ b/apps/frontend/src/views/admin/orders/AdminOrdersView.vue @@ -1,110 +1,166 @@