/* ============================================================
GlowMerald — Account (profile, orders, wishlist, address, loyalty)
============================================================ */
const { useState:useStateAcc } = React;
const ACC_NAV = [
{ k:'profile', label:'Profil', icon:'user' },
{ k:'orders', label:'Pesanan Saya', icon:'shop' },
{ k:'wishlist', label:'Wishlist', icon:'heart' },
{ k:'address', label:'Alamat', icon:'home' },
{ k:'loyalty', label:'Loyalty Points', icon:'gem' },
{ k:'settings', label:'Pengaturan', icon:'spark' },
];
const STATUS_STYLE = { 'Diproses':'st-proc', 'Dikirim':'st-ship', 'Selesai':'st-done' };
function AccountPage(){
const { param, navigate } = useApp();
const [section,setSection] = useStateAcc(param || 'profile');
return (
{section==='profile' &&
}
{section==='orders' &&
}
{section==='wishlist' &&
}
{section==='address' &&
}
{section==='loyalty' &&
}
{section==='settings' &&
}
);
}
function TierBadge({ tier }){
const cls = tier==='Inner Circle'||tier==='Ambassador' ? 'tier-emerald':'tier-gold';
return {tier};
}
function ProfileSection(){
return (
);
}
function OrdersSection(){
const { navigate } = useApp();
const [open,setOpen] = useStateAcc(null);
return (
Pesanan Saya
{ORDERS.map(o=>(
setOpen(open===o.id?null:o.id)}>
{o.id}
{o.date} · {o.items.length} item
{o.status}
{open===o.id && (
{o.items.map((it,i)=>(
))}
Total
{formatRp(o.total)}
{o.status==='Dikirim' && }
)}
))}
);
}
function WishlistSection(){
const { wishlist, navigate } = useApp();
const items = wishlist.map(findItem).filter(Boolean);
return (
Wishlist
{items.length===0
?
Wishlist masih kosong.
:
}
);
}
function AddressSection(){
const [adding,setAdding] = useStateAcc(false);
return (
Alamat
{ADDRESSES.map(a=>(
{a.label}
{a.def && Utama}
{a.name} · {a.phone}
{a.detail}, {a.city}, {a.prov} {a.post}
))}
{adding && (
)}
);
}
function LoyaltySection(){
const idx = TIERS.findIndex(t=>t.name===USER.tier);
const next = TIERS[idx+1];
const pct = next ? Math.min(100, Math.round((USER.points-TIERS[idx].min)/(next.min-TIERS[idx].min)*100)) : 100;
const toNext = next ? next.min-USER.points : 0;
return (
Loyalty Points
Saldo Poin
{USER.points.toLocaleString('id-ID')}
poin
{next && (
{USER.tier}{next.name}
{toNext.toLocaleString('id-ID')} poin lagi menuju {next.name}.
)}
Tukar Poin
{[['Voucher Rp 50.000','500 poin'],['Free Sachet Mask','350 poin'],['Free Shipping','200 poin'],['Voucher Rp 150.000','1.400 poin']].map(([t,p],i)=>(
))}
);
}
function SettingsSection(){
const Toggle = ({ label, on })=>{
const [v,setV]=useStateAcc(on);
return (
{label}
);
};
return (
);
}
window.AccountPage = AccountPage;