// === Product detail viewer === function ProductDetail({ productId, products, setProducts, onClose }) { const product = products.find(p => p.id === productId); if (!product) return null; const cat = window.MOCK.CATEGORIES.find(c => c.id === product.category); const [tab, setTab] = useState("overview"); const margin = ((product.price - product.costPrice) / product.price * 100).toFixed(1); const update = (patch) => setProducts(prev => prev.map(p => p.id === product.id ? { ...p, ...patch } : p)); return ( {product.sku} {product.name} } footer={ <> 스마트스토어에서 보기
}>
{/* Left: gallery */}
{[0, 1, 2, 3].map(i => ( ))}
현재 판매가
{formatKRW(product.price)}
원가 {formatKRW(product.costPrice)} · 마진율 {margin}%
평점
{product.rating} ({formatNum(product.reviews)})
조회수 (30일)
{formatNum(product.views30d)}
{/* Right: details */}
{cat?.icon} {cat?.name} {product.brand}
{[ ["overview", "기본정보"], ["pricing", "가격/재고"], ["desc", "상세설명"], ["sales", "판매통계"], ].map(([k, l]) => ( ))}
{tab === "overview" && (
update({ name: e.target.value })} />
update({ brand: e.target.value })} />
update({ sku: e.target.value })} />
)} {tab === "pricing" && (
update({ price: parseInt(e.target.value.replace(/[^0-9]/g, "")) || 0 })} /> update({ costPrice: parseInt(e.target.value.replace(/[^0-9]/g, "")) || 0 })} />
개당 마진 {formatKRW(product.price - product.costPrice)} ({margin}%)
30일 예상 매출 {formatKRW(product.price * product.sales30d)}
update({ stock: parseInt(e.target.value) || 0 })} />
)} {tab === "desc" && (