@wordpress/block-editor 12.4.0 → 12.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (316) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/README.md +5 -0
  3. package/build/components/block-heading-level-dropdown/heading-level-icon.js +10 -2
  4. package/build/components/block-heading-level-dropdown/heading-level-icon.js.map +1 -1
  5. package/build/components/block-heading-level-dropdown/index.native.js +4 -3
  6. package/build/components/block-heading-level-dropdown/index.native.js.map +1 -1
  7. package/build/components/block-lock/toolbar.js +25 -6
  8. package/build/components/block-lock/toolbar.js.map +1 -1
  9. package/build/components/block-mobile-toolbar/block-actions-menu.native.js +3 -6
  10. package/build/components/block-mobile-toolbar/block-actions-menu.native.js.map +1 -1
  11. package/build/components/block-parent-selector/index.js +8 -5
  12. package/build/components/block-parent-selector/index.js.map +1 -1
  13. package/build/components/block-removal-warning-modal/index.js +18 -25
  14. package/build/components/block-removal-warning-modal/index.js.map +1 -1
  15. package/build/components/block-toolbar/index.js +8 -5
  16. package/build/components/block-toolbar/index.js.map +1 -1
  17. package/build/components/block-tools/block-contextual-toolbar.js +7 -11
  18. package/build/components/block-tools/block-contextual-toolbar.js.map +1 -1
  19. package/build/components/dimensions-tool/aspect-ratio-tool.js +99 -0
  20. package/build/components/dimensions-tool/aspect-ratio-tool.js.map +1 -0
  21. package/build/components/dimensions-tool/index.js +207 -0
  22. package/build/components/dimensions-tool/index.js.map +1 -0
  23. package/build/components/dimensions-tool/scale-tool.js +111 -0
  24. package/build/components/dimensions-tool/scale-tool.js.map +1 -0
  25. package/build/components/dimensions-tool/width-height-tool.js +125 -0
  26. package/build/components/dimensions-tool/width-height-tool.js.map +1 -0
  27. package/build/components/global-styles/color-panel.js +1 -1
  28. package/build/components/global-styles/color-panel.js.map +1 -1
  29. package/build/components/global-styles/filters-panel.js +1 -1
  30. package/build/components/global-styles/filters-panel.js.map +1 -1
  31. package/build/components/global-styles/hooks.js +2 -2
  32. package/build/components/global-styles/hooks.js.map +1 -1
  33. package/build/components/global-styles/typography-panel.js +34 -2
  34. package/build/components/global-styles/typography-panel.js.map +1 -1
  35. package/build/components/image-editor/aspect-ratio-dropdown.js +1 -1
  36. package/build/components/image-editor/aspect-ratio-dropdown.js.map +1 -1
  37. package/build/components/image-editor/use-save-image.js +1 -2
  38. package/build/components/image-editor/use-save-image.js.map +1 -1
  39. package/build/components/image-size-control/index.js +6 -0
  40. package/build/components/image-size-control/index.js.map +1 -1
  41. package/build/components/index.js +19 -1
  42. package/build/components/index.js.map +1 -1
  43. package/build/components/inserter/block-patterns-explorer/patterns-list.js +2 -2
  44. package/build/components/inserter/block-patterns-explorer/patterns-list.js.map +1 -1
  45. package/build/components/inserter/block-patterns-tab.js +7 -35
  46. package/build/components/inserter/block-patterns-tab.js.map +1 -1
  47. package/build/components/inserter/hooks/use-block-types-state.js +3 -4
  48. package/build/components/inserter/hooks/use-block-types-state.js.map +1 -1
  49. package/build/components/inserter/hooks/use-patterns-state.js +9 -3
  50. package/build/components/inserter/hooks/use-patterns-state.js.map +1 -1
  51. package/build/components/inserter/media-tab/hooks.js +2 -21
  52. package/build/components/inserter/media-tab/hooks.js.map +1 -1
  53. package/build/components/inserter/reusable-block-rename-hint.js +62 -0
  54. package/build/components/inserter/reusable-block-rename-hint.js.map +1 -0
  55. package/build/components/inserter/reusable-blocks-tab.js +6 -2
  56. package/build/components/inserter/reusable-blocks-tab.js.map +1 -1
  57. package/build/components/inserter/reusable-blocks-tab.native.js +2 -2
  58. package/build/components/inserter/reusable-blocks-tab.native.js.map +1 -1
  59. package/build/components/inserter/tabs.native.js +1 -1
  60. package/build/components/inserter/tabs.native.js.map +1 -1
  61. package/build/components/inserter-draggable-blocks/index.js +9 -1
  62. package/build/components/inserter-draggable-blocks/index.js.map +1 -1
  63. package/build/components/link-control/constants.js +1 -1
  64. package/build/components/link-control/constants.js.map +1 -1
  65. package/build/components/link-control/index.js +17 -15
  66. package/build/components/link-control/index.js.map +1 -1
  67. package/build/components/link-control/search-create-button.js +5 -21
  68. package/build/components/link-control/search-create-button.js.map +1 -1
  69. package/build/components/link-control/search-input.js +4 -4
  70. package/build/components/link-control/search-input.js.map +1 -1
  71. package/build/components/link-control/search-item.js +13 -30
  72. package/build/components/link-control/search-item.js.map +1 -1
  73. package/build/components/link-control/search-results.js +2 -2
  74. package/build/components/link-control/search-results.js.map +1 -1
  75. package/build/components/link-control/settings-drawer.js +2 -3
  76. package/build/components/link-control/settings-drawer.js.map +1 -1
  77. package/build/components/list-view/appender.js +2 -6
  78. package/build/components/list-view/appender.js.map +1 -1
  79. package/build/components/provider/index.js +5 -2
  80. package/build/components/provider/index.js.map +1 -1
  81. package/build/components/provider/use-block-sync.js +21 -0
  82. package/build/components/provider/use-block-sync.js.map +1 -1
  83. package/build/components/resolution-tool/index.js +55 -0
  84. package/build/components/resolution-tool/index.js.map +1 -0
  85. package/build/components/url-input/index.js +4 -2
  86. package/build/components/url-input/index.js.map +1 -1
  87. package/build/components/writing-flow/use-tab-nav.js +10 -27
  88. package/build/components/writing-flow/use-tab-nav.js.map +1 -1
  89. package/build/components/writing-mode-control/index.js +70 -0
  90. package/build/components/writing-mode-control/index.js.map +1 -0
  91. package/build/hooks/behaviors.js +25 -20
  92. package/build/hooks/behaviors.js.map +1 -1
  93. package/build/hooks/supports.js +7 -1
  94. package/build/hooks/supports.js.map +1 -1
  95. package/build/hooks/typography.js +2 -1
  96. package/build/hooks/typography.js.map +1 -1
  97. package/build/hooks/utils.js +4 -2
  98. package/build/hooks/utils.js.map +1 -1
  99. package/build/private-apis.js +10 -1
  100. package/build/private-apis.js.map +1 -1
  101. package/build/private-apis.native.js +3 -0
  102. package/build/private-apis.native.js.map +1 -1
  103. package/build/store/actions.js +195 -1
  104. package/build/store/actions.js.map +1 -1
  105. package/build/store/defaults.js +1 -0
  106. package/build/store/defaults.js.map +1 -1
  107. package/build/store/index.js +10 -1
  108. package/build/store/index.js.map +1 -1
  109. package/build/store/private-actions.js +46 -40
  110. package/build/store/private-actions.js.map +1 -1
  111. package/build/store/private-selectors.js +3 -3
  112. package/build/store/private-selectors.js.map +1 -1
  113. package/build/store/reducer.js +22 -8
  114. package/build/store/reducer.js.map +1 -1
  115. package/build/store/selectors.js +33 -15
  116. package/build/store/selectors.js.map +1 -1
  117. package/build-module/components/block-heading-level-dropdown/heading-level-icon.js +9 -2
  118. package/build-module/components/block-heading-level-dropdown/heading-level-icon.js.map +1 -1
  119. package/build-module/components/block-heading-level-dropdown/index.native.js +4 -3
  120. package/build-module/components/block-heading-level-dropdown/index.native.js.map +1 -1
  121. package/build-module/components/block-lock/toolbar.js +25 -7
  122. package/build-module/components/block-lock/toolbar.js.map +1 -1
  123. package/build-module/components/block-mobile-toolbar/block-actions-menu.native.js +4 -6
  124. package/build-module/components/block-mobile-toolbar/block-actions-menu.native.js.map +1 -1
  125. package/build-module/components/block-parent-selector/index.js +7 -5
  126. package/build-module/components/block-parent-selector/index.js.map +1 -1
  127. package/build-module/components/block-removal-warning-modal/index.js +20 -24
  128. package/build-module/components/block-removal-warning-modal/index.js.map +1 -1
  129. package/build-module/components/block-toolbar/index.js +8 -5
  130. package/build-module/components/block-toolbar/index.js.map +1 -1
  131. package/build-module/components/block-tools/block-contextual-toolbar.js +8 -11
  132. package/build-module/components/block-tools/block-contextual-toolbar.js.map +1 -1
  133. package/build-module/components/dimensions-tool/aspect-ratio-tool.js +87 -0
  134. package/build-module/components/dimensions-tool/aspect-ratio-tool.js.map +1 -0
  135. package/build-module/components/dimensions-tool/index.js +195 -0
  136. package/build-module/components/dimensions-tool/index.js.map +1 -0
  137. package/build-module/components/dimensions-tool/scale-tool.js +103 -0
  138. package/build-module/components/dimensions-tool/scale-tool.js.map +1 -0
  139. package/build-module/components/dimensions-tool/width-height-tool.js +122 -0
  140. package/build-module/components/dimensions-tool/width-height-tool.js.map +1 -0
  141. package/build-module/components/global-styles/color-panel.js +1 -1
  142. package/build-module/components/global-styles/color-panel.js.map +1 -1
  143. package/build-module/components/global-styles/filters-panel.js +2 -2
  144. package/build-module/components/global-styles/filters-panel.js.map +1 -1
  145. package/build-module/components/global-styles/hooks.js +2 -2
  146. package/build-module/components/global-styles/hooks.js.map +1 -1
  147. package/build-module/components/global-styles/typography-panel.js +33 -2
  148. package/build-module/components/global-styles/typography-panel.js.map +1 -1
  149. package/build-module/components/image-editor/aspect-ratio-dropdown.js +1 -1
  150. package/build-module/components/image-editor/aspect-ratio-dropdown.js.map +1 -1
  151. package/build-module/components/image-editor/use-save-image.js +1 -2
  152. package/build-module/components/image-editor/use-save-image.js.map +1 -1
  153. package/build-module/components/image-size-control/index.js +5 -0
  154. package/build-module/components/image-size-control/index.js.map +1 -1
  155. package/build-module/components/index.js +6 -0
  156. package/build-module/components/index.js.map +1 -1
  157. package/build-module/components/inserter/block-patterns-explorer/patterns-list.js +2 -2
  158. package/build-module/components/inserter/block-patterns-explorer/patterns-list.js.map +1 -1
  159. package/build-module/components/inserter/block-patterns-tab.js +7 -33
  160. package/build-module/components/inserter/block-patterns-tab.js.map +1 -1
  161. package/build-module/components/inserter/hooks/use-block-types-state.js +3 -4
  162. package/build-module/components/inserter/hooks/use-block-types-state.js.map +1 -1
  163. package/build-module/components/inserter/hooks/use-patterns-state.js +9 -3
  164. package/build-module/components/inserter/hooks/use-patterns-state.js.map +1 -1
  165. package/build-module/components/inserter/media-tab/hooks.js +2 -21
  166. package/build-module/components/inserter/media-tab/hooks.js.map +1 -1
  167. package/build-module/components/inserter/reusable-block-rename-hint.js +48 -0
  168. package/build-module/components/inserter/reusable-block-rename-hint.js.map +1 -0
  169. package/build-module/components/inserter/reusable-blocks-tab.js +5 -2
  170. package/build-module/components/inserter/reusable-blocks-tab.js.map +1 -1
  171. package/build-module/components/inserter/reusable-blocks-tab.native.js +2 -2
  172. package/build-module/components/inserter/reusable-blocks-tab.native.js.map +1 -1
  173. package/build-module/components/inserter/tabs.native.js +1 -1
  174. package/build-module/components/inserter/tabs.native.js.map +1 -1
  175. package/build-module/components/inserter-draggable-blocks/index.js +9 -2
  176. package/build-module/components/inserter-draggable-blocks/index.js.map +1 -1
  177. package/build-module/components/link-control/constants.js +1 -1
  178. package/build-module/components/link-control/constants.js.map +1 -1
  179. package/build-module/components/link-control/index.js +17 -15
  180. package/build-module/components/link-control/index.js.map +1 -1
  181. package/build-module/components/link-control/search-create-button.js +7 -20
  182. package/build-module/components/link-control/search-create-button.js.map +1 -1
  183. package/build-module/components/link-control/search-input.js +4 -4
  184. package/build-module/components/link-control/search-input.js.map +1 -1
  185. package/build-module/components/link-control/search-item.js +14 -28
  186. package/build-module/components/link-control/search-item.js.map +1 -1
  187. package/build-module/components/link-control/search-results.js +3 -3
  188. package/build-module/components/link-control/search-results.js.map +1 -1
  189. package/build-module/components/link-control/settings-drawer.js +4 -5
  190. package/build-module/components/link-control/settings-drawer.js.map +1 -1
  191. package/build-module/components/list-view/appender.js +2 -6
  192. package/build-module/components/list-view/appender.js.map +1 -1
  193. package/build-module/components/provider/index.js +5 -2
  194. package/build-module/components/provider/index.js.map +1 -1
  195. package/build-module/components/provider/use-block-sync.js +21 -0
  196. package/build-module/components/provider/use-block-sync.js.map +1 -1
  197. package/build-module/components/resolution-tool/index.js +45 -0
  198. package/build-module/components/resolution-tool/index.js.map +1 -0
  199. package/build-module/components/url-input/index.js +4 -2
  200. package/build-module/components/url-input/index.js.map +1 -1
  201. package/build-module/components/writing-flow/use-tab-nav.js +8 -26
  202. package/build-module/components/writing-flow/use-tab-nav.js.map +1 -1
  203. package/build-module/components/writing-mode-control/index.js +57 -0
  204. package/build-module/components/writing-mode-control/index.js.map +1 -0
  205. package/build-module/hooks/behaviors.js +26 -20
  206. package/build-module/hooks/behaviors.js.map +1 -1
  207. package/build-module/hooks/supports.js +7 -1
  208. package/build-module/hooks/supports.js.map +1 -1
  209. package/build-module/hooks/typography.js +2 -1
  210. package/build-module/hooks/typography.js.map +1 -1
  211. package/build-module/hooks/utils.js +4 -2
  212. package/build-module/hooks/utils.js.map +1 -1
  213. package/build-module/private-apis.js +7 -1
  214. package/build-module/private-apis.js.map +1 -1
  215. package/build-module/private-apis.native.js +2 -0
  216. package/build-module/private-apis.native.js.map +1 -1
  217. package/build-module/store/actions.js +191 -1
  218. package/build-module/store/actions.js.map +1 -1
  219. package/build-module/store/defaults.js +1 -0
  220. package/build-module/store/defaults.js.map +1 -1
  221. package/build-module/store/index.js +10 -1
  222. package/build-module/store/index.js.map +1 -1
  223. package/build-module/store/private-actions.js +45 -36
  224. package/build-module/store/private-actions.js.map +1 -1
  225. package/build-module/store/private-selectors.js +2 -2
  226. package/build-module/store/private-selectors.js.map +1 -1
  227. package/build-module/store/reducer.js +22 -8
  228. package/build-module/store/reducer.js.map +1 -1
  229. package/build-module/store/selectors.js +33 -15
  230. package/build-module/store/selectors.js.map +1 -1
  231. package/build-style/content-rtl.css +3 -0
  232. package/build-style/content.css +3 -0
  233. package/build-style/style-rtl.css +131 -129
  234. package/build-style/style.css +131 -129
  235. package/package.json +32 -31
  236. package/src/components/alignment-control/test/__snapshots__/index.js.snap +6 -6
  237. package/src/components/block-alignment-control/test/__snapshots__/index.js.snap +5 -5
  238. package/src/components/block-draggable/style.scss +1 -0
  239. package/src/components/block-heading-level-dropdown/heading-level-icon.js +6 -1
  240. package/src/components/block-heading-level-dropdown/index.native.js +8 -4
  241. package/src/components/block-inspector/style.scss +2 -1
  242. package/src/components/block-lock/toolbar.js +34 -6
  243. package/src/components/block-mobile-toolbar/block-actions-menu.native.js +4 -8
  244. package/src/components/block-parent-selector/index.js +13 -8
  245. package/src/components/block-removal-warning-modal/index.js +20 -33
  246. package/src/components/block-toolbar/index.js +9 -6
  247. package/src/components/block-tools/block-contextual-toolbar.js +5 -11
  248. package/src/components/block-tools/style.scss +73 -26
  249. package/src/components/default-block-appender/content.scss +11 -0
  250. package/src/components/dimensions-tool/aspect-ratio-tool.js +124 -0
  251. package/src/components/dimensions-tool/index.js +212 -0
  252. package/src/components/dimensions-tool/scale-tool.js +124 -0
  253. package/src/components/dimensions-tool/stories/aspect-ratio-tool.js +52 -0
  254. package/src/components/dimensions-tool/stories/index.js +54 -0
  255. package/src/components/dimensions-tool/stories/scale-tool.js +48 -0
  256. package/src/components/dimensions-tool/stories/width-height-tool.js +54 -0
  257. package/src/components/dimensions-tool/test/index.js +641 -0
  258. package/src/components/dimensions-tool/width-height-tool.js +113 -0
  259. package/src/components/font-family/README.md +71 -0
  260. package/src/components/global-styles/color-panel.js +1 -1
  261. package/src/components/global-styles/filters-panel.js +2 -2
  262. package/src/components/global-styles/hooks.js +2 -0
  263. package/src/components/global-styles/typography-panel.js +40 -0
  264. package/src/components/image-editor/aspect-ratio-dropdown.js +1 -1
  265. package/src/components/image-editor/use-save-image.js +0 -1
  266. package/src/components/image-size-control/index.js +6 -0
  267. package/src/components/index.js +6 -0
  268. package/src/components/inserter/block-patterns-explorer/patterns-list.js +8 -2
  269. package/src/components/inserter/block-patterns-tab.js +8 -56
  270. package/src/components/inserter/hooks/use-block-types-state.js +3 -4
  271. package/src/components/inserter/hooks/use-patterns-state.js +35 -19
  272. package/src/components/inserter/media-tab/hooks.js +2 -22
  273. package/src/components/inserter/reusable-block-rename-hint.js +52 -0
  274. package/src/components/inserter/reusable-blocks-tab.js +5 -1
  275. package/src/components/inserter/reusable-blocks-tab.native.js +2 -2
  276. package/src/components/inserter/style.scss +28 -0
  277. package/src/components/inserter/tabs.native.js +5 -1
  278. package/src/components/inserter-draggable-blocks/index.js +13 -2
  279. package/src/components/link-control/constants.js +1 -1
  280. package/src/components/link-control/index.js +32 -28
  281. package/src/components/link-control/search-create-button.js +8 -26
  282. package/src/components/link-control/search-input.js +4 -3
  283. package/src/components/link-control/search-item.js +21 -43
  284. package/src/components/link-control/search-results.js +48 -46
  285. package/src/components/link-control/settings-drawer.js +6 -5
  286. package/src/components/link-control/style.scss +51 -123
  287. package/src/components/link-control/test/index.js +135 -123
  288. package/src/components/list-view/appender.js +5 -6
  289. package/src/components/list-view/style.scss +1 -2
  290. package/src/components/media-replace-flow/test/index.js +1 -1
  291. package/src/components/panel-color-settings/README.md +98 -0
  292. package/src/components/provider/index.js +9 -2
  293. package/src/components/provider/test/use-block-sync.js +21 -6
  294. package/src/components/provider/use-block-sync.js +19 -0
  295. package/src/components/recursion-provider/README.md +101 -0
  296. package/src/components/resolution-tool/index.js +56 -0
  297. package/src/components/resolution-tool/stories/index.js +48 -0
  298. package/src/components/url-input/index.js +2 -0
  299. package/src/components/writing-flow/use-tab-nav.js +10 -33
  300. package/src/components/writing-mode-control/index.js +68 -0
  301. package/src/components/writing-mode-control/style.scss +18 -0
  302. package/src/hooks/behaviors.js +25 -16
  303. package/src/hooks/supports.js +7 -0
  304. package/src/hooks/typography.js +2 -0
  305. package/src/hooks/utils.js +3 -0
  306. package/src/private-apis.js +6 -0
  307. package/src/private-apis.native.js +2 -0
  308. package/src/store/actions.js +194 -1
  309. package/src/store/defaults.js +1 -0
  310. package/src/store/index.js +10 -0
  311. package/src/store/private-actions.js +39 -39
  312. package/src/store/private-selectors.js +2 -2
  313. package/src/store/reducer.js +22 -8
  314. package/src/store/selectors.js +54 -20
  315. package/src/store/test/actions.js +111 -0
  316. package/src/store/test/private-actions.js +56 -0
@@ -8,7 +8,6 @@ import { _x, __, isRTL } from '@wordpress/i18n';
8
8
  import { useAsyncList, useViewportMatch } from '@wordpress/compose';
9
9
  import { __experimentalItemGroup as ItemGroup, __experimentalItem as Item, __experimentalHStack as HStack, FlexBlock, Button } from '@wordpress/components';
10
10
  import { Icon, chevronRight, chevronLeft } from '@wordpress/icons';
11
- import { parse } from '@wordpress/blocks';
12
11
  import { focus } from '@wordpress/dom';
13
12
  /**
14
13
  * Internal dependencies
@@ -18,22 +17,15 @@ import usePatternsState from './hooks/use-patterns-state';
18
17
  import BlockPatternList from '../block-patterns-list';
19
18
  import PatternsExplorerModal from './block-patterns-explorer/explorer';
20
19
  import MobileTabNavigation from './mobile-tab-navigation';
21
- import useBlockTypesState from './hooks/use-block-types-state';
22
20
 
23
21
  const noop = () => {}; // Preferred order of pattern categories. Any other categories should
24
22
  // be at the bottom without any re-ordering.
25
23
 
26
24
 
27
- const patternCategoriesOrder = ['featured', 'posts', 'text', 'gallery', 'call-to-action', 'banner', 'header', 'footer'];
25
+ const patternCategoriesOrder = ['custom', 'featured', 'posts', 'text', 'gallery', 'call-to-action', 'banner', 'header', 'footer'];
28
26
 
29
27
  function usePatternsCategories(rootClientId) {
30
28
  const [allPatterns, allCategories] = usePatternsState(undefined, rootClientId);
31
- const [unsyncedPatterns] = useBlockTypesState(rootClientId, undefined, 'unsynced');
32
- const filteredUnsyncedPatterns = useMemo(() => {
33
- return unsyncedPatterns.filter(({
34
- category: unsyncedPatternCategory
35
- }) => unsyncedPatternCategory === 'reusable');
36
- }, [unsyncedPatterns]);
37
29
  const hasRegisteredCategory = useCallback(pattern => {
38
30
  if (!pattern.categories || !pattern.categories.length) {
39
31
  return false;
@@ -64,15 +56,8 @@ function usePatternsCategories(rootClientId) {
64
56
  });
65
57
  }
66
58
 
67
- if (filteredUnsyncedPatterns.length > 0) {
68
- categories.push({
69
- name: 'reusable',
70
- label: _x('Custom patterns')
71
- });
72
- }
73
-
74
59
  return categories;
75
- }, [allCategories, allPatterns, filteredUnsyncedPatterns.length, hasRegisteredCategory]);
60
+ }, [allCategories, allPatterns, hasRegisteredCategory]);
76
61
  return populatedCategories;
77
62
  }
78
63
 
@@ -110,16 +95,6 @@ export function BlockPatternsCategoryPanel({
110
95
  showTitlesAsTooltip
111
96
  }) {
112
97
  const [allPatterns,, onClick] = usePatternsState(onInsert, rootClientId);
113
- const [unsyncedPatterns] = useBlockTypesState(rootClientId, onInsert, 'unsynced');
114
- const filteredUnsyncedPatterns = useMemo(() => {
115
- return unsyncedPatterns.filter(({
116
- category: unsyncedPatternCategory
117
- }) => unsyncedPatternCategory === 'reusable').map(syncedPattern => ({ ...syncedPattern,
118
- blocks: parse(syncedPattern.content, {
119
- __unstableSkipMigrationLogs: true
120
- })
121
- }));
122
- }, [unsyncedPatterns]);
123
98
  const availableCategories = usePatternsCategories(rootClientId);
124
99
  const currentCategoryPatterns = useMemo(() => allPatterns.filter(pattern => {
125
100
  var _pattern$categories$f;
@@ -132,13 +107,12 @@ export function BlockPatternsCategoryPanel({
132
107
 
133
108
  const availablePatternCategories = (_pattern$categories$f = pattern.categories?.filter(cat => availableCategories.find(availableCategory => availableCategory.name === cat))) !== null && _pattern$categories$f !== void 0 ? _pattern$categories$f : [];
134
109
  return availablePatternCategories.length === 0;
135
- }), [allPatterns, category]);
136
- const patterns = category.name === 'reusable' ? filteredUnsyncedPatterns : currentCategoryPatterns;
137
- const currentShownPatterns = useAsyncList(patterns); // Hide block pattern preview on unmount.
110
+ }), [allPatterns, availableCategories, category.name]);
111
+ const categoryPatternsList = useAsyncList(currentCategoryPatterns); // Hide block pattern preview on unmount.
138
112
 
139
113
  useEffect(() => () => onHover(null), []);
140
114
 
141
- if (!currentCategoryPatterns.length && !filteredUnsyncedPatterns.length) {
115
+ if (!currentCategoryPatterns.length) {
142
116
  return null;
143
117
  }
144
118
 
@@ -147,8 +121,8 @@ export function BlockPatternsCategoryPanel({
147
121
  }, createElement("div", {
148
122
  className: "block-editor-inserter__patterns-category-panel-title"
149
123
  }, category.label), createElement("p", null, category.description), createElement(BlockPatternList, {
150
- shownPatterns: currentShownPatterns,
151
- blockPatterns: patterns,
124
+ shownPatterns: categoryPatternsList,
125
+ blockPatterns: currentCategoryPatterns,
152
126
  onClickPattern: onClick,
153
127
  onHover: onHover,
154
128
  label: category.label,
@@ -1 +1 @@
1
- {"version":3,"sources":["@wordpress/block-editor/src/components/inserter/block-patterns-tab.js"],"names":["useMemo","useState","useCallback","useRef","useEffect","_x","__","isRTL","useAsyncList","useViewportMatch","__experimentalItemGroup","ItemGroup","__experimentalItem","Item","__experimentalHStack","HStack","FlexBlock","Button","Icon","chevronRight","chevronLeft","parse","focus","usePatternsState","BlockPatternList","PatternsExplorerModal","MobileTabNavigation","useBlockTypesState","noop","patternCategoriesOrder","usePatternsCategories","rootClientId","allPatterns","allCategories","undefined","unsyncedPatterns","filteredUnsyncedPatterns","filter","category","unsyncedPatternCategory","hasRegisteredCategory","pattern","categories","length","some","cat","name","populatedCategories","includes","sort","aName","bName","aIndex","indexOf","bIndex","find","push","label","BlockPatternsCategoryDialog","onInsert","onHover","showTitlesAsTooltip","container","timeout","setTimeout","firstTabbable","tabbable","current","clearTimeout","BlockPatternsCategoryPanel","onClick","map","syncedPattern","blocks","content","__unstableSkipMigrationLogs","availableCategories","currentCategoryPatterns","availablePatternCategories","availableCategory","patterns","currentShownPatterns","description","BlockPatternsTabs","onSelectCategory","selectedCategory","showPatternsExplorer","setShowPatternsExplorer","initialCategory","isMobile"],"mappings":"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","sourcesContent":["/**\n * WordPress dependencies\n */\nimport {\n\tuseMemo,\n\tuseState,\n\tuseCallback,\n\tuseRef,\n\tuseEffect,\n} from '@wordpress/element';\nimport { _x, __, isRTL } from '@wordpress/i18n';\nimport { useAsyncList, useViewportMatch } from '@wordpress/compose';\nimport {\n\t__experimentalItemGroup as ItemGroup,\n\t__experimentalItem as Item,\n\t__experimentalHStack as HStack,\n\tFlexBlock,\n\tButton,\n} from '@wordpress/components';\nimport { Icon, chevronRight, chevronLeft } from '@wordpress/icons';\nimport { parse } from '@wordpress/blocks';\nimport { focus } from '@wordpress/dom';\n\n/**\n * Internal dependencies\n */\nimport usePatternsState from './hooks/use-patterns-state';\nimport BlockPatternList from '../block-patterns-list';\nimport PatternsExplorerModal from './block-patterns-explorer/explorer';\nimport MobileTabNavigation from './mobile-tab-navigation';\nimport useBlockTypesState from './hooks/use-block-types-state';\n\nconst noop = () => {};\n\n// Preferred order of pattern categories. Any other categories should\n// be at the bottom without any re-ordering.\nconst patternCategoriesOrder = [\n\t'featured',\n\t'posts',\n\t'text',\n\t'gallery',\n\t'call-to-action',\n\t'banner',\n\t'header',\n\t'footer',\n];\n\nfunction usePatternsCategories( rootClientId ) {\n\tconst [ allPatterns, allCategories ] = usePatternsState(\n\t\tundefined,\n\t\trootClientId\n\t);\n\n\tconst [ unsyncedPatterns ] = useBlockTypesState(\n\t\trootClientId,\n\t\tundefined,\n\t\t'unsynced'\n\t);\n\n\tconst filteredUnsyncedPatterns = useMemo( () => {\n\t\treturn unsyncedPatterns.filter(\n\t\t\t( { category: unsyncedPatternCategory } ) =>\n\t\t\t\tunsyncedPatternCategory === 'reusable'\n\t\t);\n\t}, [ unsyncedPatterns ] );\n\tconst hasRegisteredCategory = useCallback(\n\t\t( pattern ) => {\n\t\t\tif ( ! pattern.categories || ! pattern.categories.length ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\treturn pattern.categories.some( ( cat ) =>\n\t\t\t\tallCategories.some( ( category ) => category.name === cat )\n\t\t\t);\n\t\t},\n\t\t[ allCategories ]\n\t);\n\n\t// Remove any empty categories.\n\tconst populatedCategories = useMemo( () => {\n\t\tconst categories = allCategories\n\t\t\t.filter( ( category ) =>\n\t\t\t\tallPatterns.some( ( pattern ) =>\n\t\t\t\t\tpattern.categories?.includes( category.name )\n\t\t\t\t)\n\t\t\t)\n\t\t\t.sort( ( { name: aName }, { name: bName } ) => {\n\t\t\t\t// Sort categories according to `patternCategoriesOrder`.\n\t\t\t\tlet aIndex = patternCategoriesOrder.indexOf( aName );\n\t\t\t\tlet bIndex = patternCategoriesOrder.indexOf( bName );\n\t\t\t\t// All other categories should come after that.\n\t\t\t\tif ( aIndex < 0 ) aIndex = patternCategoriesOrder.length;\n\t\t\t\tif ( bIndex < 0 ) bIndex = patternCategoriesOrder.length;\n\t\t\t\treturn aIndex - bIndex;\n\t\t\t} );\n\n\t\tif (\n\t\t\tallPatterns.some(\n\t\t\t\t( pattern ) => ! hasRegisteredCategory( pattern )\n\t\t\t) &&\n\t\t\t! categories.find(\n\t\t\t\t( category ) => category.name === 'uncategorized'\n\t\t\t)\n\t\t) {\n\t\t\tcategories.push( {\n\t\t\t\tname: 'uncategorized',\n\t\t\t\tlabel: _x( 'Uncategorized' ),\n\t\t\t} );\n\t\t}\n\t\tif ( filteredUnsyncedPatterns.length > 0 ) {\n\t\t\tcategories.push( {\n\t\t\t\tname: 'reusable',\n\t\t\t\tlabel: _x( 'Custom patterns' ),\n\t\t\t} );\n\t\t}\n\n\t\treturn categories;\n\t}, [\n\t\tallCategories,\n\t\tallPatterns,\n\t\tfilteredUnsyncedPatterns.length,\n\t\thasRegisteredCategory,\n\t] );\n\n\treturn populatedCategories;\n}\n\nexport function BlockPatternsCategoryDialog( {\n\trootClientId,\n\tonInsert,\n\tonHover,\n\tcategory,\n\tshowTitlesAsTooltip,\n} ) {\n\tconst container = useRef();\n\n\tuseEffect( () => {\n\t\tconst timeout = setTimeout( () => {\n\t\t\tconst [ firstTabbable ] = focus.tabbable.find( container.current );\n\t\t\tfirstTabbable?.focus();\n\t\t} );\n\t\treturn () => clearTimeout( timeout );\n\t}, [ category ] );\n\n\treturn (\n\t\t<div\n\t\t\tref={ container }\n\t\t\tclassName=\"block-editor-inserter__patterns-category-dialog\"\n\t\t>\n\t\t\t<BlockPatternsCategoryPanel\n\t\t\t\trootClientId={ rootClientId }\n\t\t\t\tonInsert={ onInsert }\n\t\t\t\tonHover={ onHover }\n\t\t\t\tcategory={ category }\n\t\t\t\tshowTitlesAsTooltip={ showTitlesAsTooltip }\n\t\t\t/>\n\t\t</div>\n\t);\n}\n\nexport function BlockPatternsCategoryPanel( {\n\trootClientId,\n\tonInsert,\n\tonHover = noop,\n\tcategory,\n\tshowTitlesAsTooltip,\n} ) {\n\tconst [ allPatterns, , onClick ] = usePatternsState(\n\t\tonInsert,\n\t\trootClientId\n\t);\n\tconst [ unsyncedPatterns ] = useBlockTypesState(\n\t\trootClientId,\n\t\tonInsert,\n\t\t'unsynced'\n\t);\n\tconst filteredUnsyncedPatterns = useMemo( () => {\n\t\treturn unsyncedPatterns\n\t\t\t.filter(\n\t\t\t\t( { category: unsyncedPatternCategory } ) =>\n\t\t\t\t\tunsyncedPatternCategory === 'reusable'\n\t\t\t)\n\t\t\t.map( ( syncedPattern ) => ( {\n\t\t\t\t...syncedPattern,\n\t\t\t\tblocks: parse( syncedPattern.content, {\n\t\t\t\t\t__unstableSkipMigrationLogs: true,\n\t\t\t\t} ),\n\t\t\t} ) );\n\t}, [ unsyncedPatterns ] );\n\n\tconst availableCategories = usePatternsCategories( rootClientId );\n\tconst currentCategoryPatterns = useMemo(\n\t\t() =>\n\t\t\tallPatterns.filter( ( pattern ) => {\n\t\t\t\tif ( category.name !== 'uncategorized' ) {\n\t\t\t\t\treturn pattern.categories?.includes( category.name );\n\t\t\t\t}\n\n\t\t\t\t// The uncategorized category should show all the patterns without any category\n\t\t\t\t// or with no available category.\n\t\t\t\tconst availablePatternCategories =\n\t\t\t\t\tpattern.categories?.filter( ( cat ) =>\n\t\t\t\t\t\tavailableCategories.find(\n\t\t\t\t\t\t\t( availableCategory ) =>\n\t\t\t\t\t\t\t\tavailableCategory.name === cat\n\t\t\t\t\t\t)\n\t\t\t\t\t) ?? [];\n\n\t\t\t\treturn availablePatternCategories.length === 0;\n\t\t\t} ),\n\t\t[ allPatterns, category ]\n\t);\n\tconst patterns =\n\t\tcategory.name === 'reusable'\n\t\t\t? filteredUnsyncedPatterns\n\t\t\t: currentCategoryPatterns;\n\tconst currentShownPatterns = useAsyncList( patterns );\n\n\t// Hide block pattern preview on unmount.\n\tuseEffect( () => () => onHover( null ), [] );\n\n\tif (\n\t\t! currentCategoryPatterns.length &&\n\t\t! filteredUnsyncedPatterns.length\n\t) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<div className=\"block-editor-inserter__patterns-category-panel\">\n\t\t\t<div className=\"block-editor-inserter__patterns-category-panel-title\">\n\t\t\t\t{ category.label }\n\t\t\t</div>\n\t\t\t<p>{ category.description }</p>\n\t\t\t<BlockPatternList\n\t\t\t\tshownPatterns={ currentShownPatterns }\n\t\t\t\tblockPatterns={ patterns }\n\t\t\t\tonClickPattern={ onClick }\n\t\t\t\tonHover={ onHover }\n\t\t\t\tlabel={ category.label }\n\t\t\t\torientation=\"vertical\"\n\t\t\t\tcategory={ category.label }\n\t\t\t\tisDraggable\n\t\t\t\tshowTitlesAsTooltip={ showTitlesAsTooltip }\n\t\t\t/>\n\t\t</div>\n\t);\n}\n\nfunction BlockPatternsTabs( {\n\tonSelectCategory,\n\tselectedCategory,\n\tonInsert,\n\trootClientId,\n} ) {\n\tconst [ showPatternsExplorer, setShowPatternsExplorer ] = useState( false );\n\tconst categories = usePatternsCategories( rootClientId );\n\tconst initialCategory = selectedCategory || categories[ 0 ];\n\tconst isMobile = useViewportMatch( 'medium', '<' );\n\treturn (\n\t\t<>\n\t\t\t{ ! isMobile && (\n\t\t\t\t<div className=\"block-editor-inserter__block-patterns-tabs-container\">\n\t\t\t\t\t<nav aria-label={ __( 'Block pattern categories' ) }>\n\t\t\t\t\t\t<ItemGroup\n\t\t\t\t\t\t\trole=\"list\"\n\t\t\t\t\t\t\tclassName=\"block-editor-inserter__block-patterns-tabs\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{ categories.map( ( category ) => (\n\t\t\t\t\t\t\t\t<Item\n\t\t\t\t\t\t\t\t\trole=\"listitem\"\n\t\t\t\t\t\t\t\t\tkey={ category.name }\n\t\t\t\t\t\t\t\t\tonClick={ () =>\n\t\t\t\t\t\t\t\t\t\tonSelectCategory( category )\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tclassName={\n\t\t\t\t\t\t\t\t\t\tcategory === selectedCategory\n\t\t\t\t\t\t\t\t\t\t\t? 'block-editor-inserter__patterns-category block-editor-inserter__patterns-selected-category'\n\t\t\t\t\t\t\t\t\t\t\t: 'block-editor-inserter__patterns-category'\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\taria-label={ category.label }\n\t\t\t\t\t\t\t\t\taria-current={\n\t\t\t\t\t\t\t\t\t\tcategory === selectedCategory\n\t\t\t\t\t\t\t\t\t\t\t? 'true'\n\t\t\t\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<HStack>\n\t\t\t\t\t\t\t\t\t\t<FlexBlock>\n\t\t\t\t\t\t\t\t\t\t\t{ category.label }\n\t\t\t\t\t\t\t\t\t\t</FlexBlock>\n\t\t\t\t\t\t\t\t\t\t<Icon\n\t\t\t\t\t\t\t\t\t\t\ticon={\n\t\t\t\t\t\t\t\t\t\t\t\tisRTL()\n\t\t\t\t\t\t\t\t\t\t\t\t\t? chevronLeft\n\t\t\t\t\t\t\t\t\t\t\t\t\t: chevronRight\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</HStack>\n\t\t\t\t\t\t\t\t</Item>\n\t\t\t\t\t\t\t) ) }\n\t\t\t\t\t\t\t<div role=\"listitem\">\n\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\tclassName=\"block-editor-inserter__patterns-explore-button\"\n\t\t\t\t\t\t\t\t\tonClick={ () =>\n\t\t\t\t\t\t\t\t\t\tsetShowPatternsExplorer( true )\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tvariant=\"secondary\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{ __( 'Explore all patterns' ) }\n\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</ItemGroup>\n\t\t\t\t\t</nav>\n\t\t\t\t</div>\n\t\t\t) }\n\t\t\t{ isMobile && (\n\t\t\t\t<MobileTabNavigation categories={ categories }>\n\t\t\t\t\t{ ( category ) => (\n\t\t\t\t\t\t<BlockPatternsCategoryPanel\n\t\t\t\t\t\t\tonInsert={ onInsert }\n\t\t\t\t\t\t\trootClientId={ rootClientId }\n\t\t\t\t\t\t\tcategory={ category }\n\t\t\t\t\t\t\tshowTitlesAsTooltip={ false }\n\t\t\t\t\t\t/>\n\t\t\t\t\t) }\n\t\t\t\t</MobileTabNavigation>\n\t\t\t) }\n\t\t\t{ showPatternsExplorer && (\n\t\t\t\t<PatternsExplorerModal\n\t\t\t\t\tinitialCategory={ initialCategory }\n\t\t\t\t\tpatternCategories={ categories }\n\t\t\t\t\tonModalClose={ () => setShowPatternsExplorer( false ) }\n\t\t\t\t/>\n\t\t\t) }\n\t\t</>\n\t);\n}\n\nexport default BlockPatternsTabs;\n"]}
1
+ {"version":3,"sources":["@wordpress/block-editor/src/components/inserter/block-patterns-tab.js"],"names":["useMemo","useState","useCallback","useRef","useEffect","_x","__","isRTL","useAsyncList","useViewportMatch","__experimentalItemGroup","ItemGroup","__experimentalItem","Item","__experimentalHStack","HStack","FlexBlock","Button","Icon","chevronRight","chevronLeft","focus","usePatternsState","BlockPatternList","PatternsExplorerModal","MobileTabNavigation","noop","patternCategoriesOrder","usePatternsCategories","rootClientId","allPatterns","allCategories","undefined","hasRegisteredCategory","pattern","categories","length","some","cat","category","name","populatedCategories","filter","includes","sort","aName","bName","aIndex","indexOf","bIndex","find","push","label","BlockPatternsCategoryDialog","onInsert","onHover","showTitlesAsTooltip","container","timeout","setTimeout","firstTabbable","tabbable","current","clearTimeout","BlockPatternsCategoryPanel","onClick","availableCategories","currentCategoryPatterns","availablePatternCategories","availableCategory","categoryPatternsList","description","BlockPatternsTabs","onSelectCategory","selectedCategory","showPatternsExplorer","setShowPatternsExplorer","initialCategory","isMobile","map"],"mappings":"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","sourcesContent":["/**\n * WordPress dependencies\n */\nimport {\n\tuseMemo,\n\tuseState,\n\tuseCallback,\n\tuseRef,\n\tuseEffect,\n} from '@wordpress/element';\nimport { _x, __, isRTL } from '@wordpress/i18n';\nimport { useAsyncList, useViewportMatch } from '@wordpress/compose';\nimport {\n\t__experimentalItemGroup as ItemGroup,\n\t__experimentalItem as Item,\n\t__experimentalHStack as HStack,\n\tFlexBlock,\n\tButton,\n} from '@wordpress/components';\nimport { Icon, chevronRight, chevronLeft } from '@wordpress/icons';\nimport { focus } from '@wordpress/dom';\n\n/**\n * Internal dependencies\n */\nimport usePatternsState from './hooks/use-patterns-state';\nimport BlockPatternList from '../block-patterns-list';\nimport PatternsExplorerModal from './block-patterns-explorer/explorer';\nimport MobileTabNavigation from './mobile-tab-navigation';\n\nconst noop = () => {};\n\n// Preferred order of pattern categories. Any other categories should\n// be at the bottom without any re-ordering.\nconst patternCategoriesOrder = [\n\t'custom',\n\t'featured',\n\t'posts',\n\t'text',\n\t'gallery',\n\t'call-to-action',\n\t'banner',\n\t'header',\n\t'footer',\n];\n\nfunction usePatternsCategories( rootClientId ) {\n\tconst [ allPatterns, allCategories ] = usePatternsState(\n\t\tundefined,\n\t\trootClientId\n\t);\n\n\tconst hasRegisteredCategory = useCallback(\n\t\t( pattern ) => {\n\t\t\tif ( ! pattern.categories || ! pattern.categories.length ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\treturn pattern.categories.some( ( cat ) =>\n\t\t\t\tallCategories.some( ( category ) => category.name === cat )\n\t\t\t);\n\t\t},\n\t\t[ allCategories ]\n\t);\n\n\t// Remove any empty categories.\n\tconst populatedCategories = useMemo( () => {\n\t\tconst categories = allCategories\n\t\t\t.filter( ( category ) =>\n\t\t\t\tallPatterns.some( ( pattern ) =>\n\t\t\t\t\tpattern.categories?.includes( category.name )\n\t\t\t\t)\n\t\t\t)\n\t\t\t.sort( ( { name: aName }, { name: bName } ) => {\n\t\t\t\t// Sort categories according to `patternCategoriesOrder`.\n\t\t\t\tlet aIndex = patternCategoriesOrder.indexOf( aName );\n\t\t\t\tlet bIndex = patternCategoriesOrder.indexOf( bName );\n\t\t\t\t// All other categories should come after that.\n\t\t\t\tif ( aIndex < 0 ) aIndex = patternCategoriesOrder.length;\n\t\t\t\tif ( bIndex < 0 ) bIndex = patternCategoriesOrder.length;\n\t\t\t\treturn aIndex - bIndex;\n\t\t\t} );\n\n\t\tif (\n\t\t\tallPatterns.some(\n\t\t\t\t( pattern ) => ! hasRegisteredCategory( pattern )\n\t\t\t) &&\n\t\t\t! categories.find(\n\t\t\t\t( category ) => category.name === 'uncategorized'\n\t\t\t)\n\t\t) {\n\t\t\tcategories.push( {\n\t\t\t\tname: 'uncategorized',\n\t\t\t\tlabel: _x( 'Uncategorized' ),\n\t\t\t} );\n\t\t}\n\n\t\treturn categories;\n\t}, [ allCategories, allPatterns, hasRegisteredCategory ] );\n\n\treturn populatedCategories;\n}\n\nexport function BlockPatternsCategoryDialog( {\n\trootClientId,\n\tonInsert,\n\tonHover,\n\tcategory,\n\tshowTitlesAsTooltip,\n} ) {\n\tconst container = useRef();\n\n\tuseEffect( () => {\n\t\tconst timeout = setTimeout( () => {\n\t\t\tconst [ firstTabbable ] = focus.tabbable.find( container.current );\n\t\t\tfirstTabbable?.focus();\n\t\t} );\n\t\treturn () => clearTimeout( timeout );\n\t}, [ category ] );\n\n\treturn (\n\t\t<div\n\t\t\tref={ container }\n\t\t\tclassName=\"block-editor-inserter__patterns-category-dialog\"\n\t\t>\n\t\t\t<BlockPatternsCategoryPanel\n\t\t\t\trootClientId={ rootClientId }\n\t\t\t\tonInsert={ onInsert }\n\t\t\t\tonHover={ onHover }\n\t\t\t\tcategory={ category }\n\t\t\t\tshowTitlesAsTooltip={ showTitlesAsTooltip }\n\t\t\t/>\n\t\t</div>\n\t);\n}\n\nexport function BlockPatternsCategoryPanel( {\n\trootClientId,\n\tonInsert,\n\tonHover = noop,\n\tcategory,\n\tshowTitlesAsTooltip,\n} ) {\n\tconst [ allPatterns, , onClick ] = usePatternsState(\n\t\tonInsert,\n\t\trootClientId\n\t);\n\n\tconst availableCategories = usePatternsCategories( rootClientId );\n\tconst currentCategoryPatterns = useMemo(\n\t\t() =>\n\t\t\tallPatterns.filter( ( pattern ) => {\n\t\t\t\tif ( category.name !== 'uncategorized' ) {\n\t\t\t\t\treturn pattern.categories?.includes( category.name );\n\t\t\t\t}\n\n\t\t\t\t// The uncategorized category should show all the patterns without any category\n\t\t\t\t// or with no available category.\n\t\t\t\tconst availablePatternCategories =\n\t\t\t\t\tpattern.categories?.filter( ( cat ) =>\n\t\t\t\t\t\tavailableCategories.find(\n\t\t\t\t\t\t\t( availableCategory ) =>\n\t\t\t\t\t\t\t\tavailableCategory.name === cat\n\t\t\t\t\t\t)\n\t\t\t\t\t) ?? [];\n\n\t\t\t\treturn availablePatternCategories.length === 0;\n\t\t\t} ),\n\t\t[ allPatterns, availableCategories, category.name ]\n\t);\n\n\tconst categoryPatternsList = useAsyncList( currentCategoryPatterns );\n\n\t// Hide block pattern preview on unmount.\n\tuseEffect( () => () => onHover( null ), [] );\n\n\tif ( ! currentCategoryPatterns.length ) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<div className=\"block-editor-inserter__patterns-category-panel\">\n\t\t\t<div className=\"block-editor-inserter__patterns-category-panel-title\">\n\t\t\t\t{ category.label }\n\t\t\t</div>\n\t\t\t<p>{ category.description }</p>\n\t\t\t<BlockPatternList\n\t\t\t\tshownPatterns={ categoryPatternsList }\n\t\t\t\tblockPatterns={ currentCategoryPatterns }\n\t\t\t\tonClickPattern={ onClick }\n\t\t\t\tonHover={ onHover }\n\t\t\t\tlabel={ category.label }\n\t\t\t\torientation=\"vertical\"\n\t\t\t\tcategory={ category.label }\n\t\t\t\tisDraggable\n\t\t\t\tshowTitlesAsTooltip={ showTitlesAsTooltip }\n\t\t\t/>\n\t\t</div>\n\t);\n}\n\nfunction BlockPatternsTabs( {\n\tonSelectCategory,\n\tselectedCategory,\n\tonInsert,\n\trootClientId,\n} ) {\n\tconst [ showPatternsExplorer, setShowPatternsExplorer ] = useState( false );\n\tconst categories = usePatternsCategories( rootClientId );\n\tconst initialCategory = selectedCategory || categories[ 0 ];\n\tconst isMobile = useViewportMatch( 'medium', '<' );\n\treturn (\n\t\t<>\n\t\t\t{ ! isMobile && (\n\t\t\t\t<div className=\"block-editor-inserter__block-patterns-tabs-container\">\n\t\t\t\t\t<nav aria-label={ __( 'Block pattern categories' ) }>\n\t\t\t\t\t\t<ItemGroup\n\t\t\t\t\t\t\trole=\"list\"\n\t\t\t\t\t\t\tclassName=\"block-editor-inserter__block-patterns-tabs\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{ categories.map( ( category ) => (\n\t\t\t\t\t\t\t\t<Item\n\t\t\t\t\t\t\t\t\trole=\"listitem\"\n\t\t\t\t\t\t\t\t\tkey={ category.name }\n\t\t\t\t\t\t\t\t\tonClick={ () =>\n\t\t\t\t\t\t\t\t\t\tonSelectCategory( category )\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tclassName={\n\t\t\t\t\t\t\t\t\t\tcategory === selectedCategory\n\t\t\t\t\t\t\t\t\t\t\t? 'block-editor-inserter__patterns-category block-editor-inserter__patterns-selected-category'\n\t\t\t\t\t\t\t\t\t\t\t: 'block-editor-inserter__patterns-category'\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\taria-label={ category.label }\n\t\t\t\t\t\t\t\t\taria-current={\n\t\t\t\t\t\t\t\t\t\tcategory === selectedCategory\n\t\t\t\t\t\t\t\t\t\t\t? 'true'\n\t\t\t\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<HStack>\n\t\t\t\t\t\t\t\t\t\t<FlexBlock>\n\t\t\t\t\t\t\t\t\t\t\t{ category.label }\n\t\t\t\t\t\t\t\t\t\t</FlexBlock>\n\t\t\t\t\t\t\t\t\t\t<Icon\n\t\t\t\t\t\t\t\t\t\t\ticon={\n\t\t\t\t\t\t\t\t\t\t\t\tisRTL()\n\t\t\t\t\t\t\t\t\t\t\t\t\t? chevronLeft\n\t\t\t\t\t\t\t\t\t\t\t\t\t: chevronRight\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</HStack>\n\t\t\t\t\t\t\t\t</Item>\n\t\t\t\t\t\t\t) ) }\n\t\t\t\t\t\t\t<div role=\"listitem\">\n\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\tclassName=\"block-editor-inserter__patterns-explore-button\"\n\t\t\t\t\t\t\t\t\tonClick={ () =>\n\t\t\t\t\t\t\t\t\t\tsetShowPatternsExplorer( true )\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tvariant=\"secondary\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{ __( 'Explore all patterns' ) }\n\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</ItemGroup>\n\t\t\t\t\t</nav>\n\t\t\t\t</div>\n\t\t\t) }\n\t\t\t{ isMobile && (\n\t\t\t\t<MobileTabNavigation categories={ categories }>\n\t\t\t\t\t{ ( category ) => (\n\t\t\t\t\t\t<BlockPatternsCategoryPanel\n\t\t\t\t\t\t\tonInsert={ onInsert }\n\t\t\t\t\t\t\trootClientId={ rootClientId }\n\t\t\t\t\t\t\tcategory={ category }\n\t\t\t\t\t\t\tshowTitlesAsTooltip={ false }\n\t\t\t\t\t\t/>\n\t\t\t\t\t) }\n\t\t\t\t</MobileTabNavigation>\n\t\t\t) }\n\t\t\t{ showPatternsExplorer && (\n\t\t\t\t<PatternsExplorerModal\n\t\t\t\t\tinitialCategory={ initialCategory }\n\t\t\t\t\tpatternCategories={ categories }\n\t\t\t\t\tonModalClose={ () => setShowPatternsExplorer( false ) }\n\t\t\t\t/>\n\t\t\t) }\n\t\t</>\n\t);\n}\n\nexport default BlockPatternsTabs;\n"]}
@@ -14,11 +14,10 @@ import { store as blockEditorStore } from '../../../store';
14
14
  *
15
15
  * @param {string=} rootClientId Insertion's root client ID.
16
16
  * @param {Function} onInsert function called when inserter a list of blocks.
17
- * @param {?string} syncStatus Optional sync status to filter pattern blocks by.
18
17
  * @return {Array} Returns the block types state. (block types, categories, collections, onSelect handler)
19
18
  */
20
19
 
21
- const useBlockTypesState = (rootClientId, onInsert, syncStatus) => {
20
+ const useBlockTypesState = (rootClientId, onInsert) => {
22
21
  const {
23
22
  categories,
24
23
  collections,
@@ -34,9 +33,9 @@ const useBlockTypesState = (rootClientId, onInsert, syncStatus) => {
34
33
  return {
35
34
  categories: getCategories(),
36
35
  collections: getCollections(),
37
- items: getInserterItems(rootClientId, syncStatus)
36
+ items: getInserterItems(rootClientId)
38
37
  };
39
- }, [rootClientId, syncStatus]);
38
+ }, [rootClientId]);
40
39
  const onSelectItem = useCallback(({
41
40
  name,
42
41
  initialAttributes,
@@ -1 +1 @@
1
- {"version":3,"sources":["@wordpress/block-editor/src/components/inserter/hooks/use-block-types-state.js"],"names":["createBlock","createBlocksFromInnerBlocksTemplate","store","blocksStore","useSelect","useCallback","blockEditorStore","useBlockTypesState","rootClientId","onInsert","syncStatus","categories","collections","items","select","getInserterItems","getCategories","getCollections","onSelectItem","name","initialAttributes","innerBlocks","shouldFocusBlock","insertedBlock","undefined"],"mappings":"AAAA;AACA;AACA;AACA,SACCA,WADD,EAECC,mCAFD,EAGCC,KAAK,IAAIC,WAHV,QAIO,mBAJP;AAKA,SAASC,SAAT,QAA0B,iBAA1B;AACA,SAASC,WAAT,QAA4B,oBAA5B;AAEA;AACA;AACA;;AACA,SAASH,KAAK,IAAII,gBAAlB,QAA0C,gBAA1C;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AACA,MAAMC,kBAAkB,GAAG,CAAEC,YAAF,EAAgBC,QAAhB,EAA0BC,UAA1B,KAA0C;AACpE,QAAM;AAAEC,IAAAA,UAAF;AAAcC,IAAAA,WAAd;AAA2BC,IAAAA;AAA3B,MAAqCT,SAAS,CACjDU,MAAF,IAAc;AACb,UAAM;AAAEC,MAAAA;AAAF,QAAuBD,MAAM,CAAER,gBAAF,CAAnC;AACA,UAAM;AAAEU,MAAAA,aAAF;AAAiBC,MAAAA;AAAjB,QAAoCH,MAAM,CAAEX,WAAF,CAAhD;AAEA,WAAO;AACNQ,MAAAA,UAAU,EAAEK,aAAa,EADnB;AAENJ,MAAAA,WAAW,EAAEK,cAAc,EAFrB;AAGNJ,MAAAA,KAAK,EAAEE,gBAAgB,CAAEP,YAAF,EAAgBE,UAAhB;AAHjB,KAAP;AAKA,GAVkD,EAWnD,CAAEF,YAAF,EAAgBE,UAAhB,CAXmD,CAApD;AAcA,QAAMQ,YAAY,GAAGb,WAAW,CAC/B,CAAE;AAAEc,IAAAA,IAAF;AAAQC,IAAAA,iBAAR;AAA2BC,IAAAA;AAA3B,GAAF,EAA4CC,gBAA5C,KAAkE;AACjE,UAAMC,aAAa,GAAGvB,WAAW,CAChCmB,IADgC,EAEhCC,iBAFgC,EAGhCnB,mCAAmC,CAAEoB,WAAF,CAHH,CAAjC;AAMAZ,IAAAA,QAAQ,CAAEc,aAAF,EAAiBC,SAAjB,EAA4BF,gBAA5B,CAAR;AACA,GAT8B,EAU/B,CAAEb,QAAF,CAV+B,CAAhC;AAaA,SAAO,CAAEI,KAAF,EAASF,UAAT,EAAqBC,WAArB,EAAkCM,YAAlC,CAAP;AACA,CA7BD;;AA+BA,eAAeX,kBAAf","sourcesContent":["/**\n * WordPress dependencies\n */\nimport {\n\tcreateBlock,\n\tcreateBlocksFromInnerBlocksTemplate,\n\tstore as blocksStore,\n} from '@wordpress/blocks';\nimport { useSelect } from '@wordpress/data';\nimport { useCallback } from '@wordpress/element';\n\n/**\n * Internal dependencies\n */\nimport { store as blockEditorStore } from '../../../store';\n\n/**\n * Retrieves the block types inserter state.\n *\n * @param {string=} rootClientId Insertion's root client ID.\n * @param {Function} onInsert function called when inserter a list of blocks.\n * @param {?string} syncStatus Optional sync status to filter pattern blocks by.\n * @return {Array} Returns the block types state. (block types, categories, collections, onSelect handler)\n */\nconst useBlockTypesState = ( rootClientId, onInsert, syncStatus ) => {\n\tconst { categories, collections, items } = useSelect(\n\t\t( select ) => {\n\t\t\tconst { getInserterItems } = select( blockEditorStore );\n\t\t\tconst { getCategories, getCollections } = select( blocksStore );\n\n\t\t\treturn {\n\t\t\t\tcategories: getCategories(),\n\t\t\t\tcollections: getCollections(),\n\t\t\t\titems: getInserterItems( rootClientId, syncStatus ),\n\t\t\t};\n\t\t},\n\t\t[ rootClientId, syncStatus ]\n\t);\n\n\tconst onSelectItem = useCallback(\n\t\t( { name, initialAttributes, innerBlocks }, shouldFocusBlock ) => {\n\t\t\tconst insertedBlock = createBlock(\n\t\t\t\tname,\n\t\t\t\tinitialAttributes,\n\t\t\t\tcreateBlocksFromInnerBlocksTemplate( innerBlocks )\n\t\t\t);\n\n\t\t\tonInsert( insertedBlock, undefined, shouldFocusBlock );\n\t\t},\n\t\t[ onInsert ]\n\t);\n\n\treturn [ items, categories, collections, onSelectItem ];\n};\n\nexport default useBlockTypesState;\n"]}
1
+ {"version":3,"sources":["@wordpress/block-editor/src/components/inserter/hooks/use-block-types-state.js"],"names":["createBlock","createBlocksFromInnerBlocksTemplate","store","blocksStore","useSelect","useCallback","blockEditorStore","useBlockTypesState","rootClientId","onInsert","categories","collections","items","select","getInserterItems","getCategories","getCollections","onSelectItem","name","initialAttributes","innerBlocks","shouldFocusBlock","insertedBlock","undefined"],"mappings":"AAAA;AACA;AACA;AACA,SACCA,WADD,EAECC,mCAFD,EAGCC,KAAK,IAAIC,WAHV,QAIO,mBAJP;AAKA,SAASC,SAAT,QAA0B,iBAA1B;AACA,SAASC,WAAT,QAA4B,oBAA5B;AAEA;AACA;AACA;;AACA,SAASH,KAAK,IAAII,gBAAlB,QAA0C,gBAA1C;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AACA,MAAMC,kBAAkB,GAAG,CAAEC,YAAF,EAAgBC,QAAhB,KAA8B;AACxD,QAAM;AAAEC,IAAAA,UAAF;AAAcC,IAAAA,WAAd;AAA2BC,IAAAA;AAA3B,MAAqCR,SAAS,CACjDS,MAAF,IAAc;AACb,UAAM;AAAEC,MAAAA;AAAF,QAAuBD,MAAM,CAAEP,gBAAF,CAAnC;AACA,UAAM;AAAES,MAAAA,aAAF;AAAiBC,MAAAA;AAAjB,QAAoCH,MAAM,CAAEV,WAAF,CAAhD;AAEA,WAAO;AACNO,MAAAA,UAAU,EAAEK,aAAa,EADnB;AAENJ,MAAAA,WAAW,EAAEK,cAAc,EAFrB;AAGNJ,MAAAA,KAAK,EAAEE,gBAAgB,CAAEN,YAAF;AAHjB,KAAP;AAKA,GAVkD,EAWnD,CAAEA,YAAF,CAXmD,CAApD;AAcA,QAAMS,YAAY,GAAGZ,WAAW,CAC/B,CAAE;AAAEa,IAAAA,IAAF;AAAQC,IAAAA,iBAAR;AAA2BC,IAAAA;AAA3B,GAAF,EAA4CC,gBAA5C,KAAkE;AACjE,UAAMC,aAAa,GAAGtB,WAAW,CAChCkB,IADgC,EAEhCC,iBAFgC,EAGhClB,mCAAmC,CAAEmB,WAAF,CAHH,CAAjC;AAMAX,IAAAA,QAAQ,CAAEa,aAAF,EAAiBC,SAAjB,EAA4BF,gBAA5B,CAAR;AACA,GAT8B,EAU/B,CAAEZ,QAAF,CAV+B,CAAhC;AAaA,SAAO,CAAEG,KAAF,EAASF,UAAT,EAAqBC,WAArB,EAAkCM,YAAlC,CAAP;AACA,CA7BD;;AA+BA,eAAeV,kBAAf","sourcesContent":["/**\n * WordPress dependencies\n */\nimport {\n\tcreateBlock,\n\tcreateBlocksFromInnerBlocksTemplate,\n\tstore as blocksStore,\n} from '@wordpress/blocks';\nimport { useSelect } from '@wordpress/data';\nimport { useCallback } from '@wordpress/element';\n\n/**\n * Internal dependencies\n */\nimport { store as blockEditorStore } from '../../../store';\n\n/**\n * Retrieves the block types inserter state.\n *\n * @param {string=} rootClientId Insertion's root client ID.\n * @param {Function} onInsert function called when inserter a list of blocks.\n * @return {Array} Returns the block types state. (block types, categories, collections, onSelect handler)\n */\nconst useBlockTypesState = ( rootClientId, onInsert ) => {\n\tconst { categories, collections, items } = useSelect(\n\t\t( select ) => {\n\t\t\tconst { getInserterItems } = select( blockEditorStore );\n\t\t\tconst { getCategories, getCollections } = select( blocksStore );\n\n\t\t\treturn {\n\t\t\t\tcategories: getCategories(),\n\t\t\t\tcollections: getCollections(),\n\t\t\t\titems: getInserterItems( rootClientId ),\n\t\t\t};\n\t\t},\n\t\t[ rootClientId ]\n\t);\n\n\tconst onSelectItem = useCallback(\n\t\t( { name, initialAttributes, innerBlocks }, shouldFocusBlock ) => {\n\t\t\tconst insertedBlock = createBlock(\n\t\t\t\tname,\n\t\t\t\tinitialAttributes,\n\t\t\t\tcreateBlocksFromInnerBlocksTemplate( innerBlocks )\n\t\t\t);\n\n\t\t\tonInsert( insertedBlock, undefined, shouldFocusBlock );\n\t\t},\n\t\t[ onInsert ]\n\t);\n\n\treturn [ items, categories, collections, onSelectItem ];\n};\n\nexport default useBlockTypesState;\n"]}
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * WordPress dependencies
3
3
  */
4
- import { useCallback } from '@wordpress/element';
4
+ import { useCallback, useMemo } from '@wordpress/element';
5
5
  import { cloneBlock } from '@wordpress/blocks';
6
6
  import { useDispatch, useSelect } from '@wordpress/data';
7
7
  import { __, sprintf } from '@wordpress/i18n';
@@ -11,6 +11,11 @@ import { store as noticesStore } from '@wordpress/notices';
11
11
  */
12
12
 
13
13
  import { store as blockEditorStore } from '../../../store';
14
+ const CUSTOM_CATEGORY = {
15
+ name: 'custom',
16
+ label: __('My patterns'),
17
+ description: __('Custom patterns add by site users')
18
+ };
14
19
  /**
15
20
  * Retrieves the block patterns inserter state.
16
21
  *
@@ -34,6 +39,7 @@ const usePatternsState = (onInsert, rootClientId) => {
34
39
  patternCategories: getSettings().__experimentalBlockPatternCategories
35
40
  };
36
41
  }, [rootClientId]);
42
+ const allCategories = useMemo(() => [...patternCategories, CUSTOM_CATEGORY], [patternCategories]);
37
43
  const {
38
44
  createSuccessNotice
39
45
  } = useDispatch(noticesStore);
@@ -44,8 +50,8 @@ const usePatternsState = (onInsert, rootClientId) => {
44
50
  __('Block pattern "%s" inserted.'), pattern.title), {
45
51
  type: 'snackbar'
46
52
  });
47
- }, []);
48
- return [patterns, patternCategories, onClickPattern];
53
+ }, [createSuccessNotice, onInsert]);
54
+ return [patterns, allCategories, onClickPattern];
49
55
  };
50
56
 
51
57
  export default usePatternsState;
@@ -1 +1 @@
1
- {"version":3,"sources":["@wordpress/block-editor/src/components/inserter/hooks/use-patterns-state.js"],"names":["useCallback","cloneBlock","useDispatch","useSelect","__","sprintf","store","noticesStore","blockEditorStore","usePatternsState","onInsert","rootClientId","patternCategories","patterns","select","__experimentalGetAllowedPatterns","getSettings","__experimentalBlockPatternCategories","createSuccessNotice","onClickPattern","pattern","blocks","map","block","name","title","type"],"mappings":"AAAA;AACA;AACA;AACA,SAASA,WAAT,QAA4B,oBAA5B;AACA,SAASC,UAAT,QAA2B,mBAA3B;AACA,SAASC,WAAT,EAAsBC,SAAtB,QAAuC,iBAAvC;AACA,SAASC,EAAT,EAAaC,OAAb,QAA4B,iBAA5B;AACA,SAASC,KAAK,IAAIC,YAAlB,QAAsC,oBAAtC;AAEA;AACA;AACA;;AACA,SAASD,KAAK,IAAIE,gBAAlB,QAA0C,gBAA1C;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AACA,MAAMC,gBAAgB,GAAG,CAAEC,QAAF,EAAYC,YAAZ,KAA8B;AACtD,QAAM;AAAEC,IAAAA,iBAAF;AAAqBC,IAAAA;AAArB,MAAkCV,SAAS,CAC9CW,MAAF,IAAc;AACb,UAAM;AAAEC,MAAAA,gCAAF;AAAoCC,MAAAA;AAApC,QACLF,MAAM,CAAEN,gBAAF,CADP;AAEA,WAAO;AACNK,MAAAA,QAAQ,EAAEE,gCAAgC,CAAEJ,YAAF,CADpC;AAENC,MAAAA,iBAAiB,EAChBI,WAAW,GAAGC;AAHT,KAAP;AAKA,GAT+C,EAUhD,CAAEN,YAAF,CAVgD,CAAjD;AAYA,QAAM;AAAEO,IAAAA;AAAF,MAA0BhB,WAAW,CAAEK,YAAF,CAA3C;AACA,QAAMY,cAAc,GAAGnB,WAAW,CAAE,CAAEoB,OAAF,EAAWC,MAAX,KAAuB;AAC1DX,IAAAA,QAAQ,CACP,CAAEW,MAAF,aAAEA,MAAF,cAAEA,MAAF,GAAY,EAAZ,EAAiBC,GAAjB,CAAwBC,KAAF,IAAatB,UAAU,CAAEsB,KAAF,CAA7C,CADO,EAEPH,OAAO,CAACI,IAFD,CAAR;AAIAN,IAAAA,mBAAmB,CAClBb,OAAO;AACN;AACAD,IAAAA,EAAE,CAAE,8BAAF,CAFI,EAGNgB,OAAO,CAACK,KAHF,CADW,EAMlB;AACCC,MAAAA,IAAI,EAAE;AADP,KANkB,CAAnB;AAUA,GAfiC,EAe/B,EAf+B,CAAlC;AAiBA,SAAO,CAAEb,QAAF,EAAYD,iBAAZ,EAA+BO,cAA/B,CAAP;AACA,CAhCD;;AAkCA,eAAeV,gBAAf","sourcesContent":["/**\n * WordPress dependencies\n */\nimport { useCallback } from '@wordpress/element';\nimport { cloneBlock } from '@wordpress/blocks';\nimport { useDispatch, useSelect } from '@wordpress/data';\nimport { __, sprintf } from '@wordpress/i18n';\nimport { store as noticesStore } from '@wordpress/notices';\n\n/**\n * Internal dependencies\n */\nimport { store as blockEditorStore } from '../../../store';\n\n/**\n * Retrieves the block patterns inserter state.\n *\n * @param {Function} onInsert function called when inserter a list of blocks.\n * @param {string=} rootClientId Insertion's root client ID.\n *\n * @return {Array} Returns the patterns state. (patterns, categories, onSelect handler)\n */\nconst usePatternsState = ( onInsert, rootClientId ) => {\n\tconst { patternCategories, patterns } = useSelect(\n\t\t( select ) => {\n\t\t\tconst { __experimentalGetAllowedPatterns, getSettings } =\n\t\t\t\tselect( blockEditorStore );\n\t\t\treturn {\n\t\t\t\tpatterns: __experimentalGetAllowedPatterns( rootClientId ),\n\t\t\t\tpatternCategories:\n\t\t\t\t\tgetSettings().__experimentalBlockPatternCategories,\n\t\t\t};\n\t\t},\n\t\t[ rootClientId ]\n\t);\n\tconst { createSuccessNotice } = useDispatch( noticesStore );\n\tconst onClickPattern = useCallback( ( pattern, blocks ) => {\n\t\tonInsert(\n\t\t\t( blocks ?? [] ).map( ( block ) => cloneBlock( block ) ),\n\t\t\tpattern.name\n\t\t);\n\t\tcreateSuccessNotice(\n\t\t\tsprintf(\n\t\t\t\t/* translators: %s: block pattern title. */\n\t\t\t\t__( 'Block pattern \"%s\" inserted.' ),\n\t\t\t\tpattern.title\n\t\t\t),\n\t\t\t{\n\t\t\t\ttype: 'snackbar',\n\t\t\t}\n\t\t);\n\t}, [] );\n\n\treturn [ patterns, patternCategories, onClickPattern ];\n};\n\nexport default usePatternsState;\n"]}
1
+ {"version":3,"sources":["@wordpress/block-editor/src/components/inserter/hooks/use-patterns-state.js"],"names":["useCallback","useMemo","cloneBlock","useDispatch","useSelect","__","sprintf","store","noticesStore","blockEditorStore","CUSTOM_CATEGORY","name","label","description","usePatternsState","onInsert","rootClientId","patternCategories","patterns","select","__experimentalGetAllowedPatterns","getSettings","__experimentalBlockPatternCategories","allCategories","createSuccessNotice","onClickPattern","pattern","blocks","map","block","title","type"],"mappings":"AAAA;AACA;AACA;AACA,SAASA,WAAT,EAAsBC,OAAtB,QAAqC,oBAArC;AACA,SAASC,UAAT,QAA2B,mBAA3B;AACA,SAASC,WAAT,EAAsBC,SAAtB,QAAuC,iBAAvC;AACA,SAASC,EAAT,EAAaC,OAAb,QAA4B,iBAA5B;AACA,SAASC,KAAK,IAAIC,YAAlB,QAAsC,oBAAtC;AAEA;AACA;AACA;;AACA,SAASD,KAAK,IAAIE,gBAAlB,QAA0C,gBAA1C;AAEA,MAAMC,eAAe,GAAG;AACvBC,EAAAA,IAAI,EAAE,QADiB;AAEvBC,EAAAA,KAAK,EAAEP,EAAE,CAAE,aAAF,CAFc;AAGvBQ,EAAAA,WAAW,EAAER,EAAE,CAAE,mCAAF;AAHQ,CAAxB;AAMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AACA,MAAMS,gBAAgB,GAAG,CAAEC,QAAF,EAAYC,YAAZ,KAA8B;AACtD,QAAM;AAAEC,IAAAA,iBAAF;AAAqBC,IAAAA;AAArB,MAAkCd,SAAS,CAC9Ce,MAAF,IAAc;AACb,UAAM;AAAEC,MAAAA,gCAAF;AAAoCC,MAAAA;AAApC,QACLF,MAAM,CAAEV,gBAAF,CADP;AAGA,WAAO;AACNS,MAAAA,QAAQ,EAAEE,gCAAgC,CAAEJ,YAAF,CADpC;AAENC,MAAAA,iBAAiB,EAChBI,WAAW,GAAGC;AAHT,KAAP;AAKA,GAV+C,EAWhD,CAAEN,YAAF,CAXgD,CAAjD;AAcA,QAAMO,aAAa,GAAGtB,OAAO,CAC5B,MAAM,CAAE,GAAGgB,iBAAL,EAAwBP,eAAxB,CADsB,EAE5B,CAAEO,iBAAF,CAF4B,CAA7B;AAKA,QAAM;AAAEO,IAAAA;AAAF,MAA0BrB,WAAW,CAAEK,YAAF,CAA3C;AACA,QAAMiB,cAAc,GAAGzB,WAAW,CACjC,CAAE0B,OAAF,EAAWC,MAAX,KAAuB;AACtBZ,IAAAA,QAAQ,CACP,CAAEY,MAAF,aAAEA,MAAF,cAAEA,MAAF,GAAY,EAAZ,EAAiBC,GAAjB,CAAwBC,KAAF,IAAa3B,UAAU,CAAE2B,KAAF,CAA7C,CADO,EAEPH,OAAO,CAACf,IAFD,CAAR;AAIAa,IAAAA,mBAAmB,CAClBlB,OAAO;AACN;AACAD,IAAAA,EAAE,CAAE,8BAAF,CAFI,EAGNqB,OAAO,CAACI,KAHF,CADW,EAMlB;AACCC,MAAAA,IAAI,EAAE;AADP,KANkB,CAAnB;AAUA,GAhBgC,EAiBjC,CAAEP,mBAAF,EAAuBT,QAAvB,CAjBiC,CAAlC;AAoBA,SAAO,CAAEG,QAAF,EAAYK,aAAZ,EAA2BE,cAA3B,CAAP;AACA,CA1CD;;AA4CA,eAAeX,gBAAf","sourcesContent":["/**\n * WordPress dependencies\n */\nimport { useCallback, useMemo } from '@wordpress/element';\nimport { cloneBlock } from '@wordpress/blocks';\nimport { useDispatch, useSelect } from '@wordpress/data';\nimport { __, sprintf } from '@wordpress/i18n';\nimport { store as noticesStore } from '@wordpress/notices';\n\n/**\n * Internal dependencies\n */\nimport { store as blockEditorStore } from '../../../store';\n\nconst CUSTOM_CATEGORY = {\n\tname: 'custom',\n\tlabel: __( 'My patterns' ),\n\tdescription: __( 'Custom patterns add by site users' ),\n};\n\n/**\n * Retrieves the block patterns inserter state.\n *\n * @param {Function} onInsert function called when inserter a list of blocks.\n * @param {string=} rootClientId Insertion's root client ID.\n *\n * @return {Array} Returns the patterns state. (patterns, categories, onSelect handler)\n */\nconst usePatternsState = ( onInsert, rootClientId ) => {\n\tconst { patternCategories, patterns } = useSelect(\n\t\t( select ) => {\n\t\t\tconst { __experimentalGetAllowedPatterns, getSettings } =\n\t\t\t\tselect( blockEditorStore );\n\n\t\t\treturn {\n\t\t\t\tpatterns: __experimentalGetAllowedPatterns( rootClientId ),\n\t\t\t\tpatternCategories:\n\t\t\t\t\tgetSettings().__experimentalBlockPatternCategories,\n\t\t\t};\n\t\t},\n\t\t[ rootClientId ]\n\t);\n\n\tconst allCategories = useMemo(\n\t\t() => [ ...patternCategories, CUSTOM_CATEGORY ],\n\t\t[ patternCategories ]\n\t);\n\n\tconst { createSuccessNotice } = useDispatch( noticesStore );\n\tconst onClickPattern = useCallback(\n\t\t( pattern, blocks ) => {\n\t\t\tonInsert(\n\t\t\t\t( blocks ?? [] ).map( ( block ) => cloneBlock( block ) ),\n\t\t\t\tpattern.name\n\t\t\t);\n\t\t\tcreateSuccessNotice(\n\t\t\t\tsprintf(\n\t\t\t\t\t/* translators: %s: block pattern title. */\n\t\t\t\t\t__( 'Block pattern \"%s\" inserted.' ),\n\t\t\t\t\tpattern.title\n\t\t\t\t),\n\t\t\t\t{\n\t\t\t\t\ttype: 'snackbar',\n\t\t\t\t}\n\t\t\t);\n\t\t},\n\t\t[ createSuccessNotice, onInsert ]\n\t);\n\n\treturn [ patterns, allCategories, onClickPattern ];\n};\n\nexport default usePatternsState;\n"]}
@@ -8,28 +8,9 @@ import { useSelect } from '@wordpress/data';
8
8
  */
9
9
 
10
10
  import { store as blockEditorStore } from '../../../store';
11
- /**
12
- * Interface for inserter media requests.
13
- *
14
- * @typedef {Object} InserterMediaRequest
15
- * @property {number} per_page How many items to fetch per page.
16
- * @property {string} search The search term to use for filtering the results.
17
- */
11
+ /** @typedef {import('./api').InserterMediaRequest} InserterMediaRequest */
18
12
 
19
- /**
20
- * Interface for inserter media responses. Any media resource should
21
- * map their response to this interface, in order to create the core
22
- * WordPress media blocks (image, video, audio).
23
- *
24
- * @typedef {Object} InserterMediaItem
25
- * @property {string} title The title of the media item.
26
- * @property {string} url The source url of the media item.
27
- * @property {string} [previewUrl] The preview source url of the media item to display in the media list.
28
- * @property {number} [id] The WordPress id of the media item.
29
- * @property {number|string} [sourceId] The id of the media item from external source.
30
- * @property {string} [alt] The alt text of the media item.
31
- * @property {string} [caption] The caption of the media item.
32
- */
13
+ /** @typedef {import('./api').InserterMediaItem} InserterMediaItem */
33
14
 
34
15
  /**
35
16
  * Fetches media items based on the provided category.
@@ -1 +1 @@
1
- {"version":3,"sources":["@wordpress/block-editor/src/components/inserter/media-tab/hooks.js"],"names":["useEffect","useState","useRef","useMemo","useSelect","store","blockEditorStore","useMediaResults","category","query","mediaList","setMediaList","isLoading","setIsLoading","lastRequest","key","JSON","stringify","name","current","_media","fetch","Object","values","useInserterMediaCategories","inserterMediaCategories","allowedMimeTypes","enableOpenverseMediaCategory","select","settings","getSettings","allowedCategories","filter","some","mimeType","startsWith","mediaType","useMediaCategories","rootClientId","categories","setCategories","canInsertImage","canInsertVideo","canInsertAudio","canInsertBlockType","_categories","categoriesHaveMedia","Map","Promise","all","map","isExternalResource","results","per_page","e","length","canInsertMediaType","image","video","audio","forEach","get","push"],"mappings":"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","sourcesContent":["/**\n * WordPress dependencies\n */\nimport { useEffect, useState, useRef, useMemo } from '@wordpress/element';\nimport { useSelect } from '@wordpress/data';\n\n/**\n * Internal dependencies\n */\nimport { store as blockEditorStore } from '../../../store';\n\n/**\n * Interface for inserter media requests.\n *\n * @typedef {Object} InserterMediaRequest\n * @property {number} per_page How many items to fetch per page.\n * @property {string} search The search term to use for filtering the results.\n */\n\n/**\n * Interface for inserter media responses. Any media resource should\n * map their response to this interface, in order to create the core\n * WordPress media blocks (image, video, audio).\n *\n * @typedef {Object} InserterMediaItem\n * @property {string} title The title of the media item.\n * @property {string} url The source url of the media item.\n * @property {string} [previewUrl] The preview source url of the media item to display in the media list.\n * @property {number} [id] The WordPress id of the media item.\n * @property {number|string} [sourceId] The id of the media item from external source.\n * @property {string} [alt] The alt text of the media item.\n * @property {string} [caption] The caption of the media item.\n */\n\n/**\n * Fetches media items based on the provided category.\n * Each media category is responsible for providing a `fetch` function.\n *\n * @param {Object} category The media category to fetch results for.\n * @param {InserterMediaRequest} query The query args to use for the request.\n * @return {InserterMediaItem[]} The media results.\n */\nexport function useMediaResults( category, query = {} ) {\n\tconst [ mediaList, setMediaList ] = useState();\n\tconst [ isLoading, setIsLoading ] = useState( false );\n\t// We need to keep track of the last request made because\n\t// multiple request can be fired without knowing the order\n\t// of resolution, and we need to ensure we are showing\n\t// the results of the last request.\n\t// In the future we could use AbortController to cancel previous\n\t// requests, but we don't for now as it involves adding support\n\t// for this to `core-data` package.\n\tconst lastRequest = useRef();\n\tuseEffect( () => {\n\t\t( async () => {\n\t\t\tconst key = JSON.stringify( {\n\t\t\t\tcategory: category.name,\n\t\t\t\t...query,\n\t\t\t} );\n\t\t\tlastRequest.current = key;\n\t\t\tsetIsLoading( true );\n\t\t\tsetMediaList( [] ); // Empty the previous results.\n\t\t\tconst _media = await category.fetch?.( query );\n\t\t\tif ( key === lastRequest.current ) {\n\t\t\t\tsetMediaList( _media );\n\t\t\t\tsetIsLoading( false );\n\t\t\t}\n\t\t} )();\n\t}, [ category.name, ...Object.values( query ) ] );\n\treturn { mediaList, isLoading };\n}\n\nfunction useInserterMediaCategories() {\n\tconst {\n\t\tinserterMediaCategories,\n\t\tallowedMimeTypes,\n\t\tenableOpenverseMediaCategory,\n\t} = useSelect( ( select ) => {\n\t\tconst settings = select( blockEditorStore ).getSettings();\n\t\treturn {\n\t\t\tinserterMediaCategories: settings.inserterMediaCategories,\n\t\t\tallowedMimeTypes: settings.allowedMimeTypes,\n\t\t\tenableOpenverseMediaCategory: settings.enableOpenverseMediaCategory,\n\t\t};\n\t}, [] );\n\t// The allowed `mime_types` can be altered by `upload_mimes` filter and restrict\n\t// some of them. In this case we shouldn't add the category to the available media\n\t// categories list in the inserter.\n\tconst allowedCategories = useMemo( () => {\n\t\tif ( ! inserterMediaCategories || ! allowedMimeTypes ) {\n\t\t\treturn;\n\t\t}\n\t\treturn inserterMediaCategories.filter( ( category ) => {\n\t\t\t// Check if Openverse category is enabled.\n\t\t\tif (\n\t\t\t\t! enableOpenverseMediaCategory &&\n\t\t\t\tcategory.name === 'openverse'\n\t\t\t) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn Object.values( allowedMimeTypes ).some( ( mimeType ) =>\n\t\t\t\tmimeType.startsWith( `${ category.mediaType }/` )\n\t\t\t);\n\t\t} );\n\t}, [\n\t\tinserterMediaCategories,\n\t\tallowedMimeTypes,\n\t\tenableOpenverseMediaCategory,\n\t] );\n\treturn allowedCategories;\n}\n\nexport function useMediaCategories( rootClientId ) {\n\tconst [ categories, setCategories ] = useState( [] );\n\tconst { canInsertImage, canInsertVideo, canInsertAudio } = useSelect(\n\t\t( select ) => {\n\t\t\tconst { canInsertBlockType } = select( blockEditorStore );\n\t\t\treturn {\n\t\t\t\tcanInsertImage: canInsertBlockType(\n\t\t\t\t\t'core/image',\n\t\t\t\t\trootClientId\n\t\t\t\t),\n\t\t\t\tcanInsertVideo: canInsertBlockType(\n\t\t\t\t\t'core/video',\n\t\t\t\t\trootClientId\n\t\t\t\t),\n\t\t\t\tcanInsertAudio: canInsertBlockType(\n\t\t\t\t\t'core/audio',\n\t\t\t\t\trootClientId\n\t\t\t\t),\n\t\t\t};\n\t\t},\n\t\t[ rootClientId ]\n\t);\n\tconst inserterMediaCategories = useInserterMediaCategories();\n\tuseEffect( () => {\n\t\t( async () => {\n\t\t\tconst _categories = [];\n\t\t\t// If `inserterMediaCategories` is not defined in\n\t\t\t// block editor settings, do not show any media categories.\n\t\t\tif ( ! inserterMediaCategories ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// Loop through categories to check if they have at least one media item.\n\t\t\tconst categoriesHaveMedia = new Map(\n\t\t\t\tawait Promise.all(\n\t\t\t\t\tinserterMediaCategories.map( async ( category ) => {\n\t\t\t\t\t\t// Some sources are external and we don't need to make a request.\n\t\t\t\t\t\tif ( category.isExternalResource ) {\n\t\t\t\t\t\t\treturn [ category.name, true ];\n\t\t\t\t\t\t}\n\t\t\t\t\t\tlet results = [];\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tresults = await category.fetch( {\n\t\t\t\t\t\t\t\tper_page: 1,\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t\t// If the request fails, we shallow the error and just don't show\n\t\t\t\t\t\t\t// the category, in order to not break the media tab.\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn [ category.name, !! results.length ];\n\t\t\t\t\t} )\n\t\t\t\t)\n\t\t\t);\n\t\t\t// We need to filter out categories that don't have any media items or\n\t\t\t// whose corresponding block type is not allowed to be inserted, based\n\t\t\t// on the category's `mediaType`.\n\t\t\tconst canInsertMediaType = {\n\t\t\t\timage: canInsertImage,\n\t\t\t\tvideo: canInsertVideo,\n\t\t\t\taudio: canInsertAudio,\n\t\t\t};\n\t\t\tinserterMediaCategories.forEach( ( category ) => {\n\t\t\t\tif (\n\t\t\t\t\tcanInsertMediaType[ category.mediaType ] &&\n\t\t\t\t\tcategoriesHaveMedia.get( category.name )\n\t\t\t\t) {\n\t\t\t\t\t_categories.push( category );\n\t\t\t\t}\n\t\t\t} );\n\t\t\tif ( !! _categories.length ) {\n\t\t\t\tsetCategories( _categories );\n\t\t\t}\n\t\t} )();\n\t}, [\n\t\tcanInsertImage,\n\t\tcanInsertVideo,\n\t\tcanInsertAudio,\n\t\tinserterMediaCategories,\n\t] );\n\treturn categories;\n}\n"]}
1
+ {"version":3,"sources":["@wordpress/block-editor/src/components/inserter/media-tab/hooks.js"],"names":["useEffect","useState","useRef","useMemo","useSelect","store","blockEditorStore","useMediaResults","category","query","mediaList","setMediaList","isLoading","setIsLoading","lastRequest","key","JSON","stringify","name","current","_media","fetch","Object","values","useInserterMediaCategories","inserterMediaCategories","allowedMimeTypes","enableOpenverseMediaCategory","select","settings","getSettings","allowedCategories","filter","some","mimeType","startsWith","mediaType","useMediaCategories","rootClientId","categories","setCategories","canInsertImage","canInsertVideo","canInsertAudio","canInsertBlockType","_categories","categoriesHaveMedia","Map","Promise","all","map","isExternalResource","results","per_page","e","length","canInsertMediaType","image","video","audio","forEach","get","push"],"mappings":"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","sourcesContent":["/**\n * WordPress dependencies\n */\nimport { useEffect, useState, useRef, useMemo } from '@wordpress/element';\nimport { useSelect } from '@wordpress/data';\n\n/**\n * Internal dependencies\n */\nimport { store as blockEditorStore } from '../../../store';\n\n/** @typedef {import('./api').InserterMediaRequest} InserterMediaRequest */\n/** @typedef {import('./api').InserterMediaItem} InserterMediaItem */\n\n/**\n * Fetches media items based on the provided category.\n * Each media category is responsible for providing a `fetch` function.\n *\n * @param {Object} category The media category to fetch results for.\n * @param {InserterMediaRequest} query The query args to use for the request.\n * @return {InserterMediaItem[]} The media results.\n */\nexport function useMediaResults( category, query = {} ) {\n\tconst [ mediaList, setMediaList ] = useState();\n\tconst [ isLoading, setIsLoading ] = useState( false );\n\t// We need to keep track of the last request made because\n\t// multiple request can be fired without knowing the order\n\t// of resolution, and we need to ensure we are showing\n\t// the results of the last request.\n\t// In the future we could use AbortController to cancel previous\n\t// requests, but we don't for now as it involves adding support\n\t// for this to `core-data` package.\n\tconst lastRequest = useRef();\n\tuseEffect( () => {\n\t\t( async () => {\n\t\t\tconst key = JSON.stringify( {\n\t\t\t\tcategory: category.name,\n\t\t\t\t...query,\n\t\t\t} );\n\t\t\tlastRequest.current = key;\n\t\t\tsetIsLoading( true );\n\t\t\tsetMediaList( [] ); // Empty the previous results.\n\t\t\tconst _media = await category.fetch?.( query );\n\t\t\tif ( key === lastRequest.current ) {\n\t\t\t\tsetMediaList( _media );\n\t\t\t\tsetIsLoading( false );\n\t\t\t}\n\t\t} )();\n\t}, [ category.name, ...Object.values( query ) ] );\n\treturn { mediaList, isLoading };\n}\n\nfunction useInserterMediaCategories() {\n\tconst {\n\t\tinserterMediaCategories,\n\t\tallowedMimeTypes,\n\t\tenableOpenverseMediaCategory,\n\t} = useSelect( ( select ) => {\n\t\tconst settings = select( blockEditorStore ).getSettings();\n\t\treturn {\n\t\t\tinserterMediaCategories: settings.inserterMediaCategories,\n\t\t\tallowedMimeTypes: settings.allowedMimeTypes,\n\t\t\tenableOpenverseMediaCategory: settings.enableOpenverseMediaCategory,\n\t\t};\n\t}, [] );\n\t// The allowed `mime_types` can be altered by `upload_mimes` filter and restrict\n\t// some of them. In this case we shouldn't add the category to the available media\n\t// categories list in the inserter.\n\tconst allowedCategories = useMemo( () => {\n\t\tif ( ! inserterMediaCategories || ! allowedMimeTypes ) {\n\t\t\treturn;\n\t\t}\n\t\treturn inserterMediaCategories.filter( ( category ) => {\n\t\t\t// Check if Openverse category is enabled.\n\t\t\tif (\n\t\t\t\t! enableOpenverseMediaCategory &&\n\t\t\t\tcategory.name === 'openverse'\n\t\t\t) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn Object.values( allowedMimeTypes ).some( ( mimeType ) =>\n\t\t\t\tmimeType.startsWith( `${ category.mediaType }/` )\n\t\t\t);\n\t\t} );\n\t}, [\n\t\tinserterMediaCategories,\n\t\tallowedMimeTypes,\n\t\tenableOpenverseMediaCategory,\n\t] );\n\treturn allowedCategories;\n}\n\nexport function useMediaCategories( rootClientId ) {\n\tconst [ categories, setCategories ] = useState( [] );\n\tconst { canInsertImage, canInsertVideo, canInsertAudio } = useSelect(\n\t\t( select ) => {\n\t\t\tconst { canInsertBlockType } = select( blockEditorStore );\n\t\t\treturn {\n\t\t\t\tcanInsertImage: canInsertBlockType(\n\t\t\t\t\t'core/image',\n\t\t\t\t\trootClientId\n\t\t\t\t),\n\t\t\t\tcanInsertVideo: canInsertBlockType(\n\t\t\t\t\t'core/video',\n\t\t\t\t\trootClientId\n\t\t\t\t),\n\t\t\t\tcanInsertAudio: canInsertBlockType(\n\t\t\t\t\t'core/audio',\n\t\t\t\t\trootClientId\n\t\t\t\t),\n\t\t\t};\n\t\t},\n\t\t[ rootClientId ]\n\t);\n\tconst inserterMediaCategories = useInserterMediaCategories();\n\tuseEffect( () => {\n\t\t( async () => {\n\t\t\tconst _categories = [];\n\t\t\t// If `inserterMediaCategories` is not defined in\n\t\t\t// block editor settings, do not show any media categories.\n\t\t\tif ( ! inserterMediaCategories ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// Loop through categories to check if they have at least one media item.\n\t\t\tconst categoriesHaveMedia = new Map(\n\t\t\t\tawait Promise.all(\n\t\t\t\t\tinserterMediaCategories.map( async ( category ) => {\n\t\t\t\t\t\t// Some sources are external and we don't need to make a request.\n\t\t\t\t\t\tif ( category.isExternalResource ) {\n\t\t\t\t\t\t\treturn [ category.name, true ];\n\t\t\t\t\t\t}\n\t\t\t\t\t\tlet results = [];\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tresults = await category.fetch( {\n\t\t\t\t\t\t\t\tper_page: 1,\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t\t// If the request fails, we shallow the error and just don't show\n\t\t\t\t\t\t\t// the category, in order to not break the media tab.\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn [ category.name, !! results.length ];\n\t\t\t\t\t} )\n\t\t\t\t)\n\t\t\t);\n\t\t\t// We need to filter out categories that don't have any media items or\n\t\t\t// whose corresponding block type is not allowed to be inserted, based\n\t\t\t// on the category's `mediaType`.\n\t\t\tconst canInsertMediaType = {\n\t\t\t\timage: canInsertImage,\n\t\t\t\tvideo: canInsertVideo,\n\t\t\t\taudio: canInsertAudio,\n\t\t\t};\n\t\t\tinserterMediaCategories.forEach( ( category ) => {\n\t\t\t\tif (\n\t\t\t\t\tcanInsertMediaType[ category.mediaType ] &&\n\t\t\t\t\tcategoriesHaveMedia.get( category.name )\n\t\t\t\t) {\n\t\t\t\t\t_categories.push( category );\n\t\t\t\t}\n\t\t\t} );\n\t\t\tif ( !! _categories.length ) {\n\t\t\t\tsetCategories( _categories );\n\t\t\t}\n\t\t} )();\n\t}, [\n\t\tcanInsertImage,\n\t\tcanInsertVideo,\n\t\tcanInsertAudio,\n\t\tinserterMediaCategories,\n\t] );\n\treturn categories;\n}\n"]}
@@ -0,0 +1,48 @@
1
+ import { createElement } from "@wordpress/element";
2
+
3
+ /**
4
+ * WordPress dependencies
5
+ */
6
+ import { Button } from '@wordpress/components';
7
+ import { useDispatch, useSelect } from '@wordpress/data';
8
+ import { focus } from '@wordpress/dom';
9
+ import { useRef } from '@wordpress/element';
10
+ import { __ } from '@wordpress/i18n';
11
+ import { close } from '@wordpress/icons';
12
+ import { store as preferencesStore } from '@wordpress/preferences';
13
+ const PREFERENCE_NAME = 'isResuableBlocksrRenameHintVisible';
14
+ export default function ReusableBlocksRenameHint() {
15
+ const isReusableBlocksRenameHint = useSelect(select => {
16
+ var _select$get;
17
+
18
+ return (_select$get = select(preferencesStore).get('core', PREFERENCE_NAME)) !== null && _select$get !== void 0 ? _select$get : true;
19
+ }, []);
20
+ const ref = useRef();
21
+ const {
22
+ set: setPreference
23
+ } = useDispatch(preferencesStore);
24
+
25
+ if (!isReusableBlocksRenameHint) {
26
+ return null;
27
+ }
28
+
29
+ return createElement("div", {
30
+ ref: ref,
31
+ className: "reusable-blocks-menu-items__rename-hint"
32
+ }, createElement("div", {
33
+ className: "reusable-blocks-menu-items__rename-hint-content"
34
+ }, __('Reusable blocks are now called patterns. A synced pattern will behave in exactly the same way as a reusable block.')), createElement(Button, {
35
+ className: "reusable-blocks-menu-items__rename-hint-dismiss",
36
+ icon: close,
37
+ iconSize: "16",
38
+ label: __('Dismiss hint'),
39
+ onClick: () => {
40
+ // Retain focus when dismissing the element.
41
+ const previousElement = focus.tabbable.findPrevious(ref.current);
42
+ previousElement?.focus();
43
+ setPreference('core', PREFERENCE_NAME, false);
44
+ },
45
+ showTooltip: false
46
+ }));
47
+ }
48
+ //# sourceMappingURL=reusable-block-rename-hint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["@wordpress/block-editor/src/components/inserter/reusable-block-rename-hint.js"],"names":["Button","useDispatch","useSelect","focus","useRef","__","close","store","preferencesStore","PREFERENCE_NAME","ReusableBlocksRenameHint","isReusableBlocksRenameHint","select","get","ref","set","setPreference","previousElement","tabbable","findPrevious","current"],"mappings":";;AAAA;AACA;AACA;AACA,SAASA,MAAT,QAAuB,uBAAvB;AACA,SAASC,WAAT,EAAsBC,SAAtB,QAAuC,iBAAvC;AACA,SAASC,KAAT,QAAsB,gBAAtB;AACA,SAASC,MAAT,QAAuB,oBAAvB;AACA,SAASC,EAAT,QAAmB,iBAAnB;AACA,SAASC,KAAT,QAAsB,kBAAtB;AACA,SAASC,KAAK,IAAIC,gBAAlB,QAA0C,wBAA1C;AAEA,MAAMC,eAAe,GAAG,oCAAxB;AAEA,eAAe,SAASC,wBAAT,GAAoC;AAClD,QAAMC,0BAA0B,GAAGT,SAAS,CACzCU,MAAF;AAAA;;AAAA,0BACCA,MAAM,CAAEJ,gBAAF,CAAN,CAA2BK,GAA3B,CAAgC,MAAhC,EAAwCJ,eAAxC,CADD,qDAC8D,IAD9D;AAAA,GAD2C,EAG3C,EAH2C,CAA5C;AAMA,QAAMK,GAAG,GAAGV,MAAM,EAAlB;AAEA,QAAM;AAAEW,IAAAA,GAAG,EAAEC;AAAP,MAAyBf,WAAW,CAAEO,gBAAF,CAA1C;;AACA,MAAK,CAAEG,0BAAP,EAAoC;AACnC,WAAO,IAAP;AACA;;AAED,SACC;AAAK,IAAA,GAAG,EAAGG,GAAX;AAAiB,IAAA,SAAS,EAAC;AAA3B,KACC;AAAK,IAAA,SAAS,EAAC;AAAf,KACGT,EAAE,CACH,oHADG,CADL,CADD,EAMC,cAAC,MAAD;AACC,IAAA,SAAS,EAAC,iDADX;AAEC,IAAA,IAAI,EAAGC,KAFR;AAGC,IAAA,QAAQ,EAAC,IAHV;AAIC,IAAA,KAAK,EAAGD,EAAE,CAAE,cAAF,CAJX;AAKC,IAAA,OAAO,EAAG,MAAM;AACf;AACA,YAAMY,eAAe,GAAGd,KAAK,CAACe,QAAN,CAAeC,YAAf,CACvBL,GAAG,CAACM,OADmB,CAAxB;AAGAH,MAAAA,eAAe,EAAEd,KAAjB;AACAa,MAAAA,aAAa,CAAE,MAAF,EAAUP,eAAV,EAA2B,KAA3B,CAAb;AACA,KAZF;AAaC,IAAA,WAAW,EAAG;AAbf,IAND,CADD;AAwBA","sourcesContent":["/**\n * WordPress dependencies\n */\nimport { Button } from '@wordpress/components';\nimport { useDispatch, useSelect } from '@wordpress/data';\nimport { focus } from '@wordpress/dom';\nimport { useRef } from '@wordpress/element';\nimport { __ } from '@wordpress/i18n';\nimport { close } from '@wordpress/icons';\nimport { store as preferencesStore } from '@wordpress/preferences';\n\nconst PREFERENCE_NAME = 'isResuableBlocksrRenameHintVisible';\n\nexport default function ReusableBlocksRenameHint() {\n\tconst isReusableBlocksRenameHint = useSelect(\n\t\t( select ) =>\n\t\t\tselect( preferencesStore ).get( 'core', PREFERENCE_NAME ) ?? true,\n\t\t[]\n\t);\n\n\tconst ref = useRef();\n\n\tconst { set: setPreference } = useDispatch( preferencesStore );\n\tif ( ! isReusableBlocksRenameHint ) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<div ref={ ref } className=\"reusable-blocks-menu-items__rename-hint\">\n\t\t\t<div className=\"reusable-blocks-menu-items__rename-hint-content\">\n\t\t\t\t{ __(\n\t\t\t\t\t'Reusable blocks are now called patterns. A synced pattern will behave in exactly the same way as a reusable block.'\n\t\t\t\t) }\n\t\t\t</div>\n\t\t\t<Button\n\t\t\t\tclassName=\"reusable-blocks-menu-items__rename-hint-dismiss\"\n\t\t\t\ticon={ close }\n\t\t\t\ticonSize=\"16\"\n\t\t\t\tlabel={ __( 'Dismiss hint' ) }\n\t\t\t\tonClick={ () => {\n\t\t\t\t\t// Retain focus when dismissing the element.\n\t\t\t\t\tconst previousElement = focus.tabbable.findPrevious(\n\t\t\t\t\t\tref.current\n\t\t\t\t\t);\n\t\t\t\t\tpreviousElement?.focus();\n\t\t\t\t\tsetPreference( 'core', PREFERENCE_NAME, false );\n\t\t\t\t} }\n\t\t\t\tshowTooltip={ false }\n\t\t\t/>\n\t\t</div>\n\t);\n}\n"]}
@@ -15,6 +15,7 @@ import BlockTypesList from '../block-types-list';
15
15
  import InserterPanel from './panel';
16
16
  import InserterNoResults from './no-results';
17
17
  import useBlockTypesState from './hooks/use-block-types-state';
18
+ import ReusableBlocksRenameHint from './reusable-block-rename-hint';
18
19
 
19
20
  function ReusableBlocksList({
20
21
  onHover,
@@ -59,7 +60,9 @@ export function ReusableBlocksTab({
59
60
  onInsert,
60
61
  onHover
61
62
  }) {
62
- return createElement(Fragment, null, createElement(ReusableBlocksList, {
63
+ return createElement(Fragment, null, createElement("div", {
64
+ className: "block-editor-inserter__hint"
65
+ }, createElement(ReusableBlocksRenameHint, null)), createElement(ReusableBlocksList, {
63
66
  onHover: onHover,
64
67
  onInsert: onInsert,
65
68
  rootClientId: rootClientId
@@ -71,7 +74,7 @@ export function ReusableBlocksTab({
71
74
  href: addQueryArgs('edit.php', {
72
75
  post_type: 'wp_block'
73
76
  })
74
- }, __('Manage custom patterns'))));
77
+ }, __('Manage my patterns'))));
75
78
  }
76
79
  export default ReusableBlocksTab;
77
80
  //# sourceMappingURL=reusable-blocks-tab.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["@wordpress/block-editor/src/components/inserter/reusable-blocks-tab.js"],"names":["useMemo","__","addQueryArgs","Button","BlockTypesList","InserterPanel","InserterNoResults","useBlockTypesState","ReusableBlocksList","onHover","onInsert","rootClientId","items","onSelectItem","filteredItems","filter","category","length","ReusableBlocksTab","post_type"],"mappings":";;AAAA;AACA;AACA;AACA,SAASA,OAAT,QAAwB,oBAAxB;AACA,SAASC,EAAT,QAAmB,iBAAnB;AACA,SAASC,YAAT,QAA6B,gBAA7B;AACA,SAASC,MAAT,QAAuB,uBAAvB;AAEA;AACA;AACA;;AACA,OAAOC,cAAP,MAA2B,qBAA3B;AACA,OAAOC,aAAP,MAA0B,SAA1B;AACA,OAAOC,iBAAP,MAA8B,cAA9B;AACA,OAAOC,kBAAP,MAA+B,+BAA/B;;AAEA,SAASC,kBAAT,CAA6B;AAAEC,EAAAA,OAAF;AAAWC,EAAAA,QAAX;AAAqBC,EAAAA;AAArB,CAA7B,EAAmE;AAClE,QAAM,CAAEC,KAAF,IAAaC,YAAb,IAA8BN,kBAAkB,CACrDI,YADqD,EAErDD,QAFqD,CAAtD;AAKA,QAAMI,aAAa,GAAGd,OAAO,CAAE,MAAM;AACpC,WAAOY,KAAK,CAACG,MAAN,CAAc,CAAE;AAAEC,MAAAA;AAAF,KAAF,KAAoBA,QAAQ,KAAK,UAA/C,CAAP;AACA,GAF4B,EAE1B,CAAEJ,KAAF,CAF0B,CAA7B;;AAIA,MAAKE,aAAa,CAACG,MAAd,KAAyB,CAA9B,EAAkC;AACjC,WAAO,cAAC,iBAAD,OAAP;AACA;;AAED,SACC,cAAC,aAAD;AAAe,IAAA,KAAK,EAAGhB,EAAE,CAAE,iBAAF;AAAzB,KACC,cAAC,cAAD;AACC,IAAA,KAAK,EAAGa,aADT;AAEC,IAAA,QAAQ,EAAGD,YAFZ;AAGC,IAAA,OAAO,EAAGJ,OAHX;AAIC,IAAA,KAAK,EAAGR,EAAE,CAAE,iBAAF;AAJX,IADD,CADD;AAUA,C,CAED;;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AACA,OAAO,SAASiB,iBAAT,CAA4B;AAAEP,EAAAA,YAAF;AAAgBD,EAAAA,QAAhB;AAA0BD,EAAAA;AAA1B,CAA5B,EAAkE;AACxE,SACC,8BACC,cAAC,kBAAD;AACC,IAAA,OAAO,EAAGA,OADX;AAEC,IAAA,QAAQ,EAAGC,QAFZ;AAGC,IAAA,YAAY,EAAGC;AAHhB,IADD,EAMC;AAAK,IAAA,SAAS,EAAC;AAAf,KACC,cAAC,MAAD;AACC,IAAA,SAAS,EAAC,+CADX;AAEC,IAAA,OAAO,EAAC,WAFT;AAGC,IAAA,IAAI,EAAGT,YAAY,CAAE,UAAF,EAAc;AAChCiB,MAAAA,SAAS,EAAE;AADqB,KAAd;AAHpB,KAOGlB,EAAE,CAAE,wBAAF,CAPL,CADD,CAND,CADD;AAoBA;AAED,eAAeiB,iBAAf","sourcesContent":["/**\n * WordPress dependencies\n */\nimport { useMemo } from '@wordpress/element';\nimport { __ } from '@wordpress/i18n';\nimport { addQueryArgs } from '@wordpress/url';\nimport { Button } from '@wordpress/components';\n\n/**\n * Internal dependencies\n */\nimport BlockTypesList from '../block-types-list';\nimport InserterPanel from './panel';\nimport InserterNoResults from './no-results';\nimport useBlockTypesState from './hooks/use-block-types-state';\n\nfunction ReusableBlocksList( { onHover, onInsert, rootClientId } ) {\n\tconst [ items, , , onSelectItem ] = useBlockTypesState(\n\t\trootClientId,\n\t\tonInsert\n\t);\n\n\tconst filteredItems = useMemo( () => {\n\t\treturn items.filter( ( { category } ) => category === 'reusable' );\n\t}, [ items ] );\n\n\tif ( filteredItems.length === 0 ) {\n\t\treturn <InserterNoResults />;\n\t}\n\n\treturn (\n\t\t<InserterPanel title={ __( 'Synced patterns' ) }>\n\t\t\t<BlockTypesList\n\t\t\t\titems={ filteredItems }\n\t\t\t\tonSelect={ onSelectItem }\n\t\t\t\tonHover={ onHover }\n\t\t\t\tlabel={ __( 'Synced patterns' ) }\n\t\t\t/>\n\t\t</InserterPanel>\n\t);\n}\n\n// The unwrapped component is only exported for use by unit tests.\n/**\n * List of reusable blocks shown in the \"Reusable\" tab of the inserter.\n *\n * @param {Object} props Component props.\n * @param {?string} props.rootClientId Client id of block to insert into.\n * @param {Function} props.onInsert Callback to run when item is inserted.\n * @param {Function} props.onHover Callback to run when item is hovered.\n *\n * @return {WPComponent} The component.\n */\nexport function ReusableBlocksTab( { rootClientId, onInsert, onHover } ) {\n\treturn (\n\t\t<>\n\t\t\t<ReusableBlocksList\n\t\t\t\tonHover={ onHover }\n\t\t\t\tonInsert={ onInsert }\n\t\t\t\trootClientId={ rootClientId }\n\t\t\t/>\n\t\t\t<div className=\"block-editor-inserter__manage-reusable-blocks-container\">\n\t\t\t\t<Button\n\t\t\t\t\tclassName=\"block-editor-inserter__manage-reusable-blocks\"\n\t\t\t\t\tvariant=\"secondary\"\n\t\t\t\t\thref={ addQueryArgs( 'edit.php', {\n\t\t\t\t\t\tpost_type: 'wp_block',\n\t\t\t\t\t} ) }\n\t\t\t\t>\n\t\t\t\t\t{ __( 'Manage custom patterns' ) }\n\t\t\t\t</Button>\n\t\t\t</div>\n\t\t</>\n\t);\n}\n\nexport default ReusableBlocksTab;\n"]}
1
+ {"version":3,"sources":["@wordpress/block-editor/src/components/inserter/reusable-blocks-tab.js"],"names":["useMemo","__","addQueryArgs","Button","BlockTypesList","InserterPanel","InserterNoResults","useBlockTypesState","ReusableBlocksRenameHint","ReusableBlocksList","onHover","onInsert","rootClientId","items","onSelectItem","filteredItems","filter","category","length","ReusableBlocksTab","post_type"],"mappings":";;AAAA;AACA;AACA;AACA,SAASA,OAAT,QAAwB,oBAAxB;AACA,SAASC,EAAT,QAAmB,iBAAnB;AACA,SAASC,YAAT,QAA6B,gBAA7B;AACA,SAASC,MAAT,QAAuB,uBAAvB;AAEA;AACA;AACA;;AACA,OAAOC,cAAP,MAA2B,qBAA3B;AACA,OAAOC,aAAP,MAA0B,SAA1B;AACA,OAAOC,iBAAP,MAA8B,cAA9B;AACA,OAAOC,kBAAP,MAA+B,+BAA/B;AACA,OAAOC,wBAAP,MAAqC,8BAArC;;AAEA,SAASC,kBAAT,CAA6B;AAAEC,EAAAA,OAAF;AAAWC,EAAAA,QAAX;AAAqBC,EAAAA;AAArB,CAA7B,EAAmE;AAClE,QAAM,CAAEC,KAAF,IAAaC,YAAb,IAA8BP,kBAAkB,CACrDK,YADqD,EAErDD,QAFqD,CAAtD;AAKA,QAAMI,aAAa,GAAGf,OAAO,CAAE,MAAM;AACpC,WAAOa,KAAK,CAACG,MAAN,CAAc,CAAE;AAAEC,MAAAA;AAAF,KAAF,KAAoBA,QAAQ,KAAK,UAA/C,CAAP;AACA,GAF4B,EAE1B,CAAEJ,KAAF,CAF0B,CAA7B;;AAIA,MAAKE,aAAa,CAACG,MAAd,KAAyB,CAA9B,EAAkC;AACjC,WAAO,cAAC,iBAAD,OAAP;AACA;;AAED,SACC,cAAC,aAAD;AAAe,IAAA,KAAK,EAAGjB,EAAE,CAAE,iBAAF;AAAzB,KACC,cAAC,cAAD;AACC,IAAA,KAAK,EAAGc,aADT;AAEC,IAAA,QAAQ,EAAGD,YAFZ;AAGC,IAAA,OAAO,EAAGJ,OAHX;AAIC,IAAA,KAAK,EAAGT,EAAE,CAAE,iBAAF;AAJX,IADD,CADD;AAUA,C,CAED;;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AACA,OAAO,SAASkB,iBAAT,CAA4B;AAAEP,EAAAA,YAAF;AAAgBD,EAAAA,QAAhB;AAA0BD,EAAAA;AAA1B,CAA5B,EAAkE;AACxE,SACC,8BACC;AAAK,IAAA,SAAS,EAAC;AAAf,KACC,cAAC,wBAAD,OADD,CADD,EAIC,cAAC,kBAAD;AACC,IAAA,OAAO,EAAGA,OADX;AAEC,IAAA,QAAQ,EAAGC,QAFZ;AAGC,IAAA,YAAY,EAAGC;AAHhB,IAJD,EASC;AAAK,IAAA,SAAS,EAAC;AAAf,KACC,cAAC,MAAD;AACC,IAAA,SAAS,EAAC,+CADX;AAEC,IAAA,OAAO,EAAC,WAFT;AAGC,IAAA,IAAI,EAAGV,YAAY,CAAE,UAAF,EAAc;AAChCkB,MAAAA,SAAS,EAAE;AADqB,KAAd;AAHpB,KAOGnB,EAAE,CAAE,oBAAF,CAPL,CADD,CATD,CADD;AAuBA;AAED,eAAekB,iBAAf","sourcesContent":["/**\n * WordPress dependencies\n */\nimport { useMemo } from '@wordpress/element';\nimport { __ } from '@wordpress/i18n';\nimport { addQueryArgs } from '@wordpress/url';\nimport { Button } from '@wordpress/components';\n\n/**\n * Internal dependencies\n */\nimport BlockTypesList from '../block-types-list';\nimport InserterPanel from './panel';\nimport InserterNoResults from './no-results';\nimport useBlockTypesState from './hooks/use-block-types-state';\nimport ReusableBlocksRenameHint from './reusable-block-rename-hint';\n\nfunction ReusableBlocksList( { onHover, onInsert, rootClientId } ) {\n\tconst [ items, , , onSelectItem ] = useBlockTypesState(\n\t\trootClientId,\n\t\tonInsert\n\t);\n\n\tconst filteredItems = useMemo( () => {\n\t\treturn items.filter( ( { category } ) => category === 'reusable' );\n\t}, [ items ] );\n\n\tif ( filteredItems.length === 0 ) {\n\t\treturn <InserterNoResults />;\n\t}\n\n\treturn (\n\t\t<InserterPanel title={ __( 'Synced patterns' ) }>\n\t\t\t<BlockTypesList\n\t\t\t\titems={ filteredItems }\n\t\t\t\tonSelect={ onSelectItem }\n\t\t\t\tonHover={ onHover }\n\t\t\t\tlabel={ __( 'Synced patterns' ) }\n\t\t\t/>\n\t\t</InserterPanel>\n\t);\n}\n\n// The unwrapped component is only exported for use by unit tests.\n/**\n * List of reusable blocks shown in the \"Reusable\" tab of the inserter.\n *\n * @param {Object} props Component props.\n * @param {?string} props.rootClientId Client id of block to insert into.\n * @param {Function} props.onInsert Callback to run when item is inserted.\n * @param {Function} props.onHover Callback to run when item is hovered.\n *\n * @return {WPComponent} The component.\n */\nexport function ReusableBlocksTab( { rootClientId, onInsert, onHover } ) {\n\treturn (\n\t\t<>\n\t\t\t<div className=\"block-editor-inserter__hint\">\n\t\t\t\t<ReusableBlocksRenameHint />\n\t\t\t</div>\n\t\t\t<ReusableBlocksList\n\t\t\t\tonHover={ onHover }\n\t\t\t\tonInsert={ onInsert }\n\t\t\t\trootClientId={ rootClientId }\n\t\t\t/>\n\t\t\t<div className=\"block-editor-inserter__manage-reusable-blocks-container\">\n\t\t\t\t<Button\n\t\t\t\t\tclassName=\"block-editor-inserter__manage-reusable-blocks\"\n\t\t\t\t\tvariant=\"secondary\"\n\t\t\t\t\thref={ addQueryArgs( 'edit.php', {\n\t\t\t\t\t\tpost_type: 'wp_block',\n\t\t\t\t\t} ) }\n\t\t\t\t>\n\t\t\t\t\t{ __( 'Manage my patterns' ) }\n\t\t\t\t</Button>\n\t\t\t</div>\n\t\t</>\n\t);\n}\n\nexport default ReusableBlocksTab;\n"]}
@@ -36,11 +36,11 @@ function ReusableBlocksTab({
36
36
  items
37
37
  })];
38
38
  return createElement(BlockTypesList, {
39
- name: "ReusableBlocks",
39
+ name: "SyncedPatterns",
40
40
  sections: sections,
41
41
  onSelect: onSelect,
42
42
  listProps: listProps,
43
- label: __('Reusable blocks')
43
+ label: __('Synced patterns')
44
44
  });
45
45
  }
46
46
 
@@ -1 +1 @@
1
- {"version":3,"sources":["@wordpress/block-editor/src/components/inserter/reusable-blocks-tab.native.js"],"names":["useSelect","__","BlockTypesList","store","blockEditorStore","createInserterSection","filterInserterItems","ReusableBlocksTab","onSelect","rootClientId","listProps","items","select","getInserterItems","allItems","onlyReusable","sections","key"],"mappings":";;AAAA;AACA;AACA;AACA,SAASA,SAAT,QAA0B,iBAA1B;AACA,SAASC,EAAT,QAAmB,iBAAnB;AAEA;AACA;AACA;;AACA,OAAOC,cAAP,MAA2B,qBAA3B;AACA,SAASC,KAAK,IAAIC,gBAAlB,QAA0C,aAA1C;AACA,SAASC,qBAAT,EAAgCC,mBAAhC,QAA2D,SAA3D;;AAEA,SAASC,iBAAT,CAA4B;AAAEC,EAAAA,QAAF;AAAYC,EAAAA,YAAZ;AAA0BC,EAAAA;AAA1B,CAA5B,EAAoE;AACnE,QAAM;AAAEC,IAAAA;AAAF,MAAYX,SAAS,CACxBY,MAAF,IAAc;AACb,UAAM;AAAEC,MAAAA;AAAF,QAAuBD,MAAM,CAAER,gBAAF,CAAnC;AACA,UAAMU,QAAQ,GAAGD,gBAAgB,CAAEJ,YAAF,CAAjC;AAEA,WAAO;AACNE,MAAAA,KAAK,EAAEL,mBAAmB,CAAEQ,QAAF,EAAY;AAAEC,QAAAA,YAAY,EAAE;AAAhB,OAAZ;AADpB,KAAP;AAGA,GARyB,EAS1B,CAAEN,YAAF,CAT0B,CAA3B;AAYA,QAAMO,QAAQ,GAAG,CAAEX,qBAAqB,CAAE;AAAEY,IAAAA,GAAG,EAAE,WAAP;AAAoBN,IAAAA;AAApB,GAAF,CAAvB,CAAjB;AAEA,SACC,cAAC,cAAD;AACC,IAAA,IAAI,EAAC,gBADN;AAEC,IAAA,QAAQ,EAAGK,QAFZ;AAGC,IAAA,QAAQ,EAAGR,QAHZ;AAIC,IAAA,SAAS,EAAGE,SAJb;AAKC,IAAA,KAAK,EAAGT,EAAE,CAAE,iBAAF;AALX,IADD;AASA;;AAED,eAAeM,iBAAf","sourcesContent":["/**\n * WordPress dependencies\n */\nimport { useSelect } from '@wordpress/data';\nimport { __ } from '@wordpress/i18n';\n\n/**\n * Internal dependencies\n */\nimport BlockTypesList from '../block-types-list';\nimport { store as blockEditorStore } from '../../store';\nimport { createInserterSection, filterInserterItems } from './utils';\n\nfunction ReusableBlocksTab( { onSelect, rootClientId, listProps } ) {\n\tconst { items } = useSelect(\n\t\t( select ) => {\n\t\t\tconst { getInserterItems } = select( blockEditorStore );\n\t\t\tconst allItems = getInserterItems( rootClientId );\n\n\t\t\treturn {\n\t\t\t\titems: filterInserterItems( allItems, { onlyReusable: true } ),\n\t\t\t};\n\t\t},\n\t\t[ rootClientId ]\n\t);\n\n\tconst sections = [ createInserterSection( { key: 'reuseable', items } ) ];\n\n\treturn (\n\t\t<BlockTypesList\n\t\t\tname=\"ReusableBlocks\"\n\t\t\tsections={ sections }\n\t\t\tonSelect={ onSelect }\n\t\t\tlistProps={ listProps }\n\t\t\tlabel={ __( 'Reusable blocks' ) }\n\t\t/>\n\t);\n}\n\nexport default ReusableBlocksTab;\n"]}
1
+ {"version":3,"sources":["@wordpress/block-editor/src/components/inserter/reusable-blocks-tab.native.js"],"names":["useSelect","__","BlockTypesList","store","blockEditorStore","createInserterSection","filterInserterItems","ReusableBlocksTab","onSelect","rootClientId","listProps","items","select","getInserterItems","allItems","onlyReusable","sections","key"],"mappings":";;AAAA;AACA;AACA;AACA,SAASA,SAAT,QAA0B,iBAA1B;AACA,SAASC,EAAT,QAAmB,iBAAnB;AAEA;AACA;AACA;;AACA,OAAOC,cAAP,MAA2B,qBAA3B;AACA,SAASC,KAAK,IAAIC,gBAAlB,QAA0C,aAA1C;AACA,SAASC,qBAAT,EAAgCC,mBAAhC,QAA2D,SAA3D;;AAEA,SAASC,iBAAT,CAA4B;AAAEC,EAAAA,QAAF;AAAYC,EAAAA,YAAZ;AAA0BC,EAAAA;AAA1B,CAA5B,EAAoE;AACnE,QAAM;AAAEC,IAAAA;AAAF,MAAYX,SAAS,CACxBY,MAAF,IAAc;AACb,UAAM;AAAEC,MAAAA;AAAF,QAAuBD,MAAM,CAAER,gBAAF,CAAnC;AACA,UAAMU,QAAQ,GAAGD,gBAAgB,CAAEJ,YAAF,CAAjC;AAEA,WAAO;AACNE,MAAAA,KAAK,EAAEL,mBAAmB,CAAEQ,QAAF,EAAY;AAAEC,QAAAA,YAAY,EAAE;AAAhB,OAAZ;AADpB,KAAP;AAGA,GARyB,EAS1B,CAAEN,YAAF,CAT0B,CAA3B;AAYA,QAAMO,QAAQ,GAAG,CAAEX,qBAAqB,CAAE;AAAEY,IAAAA,GAAG,EAAE,WAAP;AAAoBN,IAAAA;AAApB,GAAF,CAAvB,CAAjB;AAEA,SACC,cAAC,cAAD;AACC,IAAA,IAAI,EAAC,gBADN;AAEC,IAAA,QAAQ,EAAGK,QAFZ;AAGC,IAAA,QAAQ,EAAGR,QAHZ;AAIC,IAAA,SAAS,EAAGE,SAJb;AAKC,IAAA,KAAK,EAAGT,EAAE,CAAE,iBAAF;AALX,IADD;AASA;;AAED,eAAeM,iBAAf","sourcesContent":["/**\n * WordPress dependencies\n */\nimport { useSelect } from '@wordpress/data';\nimport { __ } from '@wordpress/i18n';\n\n/**\n * Internal dependencies\n */\nimport BlockTypesList from '../block-types-list';\nimport { store as blockEditorStore } from '../../store';\nimport { createInserterSection, filterInserterItems } from './utils';\n\nfunction ReusableBlocksTab( { onSelect, rootClientId, listProps } ) {\n\tconst { items } = useSelect(\n\t\t( select ) => {\n\t\t\tconst { getInserterItems } = select( blockEditorStore );\n\t\t\tconst allItems = getInserterItems( rootClientId );\n\n\t\t\treturn {\n\t\t\t\titems: filterInserterItems( allItems, { onlyReusable: true } ),\n\t\t\t};\n\t\t},\n\t\t[ rootClientId ]\n\t);\n\n\tconst sections = [ createInserterSection( { key: 'reuseable', items } ) ];\n\n\treturn (\n\t\t<BlockTypesList\n\t\t\tname=\"SyncedPatterns\"\n\t\t\tsections={ sections }\n\t\t\tonSelect={ onSelect }\n\t\t\tlistProps={ listProps }\n\t\t\tlabel={ __( 'Synced patterns' ) }\n\t\t/>\n\t);\n}\n\nexport default ReusableBlocksTab;\n"]}
@@ -129,7 +129,7 @@ InserterTabs.getTabs = () => [{
129
129
  component: BlockTypesTab
130
130
  }, {
131
131
  name: 'reusable',
132
- title: __('Reusable'),
132
+ title: __('Synced patterns'),
133
133
  component: ReusableBlocksTab
134
134
  }];
135
135
 
@@ -1 +1 @@
1
- {"version":3,"sources":["@wordpress/block-editor/src/components/inserter/tabs.native.js"],"names":["Animated","View","useCallback","useEffect","useMemo","useRef","useState","__","SegmentedControl","BlockTypesTab","ReusableBlocksTab","styles","TAB_ANIMATION_DURATION","InserterTabs","listProps","onSelect","rootClientId","showReusableBlocks","tabIndex","tabAnimation","Value","current","lastScrollEvents","wrapperWidth","setWrapperWidth","onScroll","event","nativeEvent","onWrapperLayout","layout","width","timing","duration","toValue","useNativeDriver","start","lastScrollEvent","tabs","tabKeys","filteredTabs","getTabs","filter","name","keys","translateX","length","interpolate","inputRange","outputRange","map","key","containerStyle","transform","component","TabComponent","index","TabsControl","onChangeTab","segments","title","segmentHandler","selectedTab","tabTitles","indexOf","Control"],"mappings":"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","sourcesContent":["/**\n * External dependencies\n */\nimport { Animated, View } from 'react-native';\n\n/**\n * WordPress dependencies\n */\nimport {\n\tuseCallback,\n\tuseEffect,\n\tuseMemo,\n\tuseRef,\n\tuseState,\n} from '@wordpress/element';\nimport { __ } from '@wordpress/i18n';\nimport { SegmentedControl } from '@wordpress/components';\n\n/**\n * Internal dependencies\n */\nimport BlockTypesTab from './block-types-tab';\nimport ReusableBlocksTab from './reusable-blocks-tab';\nimport styles from './style.scss';\n\nconst TAB_ANIMATION_DURATION = 250;\n\nfunction InserterTabs( {\n\tlistProps,\n\tonSelect,\n\trootClientId,\n\tshowReusableBlocks,\n\ttabIndex,\n} ) {\n\tconst tabAnimation = useRef( new Animated.Value( 0 ) ).current;\n\tconst lastScrollEvents = useRef( [] ).current;\n\tconst [ wrapperWidth, setWrapperWidth ] = useState( 0 );\n\n\tfunction onScroll( event ) {\n\t\tlastScrollEvents[ tabIndex ] = event.nativeEvent;\n\t\tlistProps.onScroll( event );\n\t}\n\n\tconst onWrapperLayout = useCallback(\n\t\t( { nativeEvent } ) => {\n\t\t\tsetWrapperWidth( nativeEvent.layout.width );\n\t\t},\n\t\t[ setWrapperWidth ]\n\t);\n\n\tuseEffect( () => {\n\t\tAnimated.timing( tabAnimation, {\n\t\t\tduration: TAB_ANIMATION_DURATION,\n\t\t\ttoValue: tabIndex,\n\t\t\tuseNativeDriver: true,\n\t\t} ).start();\n\n\t\t// Notify upstream with the last scroll event of the current tab.\n\t\tconst lastScrollEvent = lastScrollEvents[ tabIndex ];\n\t\tif ( lastScrollEvent ) {\n\t\t\tlistProps.onScroll( { nativeEvent: lastScrollEvent } );\n\t\t}\n\t}, [ tabIndex ] );\n\n\tconst { tabs, tabKeys } = useMemo( () => {\n\t\tconst filteredTabs = InserterTabs.getTabs().filter(\n\t\t\t( { name } ) => showReusableBlocks || name !== 'reusable'\n\t\t);\n\t\treturn {\n\t\t\ttabs: filteredTabs,\n\t\t\ttabKeys: [ ...filteredTabs.keys() ],\n\t\t};\n\t}, [ showReusableBlocks ] );\n\n\tconst translateX = useMemo(\n\t\t() =>\n\t\t\ttabKeys.length > 1\n\t\t\t\t? tabAnimation.interpolate( {\n\t\t\t\t\t\tinputRange: tabKeys,\n\t\t\t\t\t\toutputRange: tabKeys.map(\n\t\t\t\t\t\t\t( key ) => key * -wrapperWidth\n\t\t\t\t\t\t),\n\t\t\t\t } )\n\t\t\t\t: tabAnimation,\n\t\t[ tabAnimation, tabKeys, wrapperWidth ]\n\t);\n\n\tconst containerStyle = [\n\t\tstyles[ 'inserter-tabs__container' ],\n\t\t{\n\t\t\twidth: wrapperWidth * tabKeys.length,\n\t\t\ttransform: [ { translateX } ],\n\t\t},\n\t];\n\n\treturn (\n\t\t<View\n\t\t\tstyle={ styles[ 'inserter-tabs__wrapper' ] }\n\t\t\tonLayout={ onWrapperLayout }\n\t\t>\n\t\t\t<Animated.View style={ containerStyle }>\n\t\t\t\t{ tabs.map( ( { component: TabComponent }, index ) => (\n\t\t\t\t\t<View key={ `tab-${ index }` }>\n\t\t\t\t\t\t<TabComponent\n\t\t\t\t\t\t\trootClientId={ rootClientId }\n\t\t\t\t\t\t\tonSelect={ onSelect }\n\t\t\t\t\t\t\tlistProps={ { ...listProps, onScroll } }\n\t\t\t\t\t\t/>\n\t\t\t\t\t</View>\n\t\t\t\t) ) }\n\t\t\t</Animated.View>\n\t\t</View>\n\t);\n}\n\nfunction TabsControl( { onChangeTab, showReusableBlocks } ) {\n\tconst tabs = InserterTabs.getTabs();\n\tconst segments = useMemo( () => {\n\t\tconst filteredTabs = tabs.filter(\n\t\t\t( { name } ) => showReusableBlocks || name !== 'reusable'\n\t\t);\n\t\treturn filteredTabs.map( ( { title } ) => title );\n\t}, [ showReusableBlocks ] );\n\n\tconst segmentHandler = useCallback(\n\t\t( selectedTab ) => {\n\t\t\tconst tabTitles = tabs.map( ( { title } ) => title );\n\t\t\tonChangeTab( tabTitles.indexOf( selectedTab ) );\n\t\t},\n\t\t[ onChangeTab ]\n\t);\n\n\treturn segments.length > 1 ? (\n\t\t<SegmentedControl\n\t\t\tsegments={ segments }\n\t\t\tsegmentHandler={ segmentHandler }\n\t\t/>\n\t) : null;\n}\n\nInserterTabs.Control = TabsControl;\n\nInserterTabs.getTabs = () => [\n\t{ name: 'blocks', title: __( 'Blocks' ), component: BlockTypesTab },\n\t{ name: 'reusable', title: __( 'Reusable' ), component: ReusableBlocksTab },\n];\n\nexport default InserterTabs;\n"]}
1
+ {"version":3,"sources":["@wordpress/block-editor/src/components/inserter/tabs.native.js"],"names":["Animated","View","useCallback","useEffect","useMemo","useRef","useState","__","SegmentedControl","BlockTypesTab","ReusableBlocksTab","styles","TAB_ANIMATION_DURATION","InserterTabs","listProps","onSelect","rootClientId","showReusableBlocks","tabIndex","tabAnimation","Value","current","lastScrollEvents","wrapperWidth","setWrapperWidth","onScroll","event","nativeEvent","onWrapperLayout","layout","width","timing","duration","toValue","useNativeDriver","start","lastScrollEvent","tabs","tabKeys","filteredTabs","getTabs","filter","name","keys","translateX","length","interpolate","inputRange","outputRange","map","key","containerStyle","transform","component","TabComponent","index","TabsControl","onChangeTab","segments","title","segmentHandler","selectedTab","tabTitles","indexOf","Control"],"mappings":"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","sourcesContent":["/**\n * External dependencies\n */\nimport { Animated, View } from 'react-native';\n\n/**\n * WordPress dependencies\n */\nimport {\n\tuseCallback,\n\tuseEffect,\n\tuseMemo,\n\tuseRef,\n\tuseState,\n} from '@wordpress/element';\nimport { __ } from '@wordpress/i18n';\nimport { SegmentedControl } from '@wordpress/components';\n\n/**\n * Internal dependencies\n */\nimport BlockTypesTab from './block-types-tab';\nimport ReusableBlocksTab from './reusable-blocks-tab';\nimport styles from './style.scss';\n\nconst TAB_ANIMATION_DURATION = 250;\n\nfunction InserterTabs( {\n\tlistProps,\n\tonSelect,\n\trootClientId,\n\tshowReusableBlocks,\n\ttabIndex,\n} ) {\n\tconst tabAnimation = useRef( new Animated.Value( 0 ) ).current;\n\tconst lastScrollEvents = useRef( [] ).current;\n\tconst [ wrapperWidth, setWrapperWidth ] = useState( 0 );\n\n\tfunction onScroll( event ) {\n\t\tlastScrollEvents[ tabIndex ] = event.nativeEvent;\n\t\tlistProps.onScroll( event );\n\t}\n\n\tconst onWrapperLayout = useCallback(\n\t\t( { nativeEvent } ) => {\n\t\t\tsetWrapperWidth( nativeEvent.layout.width );\n\t\t},\n\t\t[ setWrapperWidth ]\n\t);\n\n\tuseEffect( () => {\n\t\tAnimated.timing( tabAnimation, {\n\t\t\tduration: TAB_ANIMATION_DURATION,\n\t\t\ttoValue: tabIndex,\n\t\t\tuseNativeDriver: true,\n\t\t} ).start();\n\n\t\t// Notify upstream with the last scroll event of the current tab.\n\t\tconst lastScrollEvent = lastScrollEvents[ tabIndex ];\n\t\tif ( lastScrollEvent ) {\n\t\t\tlistProps.onScroll( { nativeEvent: lastScrollEvent } );\n\t\t}\n\t}, [ tabIndex ] );\n\n\tconst { tabs, tabKeys } = useMemo( () => {\n\t\tconst filteredTabs = InserterTabs.getTabs().filter(\n\t\t\t( { name } ) => showReusableBlocks || name !== 'reusable'\n\t\t);\n\t\treturn {\n\t\t\ttabs: filteredTabs,\n\t\t\ttabKeys: [ ...filteredTabs.keys() ],\n\t\t};\n\t}, [ showReusableBlocks ] );\n\n\tconst translateX = useMemo(\n\t\t() =>\n\t\t\ttabKeys.length > 1\n\t\t\t\t? tabAnimation.interpolate( {\n\t\t\t\t\t\tinputRange: tabKeys,\n\t\t\t\t\t\toutputRange: tabKeys.map(\n\t\t\t\t\t\t\t( key ) => key * -wrapperWidth\n\t\t\t\t\t\t),\n\t\t\t\t } )\n\t\t\t\t: tabAnimation,\n\t\t[ tabAnimation, tabKeys, wrapperWidth ]\n\t);\n\n\tconst containerStyle = [\n\t\tstyles[ 'inserter-tabs__container' ],\n\t\t{\n\t\t\twidth: wrapperWidth * tabKeys.length,\n\t\t\ttransform: [ { translateX } ],\n\t\t},\n\t];\n\n\treturn (\n\t\t<View\n\t\t\tstyle={ styles[ 'inserter-tabs__wrapper' ] }\n\t\t\tonLayout={ onWrapperLayout }\n\t\t>\n\t\t\t<Animated.View style={ containerStyle }>\n\t\t\t\t{ tabs.map( ( { component: TabComponent }, index ) => (\n\t\t\t\t\t<View key={ `tab-${ index }` }>\n\t\t\t\t\t\t<TabComponent\n\t\t\t\t\t\t\trootClientId={ rootClientId }\n\t\t\t\t\t\t\tonSelect={ onSelect }\n\t\t\t\t\t\t\tlistProps={ { ...listProps, onScroll } }\n\t\t\t\t\t\t/>\n\t\t\t\t\t</View>\n\t\t\t\t) ) }\n\t\t\t</Animated.View>\n\t\t</View>\n\t);\n}\n\nfunction TabsControl( { onChangeTab, showReusableBlocks } ) {\n\tconst tabs = InserterTabs.getTabs();\n\tconst segments = useMemo( () => {\n\t\tconst filteredTabs = tabs.filter(\n\t\t\t( { name } ) => showReusableBlocks || name !== 'reusable'\n\t\t);\n\t\treturn filteredTabs.map( ( { title } ) => title );\n\t}, [ showReusableBlocks ] );\n\n\tconst segmentHandler = useCallback(\n\t\t( selectedTab ) => {\n\t\t\tconst tabTitles = tabs.map( ( { title } ) => title );\n\t\t\tonChangeTab( tabTitles.indexOf( selectedTab ) );\n\t\t},\n\t\t[ onChangeTab ]\n\t);\n\n\treturn segments.length > 1 ? (\n\t\t<SegmentedControl\n\t\t\tsegments={ segments }\n\t\t\tsegmentHandler={ segmentHandler }\n\t\t/>\n\t) : null;\n}\n\nInserterTabs.Control = TabsControl;\n\nInserterTabs.getTabs = () => [\n\t{ name: 'blocks', title: __( 'Blocks' ), component: BlockTypesTab },\n\t{\n\t\tname: 'reusable',\n\t\ttitle: __( 'Synced patterns' ),\n\t\tcomponent: ReusableBlocksTab,\n\t},\n];\n\nexport default InserterTabs;\n"]}