The Network Directory is a family of three protected pages that share the same UI infrastructure:Documentation Index
Fetch the complete documentation index at: https://mintlify.com/asubap/website/llms.txt
Use this file to discover all available pages before exploring further.
NetworkSearch for filtering/sorting, NetworkList for the card grid, and NetworkProfileModal for the full-profile drawer. Each page calls a different backend endpoint, normalises the response into the MemberDetail shape, and passes the result to the shared components. All three pages live under NetworkingLayout, which mounts the authenticated Navbar and Footer.
/network
NetworkingPage — Active inducted and pledge members. Fetches
GET /member-info/active/summary. Default sort: Total Hours (high → low)./alumni
AlumniPage — Alumni rank only. Fetches
GET /member-info/alumni/summary. Default sort: Name (A→Z)./eboard-network
EboardPage — Current executive board. Fetches
GET /eboard then cross-references GET /member-info/active/summary and GET /member-info/alumni/summary for enriched data. Default sort: Name (A→Z).Shared MemberDetail Shape
All three pages normalise backend responses toMemberDetail before handing off to NetworkList:
Summary endpoints return only
first_link. The full links array is fetched lazily inside NetworkProfileModal when the modal opens.Sub-Page Breakdown
NetworkingPage (/network)
Fetches from GET /member-info/active/summary. The endpoint returns inducted and pledge members (alumni are excluded server-side). Rank values are normalised:
display_email ?? user_email ?? "Not Provided".
Available Status filter options combine fixed rank labels with dynamic employment statuses:
AlumniPage (/alumni)
Fetches from GET /member-info/alumni/summary. The Status filter shows only employment statuses (no rank labels, since all entries are already alumni). Rank sort options are absent from alumniSortOptions.
EboardPage (/eboard-network)
Makes three parallel requests:
GET /eboard response returns EboardFacultyEntry[]:
Map<string, BackendMemberSummary> is built from the member summaries, keyed by user_email. Each eboard entry is merged with its matching summary (if found):
handleSearch as a single-argument function — it only accepts a query string (no filters object), because no filter dropdowns are active:
NetworkSearch receives availableGraduationYears: [], availableMajors: [], and availableStatuses: [], so the filter panel renders empty dropdowns and only fuzzy name/email/major/about search is active.
Fuse.js Configuration
Each page instantiates aFuse object via useMemo — it rebuilds only when members changes.
- NetworkingPage & AlumniPage
- EboardPage
NetworkSearch via useEffect. Fuzzy results are then passed through the hard filter clauses (graduation year, major, status).
Search & Filter Interface (NetworkSearch)
NetworkSearch manages its own query and filters state and calls onSearch(query, filters) after a 300 ms debounce:
handleSearch:
"Inducted", "Pledge", "Alumni") or employment status strings ("Looking for Internship", "Looking for Full-time", "Not Looking"), so a single dropdown handles both dimensions.
Sort Options
Each page passes asortOptions array to NetworkSearch and uses the useSort hook for the actual sort:
- NetworkingPage sort options
- AlumniPage sort options
- EboardPage sort options
| Value | Label |
|---|---|
name-asc | Name (A-Z) |
name-desc | Name (Z-A) |
graduation-asc | Graduation Year (Earliest) |
graduation-desc | Graduation Year (Latest) |
major-asc | Major (A-Z) |
major-desc | Major (Z-A) |
rank-asc | Rank (Current First) |
rank-desc | Rank (Alumni First) |
status-asc | Status (A-Z) |
status-desc | Status (Z-A) |
hours-desc (default) | Total Hours (High to Low) |
hours-asc | Total Hours (Low to High) |
email-asc | Email (A-Z) |
email-desc | Email (Z-A) |
NetworkList Component
NetworkList renders a responsive CSS grid (1 column → 2 columns → 3 columns) of member cards. Each card shows:
- Profile photo (or a coloured initial avatar if
photoUrlis absent) - Name + major
- Email (with
Mailicon) - Total hours (hidden when
rank.toLowerCase() === "alumni") - First link (clickable, opens in new tab;
e.stopPropagation()prevents modal from opening) - Major (with
Briefcaseicon) - About (2-line clamp with
Infoicon) - Graduation year (with
GraduationCapicon) - Rank (with
Awardicon) - Employment status (with
Targeticon)
NetworkProfileModal. Clicking anywhere on the card also opens the modal.
NetworkList can render both members and sponsors. The sponsor branch uses SponsorProfileModal. All three network pages pass only MemberDetail entries, so the sponsor branch is exercised elsewhere.NetworkProfileModal
NetworkProfileModal opens as a Modal (size "lg"). On open it checks if developmentHours !== "0" — if true the summary data is already detailed and no extra fetch is needed. Otherwise it fetches the full member profile:
email used for the lookup prefers member.userEmail over member.email (which may be display_email):
MemberDetail:
member.email (the display_email-preferred value from the list). Clicking the email copies it to the clipboard via navigator.clipboard.writeText and fires a success toast.
Extending the Directory
To add a new directory page (e.g., faculty):- Create a new page component modelled on
EboardPage. - Fetch from your backend endpoint and transform to
MemberDetail[]. - Pass the array to
<NetworkList entities={...} />. - Add the route in the router and a nav link in
getNavLinks.