@wordpress/editor
Version:
Enhanced block editor for WordPress posts.
8 lines (7 loc) • 10.2 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": ["coreStore", "editorStore", "BlockPatternsList"]
}