import { useState, useEffect } from 'react'
import { useQuery } from '@tanstack/react-query'
import { api } from '../../../../api/client'
const PAGE_SIZE = 24
export default function ImagePicker({ open, onClose, onSelect, currentImageId }) {
const [page, setPage] = useState(1)
const [search, setSearch] = useState('')
const [debouncedSearch, setDebouncedSearch] = useState('')
useEffect(() => {
const t = setTimeout(() => {
setDebouncedSearch(search)
setPage(1)
}, 300)
return () => clearTimeout(t)
}, [search])
useEffect(() => {
if (!open) {
setSearch('')
setDebouncedSearch('')
setPage(1)
}
}, [open])
const { data, isLoading } = useQuery({
queryKey: ['admin', 'images', { page, search: debouncedSearch }],
queryFn: () => {
const params = new URLSearchParams({
page,
limit: PAGE_SIZE,
...(debouncedSearch && { search: debouncedSearch }),
})
return api(`/api/admin/images?${params}`)
},
enabled: open,
placeholderData: (prev) => prev,
})
const images = data?.items || []
const totalPages = data?.total_pages || 1
if (!open) return null
return (
e.stopPropagation()}
>
이미지 선택
{/* 검색 */}
{/* 이미지 그리드 */}
{isLoading ? (
{Array.from({ length: 12 }).map((_, i) => (
))}
) : images.length === 0 ? (
{debouncedSearch ? '검색 결과가 없습니다' : '업로드된 이미지가 없습니다'}
) : (
{images.map((image) => {
const isSelected = currentImageId === image.id
return (
)
})}
)}
{/* 페이지네이션 + 액션 */}
{totalPages > 1 ? (
{page} / {totalPages}
) :
}
{currentImageId && (
)}
)
}