UNPKG

@wordpress/block-editor

Version:
8 lines (7 loc) 3.64 kB
{ "version": 3, "sources": ["../../../src/components/link-control/use-create-page.js"], "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport { __ } from '@wordpress/i18n';\nimport { useEffect, useState, useRef } from '@wordpress/element';\n\nexport default function useCreatePage( handleCreatePage ) {\n\tconst cancelableCreateSuggestion = useRef();\n\tconst [ isCreatingPage, setIsCreatingPage ] = useState( false );\n\tconst [ errorMessage, setErrorMessage ] = useState( null );\n\n\tconst createPage = async function ( suggestionTitle ) {\n\t\tsetIsCreatingPage( true );\n\t\tsetErrorMessage( null );\n\n\t\ttry {\n\t\t\t// Make cancellable in order that we can avoid setting State\n\t\t\t// if the component unmounts during the call to `createSuggestion`\n\t\t\tcancelableCreateSuggestion.current = makeCancelable(\n\t\t\t\t// Using Promise.resolve to allow createSuggestion to return a\n\t\t\t\t// non-Promise based value.\n\t\t\t\tPromise.resolve( handleCreatePage( suggestionTitle ) )\n\t\t\t);\n\n\t\t\treturn await cancelableCreateSuggestion.current.promise;\n\t\t} catch ( error ) {\n\t\t\tif ( error && error.isCanceled ) {\n\t\t\t\treturn; // bail if canceled to avoid setting state\n\t\t\t}\n\n\t\t\tsetErrorMessage(\n\t\t\t\terror.message ||\n\t\t\t\t\t__(\n\t\t\t\t\t\t'An unknown error occurred during creation. Please try again.'\n\t\t\t\t\t)\n\t\t\t);\n\t\t\tthrow error;\n\t\t} finally {\n\t\t\tsetIsCreatingPage( false );\n\t\t}\n\t};\n\n\t/**\n\t * Handles cancelling any pending Promises that have been made cancelable.\n\t */\n\tuseEffect( () => {\n\t\treturn () => {\n\t\t\t// componentDidUnmount\n\t\t\tif ( cancelableCreateSuggestion.current ) {\n\t\t\t\tcancelableCreateSuggestion.current.cancel();\n\t\t\t}\n\t\t};\n\t}, [] );\n\n\treturn {\n\t\tcreatePage,\n\t\tisCreatingPage,\n\t\terrorMessage,\n\t};\n}\n\n/**\n * Creates a wrapper around a promise which allows it to be programmatically\n * cancelled.\n * See: https://reactjs.org/blog/2015/12/16/ismounted-antipattern.html\n *\n * @param {Promise} promise the Promise to make cancelable\n */\nconst makeCancelable = ( promise ) => {\n\tlet hasCanceled_ = false;\n\n\tconst wrappedPromise = new Promise( ( resolve, reject ) => {\n\t\tpromise.then(\n\t\t\t( val ) =>\n\t\t\t\thasCanceled_ ? reject( { isCanceled: true } ) : resolve( val ),\n\t\t\t( error ) =>\n\t\t\t\thasCanceled_ ? reject( { isCanceled: true } ) : reject( error )\n\t\t);\n\t} );\n\n\treturn {\n\t\tpromise: wrappedPromise,\n\t\tcancel() {\n\t\t\thasCanceled_ = true;\n\t\t},\n\t};\n};\n"], "mappings": ";AAGA,SAAS,UAAU;AACnB,SAAS,WAAW,UAAU,cAAc;AAE7B,SAAR,cAAgC,kBAAmB;AACzD,QAAM,6BAA6B,OAAO;AAC1C,QAAM,CAAE,gBAAgB,iBAAkB,IAAI,SAAU,KAAM;AAC9D,QAAM,CAAE,cAAc,eAAgB,IAAI,SAAU,IAAK;AAEzD,QAAM,aAAa,eAAiB,iBAAkB;AACrD,sBAAmB,IAAK;AACxB,oBAAiB,IAAK;AAEtB,QAAI;AAGH,iCAA2B,UAAU;AAAA;AAAA;AAAA,QAGpC,QAAQ,QAAS,iBAAkB,eAAgB,CAAE;AAAA,MACtD;AAEA,aAAO,MAAM,2BAA2B,QAAQ;AAAA,IACjD,SAAU,OAAQ;AACjB,UAAK,SAAS,MAAM,YAAa;AAChC;AAAA,MACD;AAEA;AAAA,QACC,MAAM,WACL;AAAA,UACC;AAAA,QACD;AAAA,MACF;AACA,YAAM;AAAA,IACP,UAAE;AACD,wBAAmB,KAAM;AAAA,IAC1B;AAAA,EACD;AAKA,YAAW,MAAM;AAChB,WAAO,MAAM;AAEZ,UAAK,2BAA2B,SAAU;AACzC,mCAA2B,QAAQ,OAAO;AAAA,MAC3C;AAAA,IACD;AAAA,EACD,GAAG,CAAC,CAAE;AAEN,SAAO;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,EACD;AACD;AASA,IAAM,iBAAiB,CAAE,YAAa;AACrC,MAAI,eAAe;AAEnB,QAAM,iBAAiB,IAAI,QAAS,CAAE,SAAS,WAAY;AAC1D,YAAQ;AAAA,MACP,CAAE,QACD,eAAe,OAAQ,EAAE,YAAY,KAAK,CAAE,IAAI,QAAS,GAAI;AAAA,MAC9D,CAAE,UACD,eAAe,OAAQ,EAAE,YAAY,KAAK,CAAE,IAAI,OAAQ,KAAM;AAAA,IAChE;AAAA,EACD,CAAE;AAEF,SAAO;AAAA,IACN,SAAS;AAAA,IACT,SAAS;AACR,qBAAe;AAAA,IAChB;AAAA,EACD;AACD;", "names": [] }