import React, { useRef, useState } from "react"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { __ } from "@wordpress/i18n"; import MenuButton, { BUTTON_TYPES } from "./MenuButton"; import { faRightLong } from "@fortawesome/free-solid-svg-icons"; /** * Version control popup component. * * @param {Object} props component properties * @param {string} props.from current version * @param {string} props.to version to rollback * @param {Function} props.onCloseHandler close popup callback * @param {Function} props.onOperationStart operation start callback * @param {number} props.reloadDelay automatic page reload delay in milliseconds * @class */ function VersionControlPopup({ from, to, onCloseHandler, onOperationStart, reloadDelay = 5000, }) { const OPERATION_STATUS_TYPES = { NOT_STARTED: "notStarted", STARTED: "started", FINISHED: "finished", }; const RESPONSE_TYPES = { OK: "ok", ERROR: "error", }; /** * Generate response object. * * @param {string} message message * @param {string} [type='ok'] response type. * @return {Object} response object */ const generateResponseObject = (message, type = RESPONSE_TYPES.OK) => { return { type, message, }; }; const [operationStatus, setOperationStatus] = useState( OPERATION_STATUS_TYPES.NOT_STARTED ); const [reloadCountdown, setReloadCountdown] = useState(reloadDelay / 1000); const [responseObject, setResponseObject] = useState( generateResponseObject("") ); const isDowngrade = from > to; const countdownToReload = useRef(reloadDelay); /** * Start rollback operation. */ const startOperation = () => { setOperationStatus(OPERATION_STATUS_TYPES.STARTED); onOperationStart() .then(({ message }) => { setResponseObject( generateResponseObject(message, RESPONSE_TYPES.OK) ); }) .catch(({ message }) => { setResponseObject( generateResponseObject(message, RESPONSE_TYPES.ERROR) ); }) .finally(() => { setOperationStatus(OPERATION_STATUS_TYPES.FINISHED); reloadPage(); }); }; /** * Reload page after a designated amount of time. */ const reloadPage = () => { const reloadIntervalId = setInterval(() => { if (countdownToReload.current <= 0) { window.location.reload(); clearInterval(reloadIntervalId); } else { countdownToReload.current = countdownToReload.current - 1000; setReloadCountdown(countdownToReload.current / 1000); } }, 1000); }; return (