/* P.E.S.T Web App — Members showcase + modal (with referral links/badges) */
function RefBadges({ refs, projects, className }) {
if (!refs || refs.length === 0) return null;
return (
{refs.slice(0, 3).map((r, i) => {
const proj = projects.find((p) => p.id === r.projectId);
if (!proj) return null;
return (
{proj.logo ?
})
:
{proj.name[0]}}
);
})}
);
}
function MemberCard({ m, refs, projects, onOpen }) {
const badges = window.memberBadges(m);
return (
onOpen(m)}>
{badges.length > 0 && (
{badges.map((b) => {window.BADGE_META[b].short})}
)}
{m.nick}
{window.roleLabel(m)}
);
}
function DiscordPill({ user }) {
const [copied, setCopied] = useState(false);
return (
);
}
function MemberModal({ m, onClose }) {
const store = useStore();
const [idx, setIdx] = useState(0);
useEffect(() => {
const k = (e) => e.key === "Escape" && onClose();
window.addEventListener("keydown", k);
return () => window.removeEventListener("keydown", k);
}, []);
const socials = Object.keys(m.socials || {}).filter((s) => m.socials[s]);
const badges = window.memberBadges(m);
const pfp = (m.pfps && m.pfps[idx]) || (m.pfps && m.pfps[0]) || { name: "" };
const refs = (store.referralsByMember[m.nick] || []);
const isMe = m.nick === store.user.nick;
return (
e.stopPropagation()}>
{pfp.img ?

:
{m.nick.slice(0, 2)}
}
{window.roleLabel(m)}
{m.nick}
PFP · {pfp.name}
{badges.length > 0 && (
{badges.map((b) => {window.BADGE_META[b].full})}
)}
{window.honoraryBadges(m).length > 0 && (
{window.honoraryBadges(m).map((k) => { const B = window.HBADGE[k]; const I = B.icon; return {B.label}; })}
)}
{m.pfps && m.pfps.length > 1 && (
PFP Collection
{m.pfps.map((p, i) => (
))}
)}
{m.desc ?
{m.desc}
:
No bio yet.
}
{(socials.length > 0 || m.discord) && (
Personal channels
{socials.map((s) => { const meta = window.A_SOCIAL[s]; const I = meta.icon; return
{meta.label}; })}
{m.discord &&
}
)}
Referral links {refs.length > 0 && · support {isMe ? "you" : m.nick}}
{refs.length === 0 ? (
{isMe ? "You haven't added any referral links yet." : "No referral links shared."}
) : (
{refs.map((r, i) => {
const proj = store.projects.find((p) => p.id === r.projectId);
if (!proj) return null;
return (
{proj.name}
{(proj.categories && proj.categories.join(" · ")) || proj.category || ""}
Use ref
);
})}
)}
);
}
function Members() {
const store = useStore();
const [open, setOpen] = useState(null);
const data = window.sortMembers(store.members);
return (
Core Members
The inner circle
Thirty nodes of trust. Tap a member to see their channels — and the referral links they share with the hive.
{data.map((m, i) => (
))}
{open &&
setOpen(null)} />}
);
}
window.Members = Members;
window.MemberModal = MemberModal;