Spaces:
Build error
Build error
import { useTranslation } from "react-i18next"; | |
import { useSelector } from "react-redux"; | |
import React from "react"; | |
import { FileDiffViewer } from "#/components/features/diff-viewer/file-diff-viewer"; | |
import { retrieveAxiosErrorMessage } from "#/utils/retrieve-axios-error-message"; | |
import { useGetGitChanges } from "#/hooks/query/use-get-git-changes"; | |
import { I18nKey } from "#/i18n/declaration"; | |
import { RootState } from "#/store"; | |
import { RUNTIME_INACTIVE_STATES } from "#/types/agent-state"; | |
import { RandomTip } from "#/components/features/tips/random-tip"; | |
// Error message patterns | |
const GIT_REPO_ERROR_PATTERN = /not a git repository/i; | |
function StatusMessage({ children }: React.PropsWithChildren) { | |
return ( | |
<div className="w-full h-full flex flex-col items-center text-center justify-center text-2xl text-tertiary-light"> | |
{children} | |
</div> | |
); | |
} | |
function GitChanges() { | |
const { t } = useTranslation(); | |
const { | |
data: gitChanges, | |
isSuccess, | |
isError, | |
error, | |
isLoading: loadingGitChanges, | |
} = useGetGitChanges(); | |
const [statusMessage, setStatusMessage] = React.useState<string[] | null>( | |
null, | |
); | |
const { curAgentState } = useSelector((state: RootState) => state.agent); | |
const runtimeIsActive = !RUNTIME_INACTIVE_STATES.includes(curAgentState); | |
const isNotGitRepoError = | |
error && GIT_REPO_ERROR_PATTERN.test(retrieveAxiosErrorMessage(error)); | |
React.useEffect(() => { | |
if (!runtimeIsActive) { | |
setStatusMessage([I18nKey.DIFF_VIEWER$WAITING_FOR_RUNTIME]); | |
} else if (error) { | |
const errorMessage = retrieveAxiosErrorMessage(error); | |
if (GIT_REPO_ERROR_PATTERN.test(errorMessage)) { | |
setStatusMessage([ | |
I18nKey.DIFF_VIEWER$NOT_A_GIT_REPO, | |
I18nKey.DIFF_VIEWER$ASK_OH, | |
]); | |
} else { | |
setStatusMessage([errorMessage]); | |
} | |
} else if (loadingGitChanges) { | |
setStatusMessage([I18nKey.DIFF_VIEWER$LOADING]); | |
} else { | |
setStatusMessage(null); | |
} | |
}, [ | |
runtimeIsActive, | |
isNotGitRepoError, | |
loadingGitChanges, | |
error, | |
setStatusMessage, | |
]); | |
return ( | |
<main className="h-full overflow-y-scroll px-4 py-3 gap-3 flex flex-col items-center"> | |
{!isSuccess || !gitChanges.length ? ( | |
<div className="relative flex h-full w-full items-center"> | |
<div className="absolute inset-x-0 top-1/2 -translate-y-1/2"> | |
{statusMessage && ( | |
<StatusMessage> | |
{statusMessage.map((msg) => ( | |
<span key={msg}>{t(msg)}</span> | |
))} | |
</StatusMessage> | |
)} | |
</div> | |
<div className="absolute inset-x-0 bottom-0"> | |
{!isError && gitChanges?.length === 0 && ( | |
<div className="max-w-2xl mb-4 text-m bg-tertiary rounded-xl p-4 text-left mx-auto"> | |
<RandomTip /> | |
</div> | |
)} | |
</div> | |
</div> | |
) : ( | |
gitChanges.map((change) => ( | |
<FileDiffViewer | |
key={change.path} | |
path={change.path} | |
type={change.status} | |
/> | |
)) | |
)} | |
</main> | |
); | |
} | |
export default GitChanges; | |