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

58 lines
1.7 KiB
TypeScript

import { useMemo, useState } from 'react'
import { useListStore } from '@/features/list/stores/useListStore'
import { MOCK_ITEMS } from '@/features/list/mocks/mockItems'
import type { ListItem } from '@/features/list/types'
const PAGE_SIZE = 20
// 목데이터 클라이언트 필터 (추후 API 조회로 교체)
export function useList() {
const { selectedType, selectedStatus, selectedDeadline, currentPage, setCurrentPage } =
useListStore()
const [selectedId, setSelectedId] = useState<string | null>(null)
const filtered = useMemo(() => {
const result = MOCK_ITEMS.filter(
(item) =>
(!selectedType || item.qt_type === selectedType) &&
(!selectedStatus || item.session_status === selectedStatus),
)
if (selectedDeadline) {
const dir = selectedDeadline === '남은 시간 적은 순' ? 1 : -1
result.sort(
(a, b) =>
(new Date(a.qt_end_time).getTime() - new Date(b.qt_end_time).getTime()) * dir,
)
}
return result
}, [selectedType, selectedStatus, selectedDeadline])
const totalPages = Math.max(1, Math.ceil(filtered.length / PAGE_SIZE))
const items = useMemo(
() => filtered.slice((currentPage - 1) * PAGE_SIZE, currentPage * PAGE_SIZE),
[filtered, currentPage],
)
const selectedItem = useMemo(
() => items.find((item) => item.session_id === selectedId) ?? null,
[items, selectedId],
)
const handleItemClick = (item: ListItem) =>
setSelectedId((prev) => (prev === item.session_id ? null : item.session_id))
return {
items,
isLoading: false,
totalPages,
currentPage,
setCurrentPage,
selectedId,
selectedItem,
handleItemClick,
}
}