import { LineMemberState } from '@nirvana/core/models/line.model'; import { Avatar, Dropdown, Skeleton, Tooltip } from 'antd'; import React, { useCallback, useMemo, useRef, useState, useEffect } from 'react'; import { FiActivity, FiPlus, FiSearch } from 'react-icons/fi'; import useRooms from '../../../../providers/RoomsProvider'; import NavBar from '../navbar/Navbar'; import NoTextLogo from '@nirvana/components/logo/NoTextLogo'; import LineRow from '../line/LineRow'; import useTerminalProvider from '../../../../providers/TerminalProvider'; import useAuth from '../../../../providers/AuthProvider'; import useSockets from '../../../../providers/SocketProvider'; import useElectron from '../../../../providers/ElectronProvider'; import useStreams from '../../../../providers/StreamProvider'; import { maxToggleTunedChannelCount } from '../rules'; import { useKeyPressEvent } from 'react-use'; export default function SidePanel() { // using merely for loading state...better to add to realtimeroom context? const { rooms: initialRoomsFetch } = useRooms(); const { user, handleLogout } = useAuth(); const { allChannels, tunedChannelsCount, handleSelectLine, selectedLineId, handleShowNewChannelForm, } = useTerminalProvider(); const { handleFlowState } = useSockets(); const { handleToggleDesktopMode, desktopMode, isWindowFocused } = useElectron(); const [searchQuery, setSearchQuery] = useState(''); const handleCreateNewChannel = useCallback(() => { handleShowNewChannelForm('show'); }, [handleShowNewChannelForm]); const omniSearchBarRef = useRef(); const focusSearch = useCallback(() => { if (omniSearchBarRef.current) omniSearchBarRef.current.focus(); }, [omniSearchBarRef]); useKeyPressEvent('Tab', focusSearch); return (
{/* user control panel */}
{desktopMode === 'mainApp' && ( Conversations )}
{/* search + other stuff */} {desktopMode === 'mainApp' && ( <>
setSearchQuery(e.target.value)} value={searchQuery} ref={omniSearchBarRef} /> tab

Priority

{`${ tunedChannelsCount || 0 }/${maxToggleTunedChannelCount}`}

)} {!(allChannels.length > 0) && ( You have no lines!
Create one to connect to your team instantly.
)} {/* rest of the lines */}
{initialRoomsFetch.loading ? ( ) : ( allChannels.map((masterLineData, index) => ( )) )}
); } // todo if audio only mode, show avatar // if problem, show error function UserProfileAvatar() { const { user } = useAuth(); const { userLocalStream } = useStreams(); const videoRef = useRef(); useEffect(() => { if (videoRef.current && userLocalStream) videoRef.current.srcObject = userLocalStream; }, [userLocalStream]); if (userLocalStream) return