@wordpress/block-library
Version:
Block library for the WordPress editor.
8 lines (7 loc) • 7.28 kB
Source Map (JSON)
{
"version": 3,
"sources": ["../../../../src/template-part/edit/utils/hooks.js"],
"sourcesContent": ["/**\n * External dependencies\n */\nimport { paramCase as kebabCase } from 'change-case';\n\n/**\n * WordPress dependencies\n */\nimport { useDispatch, useSelect } from '@wordpress/data';\nimport { store as coreStore } from '@wordpress/core-data';\nimport { store as blockEditorStore } from '@wordpress/block-editor';\nimport { useMemo } from '@wordpress/element';\nimport { serialize } from '@wordpress/blocks';\nimport { __ } from '@wordpress/i18n';\n\n/**\n * Internal dependencies\n */\nimport { createTemplatePartId } from './create-template-part-id';\n\n/**\n * Retrieves the available template parts for the given area.\n *\n * @param {string} area Template part area.\n * @param {string} excludedId Template part ID to exclude.\n *\n * @return {{ templateParts: Array, isResolving: boolean }} array of template parts.\n */\nexport function useAlternativeTemplateParts( area, excludedId ) {\n\tconst { templateParts, isResolving } = useSelect( ( select ) => {\n\t\tconst { getEntityRecords, isResolving: _isResolving } =\n\t\t\tselect( coreStore );\n\t\tconst query = { per_page: -1 };\n\t\treturn {\n\t\t\ttemplateParts: getEntityRecords(\n\t\t\t\t'postType',\n\t\t\t\t'wp_template_part',\n\t\t\t\tquery\n\t\t\t),\n\t\t\tisResolving: _isResolving( 'getEntityRecords', [\n\t\t\t\t'postType',\n\t\t\t\t'wp_template_part',\n\t\t\t\tquery,\n\t\t\t] ),\n\t\t};\n\t}, [] );\n\n\tconst filteredTemplateParts = useMemo( () => {\n\t\tif ( ! templateParts ) {\n\t\t\treturn [];\n\t\t}\n\t\treturn (\n\t\t\ttemplateParts.filter(\n\t\t\t\t( templatePart ) =>\n\t\t\t\t\tcreateTemplatePartId(\n\t\t\t\t\t\ttemplatePart.theme,\n\t\t\t\t\t\ttemplatePart.slug\n\t\t\t\t\t) !== excludedId &&\n\t\t\t\t\t( ! area ||\n\t\t\t\t\t\t'uncategorized' === area ||\n\t\t\t\t\t\ttemplatePart.area === area )\n\t\t\t) || []\n\t\t);\n\t}, [ templateParts, area, excludedId ] );\n\n\treturn {\n\t\ttemplateParts: filteredTemplateParts,\n\t\tisResolving,\n\t};\n}\n\n/**\n * Retrieves the available block patterns for the given area.\n *\n * @param {string} area Template part area.\n * @param {string} clientId Block Client ID. (The container of the block can impact allowed blocks).\n *\n * @return {Array} array of block patterns.\n */\nexport function useAlternativeBlockPatterns( area, clientId ) {\n\treturn useSelect(\n\t\t( select ) => {\n\t\t\tconst blockNameWithArea = area\n\t\t\t\t? `core/template-part/${ area }`\n\t\t\t\t: 'core/template-part';\n\t\t\tconst { getBlockRootClientId, getPatternsByBlockTypes } =\n\t\t\t\tselect( blockEditorStore );\n\t\t\tconst rootClientId = getBlockRootClientId( clientId );\n\t\t\t// Use rootClientId to determine which patterns can be used in the current context.\n\t\t\t// If revisiting the idea of template parts being spotlighted when edited, it may\n\t\t\t// be worth either passing null or the template part's clientId instead.\n\t\t\t// See the following PRs for context:\n\t\t\t// - https://github.com/WordPress/gutenberg/pull/73736\n\t\t\t// - https://github.com/WordPress/gutenberg/pull/73419\n\t\t\treturn getPatternsByBlockTypes( blockNameWithArea, rootClientId );\n\t\t},\n\t\t[ area, clientId ]\n\t);\n}\n\nexport function useCreateTemplatePartFromBlocks( area, setAttributes ) {\n\tconst { saveEntityRecord } = useDispatch( coreStore );\n\n\treturn async ( blocks = [], title = __( 'Untitled Template Part' ) ) => {\n\t\t// Currently template parts only allow latin chars.\n\t\t// Fallback slug will receive suffix by default.\n\t\tconst cleanSlug =\n\t\t\tkebabCase( title ).replace( /[^\\w-]+/g, '' ) || 'wp-custom-part';\n\n\t\t// If we have `area` set from block attributes, means an exposed\n\t\t// block variation was inserted. So add this prop to the template\n\t\t// part entity on creation. Afterwards remove `area` value from\n\t\t// block attributes.\n\t\tconst record = {\n\t\t\ttitle,\n\t\t\tslug: cleanSlug,\n\t\t\tcontent: serialize( blocks ),\n\t\t\t// `area` is filterable on the server and defaults to `UNCATEGORIZED`\n\t\t\t// if provided value is not allowed.\n\t\t\tarea,\n\t\t};\n\t\tconst templatePart = await saveEntityRecord(\n\t\t\t'postType',\n\t\t\t'wp_template_part',\n\t\t\trecord\n\t\t);\n\t\tsetAttributes( {\n\t\t\tslug: templatePart.slug,\n\t\t\ttheme: templatePart.theme,\n\t\t\tarea: undefined,\n\t\t} );\n\t};\n}\n\n/**\n * Retrieves the template part area object.\n *\n * @param {string} area Template part area identifier.\n *\n * @return {{icon: Object, label: string, tagName: string}} Template Part area.\n */\nexport function useTemplatePartArea( area ) {\n\treturn useSelect(\n\t\t( select ) => {\n\t\t\tconst definedAreas =\n\t\t\t\tselect( coreStore ).getCurrentTheme()\n\t\t\t\t\t?.default_template_part_areas || [];\n\n\t\t\tconst selectedArea = definedAreas.find(\n\t\t\t\t( definedArea ) => definedArea.area === area\n\t\t\t);\n\t\t\tconst defaultArea = definedAreas.find(\n\t\t\t\t( definedArea ) => definedArea.area === 'uncategorized'\n\t\t\t);\n\n\t\t\treturn {\n\t\t\t\ticon: selectedArea?.icon || defaultArea?.icon,\n\t\t\t\tlabel: selectedArea?.label || __( 'Template Part' ),\n\t\t\t\ttagName: selectedArea?.area_tag ?? 'div',\n\t\t\t};\n\t\t},\n\t\t[ area ]\n\t);\n}\n"],
"mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,yBAAuC;AAKvC,kBAAuC;AACvC,uBAAmC;AACnC,0BAA0C;AAC1C,qBAAwB;AACxB,oBAA0B;AAC1B,kBAAmB;AAKnB,qCAAqC;AAU9B,SAAS,4BAA6B,MAAM,YAAa;AAC/D,QAAM,EAAE,eAAe,YAAY,QAAI,uBAAW,CAAE,WAAY;AAC/D,UAAM,EAAE,kBAAkB,aAAa,aAAa,IACnD,OAAQ,iBAAAA,KAAU;AACnB,UAAM,QAAQ,EAAE,UAAU,GAAG;AAC7B,WAAO;AAAA,MACN,eAAe;AAAA,QACd;AAAA,QACA;AAAA,QACA;AAAA,MACD;AAAA,MACA,aAAa,aAAc,oBAAoB;AAAA,QAC9C;AAAA,QACA;AAAA,QACA;AAAA,MACD,CAAE;AAAA,IACH;AAAA,EACD,GAAG,CAAC,CAAE;AAEN,QAAM,4BAAwB,wBAAS,MAAM;AAC5C,QAAK,CAAE,eAAgB;AACtB,aAAO,CAAC;AAAA,IACT;AACA,WACC,cAAc;AAAA,MACb,CAAE,qBACD;AAAA,QACC,aAAa;AAAA,QACb,aAAa;AAAA,MACd,MAAM,eACJ,CAAE,QACH,oBAAoB,QACpB,aAAa,SAAS;AAAA,IACzB,KAAK,CAAC;AAAA,EAER,GAAG,CAAE,eAAe,MAAM,UAAW,CAAE;AAEvC,SAAO;AAAA,IACN,eAAe;AAAA,IACf;AAAA,EACD;AACD;AAUO,SAAS,4BAA6B,MAAM,UAAW;AAC7D,aAAO;AAAA,IACN,CAAE,WAAY;AACb,YAAM,oBAAoB,OACvB,sBAAuB,IAAK,KAC5B;AACH,YAAM,EAAE,sBAAsB,wBAAwB,IACrD,OAAQ,oBAAAC,KAAiB;AAC1B,YAAM,eAAe,qBAAsB,QAAS;AAOpD,aAAO,wBAAyB,mBAAmB,YAAa;AAAA,IACjE;AAAA,IACA,CAAE,MAAM,QAAS;AAAA,EAClB;AACD;AAEO,SAAS,gCAAiC,MAAM,eAAgB;AACtE,QAAM,EAAE,iBAAiB,QAAI,yBAAa,iBAAAD,KAAU;AAEpD,SAAO,OAAQ,SAAS,CAAC,GAAG,YAAQ,gBAAI,wBAAyB,MAAO;AAGvE,UAAM,gBACL,mBAAAE,WAAW,KAAM,EAAE,QAAS,YAAY,EAAG,KAAK;AAMjD,UAAM,SAAS;AAAA,MACd;AAAA,MACA,MAAM;AAAA,MACN,aAAS,yBAAW,MAAO;AAAA;AAAA;AAAA,MAG3B;AAAA,IACD;AACA,UAAM,eAAe,MAAM;AAAA,MAC1B;AAAA,MACA;AAAA,MACA;AAAA,IACD;AACA,kBAAe;AAAA,MACd,MAAM,aAAa;AAAA,MACnB,OAAO,aAAa;AAAA,MACpB,MAAM;AAAA,IACP,CAAE;AAAA,EACH;AACD;AASO,SAAS,oBAAqB,MAAO;AAC3C,aAAO;AAAA,IACN,CAAE,WAAY;AACb,YAAM,eACL,OAAQ,iBAAAF,KAAU,EAAE,gBAAgB,GACjC,+BAA+B,CAAC;AAEpC,YAAM,eAAe,aAAa;AAAA,QACjC,CAAE,gBAAiB,YAAY,SAAS;AAAA,MACzC;AACA,YAAM,cAAc,aAAa;AAAA,QAChC,CAAE,gBAAiB,YAAY,SAAS;AAAA,MACzC;AAEA,aAAO;AAAA,QACN,MAAM,cAAc,QAAQ,aAAa;AAAA,QACzC,OAAO,cAAc,aAAS,gBAAI,eAAgB;AAAA,QAClD,SAAS,cAAc,YAAY;AAAA,MACpC;AAAA,IACD;AAAA,IACA,CAAE,IAAK;AAAA,EACR;AACD;",
"names": ["coreStore", "blockEditorStore", "kebabCase"]
}