import { RoomOptions } from '@ably/chat'; import { clsx } from 'clsx'; import React, { useState } from 'react'; import { useTheme } from '../../hooks/use-theme.tsx'; import { Button } from '../atoms/button.tsx'; import { Icon } from '../atoms/icon.tsx'; import { CreateRoomModal } from './create-room-modal.tsx'; import { DropdownMenu } from './dropdown-menu.tsx'; import { RoomList } from './room-list.tsx'; /** * Props for the Sidebar component */ export interface SidebarProps { /** Rooms to display. */ roomNames: string[]; /** Currently-active room (optional). */ activeRoomName?: string; /** Ably options passed to each `ChatRoomProvider`. */ defaultRoomOptions?: RoomOptions; /** Adds (or joins) a room. Should also set it active, if desired. */ addRoom: (name: string) => void; /** Sets the active room. Pass `undefined` to clear. */ setActiveRoom: (name?: string) => void; /** Leaves a room (and handles provider release if needed). */ leaveRoom: (name: string) => void; /** Optional CSS class names for additional styling. */ className?: string; /** Whether the sidebar is in collapsed mode (avatar-only). */ isCollapsed?: boolean; /** Callback to toggle the collapsed state. */ onToggleCollapse?: () => void; } /** * Sidebar component provides room navigation and management * * Features: * - Collapsible interface with avatar-only mode * - Room creation and management * - Theme toggle integration * - Active room highlighting * - Room count display * * @example * const [rooms, setRooms] = useState([]); * const [active, setActive] = useState(); * * const addRoom = (name: string) => setRooms(r => r.includes(name) ? r : [...r, name]); * const leaveRoom = (name: string) => setRooms(r => r.filter(n => n !== name)); * * */ export const Sidebar = ({ roomNames, activeRoomName, defaultRoomOptions, addRoom, setActiveRoom, leaveRoom, className = '', isCollapsed = false, onToggleCollapse, }: SidebarProps) => { const [showCreateModal, setShowCreateModal] = useState(false); const { theme, toggleTheme } = useTheme(); return ( ); }; Sidebar.displayName = 'Sidebar';