import { useState } from 'react' import { useAtom, useAtomValue } from 'jotai' import { PenSquareIcon, MoreVerticalIcon, FolderOpenIcon, Code2Icon, PanelLeftCloseIcon, PanelRightCloseIcon, } from 'lucide-react' import { twMerge } from 'tailwind-merge' import CommandSearch from '@/containers/Layout/TopBar/CommandSearch' import { showLeftSideBarAtom } from '@/containers/Providers/KeyListener' import { MainViewState } from '@/constants/screens' import { useClickOutside } from '@/hooks/useClickOutside' import { useCreateNewThread } from '@/hooks/useCreateNewThread' import { useMainViewState } from '@/hooks/useMainViewState' import { usePath } from '@/hooks/usePath' import { showRightSideBarAtom } from '@/screens/Chat/Sidebar' import { openFileTitle } from '@/utils/titleUtils' import { assistantsAtom } from '@/helpers/atoms/Assistant.atom' import { activeThreadAtom } from '@/helpers/atoms/Thread.atom' const TopBar = () => { const activeThread = useAtomValue(activeThreadAtom) const { mainViewState } = useMainViewState() const { requestCreateNewThread } = useCreateNewThread() const assistants = useAtomValue(assistantsAtom) const [showRightSideBar, setShowRightSideBar] = useAtom(showRightSideBarAtom) const [showLeftSideBar, setShowLeftSideBar] = useAtom(showLeftSideBarAtom) const showing = useAtomValue(showRightSideBarAtom) const { onReviewInFinder, onViewJson } = usePath() const [more, setMore] = useState(false) const [menu, setMenu] = useState(null) const [toggle, setToggle] = useState(null) useClickOutside(() => setMore(false), null, [menu, toggle]) const titleScreen = (viewStateName: MainViewState) => { switch (viewStateName) { case MainViewState.Thread: return activeThread ? activeThread?.title : 'New Thread' case MainViewState.LocalServer: return 'Local API Server' default: return MainViewState[viewStateName]?.replace(/([A-Z])/g, ' $1').trim() } } const onCreateConversationClick = async () => { if (assistants.length === 0) { alert('No assistant available') } else { requestCreateNewThread(assistants[0]) } } return (
{mainViewState !== MainViewState.Thread && mainViewState !== MainViewState.LocalServer ? (
{titleScreen(mainViewState)}
) : (
{mainViewState == MainViewState.Thread && (
setShowLeftSideBar((show) => !show)} >
)}
{titleScreen(mainViewState)}
{((activeThread && mainViewState === MainViewState.Thread) || mainViewState === MainViewState.LocalServer) && (
{showing && (
{mainViewState === MainViewState.Thread && 'Threads Settings'} {mainViewState === MainViewState.LocalServer && 'Model Settings'}
setMore(!more)} >
{mainViewState === MainViewState.Thread && more && (
{ onReviewInFinder('Thread') setMore(false) }} > {openFileTitle()}
{ onViewJson('Thread') setMore(false) }} >
Edit Threads Settings Opens thread.json. Changes affect this thread only.
)} {mainViewState === MainViewState.LocalServer && more && (
{ onReviewInFinder('Model') setMore(false) }} >
{openFileTitle()}
)}
)}
setShowRightSideBar((show) => !show)} >
)}
)}
) } export default TopBar