admin/services/myEvents.ts
alisaza e1eaf5eff5 feat: initial ghabilee-admin backoffice app
Extract admin dashboard from ghabilee-frontend2 into a dedicated Next.js
app for backoffice.ghabilee.ir (no SEO indexing / Clarity).
2026-09-05 13:12:59 +03:30

44 lines
1.5 KiB
TypeScript

import type { MyEventsGuestItemDto, MyEventsHostItemDto, MyEventsListControllerList200, PaginationMetaDto } from '@/api/generated/models'
import { getMyEvents } from '@/api/generated/my-events/my-events'
import { unwrapApiPayload } from '@/helpers/listResponse'
export const MY_EVENTS_PAGE_SIZE = 20
export type MyEventsRole = 'guest' | 'host'
export type MyEventsGuestStatus = 'upcoming' | 'held' | 'cancelled'
export type MyEventsHostStatus = 'pending_review' | 'published' | 'rejected'
export type MyEventsStatus = MyEventsGuestStatus | MyEventsHostStatus
export type MyEventsGuestItem = MyEventsGuestItemDto
export type MyEventsHostItem = MyEventsHostItemDto
export interface MyEventsPage<TItem> {
role: MyEventsRole
status: MyEventsStatus
canHost: boolean
availableRoles: MyEventsRole[]
items: TItem[]
response: PaginationMetaDto
}
const myEventsApi = getMyEvents()
/** Fetches one server-filtered lifecycle page for the My Events screen. */
export const fetchMyEventsPage = async <TItem extends MyEventsGuestItem | MyEventsHostItem>({
role,
status,
page,
pageSize = MY_EVENTS_PAGE_SIZE,
signal,
}: {
role: MyEventsRole
status: MyEventsStatus
page: number
pageSize?: number
signal?: AbortSignal
}): Promise<MyEventsPage<TItem>> => {
const response = await myEventsApi.myEventsListControllerList({ role, status, page, pageSize }, { signal })
const payload = unwrapApiPayload<MyEventsListControllerList200>(response.data)
return payload as MyEventsPage<TItem>
}