@wordpress/block-editor
Version:
80 lines (76 loc) • 2.4 kB
JavaScript
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = useCreatePage;
var _i18n = require("@wordpress/i18n");
var _element = require("@wordpress/element");
/**
* WordPress dependencies
*/
function useCreatePage(handleCreatePage) {
const cancelableCreateSuggestion = (0, _element.useRef)();
const [isCreatingPage, setIsCreatingPage] = (0, _element.useState)(false);
const [errorMessage, setErrorMessage] = (0, _element.useState)(null);
const createPage = async function (suggestionTitle) {
setIsCreatingPage(true);
setErrorMessage(null);
try {
// Make cancellable in order that we can avoid setting State
// if the component unmounts during the call to `createSuggestion`
cancelableCreateSuggestion.current = makeCancelable(
// Using Promise.resolve to allow createSuggestion to return a
// non-Promise based value.
Promise.resolve(handleCreatePage(suggestionTitle)));
return await cancelableCreateSuggestion.current.promise;
} catch (error) {
if (error && error.isCanceled) {
return; // bail if canceled to avoid setting state
}
setErrorMessage(error.message || (0, _i18n.__)('An unknown error occurred during creation. Please try again.'));
throw error;
} finally {
setIsCreatingPage(false);
}
};
/**
* Handles cancelling any pending Promises that have been made cancelable.
*/
(0, _element.useEffect)(() => {
return () => {
// componentDidUnmount
if (cancelableCreateSuggestion.current) {
cancelableCreateSuggestion.current.cancel();
}
};
}, []);
return {
createPage,
isCreatingPage,
errorMessage
};
}
/**
* Creates a wrapper around a promise which allows it to be programmatically
* cancelled.
* See: https://reactjs.org/blog/2015/12/16/ismounted-antipattern.html
*
* @param {Promise} promise the Promise to make cancelable
*/
const makeCancelable = promise => {
let hasCanceled_ = false;
const wrappedPromise = new Promise((resolve, reject) => {
promise.then(val => hasCanceled_ ? reject({
isCanceled: true
}) : resolve(val), error => hasCanceled_ ? reject({
isCanceled: true
}) : reject(error));
});
return {
promise: wrappedPromise,
cancel() {
hasCanceled_ = true;
}
};
};
//# sourceMappingURL=use-create-page.js.map
;