import { useState, useEffect } from 'react' import { useQuery } from '@tanstack/react-query' import { motion, AnimatePresence } from 'framer-motion' import { OverlayScrollbarsComponent } from 'overlayscrollbars-react' 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 return ( {open && (

이미지 선택

{/* 검색 */}
setSearch(e.target.value)} placeholder="이미지 이름으로 검색..." className="w-full rounded-lg border pl-10 pr-4 py-2.5 text-sm outline-none focus:border-[var(--input-border-focus)] hover:border-[var(--input-border-hover)]" style={{ background: 'var(--input-bg)', borderColor: 'var(--input-border)', color: 'var(--text-strong)', }} /> 🔍
{/* 이미지 그리드 — 6×4 (24개) 높이로 고정, 내부는 OverlayScrollbars */}
{isLoading ? (
{Array.from({ length: 12 }).map((_, i) => (
))}
) : images.length === 0 ? (
{debouncedSearch ? '검색 결과가 없습니다' : '업로드된 이미지가 없습니다'}
) : (
{images.map((image) => { const isSelected = currentImageId === image.id return ( ) })}
)}
{/* 페이지네이션 + 액션 (없으면 전체 섹션 숨김) */} {(totalPages > 1 || currentImageId) && (
{totalPages > 1 ? (
{page} / {totalPages}
) :
} {currentImageId && ( )}
)} )} ) }