\n {/* Raw Packet Feed */}\n {!query && (\n
\n handleSelectConversation({\n type: 'raw',\n id: 'raw',\n name: 'Raw Packet Feed',\n })\n }\n >\n 📡\n Packet Feed\n
\n )}\n\n {/* Node Map */}\n {!query && (\n
\n handleSelectConversation({\n type: 'map',\n id: 'map',\n name: 'Node Map',\n })\n }\n >\n 🗺️\n Node Map\n
\n )}\n\n {/* Cracker Toggle */}\n {!query && (\n
\n 🔓\n \n {showCracker ? 'Hide' : 'Show'} Cracker\n \n ({crackerRunning ? 'running' : 'stopped'})\n \n \n
\n )}\n\n {/* Mark All Read */}\n {!query && Object.keys(unreadCounts).length > 0 && (\n
\n ✓\n Mark all as read\n
\n )}\n\n {/* Channels */}\n {filteredChannels.length > 0 && (\n <>\n
\n Channels\n \n
\n {filteredChannels.map((channel) => {\n const unreadCount = getUnreadCount('channel', channel.key);\n const isMention = hasMention('channel', channel.key);\n return (\n
0 && \"[&_.name]:font-bold [&_.name]:text-foreground\"\n )}\n onClick={() =>\n handleSelectConversation({\n type: 'channel',\n id: channel.key,\n name: channel.name,\n })\n }\n >\n #\n {channel.name}\n {unreadCount > 0 && (\n \n {unreadCount}\n \n )}\n
\n );\n })}\n >\n )}\n\n {/* Contacts */}\n {filteredContacts.length > 0 && (\n <>\n
\n Contacts\n {filteredChannels.length === 0 && (\n \n )}\n
\n {filteredContacts.map((contact) => {\n const unreadCount = getUnreadCount('contact', contact.public_key);\n const isMention = hasMention('contact', contact.public_key);\n return (\n
0 && \"[&_.name]:font-bold [&_.name]:text-foreground\"\n )}\n onClick={() =>\n handleSelectConversation({\n type: 'contact',\n id: contact.public_key,\n name: getContactDisplayName(contact.name, contact.public_key),\n })\n }\n >\n \n \n {getContactDisplayName(contact.name, contact.public_key)}\n \n {unreadCount > 0 && (\n \n {unreadCount}\n \n )}\n
\n );\n })}\n >\n )}\n\n {/* Empty state */}\n {filteredContacts.length === 0 && filteredChannels.length === 0 && (\n
\n {query ? 'No matches found' : 'No conversations yet'}\n
\n )}\n