import {useState} from 'react';
import classNames from 'classnames';
import {Button, Card, Label, Modal, Notice, Pagination, Spinner, Table} from '@givewp/components';
import API, {getEndpoint, useMigrationFetcher} from './api';
import styles from './styles.module.scss';
import {__} from '@wordpress/i18n';
const Migrations = () => {
const [state, setState] = useState({
initialLoad: false,
currentPage: 1,
sortColumn: 'run_order',
sortDirection: 'asc',
pages: 0,
showOptions: false,
isSorting: false,
});
const [migrationModal, setMigrationModal] = useState({
visible: false,
});
const [migrationRunModal, setMigrationRunModal] = useState({
visible: false,
});
const parameters = {
page: state.currentPage,
sort: state.sortColumn,
direction: state.sortDirection,
};
const {data, isLoading, isError, mutate} = useMigrationFetcher(getEndpoint('/get-migrations', parameters), {
onSuccess: ({response}) => {
setState((previousState) => {
return {
...previousState,
initialLoad: true,
pages: response.pages,
currentPage: state.currentPage > response.pages ? 1 : state.currentPage,
showOptions: response.showOptions,
isSorting: false,
};
});
},
});
const runMigration = () => {
setMigrationRunModal((previousState) => {
return {
...previousState,
visible: true,
running: true,
};
});
let url;
if (migrationRunModal.action === 'run' && migrationRunModal.isBatchMigration) {
url = migrationRunModal.status === 'incomplete'
? '/reschedule-failed-actions'
: '/run-batch-migration';
} else if (migrationRunModal.action === 'rollback') {
url = '/rollback-migration';
} else {
url = '/run-migration';
}
API.post(url, {id: migrationRunModal.id})
.then((response) => {
if (response.data.status) {
closeMigrationRunModal();
} else {
setMigrationRunModal((previousState) => {
return {
...previousState,
type: 'error',
error: true,
errorMessage: response.data.message,
};
});
}
// Invalidate the cache
mutate(getEndpoint('/get-migrations', parameters));
})
.catch(() => {
setMigrationRunModal((previousState) => {
return {
...previousState,
type: 'error',
error: true,
};
});
});
};
const openMigrationModal = (migration) => {
setMigrationModal({
visible: true,
id: migration.id,
status: migration.status,
error: migration.error,
last_run: migration.last_run,
});
};
const closeMigrationModal = () => {
setMigrationModal({visible: false});
};
const openMigrationRunModal = (migration) => {
setMigrationRunModal({
id: migration.id,
visible: true,
type: 'warning',
isBatchMigration: migration.isBatchMigration,
action: migration.action,
status: migration.status,
});
};
const closeMigrationRunModal = () => {
setMigrationRunModal({visible: false});
};
const setSortDirectionForColumn = (column, direction) => {
setState((previousState) => {
return {
...previousState,
sortColumn: column,
sortDirection: direction,
isSorting: true,
};
});
};
const setCurrentPage = (currentPage) => {
setState((previousState) => {
return {
...previousState,
currentPage,
};
});
};
const getMigrationModal = () => {
return (
{__('Database update failed!', 'give')}
{migrationRunModal.errorMessage && (
{__('Loading updates activity', 'give')}
{__('Something went wrong!', 'give')}