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 (
{children}
); } function GitChanges() { const { t } = useTranslation(); const { data: gitChanges, isSuccess, isError, error, isLoading: loadingGitChanges, } = useGetGitChanges(); const [statusMessage, setStatusMessage] = React.useState( 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 (
{!isSuccess || !gitChanges.length ? (
{statusMessage && ( {statusMessage.map((msg) => ( {t(msg)} ))} )}
{!isError && gitChanges?.length === 0 && (
)}
) : ( gitChanges.map((change) => ( )) )}
); } export default GitChanges;