import React, {useState, useEffect} from 'react';
import {Loader} from 'lucide-react';
import {
getSettings,
getGitStatus,
addFiles,
unstageFiles,
commitFiles,
pushFiles,
revertFile,
pullBranch
} from '@api/api';
import Alert from '@ui/Alert';
import {statusLoadingMessages, getRandomMessage} from '@constants/messages';
import RepoContainer from './repo/RepoContainer';
import StatusContainer from './status/StatusContainer';
const GitContainer = () => {
const [settings, setSettings] = useState(null);
const [changes, setChanges] = useState(null);
const [loadingAction, setLoadingAction] = useState('');
const [statusLoading, setStatusLoading] = useState(true);
const [statusLoadingMessage, setStatusLoadingMessage] = useState('');
useEffect(() => {
fetchSettings();
}, []);
const fetchSettings = async () => {
try {
const fetchedSettings = await getSettings();
if (fetchedSettings && fetchedSettings.gitRepo) {
setSettings(fetchedSettings);
await fetchGitStatus();
} else {
setSettings(null);
}
} catch (error) {
console.error('Error fetching settings:', error);
}
};
const fetchGitStatus = async () => {
setStatusLoading(true);
setStatusLoadingMessage(getRandomMessage(statusLoadingMessages));
try {
const result = await getGitStatus();
if (result.success) {
const gitStatus = {
...result.data,
outgoing_changes: Array.isArray(
result.data.outgoing_changes
)
? result.data.outgoing_changes
: [],
incoming_changes: Array.isArray(
result.data.incoming_changes
)
? result.data.incoming_changes
: [],
merge_conflicts: Array.isArray(result.data.merge_conflicts)
? result.data.merge_conflicts
: []
};
setChanges(gitStatus);
}
} catch (error) {
console.error('Error fetching Git status:', error);
Alert.error('Failed to fetch Git status');
} finally {
setStatusLoading(false);
}
};
const handleStageSelectedChanges = async selectedChanges => {
setLoadingAction('stage_selected');
try {
const response = await addFiles(selectedChanges);
if (response.success) {
await fetchGitStatus();
Alert.success(response.message);
} else {
Alert.error(response.error);
}
} catch (error) {
Alert.error('An unexpected error occurred while staging changes.');
console.error('Error staging changes:', error);
} finally {
setLoadingAction('');
}
};
const handleUnstageSelectedChanges = async selectedChanges => {
setLoadingAction('unstage_selected');
try {
const response = await unstageFiles(selectedChanges);
if (response.success) {
await fetchGitStatus();
Alert.success(response.message);
} else {
Alert.error(response.error);
}
} catch (error) {
Alert.error(
'An unexpected error occurred while unstaging changes.'
);
console.error('Error unstaging changes:', error);
} finally {
setLoadingAction('');
}
};
const handleCommitSelectedChanges = async (
selectedChanges,
commitMessage
) => {
setLoadingAction('commit_selected');
try {
const response = await commitFiles(selectedChanges, commitMessage);
if (response.success) {
await fetchGitStatus();
Alert.success(response.message);
} else {
Alert.error(response.error);
}
} catch (error) {
Alert.error(
'An unexpected error occurred while committing changes.'
);
console.error('Error committing changes:', error);
} finally {
setLoadingAction('');
}
};
const handlePushChanges = async () => {
setLoadingAction('push_changes');
try {
const response = await pushFiles();
if (response.success) {
await fetchGitStatus();
Alert.success(
response.message || 'Successfully pushed changes'
);
} else {
Alert.error(
typeof response.error === 'string'
? response.error
: response.error?.error || 'Failed to push changes'
);
}
} catch (error) {
console.error('handlePushChanges error:', error);
Alert.error('An unexpected error occurred while pushing changes.');
} finally {
setLoadingAction('');
}
};
const handlePullSelectedChanges = async () => {
setLoadingAction('pull_changes');
try {
const response = await pullBranch(changes.branch);
await fetchGitStatus();
if (response.success) {
if (response.state === 'resolve') {
Alert.info(
response.message ||
'Repository is now in conflict resolution state.',
{autoClose: true, closeOnClick: true}
);
} else {
Alert.success(
response.message || 'Successfully pulled changes'
);
}
} else {
Alert.error(response.message || 'Failed to pull changes');
}
} catch (error) {
console.error('Error in pullBranch:', error);
Alert.error('Failed to pull changes');
} finally {
setLoadingAction('');
}
};
const handleRevertSelectedChanges = async selectedChanges => {
setLoadingAction('revert_selected');
try {
const response = await Promise.all(
selectedChanges.map(filePath => revertFile(filePath))
);
const allSuccessful = response.every(res => res.success);
if (allSuccessful) {
await fetchGitStatus();
Alert.success(
'Selected changes have been reverted successfully.'
);
} else {
Alert.error(
'Some changes could not be reverted. Please try again.'
);
}
} catch (error) {
Alert.error(
'An unexpected error occurred while reverting changes.'
);
console.error('Error reverting changes:', error);
} finally {
setLoadingAction('');
}
};
return (
<>