import { $desktopMode, $jwtToken, $mediaSettings, } from "../../controller/recoil"; import { Avatar, Dropdown, Menu, Tooltip } from "antd"; import { FiCheck, FiLogOut, FiMic, FiMicOff } from "react-icons/fi"; import { GlobalHotKeys, KeyMap } from "react-hotkeys"; import { useCallback, useEffect, useMemo, useRef, useState } from "react"; import { useRecoilState, useRecoilValue, useSetRecoilState } from "recoil"; import { FaSearch } from "react-icons/fa"; import HorizontalLogo from "../../../../components/logo/horizontal"; import Logo from "../Logo"; import { LogoType } from "../../../../components/logo/full"; import { useGetUserDetails } from "../../controller/index"; /** * TODO: add in video mode * */ export default function NirvanaHeader({ onHeaderFocus, }: { onHeaderFocus: () => void; }) { const { data: userDetailsRes, isLoading, isError } = useGetUserDetails(); const inputRef = useRef(null); const [searchInput, setSearchInput] = useState(""); const [desktopMode, setDesktopMode] = useRecoilState($desktopMode); const [mediaSettings, setMediaSettings] = useRecoilState($mediaSettings); const setJwtToken = useSetRecoilState($jwtToken); useEffect(() => { if (isError) setJwtToken(null); }, [isError]); /** hide the search bar in the header so that it's cleaner for these two modes */ const shouldHideSearch = useMemo(() => { if (desktopMode === "flowState" || desktopMode === "overlayOnly") return true; return false; }, [desktopMode]); const selectSearch = () => { inputRef.current?.focus(); }; const onSearchChange = (e) => { setSearchInput(e.target.value); }; const keyMap: KeyMap = { SELECT_SEARCH: { name: "select search to start searching", sequence: "/", action: "keyup", }, }; const handlers = { SELECT_SEARCH: selectSearch, }; const handleMuteToggle = useCallback(() => { setMediaSettings((previousMediaSettings) => ({ ...previousMediaSettings, isMuted: !previousMediaSettings.isMuted, })); }, [setMediaSettings]); const handleSignOut = useCallback(() => { setJwtToken(null); }, [setJwtToken]); if (isLoading) return <>loading; // todo: do I need a mute mode? isn't that just flow state // might confuse user overall const profileMenu = ( // {mediaSettings.isMuted ? "Unmute" : "Mute"} // // ), // icon: <> {mediaSettings.isMuted ? : } , // key: `profile-menu-${1}`, // }, { label: Audio Only, icon: <> {mediaSettings.mode === "audio" ? : <>} , disabled: false, key: `profile-menu-${2}`, }, { label: ( Video ), icon: <>{mediaSettings.mode === "video" ? : <>} , disabled: true, key: `profile-menu-${3}`, }, { label: ( Screen ), icon: <>{mediaSettings.mode === "screen" ? : <>} , disabled: true, key: `profile-menu-${3}`, }, { type: "divider", key: `profile-menu-${4}`, }, { label: Sign Out, icon: , key: `profile-menu-${5}`, danger: true, }, ]} /> ); return ( <>
{!shouldHideSearch && (
)} {/* todo: move this ghost button to components */} {desktopMode === "flowState" ? ( ) : ( )}
{userDetailsRes?.user?.picture && mediaSettings.mode === "audio" && ( )}
{/* menu for the output options */} {/* setOutputMode("audio")}> Audio Only setOutputMode("video")}> Video */}
); }