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;