@wordpress/editor
Version:
Enhanced block editor for WordPress posts.
8 lines (7 loc) • 10.1 kB
Source Map (JSON)
{
"version": 3,
"sources": ["../../../src/components/start-template-options/index.js"],
"sourcesContent": ["/**\n * WordPress dependencies\n */\nimport { Modal, Flex, FlexItem, Button } from '@wordpress/components';\nimport { __ } from '@wordpress/i18n';\nimport { useState, useMemo, useEffect } from '@wordpress/element';\nimport { __experimentalBlockPatternsList as BlockPatternsList } from '@wordpress/block-editor';\nimport { useSelect } from '@wordpress/data';\nimport { parse } from '@wordpress/blocks';\nimport { store as coreStore, useEntityBlockEditor } from '@wordpress/core-data';\n\n/**\n * Internal dependencies\n */\nimport { store as editorStore } from '../../store';\nimport { TEMPLATE_POST_TYPE } from '../../store/constants';\n\nfunction useFallbackTemplateContent( slug, isCustom = false ) {\n\treturn useSelect(\n\t\t( select ) => {\n\t\t\tconst { getEntityRecord, getDefaultTemplateId } =\n\t\t\t\tselect( coreStore );\n\t\t\tconst templateId = getDefaultTemplateId( {\n\t\t\t\tslug,\n\t\t\t\tis_custom: isCustom,\n\t\t\t\tignore_empty: true,\n\t\t\t} );\n\t\t\treturn templateId\n\t\t\t\t? getEntityRecord( 'postType', TEMPLATE_POST_TYPE, templateId )\n\t\t\t\t\t\t?.content?.raw\n\t\t\t\t: undefined;\n\t\t},\n\t\t[ slug, isCustom ]\n\t);\n}\n\nfunction useStartPatterns( fallbackContent ) {\n\tconst { slug, patterns } = useSelect( ( select ) => {\n\t\tconst { getCurrentPostType, getCurrentPostId } = select( editorStore );\n\t\tconst { getEntityRecord, getBlockPatterns } = select( coreStore );\n\t\tconst postId = getCurrentPostId();\n\t\tconst postType = getCurrentPostType();\n\t\tconst record = getEntityRecord( 'postType', postType, postId );\n\t\treturn {\n\t\t\tslug: record.slug,\n\t\t\tpatterns: getBlockPatterns(),\n\t\t};\n\t}, [] );\n\n\tconst currentThemeStylesheet = useSelect(\n\t\t( select ) => select( coreStore ).getCurrentTheme().stylesheet\n\t);\n\n\t// Duplicated from packages/block-library/src/pattern/edit.js.\n\tfunction injectThemeAttributeInBlockTemplateContent( block ) {\n\t\tif (\n\t\t\tblock.innerBlocks.find(\n\t\t\t\t( innerBlock ) => innerBlock.name === 'core/template-part'\n\t\t\t)\n\t\t) {\n\t\t\tblock.innerBlocks = block.innerBlocks.map( ( innerBlock ) => {\n\t\t\t\tif (\n\t\t\t\t\tinnerBlock.name === 'core/template-part' &&\n\t\t\t\t\tinnerBlock.attributes.theme === undefined\n\t\t\t\t) {\n\t\t\t\t\tinnerBlock.attributes.theme = currentThemeStylesheet;\n\t\t\t\t}\n\t\t\t\treturn innerBlock;\n\t\t\t} );\n\t\t}\n\n\t\tif (\n\t\t\tblock.name === 'core/template-part' &&\n\t\t\tblock.attributes.theme === undefined\n\t\t) {\n\t\t\tblock.attributes.theme = currentThemeStylesheet;\n\t\t}\n\t\treturn block;\n\t}\n\n\treturn useMemo( () => {\n\t\t// filter patterns that are supposed to be used in the current template being edited.\n\t\treturn [\n\t\t\t{\n\t\t\t\tname: 'fallback',\n\t\t\t\tblocks: parse( fallbackContent ),\n\t\t\t\ttitle: __( 'Fallback content' ),\n\t\t\t},\n\t\t\t...patterns\n\t\t\t\t.filter( ( pattern ) => {\n\t\t\t\t\treturn (\n\t\t\t\t\t\tArray.isArray( pattern.templateTypes ) &&\n\t\t\t\t\t\tpattern.templateTypes.some( ( templateType ) =>\n\t\t\t\t\t\t\tslug.startsWith( templateType )\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t} )\n\t\t\t\t.map( ( pattern ) => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...pattern,\n\t\t\t\t\t\tblocks: parse( pattern.content ).map( ( block ) =>\n\t\t\t\t\t\t\tinjectThemeAttributeInBlockTemplateContent( block )\n\t\t\t\t\t\t),\n\t\t\t\t\t};\n\t\t\t\t} ),\n\t\t];\n\t}, [ fallbackContent, slug, patterns ] );\n}\n\nfunction PatternSelection( { fallbackContent, onChoosePattern, postType } ) {\n\tconst [ , , onChange ] = useEntityBlockEditor( 'postType', postType );\n\tconst blockPatterns = useStartPatterns( fallbackContent );\n\treturn (\n\t\t<BlockPatternsList\n\t\t\tblockPatterns={ blockPatterns }\n\t\t\tonClickPattern={ ( pattern, blocks ) => {\n\t\t\t\tonChange( blocks, { selection: undefined } );\n\t\t\t\tonChoosePattern();\n\t\t\t} }\n\t\t/>\n\t);\n}\n\nfunction StartModal( { slug, isCustom, onClose, postType } ) {\n\tconst fallbackContent = useFallbackTemplateContent( slug, isCustom );\n\tif ( ! fallbackContent ) {\n\t\treturn null;\n\t}\n\treturn (\n\t\t<Modal\n\t\t\tclassName=\"editor-start-template-options__modal\"\n\t\t\ttitle={ __( 'Choose a pattern' ) }\n\t\t\tcloseLabel={ __( 'Cancel' ) }\n\t\t\tfocusOnMount=\"firstElement\"\n\t\t\tonRequestClose={ onClose }\n\t\t\tisFullScreen\n\t\t>\n\t\t\t<div className=\"editor-start-template-options__modal-content\">\n\t\t\t\t<PatternSelection\n\t\t\t\t\tfallbackContent={ fallbackContent }\n\t\t\t\t\tslug={ slug }\n\t\t\t\t\tisCustom={ isCustom }\n\t\t\t\t\tpostType={ postType }\n\t\t\t\t\tonChoosePattern={ () => {\n\t\t\t\t\t\tonClose();\n\t\t\t\t\t} }\n\t\t\t\t/>\n\t\t\t</div>\n\t\t\t<Flex\n\t\t\t\tclassName=\"editor-start-template-options__modal__actions\"\n\t\t\t\tjustify=\"flex-end\"\n\t\t\t\texpanded={ false }\n\t\t\t>\n\t\t\t\t<FlexItem>\n\t\t\t\t\t<Button\n\t\t\t\t\t\t__next40pxDefaultSize\n\t\t\t\t\t\tvariant=\"tertiary\"\n\t\t\t\t\t\tonClick={ onClose }\n\t\t\t\t\t>\n\t\t\t\t\t\t{ __( 'Skip' ) }\n\t\t\t\t\t</Button>\n\t\t\t\t</FlexItem>\n\t\t\t</Flex>\n\t\t</Modal>\n\t);\n}\n\nexport default function StartTemplateOptions() {\n\tconst [ isClosed, setIsClosed ] = useState( false );\n\tconst { shouldOpenModal, slug, isCustom, postType, postId } = useSelect(\n\t\t( select ) => {\n\t\t\tconst { getCurrentPostType, getCurrentPostId } =\n\t\t\t\tselect( editorStore );\n\t\t\tconst _postType = getCurrentPostType();\n\t\t\tconst _postId = getCurrentPostId();\n\t\t\tconst { getEditedEntityRecord, hasEditsForEntityRecord } =\n\t\t\t\tselect( coreStore );\n\t\t\tconst templateRecord = getEditedEntityRecord(\n\t\t\t\t'postType',\n\t\t\t\t_postType,\n\t\t\t\t_postId\n\t\t\t);\n\t\t\tconst hasEdits = hasEditsForEntityRecord(\n\t\t\t\t'postType',\n\t\t\t\t_postType,\n\t\t\t\t_postId\n\t\t\t);\n\n\t\t\treturn {\n\t\t\t\tshouldOpenModal:\n\t\t\t\t\t! hasEdits &&\n\t\t\t\t\t'' === templateRecord.content &&\n\t\t\t\t\tTEMPLATE_POST_TYPE === _postType,\n\t\t\t\tslug: templateRecord.slug,\n\t\t\t\tisCustom: templateRecord.is_custom,\n\t\t\t\tpostType: _postType,\n\t\t\t\tpostId: _postId,\n\t\t\t};\n\t\t},\n\t\t[]\n\t);\n\n\tuseEffect( () => {\n\t\t// Should reset the modal state when navigating to a new page/post.\n\t\tsetIsClosed( false );\n\t}, [ postType, postId ] );\n\n\tif ( ! shouldOpenModal || isClosed ) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<StartModal\n\t\t\tslug={ slug }\n\t\t\tisCustom={ isCustom }\n\t\t\tpostType={ postType }\n\t\t\tonClose={ () => setIsClosed( true ) }\n\t\t/>\n\t);\n}\n"],
"mappings": "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",
"names": []
}