// Primus IQ — Search Screen const ScreenSearch = ({ setRoute, allProjects = [], onOpenProject }) => { const [q, setQ] = React.useState(''); const adapted = allProjects.map(adaptProject); const matches = q ? adapted.filter(p => p.name.toLowerCase().includes(q.toLowerCase()) || (p.desc && p.desc.toLowerCase().includes(q.toLowerCase())) || (p.tag && p.tag.toLowerCase().includes(q.toLowerCase())) ) : []; return (

Search

Across all projects in the firm — your own and your colleagues'.

setQ(e.target.value)} placeholder="Try “GCC fintech”, “TCFD”, “MSME financing”…" autoFocus />
{!q && (
Start typing to search across all projects.
)} {q && ( <>
{matches.length} projects matching “{q}”
{matches.map(p => { const isMember = p.membership !== null; const isOwner = p.membership === 'owner'; return ; })} {matches.length === 0 && (
No projects matched. Try a different keyword.
)}
)}
); }; const SearchProjectRow = ({ p, isMember, isOwner, setRoute, onOpenProject }) => { const [requested, setRequested] = React.useState(p.hasPendingRequest || false); const handleRequestJoin = async () => { try { await PrimusAPI.joinProject(p.id); setRequested(true); } catch { setRequested(true); } }; return (
{p.name}
{isMember && p.membership && ( {p.membership.toUpperCase()} )} {p.tag && {p.tag}}
{p.desc}
{isMember ? ( ) : ( )}
); }; Object.assign(window, { ScreenSearch, SearchProjectRow, });