Spaces:
Build error
Build error
import React from "react"; | |
import { useLocation } from "react-router"; | |
import { useGitUser } from "#/hooks/query/use-git-user"; | |
import { UserActions } from "./user-actions"; | |
import { AllHandsLogoButton } from "#/components/shared/buttons/all-hands-logo-button"; | |
import { DocsButton } from "#/components/shared/buttons/docs-button"; | |
import { NewProjectButton } from "#/components/shared/buttons/new-project-button"; | |
import { SettingsButton } from "#/components/shared/buttons/settings-button"; | |
import { ConversationPanelButton } from "#/components/shared/buttons/conversation-panel-button"; | |
import { SettingsModal } from "#/components/shared/modals/settings/settings-modal"; | |
import { useSettings } from "#/hooks/query/use-settings"; | |
import { ConversationPanel } from "../conversation-panel/conversation-panel"; | |
import { ConversationPanelWrapper } from "../conversation-panel/conversation-panel-wrapper"; | |
import { useLogout } from "#/hooks/mutation/use-logout"; | |
import { useConfig } from "#/hooks/query/use-config"; | |
import { displayErrorToast } from "#/utils/custom-toast-handlers"; | |
export function Sidebar() { | |
const location = useLocation(); | |
const user = useGitUser(); | |
const { data: config } = useConfig(); | |
const { | |
data: settings, | |
error: settingsError, | |
isError: settingsIsError, | |
isFetching: isFetchingSettings, | |
} = useSettings(); | |
const { mutate: logout } = useLogout(); | |
const [settingsModalIsOpen, setSettingsModalIsOpen] = React.useState(false); | |
const [conversationPanelIsOpen, setConversationPanelIsOpen] = | |
React.useState(false); | |
// TODO: Remove HIDE_LLM_SETTINGS check once released | |
const shouldHideLlmSettings = | |
config?.FEATURE_FLAGS.HIDE_LLM_SETTINGS && config?.APP_MODE === "saas"; | |
React.useEffect(() => { | |
if (shouldHideLlmSettings) return; | |
if (location.pathname === "/settings") { | |
setSettingsModalIsOpen(false); | |
} else if ( | |
!isFetchingSettings && | |
settingsIsError && | |
settingsError?.status !== 404 | |
) { | |
// We don't show toast errors for settings in the global error handler | |
// because we have a special case for 404 errors | |
displayErrorToast( | |
"Something went wrong while fetching settings. Please reload the page.", | |
); | |
} else if (config?.APP_MODE === "oss" && settingsError?.status === 404) { | |
setSettingsModalIsOpen(true); | |
} | |
}, [ | |
settingsError?.status, | |
settingsError, | |
isFetchingSettings, | |
location.pathname, | |
]); | |
return ( | |
<> | |
<aside className="h-[40px] md:h-auto px-1 flex flex-row md:flex-col gap-1"> | |
<nav className="flex flex-row md:flex-col items-center justify-between w-full h-auto md:w-auto md:h-full"> | |
<div className="flex flex-row md:flex-col items-center gap-[26px]"> | |
<div className="flex items-center justify-center"> | |
<AllHandsLogoButton /> | |
</div> | |
<NewProjectButton disabled={settings?.EMAIL_VERIFIED === false} /> | |
<ConversationPanelButton | |
isOpen={conversationPanelIsOpen} | |
onClick={() => | |
settings?.EMAIL_VERIFIED === false | |
? null | |
: setConversationPanelIsOpen((prev) => !prev) | |
} | |
disabled={settings?.EMAIL_VERIFIED === false} | |
/> | |
</div> | |
<div className="flex flex-row md:flex-col md:items-center gap-[26px] md:mb-4"> | |
<DocsButton disabled={settings?.EMAIL_VERIFIED === false} /> | |
<SettingsButton disabled={settings?.EMAIL_VERIFIED === false} /> | |
<UserActions | |
user={ | |
user.data ? { avatar_url: user.data.avatar_url } : undefined | |
} | |
onLogout={logout} | |
isLoading={user.isFetching} | |
/> | |
</div> | |
</nav> | |
{conversationPanelIsOpen && ( | |
<ConversationPanelWrapper isOpen={conversationPanelIsOpen}> | |
<ConversationPanel | |
onClose={() => setConversationPanelIsOpen(false)} | |
/> | |
</ConversationPanelWrapper> | |
)} | |
</aside> | |
{settingsModalIsOpen && ( | |
<SettingsModal | |
settings={settings} | |
onClose={() => setSettingsModalIsOpen(false)} | |
/> | |
)} | |
</> | |
); | |
} | |