File size: 4,880 Bytes
246d201
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
import React from "react";
import { FaListUl } from "react-icons/fa";
import { useDispatch } from "react-redux";
import { useAuth } from "#/context/auth-context";
import { useGitHubUser } from "#/hooks/query/use-github-user";
import { useIsAuthed } from "#/hooks/query/use-is-authed";
import { UserActions } from "./user-actions";
import { AllHandsLogoButton } from "#/components/shared/buttons/all-hands-logo-button";
import { DocsButton } from "#/components/shared/buttons/docs-button";
import { ExitProjectButton } from "#/components/shared/buttons/exit-project-button";
import { SettingsButton } from "#/components/shared/buttons/settings-button";
import { LoadingSpinner } from "#/components/shared/loading-spinner";
import { AccountSettingsModal } from "#/components/shared/modals/account-settings/account-settings-modal";
import { SettingsModal } from "#/components/shared/modals/settings/settings-modal";
import { useCurrentSettings } from "#/context/settings-context";
import { useSettings } from "#/hooks/query/use-settings";
import { ConversationPanel } from "../conversation-panel/conversation-panel";
import { MULTI_CONVERSATION_UI } from "#/utils/feature-flags";
import { useEndSession } from "#/hooks/use-end-session";
import { setCurrentAgentState } from "#/state/agent-slice";
import { AgentState } from "#/types/agent-state";
import { TooltipButton } from "#/components/shared/buttons/tooltip-button";
import { ConversationPanelWrapper } from "../conversation-panel/conversation-panel-wrapper";

export function Sidebar() {
  const dispatch = useDispatch();
  const endSession = useEndSession();
  const user = useGitHubUser();
  const { data: isAuthed } = useIsAuthed();
  const { logout } = useAuth();
  const {
    data: settings,
    isError: settingsIsError,
    isSuccess: settingsSuccessfulyFetched,
  } = useSettings();

  const { isUpToDate: settingsAreUpToDate } = useCurrentSettings();

  const [accountSettingsModalOpen, setAccountSettingsModalOpen] =
    React.useState(false);
  const [settingsModalIsOpen, setSettingsModalIsOpen] = React.useState(false);

  const [conversationPanelIsOpen, setConversationPanelIsOpen] =
    React.useState(false);

  React.useEffect(() => {
    // If the github token is invalid, open the account settings modal again
    if (user.isError) {
      setAccountSettingsModalOpen(true);
    }
  }, [user.isError]);

  const handleEndSession = () => {
    dispatch(setCurrentAgentState(AgentState.LOADING));
    endSession();
  };

  const handleAccountSettingsModalClose = () => {
    // If the user closes the modal without connecting to GitHub,
    // we need to log them out to clear the invalid token from the
    // local storage
    if (user.isError) logout();
    setAccountSettingsModalOpen(false);
  };

  const showSettingsModal =
    isAuthed && (!settingsAreUpToDate || settingsModalIsOpen);

  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 gap-[18px]">

          <div className="w-[34px] h-[34px] flex items-center justify-center mb-7">

            <AllHandsLogoButton onClick={handleEndSession} />

          </div>

          {user.isLoading && <LoadingSpinner size="small" />}

          <ExitProjectButton onClick={handleEndSession} />

          {MULTI_CONVERSATION_UI && (

            <TooltipButton

              testId="toggle-conversation-panel"

              tooltip="Conversations"

              ariaLabel="Conversations"

              onClick={() => setConversationPanelIsOpen((prev) => !prev)}

            >

              <FaListUl size={22} />

            </TooltipButton>

          )}

          <DocsButton />

          <SettingsButton onClick={() => setSettingsModalIsOpen(true)} />

          {!user.isLoading && (

            <UserActions

              user={

                user.data ? { avatar_url: user.data.avatar_url } : undefined

              }

              onLogout={logout}

              onClickAccountSettings={() => setAccountSettingsModalOpen(true)}

            />

          )}

        </nav>



        {conversationPanelIsOpen && (

          <ConversationPanelWrapper isOpen={conversationPanelIsOpen}>

            <ConversationPanel

              onClose={() => setConversationPanelIsOpen(false)}

            />

          </ConversationPanelWrapper>

        )}

      </aside>



      {accountSettingsModalOpen && (

        <AccountSettingsModal onClose={handleAccountSettingsModalClose} />

      )}

      {settingsIsError ||

        (showSettingsModal && settingsSuccessfulyFetched && (

          <SettingsModal

            settings={settings}

            onClose={() => setSettingsModalIsOpen(false)}

          />

        ))}

    </>
  );
}