o2o-negosium-original/frontend/src/features/list/hooks/useList.ts

24 lines
999 B
TypeScript

import { useMemo } from 'react'
import { useSessionListQuery } from '@/apis'
import { useListStore } from '@/features/list/stores/useListStore'
import { deadlineToOrder, statusLabelToCode, toListItem } from '@/features/list/lib/adapter'
const PAGE_SIZE = 20
// 필터/정렬/페이지는 서버에 위임하고, 응답(정수 코드)을 화면용 라벨로 변환한다.
export function useList() {
const { selectedStatus, selectedDeadline, currentPage, setCurrentPage } = useListStore()
const query = useSessionListQuery({
status: selectedStatus ? statusLabelToCode(selectedStatus) : undefined,
order: selectedDeadline ? deadlineToOrder(selectedDeadline) : undefined,
page: currentPage,
page_size: PAGE_SIZE,
})
const items = useMemo(() => (query.data?.items ?? []).map(toListItem), [query.data])
const totalPages = Math.max(1, Math.ceil((query.data?.total ?? 0) / PAGE_SIZE))
return { items, isLoading: query.isLoading, totalPages, currentPage, setCurrentPage }
}