58 lines
1.7 KiB
TypeScript
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,
|
|
}
|
|
}
|