@strapi/content-manager 5.61.1 → 5.62.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 (260) hide show
  1. package/dist/admin/components/ConfigurationForm/Fields.js +1 -1
  2. package/dist/admin/components/ConfigurationForm/Fields.js.map +1 -1
  3. package/dist/admin/components/ConfigurationForm/Fields.mjs +3 -3
  4. package/dist/admin/components/ConfigurationForm/Fields.mjs.map +1 -1
  5. package/dist/admin/features/I18nSharedFieldsLock.js +54 -0
  6. package/dist/admin/features/I18nSharedFieldsLock.js.map +1 -0
  7. package/dist/admin/features/I18nSharedFieldsLock.mjs +31 -0
  8. package/dist/admin/features/I18nSharedFieldsLock.mjs.map +1 -0
  9. package/dist/admin/history/components/VersionInputRenderer.js +7 -2
  10. package/dist/admin/history/components/VersionInputRenderer.js.map +1 -1
  11. package/dist/admin/history/components/VersionInputRenderer.mjs +7 -3
  12. package/dist/admin/history/components/VersionInputRenderer.mjs.map +1 -1
  13. package/dist/admin/hooks/useContentManagerInitData.js +27 -8
  14. package/dist/admin/hooks/useContentManagerInitData.js.map +1 -1
  15. package/dist/admin/hooks/useContentManagerInitData.mjs +29 -10
  16. package/dist/admin/hooks/useContentManagerInitData.mjs.map +1 -1
  17. package/dist/admin/hooks/useDocument.js +11 -13
  18. package/dist/admin/hooks/useDocument.js.map +1 -1
  19. package/dist/admin/hooks/useDocument.mjs +11 -13
  20. package/dist/admin/hooks/useDocument.mjs.map +1 -1
  21. package/dist/admin/hooks/useI18nFieldLock.js +169 -0
  22. package/dist/admin/hooks/useI18nFieldLock.js.map +1 -0
  23. package/dist/admin/hooks/useI18nFieldLock.mjs +140 -0
  24. package/dist/admin/hooks/useI18nFieldLock.mjs.map +1 -0
  25. package/dist/admin/hooks/usePersistentQueryParams.js +16 -3
  26. package/dist/admin/hooks/usePersistentQueryParams.js.map +1 -1
  27. package/dist/admin/hooks/usePersistentQueryParams.mjs +16 -3
  28. package/dist/admin/hooks/usePersistentQueryParams.mjs.map +1 -1
  29. package/dist/admin/index.js +5 -0
  30. package/dist/admin/index.js.map +1 -1
  31. package/dist/admin/index.mjs +2 -0
  32. package/dist/admin/index.mjs.map +1 -1
  33. package/dist/admin/modules/app.js +8 -1
  34. package/dist/admin/modules/app.js.map +1 -1
  35. package/dist/admin/modules/app.mjs +8 -2
  36. package/dist/admin/modules/app.mjs.map +1 -1
  37. package/dist/admin/pages/EditView/EditViewPage.js +129 -127
  38. package/dist/admin/pages/EditView/EditViewPage.js.map +1 -1
  39. package/dist/admin/pages/EditView/EditViewPage.mjs +129 -127
  40. package/dist/admin/pages/EditView/EditViewPage.mjs.map +1 -1
  41. package/dist/admin/pages/EditView/components/DocumentActions.js +11 -4
  42. package/dist/admin/pages/EditView/components/DocumentActions.js.map +1 -1
  43. package/dist/admin/pages/EditView/components/DocumentActions.mjs +12 -5
  44. package/dist/admin/pages/EditView/components/DocumentActions.mjs.map +1 -1
  45. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.js +31 -21
  46. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.js.map +1 -1
  47. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.mjs +32 -22
  48. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.mjs.map +1 -1
  49. package/dist/admin/pages/EditView/components/FormInputs/Component/AddComponentMenu.js +98 -0
  50. package/dist/admin/pages/EditView/components/FormInputs/Component/AddComponentMenu.js.map +1 -0
  51. package/dist/admin/pages/EditView/components/FormInputs/Component/AddComponentMenu.mjs +96 -0
  52. package/dist/admin/pages/EditView/components/FormInputs/Component/AddComponentMenu.mjs.map +1 -0
  53. package/dist/admin/pages/EditView/components/FormInputs/Component/ComponentCopyModal.js +1103 -0
  54. package/dist/admin/pages/EditView/components/FormInputs/Component/ComponentCopyModal.js.map +1 -0
  55. package/dist/admin/pages/EditView/components/FormInputs/Component/ComponentCopyModal.mjs +1077 -0
  56. package/dist/admin/pages/EditView/components/FormInputs/Component/ComponentCopyModal.mjs.map +1 -0
  57. package/dist/admin/pages/EditView/components/FormInputs/Component/CopiedComponents.js +211 -0
  58. package/dist/admin/pages/EditView/components/FormInputs/Component/CopiedComponents.js.map +1 -0
  59. package/dist/admin/pages/EditView/components/FormInputs/Component/CopiedComponents.mjs +183 -0
  60. package/dist/admin/pages/EditView/components/FormInputs/Component/CopiedComponents.mjs.map +1 -0
  61. package/dist/admin/pages/EditView/components/FormInputs/Component/Initializer.js +84 -41
  62. package/dist/admin/pages/EditView/components/FormInputs/Component/Initializer.js.map +1 -1
  63. package/dist/admin/pages/EditView/components/FormInputs/Component/Initializer.mjs +86 -43
  64. package/dist/admin/pages/EditView/components/FormInputs/Component/Initializer.mjs.map +1 -1
  65. package/dist/admin/pages/EditView/components/FormInputs/Component/Input.js +86 -20
  66. package/dist/admin/pages/EditView/components/FormInputs/Component/Input.js.map +1 -1
  67. package/dist/admin/pages/EditView/components/FormInputs/Component/Input.mjs +89 -23
  68. package/dist/admin/pages/EditView/components/FormInputs/Component/Input.mjs.map +1 -1
  69. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.js +5 -2
  70. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.js.map +1 -1
  71. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.mjs +5 -2
  72. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.mjs.map +1 -1
  73. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js +142 -22
  74. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js.map +1 -1
  75. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.mjs +143 -23
  76. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.mjs.map +1 -1
  77. package/dist/admin/pages/EditView/components/FormInputs/Component/utils/componentCopy.js +402 -0
  78. package/dist/admin/pages/EditView/components/FormInputs/Component/utils/componentCopy.js.map +1 -0
  79. package/dist/admin/pages/EditView/components/FormInputs/Component/utils/componentCopy.mjs +389 -0
  80. package/dist/admin/pages/EditView/components/FormInputs/Component/utils/componentCopy.mjs.map +1 -0
  81. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.js +84 -33
  82. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.js.map +1 -1
  83. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.mjs +85 -34
  84. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.mjs.map +1 -1
  85. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentPicker.js +5 -1
  86. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentPicker.js.map +1 -1
  87. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentPicker.mjs +5 -1
  88. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentPicker.mjs.map +1 -1
  89. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js +17 -4
  90. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js.map +1 -1
  91. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs +18 -5
  92. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs.map +1 -1
  93. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.js +54 -6
  94. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.js.map +1 -1
  95. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.mjs +54 -6
  96. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.mjs.map +1 -1
  97. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.js +11 -9
  98. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.js.map +1 -1
  99. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.mjs +12 -10
  100. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.mjs.map +1 -1
  101. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js +9 -4
  102. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js.map +1 -1
  103. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs +9 -4
  104. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs.map +1 -1
  105. package/dist/admin/pages/EditView/components/FormLayout.js +66 -63
  106. package/dist/admin/pages/EditView/components/FormLayout.js.map +1 -1
  107. package/dist/admin/pages/EditView/components/FormLayout.mjs +66 -63
  108. package/dist/admin/pages/EditView/components/FormLayout.mjs.map +1 -1
  109. package/dist/admin/pages/EditView/components/InputRenderer.js +7 -1
  110. package/dist/admin/pages/EditView/components/InputRenderer.js.map +1 -1
  111. package/dist/admin/pages/EditView/components/InputRenderer.mjs +7 -1
  112. package/dist/admin/pages/EditView/components/InputRenderer.mjs.map +1 -1
  113. package/dist/admin/pages/EditView/utils/data.js +14 -9
  114. package/dist/admin/pages/EditView/utils/data.js.map +1 -1
  115. package/dist/admin/pages/EditView/utils/data.mjs +14 -9
  116. package/dist/admin/pages/EditView/utils/data.mjs.map +1 -1
  117. package/dist/admin/pages/EditView/utils/forms.js +34 -0
  118. package/dist/admin/pages/EditView/utils/forms.js.map +1 -1
  119. package/dist/admin/pages/EditView/utils/forms.mjs +34 -1
  120. package/dist/admin/pages/EditView/utils/forms.mjs.map +1 -1
  121. package/dist/admin/pages/ListConfiguration/components/DraggableCard.js +2 -1
  122. package/dist/admin/pages/ListConfiguration/components/DraggableCard.js.map +1 -1
  123. package/dist/admin/pages/ListConfiguration/components/DraggableCard.mjs +2 -1
  124. package/dist/admin/pages/ListConfiguration/components/DraggableCard.mjs.map +1 -1
  125. package/dist/admin/pages/ListConfiguration/components/EditFieldForm.js +7 -6
  126. package/dist/admin/pages/ListConfiguration/components/EditFieldForm.js.map +1 -1
  127. package/dist/admin/pages/ListConfiguration/components/EditFieldForm.mjs +7 -6
  128. package/dist/admin/pages/ListConfiguration/components/EditFieldForm.mjs.map +1 -1
  129. package/dist/admin/pages/ListView/ListViewPage.js +11 -2
  130. package/dist/admin/pages/ListView/ListViewPage.js.map +1 -1
  131. package/dist/admin/pages/ListView/ListViewPage.mjs +13 -4
  132. package/dist/admin/pages/ListView/ListViewPage.mjs.map +1 -1
  133. package/dist/admin/pages/ListView/components/Filters.js +15 -5
  134. package/dist/admin/pages/ListView/components/Filters.js.map +1 -1
  135. package/dist/admin/pages/ListView/components/Filters.mjs +16 -7
  136. package/dist/admin/pages/ListView/components/Filters.mjs.map +1 -1
  137. package/dist/admin/preview/components/InputPopover.js +18 -8
  138. package/dist/admin/preview/components/InputPopover.js.map +1 -1
  139. package/dist/admin/preview/components/InputPopover.mjs +19 -9
  140. package/dist/admin/preview/components/InputPopover.mjs.map +1 -1
  141. package/dist/admin/preview/pages/Preview.js +5 -16
  142. package/dist/admin/preview/pages/Preview.js.map +1 -1
  143. package/dist/admin/preview/pages/Preview.mjs +5 -16
  144. package/dist/admin/preview/pages/Preview.mjs.map +1 -1
  145. package/dist/admin/preview/utils/fieldUtils.js +2 -0
  146. package/dist/admin/preview/utils/fieldUtils.js.map +1 -1
  147. package/dist/admin/preview/utils/fieldUtils.mjs +2 -1
  148. package/dist/admin/preview/utils/fieldUtils.mjs.map +1 -1
  149. package/dist/admin/services/api.js +2 -1
  150. package/dist/admin/services/api.js.map +1 -1
  151. package/dist/admin/services/api.mjs +2 -1
  152. package/dist/admin/services/api.mjs.map +1 -1
  153. package/dist/admin/services/documents.js +21 -1
  154. package/dist/admin/services/documents.js.map +1 -1
  155. package/dist/admin/services/documents.mjs +21 -2
  156. package/dist/admin/services/documents.mjs.map +1 -1
  157. package/dist/admin/services/relations.js +47 -1
  158. package/dist/admin/services/relations.js.map +1 -1
  159. package/dist/admin/services/relations.mjs +47 -2
  160. package/dist/admin/services/relations.mjs.map +1 -1
  161. package/dist/admin/src/exports.d.ts +2 -0
  162. package/dist/admin/src/features/I18nSharedFieldsLock.d.ts +22 -0
  163. package/dist/admin/src/history/components/VersionInputRenderer.d.ts +7 -1
  164. package/dist/admin/src/history/services/historyVersion.d.ts +1 -1
  165. package/dist/admin/src/hooks/useI18nFieldLock.d.ts +61 -0
  166. package/dist/admin/src/modules/app.d.ts +4 -1
  167. package/dist/admin/src/pages/EditView/components/FormInputs/Component/AddComponentMenu.d.ts +15 -0
  168. package/dist/admin/src/pages/EditView/components/FormInputs/Component/ComponentCopyModal.d.ts +58 -0
  169. package/dist/admin/src/pages/EditView/components/FormInputs/Component/CopiedComponents.d.ts +41 -0
  170. package/dist/admin/src/pages/EditView/components/FormInputs/Component/Initializer.d.ts +7 -3
  171. package/dist/admin/src/pages/EditView/components/FormInputs/Component/NonRepeatable.d.ts +1 -1
  172. package/dist/admin/src/pages/EditView/components/FormInputs/Component/Repeatable.d.ts +2 -2
  173. package/dist/admin/src/pages/EditView/components/FormInputs/Component/utils/componentCopy.d.ts +115 -0
  174. package/dist/admin/src/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.d.ts +6 -3
  175. package/dist/admin/src/pages/EditView/components/FormInputs/DynamicZone/ComponentPicker.d.ts +2 -1
  176. package/dist/admin/src/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.d.ts +5 -1
  177. package/dist/admin/src/pages/EditView/utils/forms.d.ts +13 -2
  178. package/dist/admin/src/pages/ListView/components/Filters.d.ts +12 -3
  179. package/dist/admin/src/preview/services/preview.d.ts +1 -1
  180. package/dist/admin/src/preview/utils/fieldUtils.d.ts +1 -0
  181. package/dist/admin/src/services/api.d.ts +1 -1
  182. package/dist/admin/src/services/components.d.ts +2 -2
  183. package/dist/admin/src/services/contentTypes.d.ts +3 -3
  184. package/dist/admin/src/services/documents.d.ts +25 -21
  185. package/dist/admin/src/services/homepage.d.ts +1 -1
  186. package/dist/admin/src/services/init.d.ts +1 -1
  187. package/dist/admin/src/services/relations.d.ts +5 -3
  188. package/dist/admin/src/services/uid.d.ts +3 -3
  189. package/dist/admin/translations/en.json.js +41 -0
  190. package/dist/admin/translations/en.json.js.map +1 -1
  191. package/dist/admin/translations/en.json.mjs +41 -0
  192. package/dist/admin/translations/en.json.mjs.map +1 -1
  193. package/dist/server/controllers/relations.js +4 -2
  194. package/dist/server/controllers/relations.js.map +1 -1
  195. package/dist/server/controllers/relations.mjs +4 -2
  196. package/dist/server/controllers/relations.mjs.map +1 -1
  197. package/dist/server/controllers/utils/metadata.js +3 -1
  198. package/dist/server/controllers/utils/metadata.js.map +1 -1
  199. package/dist/server/controllers/utils/metadata.mjs +3 -1
  200. package/dist/server/controllers/utils/metadata.mjs.map +1 -1
  201. package/dist/server/history/services/utils.js +3 -1
  202. package/dist/server/history/services/utils.js.map +1 -1
  203. package/dist/server/history/services/utils.mjs +3 -1
  204. package/dist/server/history/services/utils.mjs.map +1 -1
  205. package/dist/server/homepage/services/homepage-query-utils.js +14 -0
  206. package/dist/server/homepage/services/homepage-query-utils.js.map +1 -1
  207. package/dist/server/homepage/services/homepage-query-utils.mjs +14 -1
  208. package/dist/server/homepage/services/homepage-query-utils.mjs.map +1 -1
  209. package/dist/server/homepage/services/homepage.js +1 -1
  210. package/dist/server/homepage/services/homepage.js.map +1 -1
  211. package/dist/server/homepage/services/homepage.mjs +2 -2
  212. package/dist/server/homepage/services/homepage.mjs.map +1 -1
  213. package/dist/server/mcp/sanitizers/shape-relations.js +1 -3
  214. package/dist/server/mcp/sanitizers/shape-relations.js.map +1 -1
  215. package/dist/server/mcp/sanitizers/shape-relations.mjs +1 -3
  216. package/dist/server/mcp/sanitizers/shape-relations.mjs.map +1 -1
  217. package/dist/server/mcp/schemas/output-schemas.js +2 -1
  218. package/dist/server/mcp/schemas/output-schemas.js.map +1 -1
  219. package/dist/server/mcp/schemas/output-schemas.mjs +2 -1
  220. package/dist/server/mcp/schemas/output-schemas.mjs.map +1 -1
  221. package/dist/server/services/document-manager.js +3 -2
  222. package/dist/server/services/document-manager.js.map +1 -1
  223. package/dist/server/services/document-manager.mjs +3 -2
  224. package/dist/server/services/document-manager.mjs.map +1 -1
  225. package/dist/server/services/document-metadata.js +92 -4
  226. package/dist/server/services/document-metadata.js.map +1 -1
  227. package/dist/server/services/document-metadata.mjs +92 -4
  228. package/dist/server/services/document-metadata.mjs.map +1 -1
  229. package/dist/server/services/permission-checker.js +20 -8
  230. package/dist/server/services/permission-checker.js.map +1 -1
  231. package/dist/server/services/permission-checker.mjs +20 -8
  232. package/dist/server/services/permission-checker.mjs.map +1 -1
  233. package/dist/server/services/uid.js +2 -1
  234. package/dist/server/services/uid.js.map +1 -1
  235. package/dist/server/services/uid.mjs +2 -1
  236. package/dist/server/services/uid.mjs.map +1 -1
  237. package/dist/server/src/controllers/relations.d.ts.map +1 -1
  238. package/dist/server/src/controllers/utils/metadata.d.ts +1 -0
  239. package/dist/server/src/controllers/utils/metadata.d.ts.map +1 -1
  240. package/dist/server/src/history/services/utils.d.ts.map +1 -1
  241. package/dist/server/src/homepage/services/homepage-query-utils.d.ts +6 -0
  242. package/dist/server/src/homepage/services/homepage-query-utils.d.ts.map +1 -1
  243. package/dist/server/src/homepage/services/homepage.d.ts.map +1 -1
  244. package/dist/server/src/index.d.ts +21 -7
  245. package/dist/server/src/index.d.ts.map +1 -1
  246. package/dist/server/src/mcp/sanitizers/shape-relations.d.ts.map +1 -1
  247. package/dist/server/src/mcp/schemas/output-schemas.d.ts.map +1 -1
  248. package/dist/server/src/services/document-manager.d.ts.map +1 -1
  249. package/dist/server/src/services/document-metadata.d.ts +5 -1
  250. package/dist/server/src/services/document-metadata.d.ts.map +1 -1
  251. package/dist/server/src/services/index.d.ts +21 -7
  252. package/dist/server/src/services/index.d.ts.map +1 -1
  253. package/dist/server/src/services/permission-checker.d.ts +6 -5
  254. package/dist/server/src/services/permission-checker.d.ts.map +1 -1
  255. package/dist/server/src/services/uid.d.ts.map +1 -1
  256. package/dist/shared/contracts/collection-types.d.ts +7 -0
  257. package/dist/shared/contracts/collection-types.d.ts.map +1 -1
  258. package/dist/shared/contracts/single-types.d.ts +4 -0
  259. package/dist/shared/contracts/single-types.d.ts.map +1 -1
  260. package/package.json +9 -9
@@ -28,6 +28,8 @@ const useContentManagerInitData = ()=>{
28
28
  const { formatMessage } = reactIntl.useIntl();
29
29
  const { _unstableFormatAPIError: formatAPIError } = strapiAdmin.useAPIErrorHandler(translations.getTranslation);
30
30
  const checkUserHasPermissions = strapiAdmin.useAuth('useContentManagerInitData', (state)=>state.checkUserHasPermissions);
31
+ const isLoadingAuth = strapiAdmin.useAuth('useContentManagerInitData', (state)=>state.isLoading);
32
+ const adminUserId = strapiAdmin.useAuth('useContentManagerInitData', (state)=>strapiAdmin.getAdminUserId(state.user));
31
33
  const state = hooks.useTypedSelector((state)=>state['content-manager'].app);
32
34
  const initialDataQuery = init.useGetInitialDataQuery(undefined, {
33
35
  /**
@@ -103,35 +105,52 @@ const useContentManagerInitData = ()=>{
103
105
  stLinks: authorizedSingleTypeLinks,
104
106
  models: contentTypes
105
107
  });
106
- dispatch(app.setInitialData({
108
+ return {
109
+ adminUserId,
107
110
  authorizedCollectionTypeLinks: ctLinks,
108
111
  authorizedSingleTypeLinks: stLinks,
109
112
  components,
110
113
  contentStructure,
111
114
  contentTypeSchemas: contentTypes,
112
115
  fieldSizes
113
- }));
116
+ };
114
117
  }, [
118
+ adminUserId,
115
119
  checkUserHasPermissions,
116
- dispatch,
117
120
  runHookWaterfall
118
121
  ]);
119
122
  React.useEffect(()=>{
123
+ let cancelled = false;
120
124
  if (initialDataQuery.data && contentTypeSettingsQuery.data) {
121
- formatData(initialDataQuery.data.components, initialDataQuery.data.contentTypes, initialDataQuery.data.fieldSizes, contentTypeSettingsQuery.data, initialDataQuery.data.contentStructure).catch((error)=>{
122
- toggleNotification({
123
- type: 'danger',
124
- message: formatAPIError(error)
125
- });
125
+ formatData(initialDataQuery.data.components, initialDataQuery.data.contentTypes, initialDataQuery.data.fieldSizes, contentTypeSettingsQuery.data, initialDataQuery.data.contentStructure).then((data)=>{
126
+ if (!cancelled) {
127
+ dispatch(app.setInitialData(data));
128
+ }
129
+ }).catch((error)=>{
130
+ if (!cancelled) {
131
+ toggleNotification({
132
+ type: 'danger',
133
+ message: formatAPIError(error)
134
+ });
135
+ }
126
136
  });
127
137
  }
138
+ return ()=>{
139
+ cancelled = true;
140
+ };
128
141
  }, [
142
+ dispatch,
129
143
  formatAPIError,
130
144
  formatData,
131
145
  initialDataQuery.data,
132
146
  contentTypeSettingsQuery.data,
133
147
  toggleNotification
134
148
  ]);
149
+ if (isLoadingAuth || state.adminUserId !== adminUserId) {
150
+ return {
151
+ ...app.initialState
152
+ };
153
+ }
135
154
  return {
136
155
  ...state
137
156
  };
@@ -1 +1 @@
1
- {"version":3,"file":"useContentManagerInitData.js","sources":["../../../admin/src/hooks/useContentManagerInitData.ts"],"sourcesContent":["import { useCallback, useEffect } from 'react';\n\nimport {\n useAuth,\n type Permission,\n useNotification,\n useStrapiApp,\n useAPIErrorHandler,\n} from '@strapi/admin/strapi-admin';\nimport { useNotifyAT } from '@strapi/design-system';\nimport { stringify } from 'qs';\nimport { useIntl } from 'react-intl';\n\nimport { COLLECTION_TYPES, SINGLE_TYPES } from '../constants/collections';\nimport { HOOKS } from '../constants/hooks';\nimport { AppState, setInitialData } from '../modules/app';\nimport { useTypedDispatch, useTypedSelector } from '../modules/hooks';\nimport { useGetAllContentTypeSettingsQuery } from '../services/contentTypes';\nimport { useGetInitialDataQuery } from '../services/init';\nimport { getTranslation } from '../utils/translations';\n\nimport type { Component } from '../../../shared/contracts/components';\nimport type {\n ContentType,\n FindContentTypesSettings,\n} from '../../../shared/contracts/content-types';\nimport type { GetInitData } from '../../../shared/contracts/init';\n\nconst { MUTATE_COLLECTION_TYPES_LINKS, MUTATE_SINGLE_TYPES_LINKS } = HOOKS;\n\ninterface ContentManagerLink {\n permissions: Permission[];\n search: string | null;\n kind: string;\n title: string;\n to: string;\n uid: string;\n name: string;\n isDisplayed: boolean;\n}\n\nconst getPermissionKey = (permission: Pick<Permission, 'action' | 'subject'>) =>\n `${permission.action}::${permission.subject ?? ''}`;\n\nconst authorizeLinks = async (\n links: ContentManagerLink[],\n checkUserHasPermissions: (\n permissions?: Array<Pick<Permission, 'action'> & Partial<Omit<Permission, 'action'>>>\n ) => Promise<Permission[]>\n) => {\n const authorizedPermissions = await checkUserHasPermissions(\n links.flatMap(({ permissions }) => permissions)\n );\n\n const authorizedPermissionKeys = new Set(authorizedPermissions.map(getPermissionKey));\n\n return links.filter(({ permissions }) =>\n permissions.some((permission) => authorizedPermissionKeys.has(getPermissionKey(permission)))\n );\n};\n\nconst useContentManagerInitData = (): AppState => {\n const { toggleNotification } = useNotification();\n const dispatch = useTypedDispatch();\n const runHookWaterfall = useStrapiApp(\n 'useContentManagerInitData',\n (state) => state.runHookWaterfall\n );\n const { notifyStatus } = useNotifyAT();\n const { formatMessage } = useIntl();\n const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler(getTranslation);\n const checkUserHasPermissions = useAuth(\n 'useContentManagerInitData',\n (state) => state.checkUserHasPermissions\n );\n\n const state = useTypedSelector((state) => state['content-manager'].app);\n\n const initialDataQuery = useGetInitialDataQuery(undefined, {\n /**\n * TODO: remove this when the CTB has been refactored to use redux-toolkit-query\n * and it can invalidate the cache on mutation\n */\n refetchOnMountOrArgChange: true,\n });\n\n useEffect(() => {\n if (initialDataQuery.data) {\n notifyStatus(\n formatMessage({\n id: getTranslation('App.schemas.data-loaded'),\n defaultMessage: 'The schemas have been successfully loaded.',\n })\n );\n }\n }, [formatMessage, initialDataQuery.data, notifyStatus]);\n\n useEffect(() => {\n if (initialDataQuery.error) {\n toggleNotification({ type: 'danger', message: formatAPIError(initialDataQuery.error) });\n }\n }, [formatAPIError, initialDataQuery.error, toggleNotification]);\n\n const contentTypeSettingsQuery = useGetAllContentTypeSettingsQuery();\n\n useEffect(() => {\n if (contentTypeSettingsQuery.error) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(contentTypeSettingsQuery.error),\n });\n }\n }, [formatAPIError, contentTypeSettingsQuery.error, toggleNotification]);\n\n const formatData = useCallback(\n async (\n components: Component[],\n contentTypes: ContentType[],\n fieldSizes: GetInitData.Response['data']['fieldSizes'],\n contentTypeConfigurations: FindContentTypesSettings.Response['data'],\n contentStructure: GetInitData.Response['data']['contentStructure']\n ) => {\n /**\n * We group these by the two types we support. We do with an object because we can use default\n * values of arrays to make sure we always have an array to manipulate further on if, for example,\n * a user has not made any single types.\n *\n * This means we have to manually add new content types to this hook if we add a new type – but\n * the safety is worth it.\n */\n const { collectionType: collectionTypeLinks, singleType: singleTypeLinks } =\n contentTypes.reduce<{\n collectionType: ContentType[];\n singleType: ContentType[];\n }>(\n (acc, model) => {\n acc[model.kind].push(model);\n return acc;\n },\n {\n collectionType: [],\n singleType: [],\n }\n );\n const collectionTypeSectionLinks = generateLinks(\n collectionTypeLinks,\n 'collectionTypes',\n contentTypeConfigurations\n );\n const singleTypeSectionLinks = generateLinks(singleTypeLinks, 'singleTypes');\n\n const authorizedLinks = await authorizeLinks(\n [...collectionTypeSectionLinks, ...singleTypeSectionLinks],\n checkUserHasPermissions\n );\n const authorizedCollectionTypeLinks = authorizedLinks.filter(\n (link) => link.kind === 'collectionType'\n );\n const authorizedSingleTypeLinks = authorizedLinks.filter(\n (link) => link.kind === 'singleType'\n );\n const { ctLinks } = runHookWaterfall(MUTATE_COLLECTION_TYPES_LINKS, {\n ctLinks: authorizedCollectionTypeLinks,\n models: contentTypes,\n });\n const { stLinks } = runHookWaterfall(MUTATE_SINGLE_TYPES_LINKS, {\n stLinks: authorizedSingleTypeLinks,\n models: contentTypes,\n });\n\n dispatch(\n setInitialData({\n authorizedCollectionTypeLinks: ctLinks,\n authorizedSingleTypeLinks: stLinks,\n components,\n contentStructure,\n contentTypeSchemas: contentTypes,\n fieldSizes,\n })\n );\n },\n [checkUserHasPermissions, dispatch, runHookWaterfall]\n );\n\n useEffect(() => {\n if (initialDataQuery.data && contentTypeSettingsQuery.data) {\n formatData(\n initialDataQuery.data.components,\n initialDataQuery.data.contentTypes,\n initialDataQuery.data.fieldSizes,\n contentTypeSettingsQuery.data,\n initialDataQuery.data.contentStructure\n ).catch((error) => {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(error),\n });\n });\n }\n }, [\n formatAPIError,\n formatData,\n initialDataQuery.data,\n contentTypeSettingsQuery.data,\n toggleNotification,\n ]);\n\n return { ...state };\n};\n\nconst generateLinks = (\n links: ContentType[],\n type: 'collectionTypes' | 'singleTypes',\n configurations: FindContentTypesSettings.Response['data'] = []\n) => {\n return links\n .filter((link) => link.isDisplayed)\n .map((link) => {\n const collectionTypesPermissions = [\n { action: 'plugin::content-manager.explorer.create', subject: link.uid },\n { action: 'plugin::content-manager.explorer.read', subject: link.uid },\n ];\n const singleTypesPermissions = [\n { action: 'plugin::content-manager.explorer.read', subject: link.uid },\n ];\n const permissions =\n type === 'collectionTypes' ? collectionTypesPermissions : singleTypesPermissions;\n\n const currentContentTypeConfig = configurations.find(({ uid }) => uid === link.uid);\n\n let search = null;\n\n if (currentContentTypeConfig) {\n const searchParams = {\n page: 1,\n pageSize: currentContentTypeConfig.settings.pageSize,\n sort: `${currentContentTypeConfig.settings.defaultSortBy}:${currentContentTypeConfig.settings.defaultSortOrder}`,\n };\n\n search = stringify(searchParams, { encode: false });\n }\n\n return {\n permissions,\n search,\n kind: link.kind,\n title: link.info.displayName,\n to: `/content-manager/${link.kind === 'collectionType' ? COLLECTION_TYPES : SINGLE_TYPES}/${\n link.uid\n }`,\n uid: link.uid,\n // Used for the list item key in the helper plugin\n name: link.uid,\n isDisplayed: link.isDisplayed,\n } satisfies ContentManagerLink;\n });\n};\n\nexport { useContentManagerInitData };\nexport type { ContentManagerLink };\n"],"names":["MUTATE_COLLECTION_TYPES_LINKS","MUTATE_SINGLE_TYPES_LINKS","HOOKS","getPermissionKey","permission","action","subject","authorizeLinks","links","checkUserHasPermissions","authorizedPermissions","flatMap","permissions","authorizedPermissionKeys","Set","map","filter","some","has","useContentManagerInitData","toggleNotification","useNotification","dispatch","useTypedDispatch","runHookWaterfall","useStrapiApp","state","notifyStatus","useNotifyAT","formatMessage","useIntl","_unstableFormatAPIError","formatAPIError","useAPIErrorHandler","getTranslation","useAuth","useTypedSelector","app","initialDataQuery","useGetInitialDataQuery","undefined","refetchOnMountOrArgChange","useEffect","data","id","defaultMessage","error","type","message","contentTypeSettingsQuery","useGetAllContentTypeSettingsQuery","formatData","useCallback","components","contentTypes","fieldSizes","contentTypeConfigurations","contentStructure","collectionType","collectionTypeLinks","singleType","singleTypeLinks","reduce","acc","model","kind","push","collectionTypeSectionLinks","generateLinks","singleTypeSectionLinks","authorizedLinks","authorizedCollectionTypeLinks","link","authorizedSingleTypeLinks","ctLinks","models","stLinks","setInitialData","contentTypeSchemas","catch","configurations","isDisplayed","collectionTypesPermissions","uid","singleTypesPermissions","currentContentTypeConfig","find","search","searchParams","page","pageSize","settings","sort","defaultSortBy","defaultSortOrder","stringify","encode","title","info","displayName","to","COLLECTION_TYPES","SINGLE_TYPES","name"],"mappings":"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"}
1
+ {"version":3,"file":"useContentManagerInitData.js","sources":["../../../admin/src/hooks/useContentManagerInitData.ts"],"sourcesContent":["import { useCallback, useEffect } from 'react';\n\nimport {\n getAdminUserId,\n useAuth,\n type Permission,\n useNotification,\n useStrapiApp,\n useAPIErrorHandler,\n} from '@strapi/admin/strapi-admin';\nimport { useNotifyAT } from '@strapi/design-system';\nimport { stringify } from 'qs';\nimport { useIntl } from 'react-intl';\n\nimport { COLLECTION_TYPES, SINGLE_TYPES } from '../constants/collections';\nimport { HOOKS } from '../constants/hooks';\nimport { AppState, initialState, setInitialData } from '../modules/app';\nimport { useTypedDispatch, useTypedSelector } from '../modules/hooks';\nimport { useGetAllContentTypeSettingsQuery } from '../services/contentTypes';\nimport { useGetInitialDataQuery } from '../services/init';\nimport { getTranslation } from '../utils/translations';\n\nimport type { Component } from '../../../shared/contracts/components';\nimport type {\n ContentType,\n FindContentTypesSettings,\n} from '../../../shared/contracts/content-types';\nimport type { GetInitData } from '../../../shared/contracts/init';\n\nconst { MUTATE_COLLECTION_TYPES_LINKS, MUTATE_SINGLE_TYPES_LINKS } = HOOKS;\n\ninterface ContentManagerLink {\n permissions: Permission[];\n search: string | null;\n kind: string;\n title: string;\n to: string;\n uid: string;\n name: string;\n isDisplayed: boolean;\n}\n\nconst getPermissionKey = (permission: Pick<Permission, 'action' | 'subject'>) =>\n `${permission.action}::${permission.subject ?? ''}`;\n\nconst authorizeLinks = async (\n links: ContentManagerLink[],\n checkUserHasPermissions: (\n permissions?: Array<Pick<Permission, 'action'> & Partial<Omit<Permission, 'action'>>>\n ) => Promise<Permission[]>\n) => {\n const authorizedPermissions = await checkUserHasPermissions(\n links.flatMap(({ permissions }) => permissions)\n );\n\n const authorizedPermissionKeys = new Set(authorizedPermissions.map(getPermissionKey));\n\n return links.filter(({ permissions }) =>\n permissions.some((permission) => authorizedPermissionKeys.has(getPermissionKey(permission)))\n );\n};\n\nconst useContentManagerInitData = (): AppState => {\n const { toggleNotification } = useNotification();\n const dispatch = useTypedDispatch();\n const runHookWaterfall = useStrapiApp(\n 'useContentManagerInitData',\n (state) => state.runHookWaterfall\n );\n const { notifyStatus } = useNotifyAT();\n const { formatMessage } = useIntl();\n const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler(getTranslation);\n const checkUserHasPermissions = useAuth(\n 'useContentManagerInitData',\n (state) => state.checkUserHasPermissions\n );\n const isLoadingAuth = useAuth('useContentManagerInitData', (state) => state.isLoading);\n const adminUserId = useAuth('useContentManagerInitData', (state) => getAdminUserId(state.user));\n\n const state = useTypedSelector((state) => state['content-manager'].app);\n\n const initialDataQuery = useGetInitialDataQuery(undefined, {\n /**\n * TODO: remove this when the CTB has been refactored to use redux-toolkit-query\n * and it can invalidate the cache on mutation\n */\n refetchOnMountOrArgChange: true,\n });\n\n useEffect(() => {\n if (initialDataQuery.data) {\n notifyStatus(\n formatMessage({\n id: getTranslation('App.schemas.data-loaded'),\n defaultMessage: 'The schemas have been successfully loaded.',\n })\n );\n }\n }, [formatMessage, initialDataQuery.data, notifyStatus]);\n\n useEffect(() => {\n if (initialDataQuery.error) {\n toggleNotification({ type: 'danger', message: formatAPIError(initialDataQuery.error) });\n }\n }, [formatAPIError, initialDataQuery.error, toggleNotification]);\n\n const contentTypeSettingsQuery = useGetAllContentTypeSettingsQuery();\n\n useEffect(() => {\n if (contentTypeSettingsQuery.error) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(contentTypeSettingsQuery.error),\n });\n }\n }, [formatAPIError, contentTypeSettingsQuery.error, toggleNotification]);\n\n const formatData = useCallback(\n async (\n components: Component[],\n contentTypes: ContentType[],\n fieldSizes: GetInitData.Response['data']['fieldSizes'],\n contentTypeConfigurations: FindContentTypesSettings.Response['data'],\n contentStructure: GetInitData.Response['data']['contentStructure']\n ) => {\n /**\n * We group these by the two types we support. We do with an object because we can use default\n * values of arrays to make sure we always have an array to manipulate further on if, for example,\n * a user has not made any single types.\n *\n * This means we have to manually add new content types to this hook if we add a new type – but\n * the safety is worth it.\n */\n const { collectionType: collectionTypeLinks, singleType: singleTypeLinks } =\n contentTypes.reduce<{\n collectionType: ContentType[];\n singleType: ContentType[];\n }>(\n (acc, model) => {\n acc[model.kind].push(model);\n return acc;\n },\n {\n collectionType: [],\n singleType: [],\n }\n );\n const collectionTypeSectionLinks = generateLinks(\n collectionTypeLinks,\n 'collectionTypes',\n contentTypeConfigurations\n );\n const singleTypeSectionLinks = generateLinks(singleTypeLinks, 'singleTypes');\n\n const authorizedLinks = await authorizeLinks(\n [...collectionTypeSectionLinks, ...singleTypeSectionLinks],\n checkUserHasPermissions\n );\n const authorizedCollectionTypeLinks = authorizedLinks.filter(\n (link) => link.kind === 'collectionType'\n );\n const authorizedSingleTypeLinks = authorizedLinks.filter(\n (link) => link.kind === 'singleType'\n );\n const { ctLinks } = runHookWaterfall(MUTATE_COLLECTION_TYPES_LINKS, {\n ctLinks: authorizedCollectionTypeLinks,\n models: contentTypes,\n });\n const { stLinks } = runHookWaterfall(MUTATE_SINGLE_TYPES_LINKS, {\n stLinks: authorizedSingleTypeLinks,\n models: contentTypes,\n });\n\n return {\n adminUserId,\n authorizedCollectionTypeLinks: ctLinks,\n authorizedSingleTypeLinks: stLinks,\n components,\n contentStructure,\n contentTypeSchemas: contentTypes,\n fieldSizes,\n };\n },\n [adminUserId, checkUserHasPermissions, runHookWaterfall]\n );\n\n useEffect(() => {\n let cancelled = false;\n\n if (initialDataQuery.data && contentTypeSettingsQuery.data) {\n formatData(\n initialDataQuery.data.components,\n initialDataQuery.data.contentTypes,\n initialDataQuery.data.fieldSizes,\n contentTypeSettingsQuery.data,\n initialDataQuery.data.contentStructure\n )\n .then((data) => {\n if (!cancelled) {\n dispatch(setInitialData(data));\n }\n })\n .catch((error) => {\n if (!cancelled) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(error),\n });\n }\n });\n }\n\n return () => {\n cancelled = true;\n };\n }, [\n dispatch,\n formatAPIError,\n formatData,\n initialDataQuery.data,\n contentTypeSettingsQuery.data,\n toggleNotification,\n ]);\n\n if (isLoadingAuth || state.adminUserId !== adminUserId) {\n return { ...initialState };\n }\n\n return { ...state };\n};\n\nconst generateLinks = (\n links: ContentType[],\n type: 'collectionTypes' | 'singleTypes',\n configurations: FindContentTypesSettings.Response['data'] = []\n) => {\n return links\n .filter((link) => link.isDisplayed)\n .map((link) => {\n const collectionTypesPermissions = [\n { action: 'plugin::content-manager.explorer.create', subject: link.uid },\n { action: 'plugin::content-manager.explorer.read', subject: link.uid },\n ];\n const singleTypesPermissions = [\n { action: 'plugin::content-manager.explorer.read', subject: link.uid },\n ];\n const permissions =\n type === 'collectionTypes' ? collectionTypesPermissions : singleTypesPermissions;\n\n const currentContentTypeConfig = configurations.find(({ uid }) => uid === link.uid);\n\n let search = null;\n\n if (currentContentTypeConfig) {\n const searchParams = {\n page: 1,\n pageSize: currentContentTypeConfig.settings.pageSize,\n sort: `${currentContentTypeConfig.settings.defaultSortBy}:${currentContentTypeConfig.settings.defaultSortOrder}`,\n };\n\n search = stringify(searchParams, { encode: false });\n }\n\n return {\n permissions,\n search,\n kind: link.kind,\n title: link.info.displayName,\n to: `/content-manager/${link.kind === 'collectionType' ? COLLECTION_TYPES : SINGLE_TYPES}/${\n link.uid\n }`,\n uid: link.uid,\n // Used for the list item key in the helper plugin\n name: link.uid,\n isDisplayed: link.isDisplayed,\n } satisfies ContentManagerLink;\n });\n};\n\nexport { useContentManagerInitData };\nexport type { ContentManagerLink };\n"],"names":["MUTATE_COLLECTION_TYPES_LINKS","MUTATE_SINGLE_TYPES_LINKS","HOOKS","getPermissionKey","permission","action","subject","authorizeLinks","links","checkUserHasPermissions","authorizedPermissions","flatMap","permissions","authorizedPermissionKeys","Set","map","filter","some","has","useContentManagerInitData","toggleNotification","useNotification","dispatch","useTypedDispatch","runHookWaterfall","useStrapiApp","state","notifyStatus","useNotifyAT","formatMessage","useIntl","_unstableFormatAPIError","formatAPIError","useAPIErrorHandler","getTranslation","useAuth","isLoadingAuth","isLoading","adminUserId","getAdminUserId","user","useTypedSelector","app","initialDataQuery","useGetInitialDataQuery","undefined","refetchOnMountOrArgChange","useEffect","data","id","defaultMessage","error","type","message","contentTypeSettingsQuery","useGetAllContentTypeSettingsQuery","formatData","useCallback","components","contentTypes","fieldSizes","contentTypeConfigurations","contentStructure","collectionType","collectionTypeLinks","singleType","singleTypeLinks","reduce","acc","model","kind","push","collectionTypeSectionLinks","generateLinks","singleTypeSectionLinks","authorizedLinks","authorizedCollectionTypeLinks","link","authorizedSingleTypeLinks","ctLinks","models","stLinks","contentTypeSchemas","cancelled","then","setInitialData","catch","initialState","configurations","isDisplayed","collectionTypesPermissions","uid","singleTypesPermissions","currentContentTypeConfig","find","search","searchParams","page","pageSize","settings","sort","defaultSortBy","defaultSortOrder","stringify","encode","title","info","displayName","to","COLLECTION_TYPES","SINGLE_TYPES","name"],"mappings":"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"}
@@ -1,11 +1,11 @@
1
1
  import { useEffect, useCallback } from 'react';
2
- import { useNotification, useStrapiApp, useAPIErrorHandler, useAuth } from '@strapi/admin/strapi-admin';
2
+ import { useNotification, useStrapiApp, useAPIErrorHandler, useAuth, getAdminUserId } from '@strapi/admin/strapi-admin';
3
3
  import { useNotifyAT } from '@strapi/design-system';
4
4
  import { stringify } from 'qs';
5
5
  import { useIntl } from 'react-intl';
6
6
  import { COLLECTION_TYPES, SINGLE_TYPES } from '../constants/collections.mjs';
7
7
  import { HOOKS } from '../constants/hooks.mjs';
8
- import { setInitialData } from '../modules/app.mjs';
8
+ import { setInitialData, initialState } from '../modules/app.mjs';
9
9
  import { useTypedDispatch, useTypedSelector } from '../modules/hooks.mjs';
10
10
  import { useGetAllContentTypeSettingsQuery } from '../services/contentTypes.mjs';
11
11
  import { useGetInitialDataQuery } from '../services/init.mjs';
@@ -26,6 +26,8 @@ const useContentManagerInitData = ()=>{
26
26
  const { formatMessage } = useIntl();
27
27
  const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler(getTranslation);
28
28
  const checkUserHasPermissions = useAuth('useContentManagerInitData', (state)=>state.checkUserHasPermissions);
29
+ const isLoadingAuth = useAuth('useContentManagerInitData', (state)=>state.isLoading);
30
+ const adminUserId = useAuth('useContentManagerInitData', (state)=>getAdminUserId(state.user));
29
31
  const state = useTypedSelector((state)=>state['content-manager'].app);
30
32
  const initialDataQuery = useGetInitialDataQuery(undefined, {
31
33
  /**
@@ -101,35 +103,52 @@ const useContentManagerInitData = ()=>{
101
103
  stLinks: authorizedSingleTypeLinks,
102
104
  models: contentTypes
103
105
  });
104
- dispatch(setInitialData({
106
+ return {
107
+ adminUserId,
105
108
  authorizedCollectionTypeLinks: ctLinks,
106
109
  authorizedSingleTypeLinks: stLinks,
107
110
  components,
108
111
  contentStructure,
109
112
  contentTypeSchemas: contentTypes,
110
113
  fieldSizes
111
- }));
114
+ };
112
115
  }, [
116
+ adminUserId,
113
117
  checkUserHasPermissions,
114
- dispatch,
115
118
  runHookWaterfall
116
119
  ]);
117
120
  useEffect(()=>{
121
+ let cancelled = false;
118
122
  if (initialDataQuery.data && contentTypeSettingsQuery.data) {
119
- formatData(initialDataQuery.data.components, initialDataQuery.data.contentTypes, initialDataQuery.data.fieldSizes, contentTypeSettingsQuery.data, initialDataQuery.data.contentStructure).catch((error)=>{
120
- toggleNotification({
121
- type: 'danger',
122
- message: formatAPIError(error)
123
- });
123
+ formatData(initialDataQuery.data.components, initialDataQuery.data.contentTypes, initialDataQuery.data.fieldSizes, contentTypeSettingsQuery.data, initialDataQuery.data.contentStructure).then((data)=>{
124
+ if (!cancelled) {
125
+ dispatch(setInitialData(data));
126
+ }
127
+ }).catch((error)=>{
128
+ if (!cancelled) {
129
+ toggleNotification({
130
+ type: 'danger',
131
+ message: formatAPIError(error)
132
+ });
133
+ }
124
134
  });
125
135
  }
136
+ return ()=>{
137
+ cancelled = true;
138
+ };
126
139
  }, [
140
+ dispatch,
127
141
  formatAPIError,
128
142
  formatData,
129
143
  initialDataQuery.data,
130
144
  contentTypeSettingsQuery.data,
131
145
  toggleNotification
132
146
  ]);
147
+ if (isLoadingAuth || state.adminUserId !== adminUserId) {
148
+ return {
149
+ ...initialState
150
+ };
151
+ }
133
152
  return {
134
153
  ...state
135
154
  };
@@ -1 +1 @@
1
- {"version":3,"file":"useContentManagerInitData.mjs","sources":["../../../admin/src/hooks/useContentManagerInitData.ts"],"sourcesContent":["import { useCallback, useEffect } from 'react';\n\nimport {\n useAuth,\n type Permission,\n useNotification,\n useStrapiApp,\n useAPIErrorHandler,\n} from '@strapi/admin/strapi-admin';\nimport { useNotifyAT } from '@strapi/design-system';\nimport { stringify } from 'qs';\nimport { useIntl } from 'react-intl';\n\nimport { COLLECTION_TYPES, SINGLE_TYPES } from '../constants/collections';\nimport { HOOKS } from '../constants/hooks';\nimport { AppState, setInitialData } from '../modules/app';\nimport { useTypedDispatch, useTypedSelector } from '../modules/hooks';\nimport { useGetAllContentTypeSettingsQuery } from '../services/contentTypes';\nimport { useGetInitialDataQuery } from '../services/init';\nimport { getTranslation } from '../utils/translations';\n\nimport type { Component } from '../../../shared/contracts/components';\nimport type {\n ContentType,\n FindContentTypesSettings,\n} from '../../../shared/contracts/content-types';\nimport type { GetInitData } from '../../../shared/contracts/init';\n\nconst { MUTATE_COLLECTION_TYPES_LINKS, MUTATE_SINGLE_TYPES_LINKS } = HOOKS;\n\ninterface ContentManagerLink {\n permissions: Permission[];\n search: string | null;\n kind: string;\n title: string;\n to: string;\n uid: string;\n name: string;\n isDisplayed: boolean;\n}\n\nconst getPermissionKey = (permission: Pick<Permission, 'action' | 'subject'>) =>\n `${permission.action}::${permission.subject ?? ''}`;\n\nconst authorizeLinks = async (\n links: ContentManagerLink[],\n checkUserHasPermissions: (\n permissions?: Array<Pick<Permission, 'action'> & Partial<Omit<Permission, 'action'>>>\n ) => Promise<Permission[]>\n) => {\n const authorizedPermissions = await checkUserHasPermissions(\n links.flatMap(({ permissions }) => permissions)\n );\n\n const authorizedPermissionKeys = new Set(authorizedPermissions.map(getPermissionKey));\n\n return links.filter(({ permissions }) =>\n permissions.some((permission) => authorizedPermissionKeys.has(getPermissionKey(permission)))\n );\n};\n\nconst useContentManagerInitData = (): AppState => {\n const { toggleNotification } = useNotification();\n const dispatch = useTypedDispatch();\n const runHookWaterfall = useStrapiApp(\n 'useContentManagerInitData',\n (state) => state.runHookWaterfall\n );\n const { notifyStatus } = useNotifyAT();\n const { formatMessage } = useIntl();\n const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler(getTranslation);\n const checkUserHasPermissions = useAuth(\n 'useContentManagerInitData',\n (state) => state.checkUserHasPermissions\n );\n\n const state = useTypedSelector((state) => state['content-manager'].app);\n\n const initialDataQuery = useGetInitialDataQuery(undefined, {\n /**\n * TODO: remove this when the CTB has been refactored to use redux-toolkit-query\n * and it can invalidate the cache on mutation\n */\n refetchOnMountOrArgChange: true,\n });\n\n useEffect(() => {\n if (initialDataQuery.data) {\n notifyStatus(\n formatMessage({\n id: getTranslation('App.schemas.data-loaded'),\n defaultMessage: 'The schemas have been successfully loaded.',\n })\n );\n }\n }, [formatMessage, initialDataQuery.data, notifyStatus]);\n\n useEffect(() => {\n if (initialDataQuery.error) {\n toggleNotification({ type: 'danger', message: formatAPIError(initialDataQuery.error) });\n }\n }, [formatAPIError, initialDataQuery.error, toggleNotification]);\n\n const contentTypeSettingsQuery = useGetAllContentTypeSettingsQuery();\n\n useEffect(() => {\n if (contentTypeSettingsQuery.error) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(contentTypeSettingsQuery.error),\n });\n }\n }, [formatAPIError, contentTypeSettingsQuery.error, toggleNotification]);\n\n const formatData = useCallback(\n async (\n components: Component[],\n contentTypes: ContentType[],\n fieldSizes: GetInitData.Response['data']['fieldSizes'],\n contentTypeConfigurations: FindContentTypesSettings.Response['data'],\n contentStructure: GetInitData.Response['data']['contentStructure']\n ) => {\n /**\n * We group these by the two types we support. We do with an object because we can use default\n * values of arrays to make sure we always have an array to manipulate further on if, for example,\n * a user has not made any single types.\n *\n * This means we have to manually add new content types to this hook if we add a new type – but\n * the safety is worth it.\n */\n const { collectionType: collectionTypeLinks, singleType: singleTypeLinks } =\n contentTypes.reduce<{\n collectionType: ContentType[];\n singleType: ContentType[];\n }>(\n (acc, model) => {\n acc[model.kind].push(model);\n return acc;\n },\n {\n collectionType: [],\n singleType: [],\n }\n );\n const collectionTypeSectionLinks = generateLinks(\n collectionTypeLinks,\n 'collectionTypes',\n contentTypeConfigurations\n );\n const singleTypeSectionLinks = generateLinks(singleTypeLinks, 'singleTypes');\n\n const authorizedLinks = await authorizeLinks(\n [...collectionTypeSectionLinks, ...singleTypeSectionLinks],\n checkUserHasPermissions\n );\n const authorizedCollectionTypeLinks = authorizedLinks.filter(\n (link) => link.kind === 'collectionType'\n );\n const authorizedSingleTypeLinks = authorizedLinks.filter(\n (link) => link.kind === 'singleType'\n );\n const { ctLinks } = runHookWaterfall(MUTATE_COLLECTION_TYPES_LINKS, {\n ctLinks: authorizedCollectionTypeLinks,\n models: contentTypes,\n });\n const { stLinks } = runHookWaterfall(MUTATE_SINGLE_TYPES_LINKS, {\n stLinks: authorizedSingleTypeLinks,\n models: contentTypes,\n });\n\n dispatch(\n setInitialData({\n authorizedCollectionTypeLinks: ctLinks,\n authorizedSingleTypeLinks: stLinks,\n components,\n contentStructure,\n contentTypeSchemas: contentTypes,\n fieldSizes,\n })\n );\n },\n [checkUserHasPermissions, dispatch, runHookWaterfall]\n );\n\n useEffect(() => {\n if (initialDataQuery.data && contentTypeSettingsQuery.data) {\n formatData(\n initialDataQuery.data.components,\n initialDataQuery.data.contentTypes,\n initialDataQuery.data.fieldSizes,\n contentTypeSettingsQuery.data,\n initialDataQuery.data.contentStructure\n ).catch((error) => {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(error),\n });\n });\n }\n }, [\n formatAPIError,\n formatData,\n initialDataQuery.data,\n contentTypeSettingsQuery.data,\n toggleNotification,\n ]);\n\n return { ...state };\n};\n\nconst generateLinks = (\n links: ContentType[],\n type: 'collectionTypes' | 'singleTypes',\n configurations: FindContentTypesSettings.Response['data'] = []\n) => {\n return links\n .filter((link) => link.isDisplayed)\n .map((link) => {\n const collectionTypesPermissions = [\n { action: 'plugin::content-manager.explorer.create', subject: link.uid },\n { action: 'plugin::content-manager.explorer.read', subject: link.uid },\n ];\n const singleTypesPermissions = [\n { action: 'plugin::content-manager.explorer.read', subject: link.uid },\n ];\n const permissions =\n type === 'collectionTypes' ? collectionTypesPermissions : singleTypesPermissions;\n\n const currentContentTypeConfig = configurations.find(({ uid }) => uid === link.uid);\n\n let search = null;\n\n if (currentContentTypeConfig) {\n const searchParams = {\n page: 1,\n pageSize: currentContentTypeConfig.settings.pageSize,\n sort: `${currentContentTypeConfig.settings.defaultSortBy}:${currentContentTypeConfig.settings.defaultSortOrder}`,\n };\n\n search = stringify(searchParams, { encode: false });\n }\n\n return {\n permissions,\n search,\n kind: link.kind,\n title: link.info.displayName,\n to: `/content-manager/${link.kind === 'collectionType' ? COLLECTION_TYPES : SINGLE_TYPES}/${\n link.uid\n }`,\n uid: link.uid,\n // Used for the list item key in the helper plugin\n name: link.uid,\n isDisplayed: link.isDisplayed,\n } satisfies ContentManagerLink;\n });\n};\n\nexport { useContentManagerInitData };\nexport type { ContentManagerLink };\n"],"names":["MUTATE_COLLECTION_TYPES_LINKS","MUTATE_SINGLE_TYPES_LINKS","HOOKS","getPermissionKey","permission","action","subject","authorizeLinks","links","checkUserHasPermissions","authorizedPermissions","flatMap","permissions","authorizedPermissionKeys","Set","map","filter","some","has","useContentManagerInitData","toggleNotification","useNotification","dispatch","useTypedDispatch","runHookWaterfall","useStrapiApp","state","notifyStatus","useNotifyAT","formatMessage","useIntl","_unstableFormatAPIError","formatAPIError","useAPIErrorHandler","getTranslation","useAuth","useTypedSelector","app","initialDataQuery","useGetInitialDataQuery","undefined","refetchOnMountOrArgChange","useEffect","data","id","defaultMessage","error","type","message","contentTypeSettingsQuery","useGetAllContentTypeSettingsQuery","formatData","useCallback","components","contentTypes","fieldSizes","contentTypeConfigurations","contentStructure","collectionType","collectionTypeLinks","singleType","singleTypeLinks","reduce","acc","model","kind","push","collectionTypeSectionLinks","generateLinks","singleTypeSectionLinks","authorizedLinks","authorizedCollectionTypeLinks","link","authorizedSingleTypeLinks","ctLinks","models","stLinks","setInitialData","contentTypeSchemas","catch","configurations","isDisplayed","collectionTypesPermissions","uid","singleTypesPermissions","currentContentTypeConfig","find","search","searchParams","page","pageSize","settings","sort","defaultSortBy","defaultSortOrder","stringify","encode","title","info","displayName","to","COLLECTION_TYPES","SINGLE_TYPES","name"],"mappings":";;;;;;;;;;;;;AA4BA,MAAM,EAAEA,6BAA6B,EAAEC,yBAAyB,EAAE,GAAGC,KAAAA;AAarE,MAAMC,gBAAAA,GAAmB,CAACC,UAAAA,GACxB,CAAA,EAAGA,UAAAA,CAAWC,MAAM,CAAC,EAAE,EAAED,UAAAA,CAAWE,OAAO,IAAI,EAAA,CAAA,CAAI;AAErD,MAAMC,cAAAA,GAAiB,OACrBC,KAAAA,EACAC,uBAAAA,GAAAA;IAIA,MAAMC,qBAAAA,GAAwB,MAAMD,uBAAAA,CAClCD,KAAAA,CAAMG,OAAO,CAAC,CAAC,EAAEC,WAAW,EAAE,GAAKA,WAAAA,CAAAA,CAAAA;AAGrC,IAAA,MAAMC,wBAAAA,GAA2B,IAAIC,GAAAA,CAAIJ,qBAAAA,CAAsBK,GAAG,CAACZ,gBAAAA,CAAAA,CAAAA;AAEnE,IAAA,OAAOK,MAAMQ,MAAM,CAAC,CAAC,EAAEJ,WAAW,EAAE,GAClCA,WAAAA,CAAYK,IAAI,CAAC,CAACb,UAAAA,GAAeS,wBAAAA,CAAyBK,GAAG,CAACf,gBAAAA,CAAiBC,UAAAA,CAAAA,CAAAA,CAAAA,CAAAA;AAEnF,CAAA;AAEA,MAAMe,yBAAAA,GAA4B,IAAA;IAChC,MAAM,EAAEC,kBAAkB,EAAE,GAAGC,eAAAA,EAAAA;AAC/B,IAAA,MAAMC,QAAAA,GAAWC,gBAAAA,EAAAA;AACjB,IAAA,MAAMC,mBAAmBC,YAAAA,CACvB,2BAAA,EACA,CAACC,KAAAA,GAAUA,MAAMF,gBAAgB,CAAA;IAEnC,MAAM,EAAEG,YAAY,EAAE,GAAGC,WAAAA,EAAAA;IACzB,MAAM,EAAEC,aAAa,EAAE,GAAGC,OAAAA,EAAAA;AAC1B,IAAA,MAAM,EAAEC,uBAAAA,EAAyBC,cAAc,EAAE,GAAGC,kBAAAA,CAAmBC,cAAAA,CAAAA;AACvE,IAAA,MAAMzB,0BAA0B0B,OAAAA,CAC9B,2BAAA,EACA,CAACT,KAAAA,GAAUA,MAAMjB,uBAAuB,CAAA;IAG1C,MAAMiB,KAAAA,GAAQU,iBAAiB,CAACV,KAAAA,GAAUA,KAAK,CAAC,iBAAA,CAAkB,CAACW,GAAG,CAAA;IAEtE,MAAMC,gBAAAA,GAAmBC,uBAAuBC,SAAAA,EAAW;AACzD;;;AAGC,QACDC,yBAAAA,EAA2B;AAC7B,KAAA,CAAA;IAEAC,SAAAA,CAAU,IAAA;QACR,IAAIJ,gBAAAA,CAAiBK,IAAI,EAAE;AACzBhB,YAAAA,YAAAA,CACEE,aAAAA,CAAc;AACZe,gBAAAA,EAAAA,EAAIV,cAAAA,CAAe,yBAAA,CAAA;gBACnBW,cAAAA,EAAgB;AAClB,aAAA,CAAA,CAAA;AAEJ,QAAA;IACF,CAAA,EAAG;AAAChB,QAAAA,aAAAA;AAAeS,QAAAA,gBAAAA,CAAiBK,IAAI;AAAEhB,QAAAA;AAAa,KAAA,CAAA;IAEvDe,SAAAA,CAAU,IAAA;QACR,IAAIJ,gBAAAA,CAAiBQ,KAAK,EAAE;YAC1B1B,kBAAAA,CAAmB;gBAAE2B,IAAAA,EAAM,QAAA;gBAAUC,OAAAA,EAAShB,cAAAA,CAAeM,iBAAiBQ,KAAK;AAAE,aAAA,CAAA;AACvF,QAAA;IACF,CAAA,EAAG;AAACd,QAAAA,cAAAA;AAAgBM,QAAAA,gBAAAA,CAAiBQ,KAAK;AAAE1B,QAAAA;AAAmB,KAAA,CAAA;AAE/D,IAAA,MAAM6B,wBAAAA,GAA2BC,iCAAAA,EAAAA;IAEjCR,SAAAA,CAAU,IAAA;QACR,IAAIO,wBAAAA,CAAyBH,KAAK,EAAE;YAClC1B,kBAAAA,CAAmB;gBACjB2B,IAAAA,EAAM,QAAA;gBACNC,OAAAA,EAAShB,cAAAA,CAAeiB,yBAAyBH,KAAK;AACxD,aAAA,CAAA;AACF,QAAA;IACF,CAAA,EAAG;AAACd,QAAAA,cAAAA;AAAgBiB,QAAAA,wBAAAA,CAAyBH,KAAK;AAAE1B,QAAAA;AAAmB,KAAA,CAAA;AAEvE,IAAA,MAAM+B,aAAaC,WAAAA,CACjB,OACEC,UAAAA,EACAC,YAAAA,EACAC,YACAC,yBAAAA,EACAC,gBAAAA,GAAAA;AAEA;;;;;;;AAOC,UACD,MAAM,EAAEC,cAAAA,EAAgBC,mBAAmB,EAAEC,UAAAA,EAAYC,eAAe,EAAE,GACxEP,YAAAA,CAAaQ,MAAM,CAIjB,CAACC,GAAAA,EAAKC,KAAAA,GAAAA;AACJD,YAAAA,GAAG,CAACC,KAAAA,CAAMC,IAAI,CAAC,CAACC,IAAI,CAACF,KAAAA,CAAAA;YACrB,OAAOD,GAAAA;QACT,CAAA,EACA;AACEL,YAAAA,cAAAA,EAAgB,EAAE;AAClBE,YAAAA,UAAAA,EAAY;AACd,SAAA,CAAA;QAEJ,MAAMO,0BAAAA,GAA6BC,aAAAA,CACjCT,mBAAAA,EACA,iBAAA,EACAH,yBAAAA,CAAAA;QAEF,MAAMa,sBAAAA,GAAyBD,cAAcP,eAAAA,EAAiB,aAAA,CAAA;QAE9D,MAAMS,eAAAA,GAAkB,MAAM/D,cAAAA,CAC5B;AAAI4D,YAAAA,GAAAA,0BAAAA;AAA+BE,YAAAA,GAAAA;SAAuB,EAC1D5D,uBAAAA,CAAAA;QAEF,MAAM8D,6BAAAA,GAAgCD,gBAAgBtD,MAAM,CAC1D,CAACwD,IAAAA,GAASA,IAAAA,CAAKP,IAAI,KAAK,gBAAA,CAAA;QAE1B,MAAMQ,yBAAAA,GAA4BH,gBAAgBtD,MAAM,CACtD,CAACwD,IAAAA,GAASA,IAAAA,CAAKP,IAAI,KAAK,YAAA,CAAA;AAE1B,QAAA,MAAM,EAAES,OAAO,EAAE,GAAGlD,iBAAiBxB,6BAAAA,EAA+B;YAClE0E,OAAAA,EAASH,6BAAAA;YACTI,MAAAA,EAAQrB;AACV,SAAA,CAAA;AACA,QAAA,MAAM,EAAEsB,OAAO,EAAE,GAAGpD,iBAAiBvB,yBAAAA,EAA2B;YAC9D2E,OAAAA,EAASH,yBAAAA;YACTE,MAAAA,EAAQrB;AACV,SAAA,CAAA;AAEAhC,QAAAA,QAAAA,CACEuD,cAAAA,CAAe;YACbN,6BAAAA,EAA+BG,OAAAA;YAC/BD,yBAAAA,EAA2BG,OAAAA;AAC3BvB,YAAAA,UAAAA;AACAI,YAAAA,gBAAAA;YACAqB,kBAAAA,EAAoBxB,YAAAA;AACpBC,YAAAA;AACF,SAAA,CAAA,CAAA;IAEJ,CAAA,EACA;AAAC9C,QAAAA,uBAAAA;AAAyBa,QAAAA,QAAAA;AAAUE,QAAAA;AAAiB,KAAA,CAAA;IAGvDkB,SAAAA,CAAU,IAAA;AACR,QAAA,IAAIJ,gBAAAA,CAAiBK,IAAI,IAAIM,wBAAAA,CAAyBN,IAAI,EAAE;YAC1DQ,UAAAA,CACEb,gBAAAA,CAAiBK,IAAI,CAACU,UAAU,EAChCf,iBAAiBK,IAAI,CAACW,YAAY,EAClChB,gBAAAA,CAAiBK,IAAI,CAACY,UAAU,EAChCN,wBAAAA,CAAyBN,IAAI,EAC7BL,gBAAAA,CAAiBK,IAAI,CAACc,gBAAgB,CAAA,CACtCsB,KAAK,CAAC,CAACjC,KAAAA,GAAAA;gBACP1B,kBAAAA,CAAmB;oBACjB2B,IAAAA,EAAM,QAAA;AACNC,oBAAAA,OAAAA,EAAShB,cAAAA,CAAec,KAAAA;AAC1B,iBAAA,CAAA;AACF,YAAA,CAAA,CAAA;AACF,QAAA;IACF,CAAA,EAAG;AACDd,QAAAA,cAAAA;AACAmB,QAAAA,UAAAA;AACAb,QAAAA,gBAAAA,CAAiBK,IAAI;AACrBM,QAAAA,wBAAAA,CAAyBN,IAAI;AAC7BvB,QAAAA;AACD,KAAA,CAAA;IAED,OAAO;AAAE,QAAA,GAAGM;AAAM,KAAA;AACpB;AAEA,MAAM0C,aAAAA,GAAgB,CACpB5D,KAAAA,EACAuC,IAAAA,EACAiC,iBAA4D,EAAE,GAAA;IAE9D,OAAOxE,KAAAA,CACJQ,MAAM,CAAC,CAACwD,IAAAA,GAASA,KAAKS,WAAW,CAAA,CACjClE,GAAG,CAAC,CAACyD,IAAAA,GAAAA;AACJ,QAAA,MAAMU,0BAAAA,GAA6B;AACjC,YAAA;gBAAE7E,MAAAA,EAAQ,yCAAA;AAA2CC,gBAAAA,OAAAA,EAASkE,KAAKW;AAAI,aAAA;AACvE,YAAA;gBAAE9E,MAAAA,EAAQ,uCAAA;AAAyCC,gBAAAA,OAAAA,EAASkE,KAAKW;AAAI;AACtE,SAAA;AACD,QAAA,MAAMC,sBAAAA,GAAyB;AAC7B,YAAA;gBAAE/E,MAAAA,EAAQ,uCAAA;AAAyCC,gBAAAA,OAAAA,EAASkE,KAAKW;AAAI;AACtE,SAAA;QACD,MAAMvE,WAAAA,GACJmC,IAAAA,KAAS,iBAAA,GAAoBmC,0BAAAA,GAA6BE,sBAAAA;QAE5D,MAAMC,wBAAAA,GAA2BL,cAAAA,CAAeM,IAAI,CAAC,CAAC,EAAEH,GAAG,EAAE,GAAKA,GAAAA,KAAQX,IAAAA,CAAKW,GAAG,CAAA;AAElF,QAAA,IAAII,MAAAA,GAAS,IAAA;AAEb,QAAA,IAAIF,wBAAAA,EAA0B;AAC5B,YAAA,MAAMG,YAAAA,GAAe;gBACnBC,IAAAA,EAAM,CAAA;gBACNC,QAAAA,EAAUL,wBAAAA,CAAyBM,QAAQ,CAACD,QAAQ;AACpDE,gBAAAA,IAAAA,EAAM,CAAA,EAAGP,wBAAAA,CAAyBM,QAAQ,CAACE,aAAa,CAAC,CAAC,EAAER,wBAAAA,CAAyBM,QAAQ,CAACG,gBAAgB,CAAA;AAChH,aAAA;AAEAP,YAAAA,MAAAA,GAASQ,UAAUP,YAAAA,EAAc;gBAAEQ,MAAAA,EAAQ;AAAM,aAAA,CAAA;AACnD,QAAA;QAEA,OAAO;AACLpF,YAAAA,WAAAA;AACA2E,YAAAA,MAAAA;AACAtB,YAAAA,IAAAA,EAAMO,KAAKP,IAAI;YACfgC,KAAAA,EAAOzB,IAAAA,CAAK0B,IAAI,CAACC,WAAW;AAC5BC,YAAAA,EAAAA,EAAI,CAAC,iBAAiB,EAAE5B,IAAAA,CAAKP,IAAI,KAAK,gBAAA,GAAmBoC,gBAAAA,GAAmBC,YAAAA,CAAa,CAAC,EACxF9B,IAAAA,CAAKW,GAAG,CAAA,CACR;AACFA,YAAAA,GAAAA,EAAKX,KAAKW,GAAG;;AAEboB,YAAAA,IAAAA,EAAM/B,KAAKW,GAAG;AACdF,YAAAA,WAAAA,EAAaT,KAAKS;AACpB,SAAA;AACF,IAAA,CAAA,CAAA;AACJ,CAAA;;;;"}
1
+ {"version":3,"file":"useContentManagerInitData.mjs","sources":["../../../admin/src/hooks/useContentManagerInitData.ts"],"sourcesContent":["import { useCallback, useEffect } from 'react';\n\nimport {\n getAdminUserId,\n useAuth,\n type Permission,\n useNotification,\n useStrapiApp,\n useAPIErrorHandler,\n} from '@strapi/admin/strapi-admin';\nimport { useNotifyAT } from '@strapi/design-system';\nimport { stringify } from 'qs';\nimport { useIntl } from 'react-intl';\n\nimport { COLLECTION_TYPES, SINGLE_TYPES } from '../constants/collections';\nimport { HOOKS } from '../constants/hooks';\nimport { AppState, initialState, setInitialData } from '../modules/app';\nimport { useTypedDispatch, useTypedSelector } from '../modules/hooks';\nimport { useGetAllContentTypeSettingsQuery } from '../services/contentTypes';\nimport { useGetInitialDataQuery } from '../services/init';\nimport { getTranslation } from '../utils/translations';\n\nimport type { Component } from '../../../shared/contracts/components';\nimport type {\n ContentType,\n FindContentTypesSettings,\n} from '../../../shared/contracts/content-types';\nimport type { GetInitData } from '../../../shared/contracts/init';\n\nconst { MUTATE_COLLECTION_TYPES_LINKS, MUTATE_SINGLE_TYPES_LINKS } = HOOKS;\n\ninterface ContentManagerLink {\n permissions: Permission[];\n search: string | null;\n kind: string;\n title: string;\n to: string;\n uid: string;\n name: string;\n isDisplayed: boolean;\n}\n\nconst getPermissionKey = (permission: Pick<Permission, 'action' | 'subject'>) =>\n `${permission.action}::${permission.subject ?? ''}`;\n\nconst authorizeLinks = async (\n links: ContentManagerLink[],\n checkUserHasPermissions: (\n permissions?: Array<Pick<Permission, 'action'> & Partial<Omit<Permission, 'action'>>>\n ) => Promise<Permission[]>\n) => {\n const authorizedPermissions = await checkUserHasPermissions(\n links.flatMap(({ permissions }) => permissions)\n );\n\n const authorizedPermissionKeys = new Set(authorizedPermissions.map(getPermissionKey));\n\n return links.filter(({ permissions }) =>\n permissions.some((permission) => authorizedPermissionKeys.has(getPermissionKey(permission)))\n );\n};\n\nconst useContentManagerInitData = (): AppState => {\n const { toggleNotification } = useNotification();\n const dispatch = useTypedDispatch();\n const runHookWaterfall = useStrapiApp(\n 'useContentManagerInitData',\n (state) => state.runHookWaterfall\n );\n const { notifyStatus } = useNotifyAT();\n const { formatMessage } = useIntl();\n const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler(getTranslation);\n const checkUserHasPermissions = useAuth(\n 'useContentManagerInitData',\n (state) => state.checkUserHasPermissions\n );\n const isLoadingAuth = useAuth('useContentManagerInitData', (state) => state.isLoading);\n const adminUserId = useAuth('useContentManagerInitData', (state) => getAdminUserId(state.user));\n\n const state = useTypedSelector((state) => state['content-manager'].app);\n\n const initialDataQuery = useGetInitialDataQuery(undefined, {\n /**\n * TODO: remove this when the CTB has been refactored to use redux-toolkit-query\n * and it can invalidate the cache on mutation\n */\n refetchOnMountOrArgChange: true,\n });\n\n useEffect(() => {\n if (initialDataQuery.data) {\n notifyStatus(\n formatMessage({\n id: getTranslation('App.schemas.data-loaded'),\n defaultMessage: 'The schemas have been successfully loaded.',\n })\n );\n }\n }, [formatMessage, initialDataQuery.data, notifyStatus]);\n\n useEffect(() => {\n if (initialDataQuery.error) {\n toggleNotification({ type: 'danger', message: formatAPIError(initialDataQuery.error) });\n }\n }, [formatAPIError, initialDataQuery.error, toggleNotification]);\n\n const contentTypeSettingsQuery = useGetAllContentTypeSettingsQuery();\n\n useEffect(() => {\n if (contentTypeSettingsQuery.error) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(contentTypeSettingsQuery.error),\n });\n }\n }, [formatAPIError, contentTypeSettingsQuery.error, toggleNotification]);\n\n const formatData = useCallback(\n async (\n components: Component[],\n contentTypes: ContentType[],\n fieldSizes: GetInitData.Response['data']['fieldSizes'],\n contentTypeConfigurations: FindContentTypesSettings.Response['data'],\n contentStructure: GetInitData.Response['data']['contentStructure']\n ) => {\n /**\n * We group these by the two types we support. We do with an object because we can use default\n * values of arrays to make sure we always have an array to manipulate further on if, for example,\n * a user has not made any single types.\n *\n * This means we have to manually add new content types to this hook if we add a new type – but\n * the safety is worth it.\n */\n const { collectionType: collectionTypeLinks, singleType: singleTypeLinks } =\n contentTypes.reduce<{\n collectionType: ContentType[];\n singleType: ContentType[];\n }>(\n (acc, model) => {\n acc[model.kind].push(model);\n return acc;\n },\n {\n collectionType: [],\n singleType: [],\n }\n );\n const collectionTypeSectionLinks = generateLinks(\n collectionTypeLinks,\n 'collectionTypes',\n contentTypeConfigurations\n );\n const singleTypeSectionLinks = generateLinks(singleTypeLinks, 'singleTypes');\n\n const authorizedLinks = await authorizeLinks(\n [...collectionTypeSectionLinks, ...singleTypeSectionLinks],\n checkUserHasPermissions\n );\n const authorizedCollectionTypeLinks = authorizedLinks.filter(\n (link) => link.kind === 'collectionType'\n );\n const authorizedSingleTypeLinks = authorizedLinks.filter(\n (link) => link.kind === 'singleType'\n );\n const { ctLinks } = runHookWaterfall(MUTATE_COLLECTION_TYPES_LINKS, {\n ctLinks: authorizedCollectionTypeLinks,\n models: contentTypes,\n });\n const { stLinks } = runHookWaterfall(MUTATE_SINGLE_TYPES_LINKS, {\n stLinks: authorizedSingleTypeLinks,\n models: contentTypes,\n });\n\n return {\n adminUserId,\n authorizedCollectionTypeLinks: ctLinks,\n authorizedSingleTypeLinks: stLinks,\n components,\n contentStructure,\n contentTypeSchemas: contentTypes,\n fieldSizes,\n };\n },\n [adminUserId, checkUserHasPermissions, runHookWaterfall]\n );\n\n useEffect(() => {\n let cancelled = false;\n\n if (initialDataQuery.data && contentTypeSettingsQuery.data) {\n formatData(\n initialDataQuery.data.components,\n initialDataQuery.data.contentTypes,\n initialDataQuery.data.fieldSizes,\n contentTypeSettingsQuery.data,\n initialDataQuery.data.contentStructure\n )\n .then((data) => {\n if (!cancelled) {\n dispatch(setInitialData(data));\n }\n })\n .catch((error) => {\n if (!cancelled) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(error),\n });\n }\n });\n }\n\n return () => {\n cancelled = true;\n };\n }, [\n dispatch,\n formatAPIError,\n formatData,\n initialDataQuery.data,\n contentTypeSettingsQuery.data,\n toggleNotification,\n ]);\n\n if (isLoadingAuth || state.adminUserId !== adminUserId) {\n return { ...initialState };\n }\n\n return { ...state };\n};\n\nconst generateLinks = (\n links: ContentType[],\n type: 'collectionTypes' | 'singleTypes',\n configurations: FindContentTypesSettings.Response['data'] = []\n) => {\n return links\n .filter((link) => link.isDisplayed)\n .map((link) => {\n const collectionTypesPermissions = [\n { action: 'plugin::content-manager.explorer.create', subject: link.uid },\n { action: 'plugin::content-manager.explorer.read', subject: link.uid },\n ];\n const singleTypesPermissions = [\n { action: 'plugin::content-manager.explorer.read', subject: link.uid },\n ];\n const permissions =\n type === 'collectionTypes' ? collectionTypesPermissions : singleTypesPermissions;\n\n const currentContentTypeConfig = configurations.find(({ uid }) => uid === link.uid);\n\n let search = null;\n\n if (currentContentTypeConfig) {\n const searchParams = {\n page: 1,\n pageSize: currentContentTypeConfig.settings.pageSize,\n sort: `${currentContentTypeConfig.settings.defaultSortBy}:${currentContentTypeConfig.settings.defaultSortOrder}`,\n };\n\n search = stringify(searchParams, { encode: false });\n }\n\n return {\n permissions,\n search,\n kind: link.kind,\n title: link.info.displayName,\n to: `/content-manager/${link.kind === 'collectionType' ? COLLECTION_TYPES : SINGLE_TYPES}/${\n link.uid\n }`,\n uid: link.uid,\n // Used for the list item key in the helper plugin\n name: link.uid,\n isDisplayed: link.isDisplayed,\n } satisfies ContentManagerLink;\n });\n};\n\nexport { useContentManagerInitData };\nexport type { ContentManagerLink };\n"],"names":["MUTATE_COLLECTION_TYPES_LINKS","MUTATE_SINGLE_TYPES_LINKS","HOOKS","getPermissionKey","permission","action","subject","authorizeLinks","links","checkUserHasPermissions","authorizedPermissions","flatMap","permissions","authorizedPermissionKeys","Set","map","filter","some","has","useContentManagerInitData","toggleNotification","useNotification","dispatch","useTypedDispatch","runHookWaterfall","useStrapiApp","state","notifyStatus","useNotifyAT","formatMessage","useIntl","_unstableFormatAPIError","formatAPIError","useAPIErrorHandler","getTranslation","useAuth","isLoadingAuth","isLoading","adminUserId","getAdminUserId","user","useTypedSelector","app","initialDataQuery","useGetInitialDataQuery","undefined","refetchOnMountOrArgChange","useEffect","data","id","defaultMessage","error","type","message","contentTypeSettingsQuery","useGetAllContentTypeSettingsQuery","formatData","useCallback","components","contentTypes","fieldSizes","contentTypeConfigurations","contentStructure","collectionType","collectionTypeLinks","singleType","singleTypeLinks","reduce","acc","model","kind","push","collectionTypeSectionLinks","generateLinks","singleTypeSectionLinks","authorizedLinks","authorizedCollectionTypeLinks","link","authorizedSingleTypeLinks","ctLinks","models","stLinks","contentTypeSchemas","cancelled","then","setInitialData","catch","initialState","configurations","isDisplayed","collectionTypesPermissions","uid","singleTypesPermissions","currentContentTypeConfig","find","search","searchParams","page","pageSize","settings","sort","defaultSortBy","defaultSortOrder","stringify","encode","title","info","displayName","to","COLLECTION_TYPES","SINGLE_TYPES","name"],"mappings":"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"}
@@ -170,10 +170,9 @@ const getValidationSchema = (schema, components)=>{
170
170
  * `pluginOptions.i18n.localized` is `undefined` count as non-localized
171
171
  * (an attribute created without the i18n plugin has no i18n options at
172
172
  * all but is still inherited at save by `copyNonLocalizedFields`).
173
- * - scalar or media — `component` / `dynamiczone` / `relation` are excluded
174
- * because the server doesn't populate them in `availableLocales` either,
175
- * so there'd be nothing to copy from.
176
- */ const nonLocalizedScalarAndMediaFields = React__namespace.useMemo(()=>{
173
+ * - scalar, media, component, or dynamic zone — relations are excluded
174
+ * because the server doesn't populate them in `availableLocales` either.
175
+ */ const nonLocalizedFieldsToInherit = React__namespace.useMemo(()=>{
177
176
  if (!schema?.attributes) {
178
177
  return [];
179
178
  }
@@ -182,7 +181,7 @@ const getValidationSchema = (schema, components)=>{
182
181
  if (isLocalizedAttribute(attribute)) {
183
182
  return false;
184
183
  }
185
- return attribute.type !== 'component' && attribute.type !== 'dynamiczone' && attribute.type !== 'relation';
184
+ return attribute.type !== 'relation';
186
185
  });
187
186
  }, [
188
187
  schema
@@ -195,12 +194,11 @@ const getValidationSchema = (schema, components)=>{
195
194
  *
196
195
  * We also prepare the form for new documents, so we need to:
197
196
  * - set default values on fields
198
- * - inherit non-localized scalar/media values from a sibling locale.
199
- * Scope is intentionally limited to scalars and media — that is exactly
200
- * what the server populates into `meta.availableLocales` (see
197
+ * - inherit non-localized scalar/media/component/dynamic-zone values from a sibling locale.
198
+ * Scope matches what the server populates into `meta.availableLocales` (see
201
199
  * `packages/core/content-manager/server/src/services/document-metadata.ts`).
202
- * Components, dynamic zones, and relations are not in that payload; the
203
- * server fills them at save time via `copyNonLocalizedFields` (in
200
+ * Relations are not in that payload; the server fills them at save time via
201
+ * `copyNonLocalizedFields` (in
204
202
  * `packages/core/core/src/services/document-service/internationalization.ts`)
205
203
  * when the new locale row is first created.
206
204
  * Baking the inheritance into `initialValues` here is what lets it survive
@@ -229,8 +227,8 @@ const getValidationSchema = (schema, components)=>{
229
227
  // - Avoids coupling this hook to `useGetLocalesQuery` just to find the
230
228
  // default locale.
231
229
  const sibling = meta?.availableLocales?.[0];
232
- if (sibling && nonLocalizedScalarAndMediaFields.length > 0) {
233
- const inherited = nonLocalizedScalarAndMediaFields.reduce((acc, name)=>{
230
+ if (sibling && nonLocalizedFieldsToInherit.length > 0) {
231
+ const inherited = nonLocalizedFieldsToInherit.reduce((acc, name)=>{
234
232
  if (name in sibling) {
235
233
  acc[name] = sibling[name];
236
234
  }
@@ -248,7 +246,7 @@ const getValidationSchema = (schema, components)=>{
248
246
  schema,
249
247
  components,
250
248
  meta?.availableLocales,
251
- nonLocalizedScalarAndMediaFields
249
+ nonLocalizedFieldsToInherit
252
250
  ]);
253
251
  const isLoading = isLoadingDocument || isFetchingDocument || isLoadingSchema;
254
252
  const hasError = !!error;
@@ -1 +1 @@
1
- {"version":3,"file":"useDocument.js","sources":["../../../admin/src/hooks/useDocument.ts"],"sourcesContent":["/**\n * This hook doesn't use a context provider because we fetch directly from the server,\n * this sounds expensive but actually, it's really not. Because we have redux-toolkit-query\n * being a cache layer so if nothing invalidates the cache, we don't fetch again.\n *\n * The network is deduplicated, but the work done inside the hook is not: it can be mounted\n * by hundreds of fields at once, so anything expensive it derives must be cached outside of\n * the hook instance (see `getValidationSchema`).\n */\n\nimport * as React from 'react';\n\nimport {\n useNotification,\n useAPIErrorHandler,\n useQueryParams,\n FormErrors,\n getYupValidationErrors,\n useForm,\n} from '@strapi/admin/strapi-admin';\nimport { useIntl } from 'react-intl';\nimport { useParams } from 'react-router-dom';\nimport { ValidationError } from 'yup';\n\nimport { SINGLE_TYPES } from '../constants/collections';\nimport { type AnyData, transformDocument } from '../pages/EditView/utils/data';\nimport { createDefaultForm } from '../pages/EditView/utils/forms';\nimport { useGetDocumentQuery } from '../services/documents';\nimport { buildValidParams } from '../utils/api';\nimport { createYupSchema } from '../utils/validation';\n\nimport { useContentTypeSchema, ComponentsDictionary } from './useContentTypeSchema';\nimport { useDocumentLayout } from './useDocumentLayout';\n\nimport type { FindOne } from '../../../shared/contracts/collection-types';\nimport type { ContentType } from '../../../shared/contracts/content-types';\nimport type { Modules } from '@strapi/types';\n\ninterface UseDocumentArgs {\n collectionType: string;\n model: string;\n documentId?: string;\n params?: object;\n}\n\ntype UseDocumentOpts = Parameters<typeof useGetDocumentQuery>[1];\n\ntype Document = FindOne.Response['data'];\n\ntype Schema = ContentType;\n\ntype ValidationSchema = ReturnType<typeof createYupSchema>;\n\n// Building the yup schema of a model clones a schema for every nested component and dynamic\n// zone: on large models it takes seconds and gigabytes. `schema` and `components` identities\n// are shared across hook instances (see `useContentTypeSchema`), so build it once per pair,\n// and only when something actually validates.\nconst validationSchemaCache = new WeakMap<\n Schema,\n WeakMap<ComponentsDictionary, ValidationSchema>\n>();\n\nconst getValidationSchema = (schema: Schema, components: ComponentsDictionary) => {\n let byComponents = validationSchemaCache.get(schema);\n\n if (!byComponents) {\n byComponents = new WeakMap();\n validationSchemaCache.set(schema, byComponents);\n }\n\n let validationSchema = byComponents.get(components);\n\n if (!validationSchema) {\n validationSchema = createYupSchema(schema.attributes, components);\n byComponents.set(components, validationSchema);\n }\n\n return validationSchema;\n};\n\ntype UseDocument = (\n args: UseDocumentArgs,\n opts?: UseDocumentOpts\n) => {\n /**\n * These are the schemas of the components used in the content type, organised\n * by their uid.\n */\n components: ComponentsDictionary;\n document?: Document;\n meta?: FindOne.Response['meta'];\n isLoading: boolean;\n /**\n * This is the schema of the content type, it is not the same as the layout.\n */\n schema?: Schema;\n schemas?: Schema[];\n hasError?: boolean;\n refetch: () => void;\n validate: (document: Document) => null | FormErrors;\n /**\n * Get the document's title\n */\n getTitle: (mainField: string) => string;\n /**\n * Get the initial form values for the document\n */\n getInitialFormValues: (isCreatingDocument?: boolean) => AnyData | undefined;\n};\n\n/**\n * Mirrors the server's `isLocalizedAttribute` in\n * `packages/plugins/i18n/server/src/services/content-types.ts`: an attribute\n * counts as localized only when `pluginOptions.i18n.localized` is explicitly\n * `true`. Both `false` and `undefined` mean \"non-localized\" — important here\n * because attributes created without the i18n plugin omit the field entirely,\n * and we still want them inherited when creating a new locale draft.\n */\nconst isLocalizedAttribute = (attribute: { pluginOptions?: object }): boolean => {\n // `pluginOptions` on the base attribute is typed as `object`, so we have to\n // narrow it to the i18n-specific shape here.\n const i18nOptions = attribute.pluginOptions as { i18n?: { localized?: boolean } } | undefined;\n return i18nOptions?.i18n?.localized === true;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * useDocument\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * @alpha\n * @public\n * @description Returns a document based on the model, collection type & id passed as arguments.\n * Also extracts its schema from the redux cache to be used for creating a validation schema.\n * @example\n * ```tsx\n * const { id, model, collectionType } = useParams<{ id: string; model: string; collectionType: string }>();\n *\n * if(!model || !collectionType) return null;\n *\n * const { document, isLoading, validate } = useDocument({ documentId: id, model, collectionType, params: { locale: 'en-GB' } })\n * const { update } = useDocumentActions()\n *\n * const onSubmit = async (document: Document) => {\n * const errors = validate(document);\n *\n * if(errors) {\n * // handle errors\n * }\n *\n * await update({ collectionType, model, id }, document)\n * }\n * ```\n *\n */\nconst useDocument: UseDocument = (args, opts) => {\n const { toggleNotification } = useNotification();\n const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();\n const { formatMessage } = useIntl();\n\n const {\n currentData: data,\n isLoading: isLoadingDocument,\n isFetching: isFetchingDocument,\n error,\n refetch,\n } = useGetDocumentQuery(args, {\n ...opts,\n skip: (!args.documentId && args.collectionType !== SINGLE_TYPES) || opts?.skip,\n });\n const document = data?.data;\n const meta = data?.meta;\n\n const {\n components,\n schema,\n schemas,\n isLoading: isLoadingSchema,\n } = useContentTypeSchema(args.model);\n const isSingleType = schema?.kind === 'singleType';\n\n const getTitle = React.useCallback(\n (mainField: string) => {\n // Always use mainField if it's not an id\n if (mainField !== 'id' && document?.[mainField]) {\n return document[mainField];\n }\n\n // When it's a singleType without a mainField, use the contentType displayName\n if (schema?.kind === 'singleType' && schema.info.displayName) {\n return formatMessage({\n id: schema.info.displayName,\n defaultMessage: schema.info.displayName,\n });\n }\n\n // Otherwise, use a fallback\n return formatMessage({\n id: 'content-manager.containers.untitled',\n defaultMessage: 'Untitled',\n });\n },\n [document, formatMessage, schema]\n );\n\n React.useEffect(() => {\n if (error) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(error),\n });\n }\n }, [toggleNotification, error, formatAPIError, args.collectionType]);\n\n const validate = React.useCallback(\n (document: Modules.Documents.AnyDocument): FormErrors | null => {\n if (!schema) {\n throw new Error(\n 'There is no validation schema generated, this is likely due to the schema not being loaded yet.'\n );\n }\n\n const validationSchema = getValidationSchema(schema, components);\n\n try {\n validationSchema.validateSync(document, { abortEarly: false, strict: true });\n return null;\n } catch (error) {\n if (error instanceof ValidationError) {\n return getYupValidationErrors(error);\n }\n\n throw error;\n }\n },\n [schema, components]\n );\n\n /**\n * Schema attributes that should be inherited from a sibling locale when\n * creating a new locale draft.\n *\n * Scope intentionally matches what the server populates into\n * `meta.availableLocales` (see `packages/core/content-manager/server/src/services/document-metadata.ts`):\n * - non-localized — `isLocalizedAttribute` semantics, so attributes whose\n * `pluginOptions.i18n.localized` is `undefined` count as non-localized\n * (an attribute created without the i18n plugin has no i18n options at\n * all but is still inherited at save by `copyNonLocalizedFields`).\n * - scalar or media — `component` / `dynamiczone` / `relation` are excluded\n * because the server doesn't populate them in `availableLocales` either,\n * so there'd be nothing to copy from.\n */\n const nonLocalizedScalarAndMediaFields = React.useMemo(() => {\n if (!schema?.attributes) {\n return [];\n }\n\n return Object.keys(schema.attributes).filter((name) => {\n const attribute = schema.attributes[name];\n\n if (isLocalizedAttribute(attribute)) {\n return false;\n }\n\n return (\n attribute.type !== 'component' &&\n attribute.type !== 'dynamiczone' &&\n attribute.type !== 'relation'\n );\n });\n }, [schema]);\n\n /**\n * Here we prepare the form for editing, we need to:\n * - remove prohibited fields from the document (passwords | ADD YOURS WHEN THERES A NEW ONE)\n * - swap out count objects on relations for empty arrays\n * - set __temp_key__ on array objects for drag & drop\n *\n * We also prepare the form for new documents, so we need to:\n * - set default values on fields\n * - inherit non-localized scalar/media values from a sibling locale.\n * Scope is intentionally limited to scalars and media — that is exactly\n * what the server populates into `meta.availableLocales` (see\n * `packages/core/content-manager/server/src/services/document-metadata.ts`).\n * Components, dynamic zones, and relations are not in that payload; the\n * server fills them at save time via `copyNonLocalizedFields` (in\n * `packages/core/core/src/services/document-service/internationalization.ts`)\n * when the new locale row is first created.\n * Baking the inheritance into `initialValues` here is what lets it survive\n * `<Form>` re-inits: the `SET_INITIAL_VALUES` effect in\n * `packages/core/admin/admin/src/components/Form.tsx` re-applies these\n * values whenever `initialValues` changes (e.g. after a locale switch),\n * which the previous side-effect-based prefill in `LocalePickerAction`\n * could not survive on revisits.\n */\n const getInitialFormValues = React.useCallback(\n (isCreatingDocument: boolean = false) => {\n if ((!document && !isCreatingDocument && !isSingleType) || !schema) {\n return undefined;\n }\n\n /**\n * Check that we have an ID so we know the\n * document has been created in some way.\n */\n if (document?.id) {\n return transformDocument(schema, components)(document);\n }\n\n let form: AnyData = createDefaultForm(schema, components);\n\n // Intentionally use `availableLocales[0]`:\n // - The server sorts `getAvailableLocales` with the default locale first\n // (see `document-metadata.ts`), so index 0 is the canonical inheritance\n // source. Sibling locales can drift on non-localized fields because the\n // server only syncs them at locale-creation time, not on subsequent\n // updates — preferring the default keeps the surfaced values stable.\n // - Avoids coupling this hook to `useGetLocalesQuery` just to find the\n // default locale.\n const sibling = meta?.availableLocales?.[0] as Record<string, unknown> | undefined;\n if (sibling && nonLocalizedScalarAndMediaFields.length > 0) {\n const inherited = nonLocalizedScalarAndMediaFields.reduce<AnyData>((acc, name) => {\n if (name in sibling) {\n acc[name] = sibling[name];\n }\n return acc;\n }, {});\n\n form = { ...form, ...inherited };\n }\n\n return transformDocument(schema, components)(form);\n },\n [\n document,\n isSingleType,\n schema,\n components,\n meta?.availableLocales,\n nonLocalizedScalarAndMediaFields,\n ]\n );\n\n const isLoading = isLoadingDocument || isFetchingDocument || isLoadingSchema;\n const hasError = !!error;\n\n return React.useMemo(\n () =>\n ({\n components,\n document,\n meta,\n isLoading,\n hasError,\n schema,\n schemas,\n validate,\n getTitle,\n getInitialFormValues,\n refetch,\n }) satisfies ReturnType<UseDocument>,\n [\n components,\n document,\n meta,\n isLoading,\n hasError,\n schema,\n schemas,\n validate,\n getTitle,\n getInitialFormValues,\n refetch,\n ]\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * useDoc\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * @internal this hook uses the router to extract the model, collection type & id from the url.\n * therefore, it shouldn't be used outside of the content-manager because it won't work as intended.\n */\nconst useDoc = (opts?: UseDocumentOpts) => {\n const { id, slug, collectionType, origin } = useParams<{\n id: string;\n origin: string;\n slug: string;\n collectionType: string;\n }>();\n const [{ query }] = useQueryParams();\n const params = React.useMemo(() => buildValidParams(query), [query]);\n\n if (!collectionType) {\n throw new Error('Could not find collectionType in url params');\n }\n\n if (!slug) {\n throw new Error('Could not find model in url params');\n }\n\n const document = useDocument(\n { documentId: origin || id, model: slug, collectionType, params },\n {\n ...opts,\n skip: id === 'create' || (!origin && !id && collectionType !== SINGLE_TYPES) || opts?.skip,\n }\n );\n\n const returnId = origin || (id === 'create' ? undefined : id);\n\n return {\n collectionType,\n model: slug,\n id: returnId,\n ...document,\n };\n};\n\n/**\n * @public\n * @experimental\n * Content manager context hooks for plugin development.\n * Make sure to use this hook inside the content manager.\n */\nconst useContentManagerContext = () => {\n const {\n collectionType,\n model,\n id,\n components,\n isLoading: isLoadingDoc,\n schema,\n schemas,\n } = useDoc();\n\n const layout = useDocumentLayout(model);\n\n const form = useForm<unknown>('useContentManagerContext', (state) => state);\n\n const isSingleType = collectionType === SINGLE_TYPES;\n const slug = model;\n const isCreatingEntry = id === 'create';\n\n useContentTypeSchema();\n\n const isLoading = isLoadingDoc || layout.isLoading;\n const error = layout.error;\n\n return {\n error,\n isLoading,\n\n // Base metadata\n model,\n collectionType,\n id,\n slug,\n isCreatingEntry,\n isSingleType,\n hasDraftAndPublish: schema?.options?.draftAndPublish ?? false,\n\n // All schema infos\n components,\n contentType: schema,\n contentTypes: schemas,\n\n // Form state\n form,\n\n // layout infos\n layout,\n };\n};\n\nexport { useDocument, useDoc, useContentManagerContext };\nexport type { UseDocument, UseDocumentArgs, Document, Schema, ComponentsDictionary };\n"],"names":["validationSchemaCache","WeakMap","getValidationSchema","schema","components","byComponents","get","set","validationSchema","createYupSchema","attributes","isLocalizedAttribute","attribute","i18nOptions","pluginOptions","i18n","localized","useDocument","args","opts","toggleNotification","useNotification","_unstableFormatAPIError","formatAPIError","useAPIErrorHandler","formatMessage","useIntl","currentData","data","isLoading","isLoadingDocument","isFetching","isFetchingDocument","error","refetch","useGetDocumentQuery","skip","documentId","collectionType","SINGLE_TYPES","document","meta","schemas","isLoadingSchema","useContentTypeSchema","model","isSingleType","kind","getTitle","React","useCallback","mainField","info","displayName","id","defaultMessage","useEffect","type","message","validate","Error","validateSync","abortEarly","strict","ValidationError","getYupValidationErrors","nonLocalizedScalarAndMediaFields","useMemo","Object","keys","filter","name","getInitialFormValues","isCreatingDocument","undefined","transformDocument","form","createDefaultForm","sibling","availableLocales","length","inherited","reduce","acc","hasError","useDoc","slug","origin","useParams","query","useQueryParams","params","buildValidParams","returnId","useContentManagerContext","isLoadingDoc","layout","useDocumentLayout","useForm","state","isCreatingEntry","hasDraftAndPublish","options","draftAndPublish","contentType","contentTypes"],"mappings":"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"}
1
+ {"version":3,"file":"useDocument.js","sources":["../../../admin/src/hooks/useDocument.ts"],"sourcesContent":["/**\n * This hook doesn't use a context provider because we fetch directly from the server,\n * this sounds expensive but actually, it's really not. Because we have redux-toolkit-query\n * being a cache layer so if nothing invalidates the cache, we don't fetch again.\n *\n * The network is deduplicated, but the work done inside the hook is not: it can be mounted\n * by hundreds of fields at once, so anything expensive it derives must be cached outside of\n * the hook instance (see `getValidationSchema`).\n */\n\nimport * as React from 'react';\n\nimport {\n useNotification,\n useAPIErrorHandler,\n useQueryParams,\n FormErrors,\n getYupValidationErrors,\n useForm,\n} from '@strapi/admin/strapi-admin';\nimport { useIntl } from 'react-intl';\nimport { useParams } from 'react-router-dom';\nimport { ValidationError } from 'yup';\n\nimport { SINGLE_TYPES } from '../constants/collections';\nimport { type AnyData, transformDocument } from '../pages/EditView/utils/data';\nimport { createDefaultForm } from '../pages/EditView/utils/forms';\nimport { useGetDocumentQuery } from '../services/documents';\nimport { buildValidParams } from '../utils/api';\nimport { createYupSchema } from '../utils/validation';\n\nimport { useContentTypeSchema, ComponentsDictionary } from './useContentTypeSchema';\nimport { useDocumentLayout } from './useDocumentLayout';\n\nimport type { FindOne } from '../../../shared/contracts/collection-types';\nimport type { ContentType } from '../../../shared/contracts/content-types';\nimport type { Modules } from '@strapi/types';\n\ninterface UseDocumentArgs {\n collectionType: string;\n model: string;\n documentId?: string;\n params?: object;\n}\n\ntype UseDocumentOpts = Parameters<typeof useGetDocumentQuery>[1];\n\ntype Document = FindOne.Response['data'];\n\ntype Schema = ContentType;\n\ntype ValidationSchema = ReturnType<typeof createYupSchema>;\n\n// Building the yup schema of a model clones a schema for every nested component and dynamic\n// zone: on large models it takes seconds and gigabytes. `schema` and `components` identities\n// are shared across hook instances (see `useContentTypeSchema`), so build it once per pair,\n// and only when something actually validates.\nconst validationSchemaCache = new WeakMap<\n Schema,\n WeakMap<ComponentsDictionary, ValidationSchema>\n>();\n\nconst getValidationSchema = (schema: Schema, components: ComponentsDictionary) => {\n let byComponents = validationSchemaCache.get(schema);\n\n if (!byComponents) {\n byComponents = new WeakMap();\n validationSchemaCache.set(schema, byComponents);\n }\n\n let validationSchema = byComponents.get(components);\n\n if (!validationSchema) {\n validationSchema = createYupSchema(schema.attributes, components);\n byComponents.set(components, validationSchema);\n }\n\n return validationSchema;\n};\n\ntype UseDocument = (\n args: UseDocumentArgs,\n opts?: UseDocumentOpts\n) => {\n /**\n * These are the schemas of the components used in the content type, organised\n * by their uid.\n */\n components: ComponentsDictionary;\n document?: Document;\n meta?: FindOne.Response['meta'];\n isLoading: boolean;\n /**\n * This is the schema of the content type, it is not the same as the layout.\n */\n schema?: Schema;\n schemas?: Schema[];\n hasError?: boolean;\n refetch: () => void;\n validate: (document: Document) => null | FormErrors;\n /**\n * Get the document's title\n */\n getTitle: (mainField: string) => string;\n /**\n * Get the initial form values for the document\n */\n getInitialFormValues: (isCreatingDocument?: boolean) => AnyData | undefined;\n};\n\n/**\n * Mirrors the server's `isLocalizedAttribute` in\n * `packages/plugins/i18n/server/src/services/content-types.ts`: an attribute\n * counts as localized only when `pluginOptions.i18n.localized` is explicitly\n * `true`. Both `false` and `undefined` mean \"non-localized\" — important here\n * because attributes created without the i18n plugin omit the field entirely,\n * and we still want them inherited when creating a new locale draft.\n */\nconst isLocalizedAttribute = (attribute: { pluginOptions?: object }): boolean => {\n // `pluginOptions` on the base attribute is typed as `object`, so we have to\n // narrow it to the i18n-specific shape here.\n const i18nOptions = attribute.pluginOptions as { i18n?: { localized?: boolean } } | undefined;\n return i18nOptions?.i18n?.localized === true;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * useDocument\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * @alpha\n * @public\n * @description Returns a document based on the model, collection type & id passed as arguments.\n * Also extracts its schema from the redux cache to be used for creating a validation schema.\n * @example\n * ```tsx\n * const { id, model, collectionType } = useParams<{ id: string; model: string; collectionType: string }>();\n *\n * if(!model || !collectionType) return null;\n *\n * const { document, isLoading, validate } = useDocument({ documentId: id, model, collectionType, params: { locale: 'en-GB' } })\n * const { update } = useDocumentActions()\n *\n * const onSubmit = async (document: Document) => {\n * const errors = validate(document);\n *\n * if(errors) {\n * // handle errors\n * }\n *\n * await update({ collectionType, model, id }, document)\n * }\n * ```\n *\n */\nconst useDocument: UseDocument = (args, opts) => {\n const { toggleNotification } = useNotification();\n const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();\n const { formatMessage } = useIntl();\n\n const {\n currentData: data,\n isLoading: isLoadingDocument,\n isFetching: isFetchingDocument,\n error,\n refetch,\n } = useGetDocumentQuery(args, {\n ...opts,\n skip: (!args.documentId && args.collectionType !== SINGLE_TYPES) || opts?.skip,\n });\n const document = data?.data;\n const meta = data?.meta;\n\n const {\n components,\n schema,\n schemas,\n isLoading: isLoadingSchema,\n } = useContentTypeSchema(args.model);\n const isSingleType = schema?.kind === 'singleType';\n\n const getTitle = React.useCallback(\n (mainField: string) => {\n // Always use mainField if it's not an id\n if (mainField !== 'id' && document?.[mainField]) {\n return document[mainField];\n }\n\n // When it's a singleType without a mainField, use the contentType displayName\n if (schema?.kind === 'singleType' && schema.info.displayName) {\n return formatMessage({\n id: schema.info.displayName,\n defaultMessage: schema.info.displayName,\n });\n }\n\n // Otherwise, use a fallback\n return formatMessage({\n id: 'content-manager.containers.untitled',\n defaultMessage: 'Untitled',\n });\n },\n [document, formatMessage, schema]\n );\n\n React.useEffect(() => {\n if (error) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(error),\n });\n }\n }, [toggleNotification, error, formatAPIError, args.collectionType]);\n\n const validate = React.useCallback(\n (document: Modules.Documents.AnyDocument): FormErrors | null => {\n if (!schema) {\n throw new Error(\n 'There is no validation schema generated, this is likely due to the schema not being loaded yet.'\n );\n }\n\n const validationSchema = getValidationSchema(schema, components);\n\n try {\n validationSchema.validateSync(document, { abortEarly: false, strict: true });\n return null;\n } catch (error) {\n if (error instanceof ValidationError) {\n return getYupValidationErrors(error);\n }\n\n throw error;\n }\n },\n [schema, components]\n );\n\n /**\n * Schema attributes that should be inherited from a sibling locale when\n * creating a new locale draft.\n *\n * Scope intentionally matches what the server populates into\n * `meta.availableLocales` (see `packages/core/content-manager/server/src/services/document-metadata.ts`):\n * - non-localized — `isLocalizedAttribute` semantics, so attributes whose\n * `pluginOptions.i18n.localized` is `undefined` count as non-localized\n * (an attribute created without the i18n plugin has no i18n options at\n * all but is still inherited at save by `copyNonLocalizedFields`).\n * - scalar, media, component, or dynamic zone — relations are excluded\n * because the server doesn't populate them in `availableLocales` either.\n */\n const nonLocalizedFieldsToInherit = React.useMemo(() => {\n if (!schema?.attributes) {\n return [];\n }\n\n return Object.keys(schema.attributes).filter((name) => {\n const attribute = schema.attributes[name];\n\n if (isLocalizedAttribute(attribute)) {\n return false;\n }\n\n return attribute.type !== 'relation';\n });\n }, [schema]);\n\n /**\n * Here we prepare the form for editing, we need to:\n * - remove prohibited fields from the document (passwords | ADD YOURS WHEN THERES A NEW ONE)\n * - swap out count objects on relations for empty arrays\n * - set __temp_key__ on array objects for drag & drop\n *\n * We also prepare the form for new documents, so we need to:\n * - set default values on fields\n * - inherit non-localized scalar/media/component/dynamic-zone values from a sibling locale.\n * Scope matches what the server populates into `meta.availableLocales` (see\n * `packages/core/content-manager/server/src/services/document-metadata.ts`).\n * Relations are not in that payload; the server fills them at save time via\n * `copyNonLocalizedFields` (in\n * `packages/core/core/src/services/document-service/internationalization.ts`)\n * when the new locale row is first created.\n * Baking the inheritance into `initialValues` here is what lets it survive\n * `<Form>` re-inits: the `SET_INITIAL_VALUES` effect in\n * `packages/core/admin/admin/src/components/Form.tsx` re-applies these\n * values whenever `initialValues` changes (e.g. after a locale switch),\n * which the previous side-effect-based prefill in `LocalePickerAction`\n * could not survive on revisits.\n */\n const getInitialFormValues = React.useCallback(\n (isCreatingDocument: boolean = false) => {\n if ((!document && !isCreatingDocument && !isSingleType) || !schema) {\n return undefined;\n }\n\n /**\n * Check that we have an ID so we know the\n * document has been created in some way.\n */\n if (document?.id) {\n return transformDocument(schema, components)(document);\n }\n\n let form: AnyData = createDefaultForm(schema, components);\n\n // Intentionally use `availableLocales[0]`:\n // - The server sorts `getAvailableLocales` with the default locale first\n // (see `document-metadata.ts`), so index 0 is the canonical inheritance\n // source. Sibling locales can drift on non-localized fields because the\n // server only syncs them at locale-creation time, not on subsequent\n // updates — preferring the default keeps the surfaced values stable.\n // - Avoids coupling this hook to `useGetLocalesQuery` just to find the\n // default locale.\n const sibling = meta?.availableLocales?.[0] as Record<string, unknown> | undefined;\n if (sibling && nonLocalizedFieldsToInherit.length > 0) {\n const inherited = nonLocalizedFieldsToInherit.reduce<AnyData>((acc, name) => {\n if (name in sibling) {\n acc[name] = sibling[name];\n }\n return acc;\n }, {});\n\n form = { ...form, ...inherited };\n }\n\n return transformDocument(schema, components)(form);\n },\n [\n document,\n isSingleType,\n schema,\n components,\n meta?.availableLocales,\n nonLocalizedFieldsToInherit,\n ]\n );\n\n const isLoading = isLoadingDocument || isFetchingDocument || isLoadingSchema;\n const hasError = !!error;\n\n return React.useMemo(\n () =>\n ({\n components,\n document,\n meta,\n isLoading,\n hasError,\n schema,\n schemas,\n validate,\n getTitle,\n getInitialFormValues,\n refetch,\n }) satisfies ReturnType<UseDocument>,\n [\n components,\n document,\n meta,\n isLoading,\n hasError,\n schema,\n schemas,\n validate,\n getTitle,\n getInitialFormValues,\n refetch,\n ]\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * useDoc\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * @internal this hook uses the router to extract the model, collection type & id from the url.\n * therefore, it shouldn't be used outside of the content-manager because it won't work as intended.\n */\nconst useDoc = (opts?: UseDocumentOpts) => {\n const { id, slug, collectionType, origin } = useParams<{\n id: string;\n origin: string;\n slug: string;\n collectionType: string;\n }>();\n const [{ query }] = useQueryParams();\n const params = React.useMemo(() => buildValidParams(query), [query]);\n\n if (!collectionType) {\n throw new Error('Could not find collectionType in url params');\n }\n\n if (!slug) {\n throw new Error('Could not find model in url params');\n }\n\n const document = useDocument(\n { documentId: origin || id, model: slug, collectionType, params },\n {\n ...opts,\n skip: id === 'create' || (!origin && !id && collectionType !== SINGLE_TYPES) || opts?.skip,\n }\n );\n\n const returnId = origin || (id === 'create' ? undefined : id);\n\n return {\n collectionType,\n model: slug,\n id: returnId,\n ...document,\n };\n};\n\n/**\n * @public\n * @experimental\n * Content manager context hooks for plugin development.\n * Make sure to use this hook inside the content manager.\n */\nconst useContentManagerContext = () => {\n const {\n collectionType,\n model,\n id,\n components,\n isLoading: isLoadingDoc,\n schema,\n schemas,\n } = useDoc();\n\n const layout = useDocumentLayout(model);\n\n const form = useForm<unknown>('useContentManagerContext', (state) => state);\n\n const isSingleType = collectionType === SINGLE_TYPES;\n const slug = model;\n const isCreatingEntry = id === 'create';\n\n useContentTypeSchema();\n\n const isLoading = isLoadingDoc || layout.isLoading;\n const error = layout.error;\n\n return {\n error,\n isLoading,\n\n // Base metadata\n model,\n collectionType,\n id,\n slug,\n isCreatingEntry,\n isSingleType,\n hasDraftAndPublish: schema?.options?.draftAndPublish ?? false,\n\n // All schema infos\n components,\n contentType: schema,\n contentTypes: schemas,\n\n // Form state\n form,\n\n // layout infos\n layout,\n };\n};\n\nexport { useDocument, useDoc, useContentManagerContext };\nexport type { UseDocument, UseDocumentArgs, Document, Schema, ComponentsDictionary };\n"],"names":["validationSchemaCache","WeakMap","getValidationSchema","schema","components","byComponents","get","set","validationSchema","createYupSchema","attributes","isLocalizedAttribute","attribute","i18nOptions","pluginOptions","i18n","localized","useDocument","args","opts","toggleNotification","useNotification","_unstableFormatAPIError","formatAPIError","useAPIErrorHandler","formatMessage","useIntl","currentData","data","isLoading","isLoadingDocument","isFetching","isFetchingDocument","error","refetch","useGetDocumentQuery","skip","documentId","collectionType","SINGLE_TYPES","document","meta","schemas","isLoadingSchema","useContentTypeSchema","model","isSingleType","kind","getTitle","React","useCallback","mainField","info","displayName","id","defaultMessage","useEffect","type","message","validate","Error","validateSync","abortEarly","strict","ValidationError","getYupValidationErrors","nonLocalizedFieldsToInherit","useMemo","Object","keys","filter","name","getInitialFormValues","isCreatingDocument","undefined","transformDocument","form","createDefaultForm","sibling","availableLocales","length","inherited","reduce","acc","hasError","useDoc","slug","origin","useParams","query","useQueryParams","params","buildValidParams","returnId","useContentManagerContext","isLoadingDoc","layout","useDocumentLayout","useForm","state","isCreatingEntry","hasDraftAndPublish","options","draftAndPublish","contentType","contentTypes"],"mappings":"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"}
@@ -148,10 +148,9 @@ const getValidationSchema = (schema, components)=>{
148
148
  * `pluginOptions.i18n.localized` is `undefined` count as non-localized
149
149
  * (an attribute created without the i18n plugin has no i18n options at
150
150
  * all but is still inherited at save by `copyNonLocalizedFields`).
151
- * - scalar or media — `component` / `dynamiczone` / `relation` are excluded
152
- * because the server doesn't populate them in `availableLocales` either,
153
- * so there'd be nothing to copy from.
154
- */ const nonLocalizedScalarAndMediaFields = React.useMemo(()=>{
151
+ * - scalar, media, component, or dynamic zone — relations are excluded
152
+ * because the server doesn't populate them in `availableLocales` either.
153
+ */ const nonLocalizedFieldsToInherit = React.useMemo(()=>{
155
154
  if (!schema?.attributes) {
156
155
  return [];
157
156
  }
@@ -160,7 +159,7 @@ const getValidationSchema = (schema, components)=>{
160
159
  if (isLocalizedAttribute(attribute)) {
161
160
  return false;
162
161
  }
163
- return attribute.type !== 'component' && attribute.type !== 'dynamiczone' && attribute.type !== 'relation';
162
+ return attribute.type !== 'relation';
164
163
  });
165
164
  }, [
166
165
  schema
@@ -173,12 +172,11 @@ const getValidationSchema = (schema, components)=>{
173
172
  *
174
173
  * We also prepare the form for new documents, so we need to:
175
174
  * - set default values on fields
176
- * - inherit non-localized scalar/media values from a sibling locale.
177
- * Scope is intentionally limited to scalars and media — that is exactly
178
- * what the server populates into `meta.availableLocales` (see
175
+ * - inherit non-localized scalar/media/component/dynamic-zone values from a sibling locale.
176
+ * Scope matches what the server populates into `meta.availableLocales` (see
179
177
  * `packages/core/content-manager/server/src/services/document-metadata.ts`).
180
- * Components, dynamic zones, and relations are not in that payload; the
181
- * server fills them at save time via `copyNonLocalizedFields` (in
178
+ * Relations are not in that payload; the server fills them at save time via
179
+ * `copyNonLocalizedFields` (in
182
180
  * `packages/core/core/src/services/document-service/internationalization.ts`)
183
181
  * when the new locale row is first created.
184
182
  * Baking the inheritance into `initialValues` here is what lets it survive
@@ -207,8 +205,8 @@ const getValidationSchema = (schema, components)=>{
207
205
  // - Avoids coupling this hook to `useGetLocalesQuery` just to find the
208
206
  // default locale.
209
207
  const sibling = meta?.availableLocales?.[0];
210
- if (sibling && nonLocalizedScalarAndMediaFields.length > 0) {
211
- const inherited = nonLocalizedScalarAndMediaFields.reduce((acc, name)=>{
208
+ if (sibling && nonLocalizedFieldsToInherit.length > 0) {
209
+ const inherited = nonLocalizedFieldsToInherit.reduce((acc, name)=>{
212
210
  if (name in sibling) {
213
211
  acc[name] = sibling[name];
214
212
  }
@@ -226,7 +224,7 @@ const getValidationSchema = (schema, components)=>{
226
224
  schema,
227
225
  components,
228
226
  meta?.availableLocales,
229
- nonLocalizedScalarAndMediaFields
227
+ nonLocalizedFieldsToInherit
230
228
  ]);
231
229
  const isLoading = isLoadingDocument || isFetchingDocument || isLoadingSchema;
232
230
  const hasError = !!error;