+
+
+ setSearchQuery(e.target.value)}
+ className={cn('h-7 text-[13px] bg-background/50', searchQuery ? 'pr-8' : 'pr-3')}
+ />
+ {searchQuery && (
+
+ )}
+
+
+
{/* Tools */}
{toolRows.length > 0 && (
<>
diff --git a/frontend/src/test/sidebar.test.tsx b/frontend/src/test/sidebar.test.tsx
index 167ab1d..a2a75ab 100644
--- a/frontend/src/test/sidebar.test.tsx
+++ b/frontend/src/test/sidebar.test.tsx
@@ -122,6 +122,46 @@ describe('Sidebar section summaries', () => {
expect(within(getSectionHeaderContainer('Repeaters')).getByText('4')).toBeInTheDocument();
});
+ it('renders a full add channel/contact button above search and calls onNewMessage', () => {
+ const onNewMessage = vi.fn();
+
+ render(
+
+ );
+
+ const addButton = screen.getByRole('button', { name: 'Add channel or contact' });
+ const search = screen.getByLabelText('Search conversations');
+ const nav = screen.getByRole('navigation', { name: 'Conversations' });
+ const toolsButton = screen.getByRole('button', { name: 'Tools' });
+
+ expect(addButton).toHaveTextContent('Add Channel/Contact');
+ expect(
+ addButton.compareDocumentPosition(search) & Node.DOCUMENT_POSITION_FOLLOWING
+ ).toBeTruthy();
+ expect(nav.compareDocumentPosition(search) & Node.DOCUMENT_POSITION_CONTAINED_BY).toBeTruthy();
+ expect(
+ search.compareDocumentPosition(toolsButton) & Node.DOCUMENT_POSITION_FOLLOWING
+ ).toBeTruthy();
+
+ fireEvent.click(addButton);
+ expect(onNewMessage).toHaveBeenCalledTimes(1);
+ });
+
it('turns favorites and channels rollups red when they contain a mention', () => {
renderSidebar({
mentions: {