/* ============================================================ GlowMerald — Shop (filter, sort, grid) ============================================================ */ const { useState:useStateS, useEffect:useEffectS } = React; function ShopPage(){ const [types,setTypes] = useStateS([]); const [concerns,setConcerns] = useStateS([]); const [maxPrice,setMaxPrice] = useStateS(1300000); const [sort,setSort] = useStateS('best'); const [loading,setLoading] = useStateS(true); const [filterOpen,setFilterOpen] = useStateS(false); useEffectS(()=>{ setLoading(true); const t=setTimeout(()=>setLoading(false),650); return ()=>clearTimeout(t); },[types,concerns,maxPrice,sort]); const toggle = (arr,set,v)=> set(arr.includes(v)?arr.filter(x=>x!==v):[...arr,v]); let items = ALL_ITEMS.filter(p=>{ if(types.length && !types.includes(p.type)) return false; if(p.price>maxPrice) return false; if(concerns.length && !concerns.some(c=>(p.concerns||[]).includes(c))) return false; return true; }); items = [...items].sort((a,b)=>{ if(sort==='low') return a.price-b.price; if(sort==='new') return ALL_ITEMS.indexOf(b)-ALL_ITEMS.indexOf(a); return (b.bestSeller?1:0)-(a.bestSeller?1:0) || b.rating-a.rating; }); const clearAll = ()=>{ setTypes([]); setConcerns([]); setMaxPrice(1300000); }; const activeCount = types.length+concerns.length+(maxPrice<1300000?1:0); const FilterPanel = (

Tipe Produk

{TYPES.map(t=>( ))}

Kebutuhan Kulit

{CONCERNS.map(c=>( ))}

Harga Maksimum

setMaxPrice(+e.target.value)} className="range"/>
Hingga {formatRp(maxPrice)}
{activeCount>0 && }
); return (
Shop

Koleksi GlowMerald

Serum, masker, dan bundle — diformulasikan untuk ritual yang efisien dan terasa premium.

{loading?'…':items.length} produk
{loading ? (
{[0,1,2,3,4,5].map(i=>)}
) : items.length===0 ? (

Tidak ada produk yang cocok dengan filter.

) : (
{items.map(p=>)}
)}
{filterOpen && (
setFilterOpen(false)} style={{ alignItems:'flex-end', display:'flex' }}>
e.stopPropagation()}>

Filter

{FilterPanel}
)}
); } window.ShopPage = ShopPage;