Spaces:
Build error
Build error
import React from "react"; | |
import { useTranslation } from "react-i18next"; | |
import { useConfig } from "#/hooks/query/use-config"; | |
import { useSettings } from "#/hooks/query/use-settings"; | |
import { BrandButton } from "#/components/features/settings/brand-button"; | |
import { useLogout } from "#/hooks/mutation/use-logout"; | |
import { GitHubTokenInput } from "#/components/features/settings/git-settings/github-token-input"; | |
import { GitLabTokenInput } from "#/components/features/settings/git-settings/gitlab-token-input"; | |
import { ConfigureGitHubRepositoriesAnchor } from "#/components/features/settings/git-settings/configure-github-repositories-anchor"; | |
import { I18nKey } from "#/i18n/declaration"; | |
import { | |
displayErrorToast, | |
displaySuccessToast, | |
} from "#/utils/custom-toast-handlers"; | |
import { retrieveAxiosErrorMessage } from "#/utils/retrieve-axios-error-message"; | |
import { GitSettingInputsSkeleton } from "#/components/features/settings/git-settings/github-settings-inputs-skeleton"; | |
import { useAddGitProviders } from "#/hooks/mutation/use-add-git-providers"; | |
import { useUserProviders } from "#/hooks/use-user-providers"; | |
function GitSettingsScreen() { | |
const { t } = useTranslation(); | |
const { mutate: saveGitProviders, isPending } = useAddGitProviders(); | |
const { mutate: disconnectGitTokens } = useLogout(); | |
const { data: settings, isLoading } = useSettings(); | |
const { providers } = useUserProviders(); | |
const { data: config } = useConfig(); | |
const [githubTokenInputHasValue, setGithubTokenInputHasValue] = | |
React.useState(false); | |
const [gitlabTokenInputHasValue, setGitlabTokenInputHasValue] = | |
React.useState(false); | |
const [githubHostInputHasValue, setGithubHostInputHasValue] = | |
React.useState(false); | |
const [gitlabHostInputHasValue, setGitlabHostInputHasValue] = | |
React.useState(false); | |
const existingGithubHost = settings?.PROVIDER_TOKENS_SET.github; | |
const existingGitlabHost = settings?.PROVIDER_TOKENS_SET.gitlab; | |
const isSaas = config?.APP_MODE === "saas"; | |
const isGitHubTokenSet = providers.includes("github"); | |
const isGitLabTokenSet = providers.includes("gitlab"); | |
const formAction = async (formData: FormData) => { | |
const disconnectButtonClicked = | |
formData.get("disconnect-tokens-button") !== null; | |
if (disconnectButtonClicked) { | |
disconnectGitTokens(); | |
return; | |
} | |
const githubToken = formData.get("github-token-input")?.toString() || ""; | |
const gitlabToken = formData.get("gitlab-token-input")?.toString() || ""; | |
const githubHost = formData.get("github-host-input")?.toString() || ""; | |
const gitlabHost = formData.get("gitlab-host-input")?.toString() || ""; | |
saveGitProviders( | |
{ | |
providers: { | |
github: { token: githubToken, host: githubHost }, | |
gitlab: { token: gitlabToken, host: gitlabHost }, | |
}, | |
}, | |
{ | |
onSuccess: () => { | |
displaySuccessToast(t(I18nKey.SETTINGS$SAVED)); | |
}, | |
onError: (error) => { | |
const errorMessage = retrieveAxiosErrorMessage(error); | |
displayErrorToast(errorMessage || t(I18nKey.ERROR$GENERIC)); | |
}, | |
onSettled: () => { | |
setGithubTokenInputHasValue(false); | |
setGitlabTokenInputHasValue(false); | |
setGithubHostInputHasValue(false); | |
setGitlabHostInputHasValue(false); | |
}, | |
}, | |
); | |
}; | |
const formIsClean = | |
!githubTokenInputHasValue && | |
!gitlabTokenInputHasValue && | |
!githubHostInputHasValue && | |
!gitlabHostInputHasValue; | |
const shouldRenderExternalConfigureButtons = isSaas && config.APP_SLUG; | |
return ( | |
<form | |
data-testid="git-settings-screen" | |
action={formAction} | |
className="flex flex-col h-full justify-between" | |
> | |
{!isLoading && ( | |
<div className="p-9 flex flex-col gap-12"> | |
{shouldRenderExternalConfigureButtons && !isLoading && ( | |
<ConfigureGitHubRepositoriesAnchor slug={config.APP_SLUG!} /> | |
)} | |
{!isSaas && ( | |
<GitHubTokenInput | |
name="github-token-input" | |
isGitHubTokenSet={isGitHubTokenSet} | |
onChange={(value) => { | |
setGithubTokenInputHasValue(!!value); | |
}} | |
onGitHubHostChange={(value) => { | |
setGitlabHostInputHasValue(!!value); | |
}} | |
githubHostSet={existingGithubHost} | |
/> | |
)} | |
{!isSaas && ( | |
<GitLabTokenInput | |
name="gitlab-token-input" | |
isGitLabTokenSet={isGitLabTokenSet} | |
onChange={(value) => { | |
setGitlabTokenInputHasValue(!!value); | |
}} | |
onGitLabHostChange={(value) => { | |
setGitlabHostInputHasValue(!!value); | |
}} | |
gitlabHostSet={existingGitlabHost} | |
/> | |
)} | |
</div> | |
)} | |
{isLoading && <GitSettingInputsSkeleton />} | |
<div className="flex gap-6 p-6 justify-end border-t border-t-tertiary"> | |
{!shouldRenderExternalConfigureButtons && ( | |
<> | |
<BrandButton | |
testId="disconnect-tokens-button" | |
name="disconnect-tokens-button" | |
type="submit" | |
variant="secondary" | |
isDisabled={!isGitHubTokenSet && !isGitLabTokenSet} | |
> | |
Disconnect Tokens | |
</BrandButton> | |
<BrandButton | |
testId="submit-button" | |
type="submit" | |
variant="primary" | |
isDisabled={isPending || formIsClean} | |
> | |
{!isPending && t("SETTINGS$SAVE_CHANGES")} | |
{isPending && t("SETTINGS$SAVING")} | |
</BrandButton> | |
</> | |
)} | |
</div> | |
</form> | |
); | |
} | |
export default GitSettingsScreen; | |