{!hasPullRequest ? (
<>
diff --git a/frontend/src/components/features/github/github-repositories-suggestion-box.tsx b/frontend/src/components/features/github/github-repositories-suggestion-box.tsx
index 35a31e18a1..45eb527806 100644
--- a/frontend/src/components/features/github/github-repositories-suggestion-box.tsx
+++ b/frontend/src/components/features/github/github-repositories-suggestion-box.tsx
@@ -5,14 +5,12 @@ import { SuggestionBox } from "#/components/features/suggestions/suggestion-box"
import GitHubLogo from "#/assets/branding/github-logo.svg?react";
import { GitHubRepositorySelector } from "./github-repo-selector";
import { ModalButton } from "#/components/shared/buttons/modal-button";
-import { ConnectToGitHubModal } from "#/components/shared/modals/connect-to-github-modal";
-import { ModalBackdrop } from "#/components/shared/modals/modal-backdrop";
-import { isGitHubErrorReponse } from "#/api/github-axios-instance";
import { useAppRepositories } from "#/hooks/query/use-app-repositories";
import { useSearchRepositories } from "#/hooks/query/use-search-repositories";
import { useUserRepositories } from "#/hooks/query/use-user-repositories";
import { sanitizeQuery } from "#/utils/sanitize-query";
import { useDebounce } from "#/hooks/use-debounce";
+import { AccountSettingsModal } from "#/components/shared/modals/account-settings/account-settings-modal";
interface GitHubRepositoriesSuggestionBoxProps {
handleSubmit: () => void;
@@ -51,7 +49,7 @@ export function GitHubRepositoriesSuggestionBox({
}
};
- const isLoggedIn = !!user && !isGitHubErrorReponse(user);
+ const isLoggedIn = !!user;
return (
<>
@@ -76,11 +74,9 @@ export function GitHubRepositoriesSuggestionBox({
}
/>
{connectToGitHubModalOpen && (
-
setConnectToGitHubModalOpen(false)}>
- setConnectToGitHubModalOpen(false)}
- />
-
+
setConnectToGitHubModalOpen(false)}
+ />
)}
>
);
diff --git a/frontend/src/components/features/sidebar/sidebar.tsx b/frontend/src/components/features/sidebar/sidebar.tsx
index cee990f9e9..044aa4846b 100644
--- a/frontend/src/components/features/sidebar/sidebar.tsx
+++ b/frontend/src/components/features/sidebar/sidebar.tsx
@@ -1,9 +1,8 @@
import React from "react";
import { FaListUl } from "react-icons/fa";
import { useDispatch } from "react-redux";
-import { useAuth } from "#/context/auth-context";
+import posthog from "posthog-js";
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";
@@ -21,20 +20,19 @@ 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";
+import { useLogout } from "#/hooks/mutation/use-logout";
+import { useConfig } from "#/hooks/query/use-config";
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 { data: config } = useConfig();
+ const { data: settings, isError: settingsError } = useSettings();
+ const { mutateAsync: logout } = useLogout();
- const { isUpToDate: settingsAreUpToDate } = useCurrentSettings();
+ const { saveUserSettings, isUpToDate: settingsAreUpToDate } =
+ useCurrentSettings();
const [accountSettingsModalOpen, setAccountSettingsModalOpen] =
React.useState(false);
@@ -56,15 +54,16 @@ export function Sidebar() {
};
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);
+ const handleLogout = async () => {
+ if (config?.APP_MODE === "saas") await logout();
+ else await saveUserSettings({ unset_github_token: true });
+ posthog.reset();
+ };
+
+ const showSettingsModal = !settingsAreUpToDate || settingsModalIsOpen;
return (
<>
@@ -92,7 +91,7 @@ export function Sidebar() {
user={
user.data ? { avatar_url: user.data.avatar_url } : undefined
}
- onLogout={logout}
+ onLogout={handleLogout}
onClickAccountSettings={() => setAccountSettingsModalOpen(true)}
/>
)}
@@ -110,13 +109,12 @@ export function Sidebar() {
{accountSettingsModalOpen && (
)}
- {settingsIsError ||
- (showSettingsModal && settingsSuccessfulyFetched && (
- setSettingsModalIsOpen(false)}
- />
- ))}
+ {(settingsError || showSettingsModal) && (
+ setSettingsModalIsOpen(false)}
+ />
+ )}
>
);
}
diff --git a/frontend/src/components/features/waitlist/waitlist-modal.tsx b/frontend/src/components/features/waitlist/waitlist-modal.tsx
index 486bf1855e..b8f2f71f4c 100644
--- a/frontend/src/components/features/waitlist/waitlist-modal.tsx
+++ b/frontend/src/components/features/waitlist/waitlist-modal.tsx
@@ -10,11 +10,14 @@ import { TOSCheckbox } from "./tos-checkbox";
import { handleCaptureConsent } from "#/utils/handle-capture-consent";
interface WaitlistModalProps {
- ghToken: string | null;
+ ghTokenIsSet: boolean;
githubAuthUrl: string | null;
}
-export function WaitlistModal({ ghToken, githubAuthUrl }: WaitlistModalProps) {
+export function WaitlistModal({
+ ghTokenIsSet,
+ githubAuthUrl,
+}: WaitlistModalProps) {
const [isTosAccepted, setIsTosAccepted] = React.useState(false);
const handleGitHubAuth = () => {
@@ -28,11 +31,11 @@ export function WaitlistModal({ ghToken, githubAuthUrl }: WaitlistModalProps) {
-
+
setIsTosAccepted((prev) => !prev)} />
- {!ghToken && (
+ {!ghTokenIsSet && (
)}
- {ghToken && }
+ {ghTokenIsSet && }
);
diff --git a/frontend/src/components/shared/modals/account-settings/account-settings-form.tsx b/frontend/src/components/shared/modals/account-settings/account-settings-form.tsx
index 6f805829bd..17d44e491c 100644
--- a/frontend/src/components/shared/modals/account-settings/account-settings-form.tsx
+++ b/frontend/src/components/shared/modals/account-settings/account-settings-form.tsx
@@ -1,5 +1,6 @@
import React from "react";
import { useTranslation } from "react-i18next";
+import posthog from "posthog-js";
import {
BaseModalDescription,
BaseModalTitle,
@@ -7,13 +8,13 @@ import {
import { ModalBody } from "../modal-body";
import { AvailableLanguages } from "#/i18n";
import { I18nKey } from "#/i18n/declaration";
-import { useAuth } from "#/context/auth-context";
import { handleCaptureConsent } from "#/utils/handle-capture-consent";
import { ModalButton } from "../../buttons/modal-button";
-import { CustomInput } from "../../custom-input";
import { FormFieldset } from "../../form-fieldset";
import { useConfig } from "#/hooks/query/use-config";
import { useCurrentSettings } from "#/context/settings-context";
+import { PostSettings } from "#/services/settings";
+import { GitHubTokenInput } from "./github-token-input";
interface AccountSettingsFormProps {
onClose: () => void;
@@ -28,11 +29,12 @@ export function AccountSettingsForm({
gitHubError,
analyticsConsent,
}: AccountSettingsFormProps) {
- const { gitHubToken, setGitHubToken, logout } = useAuth();
const { data: config } = useConfig();
- const { saveUserSettings } = useCurrentSettings();
+ const { saveUserSettings, settings } = useCurrentSettings();
const { t } = useTranslation();
+ const githubTokenIsSet = !!settings?.GITHUB_TOKEN_IS_SET;
+
const handleSubmit = async (event: React.FormEvent) => {
event.preventDefault();
const formData = new FormData(event.currentTarget);
@@ -41,7 +43,9 @@ export function AccountSettingsForm({
const language = formData.get("language")?.toString();
const analytics = formData.get("analytics")?.toString() === "on";
- if (ghToken) setGitHubToken(ghToken);
+ const newSettings: Partial = {};
+
+ if (ghToken) newSettings.github_token = ghToken;
// The form returns the language label, so we need to find the corresponding
// language key to save it in the settings
@@ -50,9 +54,11 @@ export function AccountSettingsForm({
({ label }) => label === language,
)?.value;
- if (languageKey) await saveUserSettings({ LANGUAGE: languageKey });
+ if (languageKey) newSettings.LANGUAGE = languageKey;
}
+ await saveUserSettings(newSettings);
+
handleCaptureConsent(analytics);
const ANALYTICS = analytics.toString();
localStorage.setItem("analytics-consent", ANALYTICS);
@@ -60,6 +66,12 @@ export function AccountSettingsForm({
onClose();
};
+ const onDisconnect = async () => {
+ await saveUserSettings({ unset_github_token: true });
+ posthog.reset();
+ onClose();
+ };
+
return (
- {isInWaitlist && (
-