mirror of
https://github.com/OpenHands/OpenHands.git
synced 2025-12-26 05:48:36 +08:00
119 lines
4.2 KiB
TypeScript
119 lines
4.2 KiB
TypeScript
import React from "react";
|
|
import { useLocation } from "react-router";
|
|
import { useGitUser } from "#/hooks/query/use-git-user";
|
|
import { UserActions } from "./user-actions";
|
|
import { OpenHandsLogoButton } from "#/components/shared/buttons/openhands-logo-button";
|
|
import { NewProjectButton } from "#/components/shared/buttons/new-project-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";
|
|
import { MicroagentManagementButton } from "#/components/shared/buttons/microagent-management-button";
|
|
import { cn } from "#/utils/utils";
|
|
|
|
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);
|
|
|
|
const { pathname } = useLocation();
|
|
|
|
React.useEffect(() => {
|
|
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={cn(
|
|
"h-[54px] p-3 md:p-0 md:h-[40px] md:h-auto flex flex-row md:flex-col gap-1 bg-base md:w-[75px] md:min-w-[75px] sm:pt-0 sm:px-2 md:pt-[14px] md:px-0",
|
|
pathname === "/" && "md:pt-6.5 md:pb-3",
|
|
)}
|
|
>
|
|
<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">
|
|
<OpenHandsLogoButton />
|
|
</div>
|
|
<div>
|
|
<NewProjectButton disabled={settings?.EMAIL_VERIFIED === false} />
|
|
</div>
|
|
<ConversationPanelButton
|
|
isOpen={conversationPanelIsOpen}
|
|
onClick={() =>
|
|
settings?.EMAIL_VERIFIED === false
|
|
? null
|
|
: setConversationPanelIsOpen((prev) => !prev)
|
|
}
|
|
disabled={settings?.EMAIL_VERIFIED === false}
|
|
/>
|
|
<MicroagentManagementButton
|
|
disabled={settings?.EMAIL_VERIFIED === false}
|
|
/>
|
|
</div>
|
|
|
|
<div className="flex flex-row md:flex-col md:items-center gap-[26px]">
|
|
<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)}
|
|
/>
|
|
)}
|
|
</>
|
|
);
|
|
}
|