import type { Member } from "../stores/member.ts"; export type MentionOption = | { kind: "special"; id: string; label: string; description: string } | { kind: "user"; member: Member }; interface MentionDropdownProps { query: string; members: Member[]; selectedIndex: number; onSelect: (username: string) => void; canMentionEveryone?: boolean; } const SPECIALS: { id: string; label: string; description: string }[] = [ { id: "everyone", label: "everyone", description: "Notify the entire server" }, { id: "channel", label: "channel", description: "Notify everyone in this channel" }, ]; export function buildMentionOptions( query: string, members: Member[], canMentionEveryone: boolean, ): MentionOption[] { const q = query.toLowerCase(); const options: MentionOption[] = []; if (canMentionEveryone) { for (const s of SPECIALS) { if (!q || s.id.startsWith(q) || s.label.startsWith(q)) { options.push({ kind: "special", id: s.id, label: s.label, description: s.description }); } } } const users = members .filter( (m) => m.username.toLowerCase().includes(q) || m.display_name?.toLowerCase().includes(q), ) .slice(0, 6) .map((m): MentionOption => ({ kind: "user", member: m })); return [...options, ...users].slice(0, 8); } export function MentionDropdown({ query, members, selectedIndex, onSelect, canMentionEveryone = false, }: MentionDropdownProps) { const options = buildMentionOptions(query, members, canMentionEveryone); if (options.length === 0) return null; return (
MENTION
{options.map((opt, i) => { const active = i === selectedIndex; if (opt.kind === "special") { return ( ); } const m = opt.member; return ( ); })}
); }