@strapi/admin 5.33.4 → 5.35.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 (310) hide show
  1. package/dist/admin/admin/src/components/GradientBadge.js +18 -2
  2. package/dist/admin/admin/src/components/GradientBadge.js.map +1 -1
  3. package/dist/admin/admin/src/components/GradientBadge.mjs +19 -3
  4. package/dist/admin/admin/src/components/GradientBadge.mjs.map +1 -1
  5. package/dist/admin/admin/src/components/Layouts/ActionLayout.js +8 -1
  6. package/dist/admin/admin/src/components/Layouts/ActionLayout.js.map +1 -1
  7. package/dist/admin/admin/src/components/Layouts/ActionLayout.mjs +8 -1
  8. package/dist/admin/admin/src/components/Layouts/ActionLayout.mjs.map +1 -1
  9. package/dist/admin/admin/src/components/Layouts/ContentLayout.js +4 -0
  10. package/dist/admin/admin/src/components/Layouts/ContentLayout.js.map +1 -1
  11. package/dist/admin/admin/src/components/Layouts/ContentLayout.mjs +4 -0
  12. package/dist/admin/admin/src/components/Layouts/ContentLayout.mjs.map +1 -1
  13. package/dist/admin/admin/src/components/Layouts/HeaderLayout.js +84 -50
  14. package/dist/admin/admin/src/components/Layouts/HeaderLayout.js.map +1 -1
  15. package/dist/admin/admin/src/components/Layouts/HeaderLayout.mjs +86 -52
  16. package/dist/admin/admin/src/components/Layouts/HeaderLayout.mjs.map +1 -1
  17. package/dist/admin/admin/src/components/MainNav/MainNavLinks.js +1 -0
  18. package/dist/admin/admin/src/components/MainNav/MainNavLinks.js.map +1 -1
  19. package/dist/admin/admin/src/components/MainNav/MainNavLinks.mjs +1 -0
  20. package/dist/admin/admin/src/components/MainNav/MainNavLinks.mjs.map +1 -1
  21. package/dist/admin/admin/src/components/MainNav/NavLink.js +37 -6
  22. package/dist/admin/admin/src/components/MainNav/NavLink.js.map +1 -1
  23. package/dist/admin/admin/src/components/MainNav/NavLink.mjs +38 -7
  24. package/dist/admin/admin/src/components/MainNav/NavLink.mjs.map +1 -1
  25. package/dist/admin/admin/src/components/NpsSurvey.js +2 -0
  26. package/dist/admin/admin/src/components/NpsSurvey.js.map +1 -1
  27. package/dist/admin/admin/src/components/NpsSurvey.mjs +2 -0
  28. package/dist/admin/admin/src/components/NpsSurvey.mjs.map +1 -1
  29. package/dist/admin/admin/src/components/SubNav.js +41 -20
  30. package/dist/admin/admin/src/components/SubNav.js.map +1 -1
  31. package/dist/admin/admin/src/components/SubNav.mjs +42 -21
  32. package/dist/admin/admin/src/components/SubNav.mjs.map +1 -1
  33. package/dist/admin/admin/src/constants/theme.js +2 -0
  34. package/dist/admin/admin/src/constants/theme.js.map +1 -1
  35. package/dist/admin/admin/src/constants/theme.mjs +2 -1
  36. package/dist/admin/admin/src/constants/theme.mjs.map +1 -1
  37. package/dist/admin/admin/src/core/apis/router.js.map +1 -1
  38. package/dist/admin/admin/src/core/apis/router.mjs.map +1 -1
  39. package/dist/admin/admin/src/features/Tracking.js.map +1 -1
  40. package/dist/admin/admin/src/features/Tracking.mjs.map +1 -1
  41. package/dist/admin/admin/src/hooks/useMenu.js +2 -1
  42. package/dist/admin/admin/src/hooks/useMenu.js.map +1 -1
  43. package/dist/admin/admin/src/hooks/useMenu.mjs +2 -1
  44. package/dist/admin/admin/src/hooks/useMenu.mjs.map +1 -1
  45. package/dist/admin/admin/src/layouts/AuthenticatedLayout.js.map +1 -1
  46. package/dist/admin/admin/src/layouts/AuthenticatedLayout.mjs.map +1 -1
  47. package/dist/admin/admin/src/pages/Auth/components/Register.js +51 -10
  48. package/dist/admin/admin/src/pages/Auth/components/Register.js.map +1 -1
  49. package/dist/admin/admin/src/pages/Auth/components/Register.mjs +51 -10
  50. package/dist/admin/admin/src/pages/Auth/components/Register.mjs.map +1 -1
  51. package/dist/admin/admin/src/pages/Auth/components/ResetPassword.js +12 -3
  52. package/dist/admin/admin/src/pages/Auth/components/ResetPassword.js.map +1 -1
  53. package/dist/admin/admin/src/pages/Auth/components/ResetPassword.mjs +12 -3
  54. package/dist/admin/admin/src/pages/Auth/components/ResetPassword.mjs.map +1 -1
  55. package/dist/admin/admin/src/pages/Home/HomePage.js +1 -0
  56. package/dist/admin/admin/src/pages/Home/HomePage.js.map +1 -1
  57. package/dist/admin/admin/src/pages/Home/HomePage.mjs +1 -0
  58. package/dist/admin/admin/src/pages/Home/HomePage.mjs.map +1 -1
  59. package/dist/admin/admin/src/pages/ProfilePage.js +1 -0
  60. package/dist/admin/admin/src/pages/ProfilePage.js.map +1 -1
  61. package/dist/admin/admin/src/pages/ProfilePage.mjs +1 -0
  62. package/dist/admin/admin/src/pages/ProfilePage.mjs.map +1 -1
  63. package/dist/admin/admin/src/pages/Settings/components/SettingsNav.js +7 -2
  64. package/dist/admin/admin/src/pages/Settings/components/SettingsNav.js.map +1 -1
  65. package/dist/admin/admin/src/pages/Settings/components/SettingsNav.mjs +7 -2
  66. package/dist/admin/admin/src/pages/Settings/components/SettingsNav.mjs.map +1 -1
  67. package/dist/admin/admin/src/pages/Settings/components/Tokens/FormHead.js +44 -26
  68. package/dist/admin/admin/src/pages/Settings/components/Tokens/FormHead.js.map +1 -1
  69. package/dist/admin/admin/src/pages/Settings/components/Tokens/FormHead.mjs +45 -27
  70. package/dist/admin/admin/src/pages/Settings/components/Tokens/FormHead.mjs.map +1 -1
  71. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/ListView.js +1 -0
  72. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/ListView.js.map +1 -1
  73. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/ListView.mjs +1 -0
  74. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/ListView.mjs.map +1 -1
  75. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.js +1 -0
  76. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.js.map +1 -1
  77. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.mjs +1 -0
  78. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.mjs.map +1 -1
  79. package/dist/admin/admin/src/pages/Settings/pages/Roles/CreatePage.js +3 -0
  80. package/dist/admin/admin/src/pages/Settings/pages/Roles/CreatePage.js.map +1 -1
  81. package/dist/admin/admin/src/pages/Settings/pages/Roles/CreatePage.mjs +3 -0
  82. package/dist/admin/admin/src/pages/Settings/pages/Roles/CreatePage.mjs.map +1 -1
  83. package/dist/admin/admin/src/pages/Settings/pages/Roles/EditPage.js +9 -11
  84. package/dist/admin/admin/src/pages/Settings/pages/Roles/EditPage.js.map +1 -1
  85. package/dist/admin/admin/src/pages/Settings/pages/Roles/EditPage.mjs +10 -12
  86. package/dist/admin/admin/src/pages/Settings/pages/Roles/EditPage.mjs.map +1 -1
  87. package/dist/admin/admin/src/pages/Settings/pages/Roles/ListPage.js +1 -0
  88. package/dist/admin/admin/src/pages/Settings/pages/Roles/ListPage.js.map +1 -1
  89. package/dist/admin/admin/src/pages/Settings/pages/Roles/ListPage.mjs +1 -0
  90. package/dist/admin/admin/src/pages/Settings/pages/Roles/ListPage.mjs.map +1 -1
  91. package/dist/admin/admin/src/pages/Settings/pages/TransferTokens/ListView.js +1 -0
  92. package/dist/admin/admin/src/pages/Settings/pages/TransferTokens/ListView.js.map +1 -1
  93. package/dist/admin/admin/src/pages/Settings/pages/TransferTokens/ListView.mjs +1 -0
  94. package/dist/admin/admin/src/pages/Settings/pages/TransferTokens/ListView.mjs.map +1 -1
  95. package/dist/admin/admin/src/pages/Settings/pages/Users/EditPage.js +1 -0
  96. package/dist/admin/admin/src/pages/Settings/pages/Users/EditPage.js.map +1 -1
  97. package/dist/admin/admin/src/pages/Settings/pages/Users/EditPage.mjs +1 -0
  98. package/dist/admin/admin/src/pages/Settings/pages/Users/EditPage.mjs.map +1 -1
  99. package/dist/admin/admin/src/pages/Settings/pages/Users/components/CreateActionCE.js +1 -0
  100. package/dist/admin/admin/src/pages/Settings/pages/Users/components/CreateActionCE.js.map +1 -1
  101. package/dist/admin/admin/src/pages/Settings/pages/Users/components/CreateActionCE.mjs +1 -0
  102. package/dist/admin/admin/src/pages/Settings/pages/Users/components/CreateActionCE.mjs.map +1 -1
  103. package/dist/admin/admin/src/pages/Settings/pages/Users/utils/validation.js +12 -3
  104. package/dist/admin/admin/src/pages/Settings/pages/Users/utils/validation.js.map +1 -1
  105. package/dist/admin/admin/src/pages/Settings/pages/Users/utils/validation.mjs +12 -3
  106. package/dist/admin/admin/src/pages/Settings/pages/Users/utils/validation.mjs.map +1 -1
  107. package/dist/admin/admin/src/pages/Settings/pages/Webhooks/ListPage.js +1 -0
  108. package/dist/admin/admin/src/pages/Settings/pages/Webhooks/ListPage.js.map +1 -1
  109. package/dist/admin/admin/src/pages/Settings/pages/Webhooks/ListPage.mjs +1 -0
  110. package/dist/admin/admin/src/pages/Settings/pages/Webhooks/ListPage.mjs.map +1 -1
  111. package/dist/admin/admin/src/pages/Settings/pages/Webhooks/components/WebhookForm.js +3 -0
  112. package/dist/admin/admin/src/pages/Settings/pages/Webhooks/components/WebhookForm.js.map +1 -1
  113. package/dist/admin/admin/src/pages/Settings/pages/Webhooks/components/WebhookForm.mjs +3 -0
  114. package/dist/admin/admin/src/pages/Settings/pages/Webhooks/components/WebhookForm.mjs.map +1 -1
  115. package/dist/admin/admin/src/router.js +0 -9
  116. package/dist/admin/admin/src/router.js.map +1 -1
  117. package/dist/admin/admin/src/router.mjs +0 -9
  118. package/dist/admin/admin/src/router.mjs.map +1 -1
  119. package/dist/admin/admin/src/translations/ar.json.js +0 -42
  120. package/dist/admin/admin/src/translations/ar.json.js.map +1 -1
  121. package/dist/admin/admin/src/translations/ar.json.mjs +0 -42
  122. package/dist/admin/admin/src/translations/ar.json.mjs.map +1 -1
  123. package/dist/admin/admin/src/translations/ca.json.js +0 -21
  124. package/dist/admin/admin/src/translations/ca.json.js.map +1 -1
  125. package/dist/admin/admin/src/translations/ca.json.mjs +0 -21
  126. package/dist/admin/admin/src/translations/ca.json.mjs.map +1 -1
  127. package/dist/admin/admin/src/translations/de.json.js +422 -66
  128. package/dist/admin/admin/src/translations/de.json.js.map +1 -1
  129. package/dist/admin/admin/src/translations/de.json.mjs +419 -67
  130. package/dist/admin/admin/src/translations/de.json.mjs.map +1 -1
  131. package/dist/admin/admin/src/translations/dk.json.js +0 -6
  132. package/dist/admin/admin/src/translations/dk.json.js.map +1 -1
  133. package/dist/admin/admin/src/translations/dk.json.mjs +0 -6
  134. package/dist/admin/admin/src/translations/dk.json.mjs.map +1 -1
  135. package/dist/admin/admin/src/translations/en.json.js +0 -44
  136. package/dist/admin/admin/src/translations/en.json.js.map +1 -1
  137. package/dist/admin/admin/src/translations/en.json.mjs +0 -44
  138. package/dist/admin/admin/src/translations/en.json.mjs.map +1 -1
  139. package/dist/admin/admin/src/translations/es.json.js +0 -25
  140. package/dist/admin/admin/src/translations/es.json.js.map +1 -1
  141. package/dist/admin/admin/src/translations/es.json.mjs +0 -25
  142. package/dist/admin/admin/src/translations/es.json.mjs.map +1 -1
  143. package/dist/admin/admin/src/translations/eu.json.js +0 -43
  144. package/dist/admin/admin/src/translations/eu.json.js.map +1 -1
  145. package/dist/admin/admin/src/translations/eu.json.mjs +0 -43
  146. package/dist/admin/admin/src/translations/eu.json.mjs.map +1 -1
  147. package/dist/admin/admin/src/translations/fr.json.js +0 -6
  148. package/dist/admin/admin/src/translations/fr.json.js.map +1 -1
  149. package/dist/admin/admin/src/translations/fr.json.mjs +0 -6
  150. package/dist/admin/admin/src/translations/fr.json.mjs.map +1 -1
  151. package/dist/admin/admin/src/translations/gu.json.js +0 -21
  152. package/dist/admin/admin/src/translations/gu.json.js.map +1 -1
  153. package/dist/admin/admin/src/translations/gu.json.mjs +0 -21
  154. package/dist/admin/admin/src/translations/gu.json.mjs.map +1 -1
  155. package/dist/admin/admin/src/translations/hi.json.js +0 -21
  156. package/dist/admin/admin/src/translations/hi.json.js.map +1 -1
  157. package/dist/admin/admin/src/translations/hi.json.mjs +0 -21
  158. package/dist/admin/admin/src/translations/hi.json.mjs.map +1 -1
  159. package/dist/admin/admin/src/translations/hu.json.js +0 -43
  160. package/dist/admin/admin/src/translations/hu.json.js.map +1 -1
  161. package/dist/admin/admin/src/translations/hu.json.mjs +0 -43
  162. package/dist/admin/admin/src/translations/hu.json.mjs.map +1 -1
  163. package/dist/admin/admin/src/translations/it.json.js +613 -3
  164. package/dist/admin/admin/src/translations/it.json.js.map +1 -1
  165. package/dist/admin/admin/src/translations/it.json.mjs +605 -4
  166. package/dist/admin/admin/src/translations/it.json.mjs.map +1 -1
  167. package/dist/admin/admin/src/translations/ja.json.js +0 -6
  168. package/dist/admin/admin/src/translations/ja.json.js.map +1 -1
  169. package/dist/admin/admin/src/translations/ja.json.mjs +0 -6
  170. package/dist/admin/admin/src/translations/ja.json.mjs.map +1 -1
  171. package/dist/admin/admin/src/translations/ko.json.js +430 -102
  172. package/dist/admin/admin/src/translations/ko.json.js.map +1 -1
  173. package/dist/admin/admin/src/translations/ko.json.mjs +427 -103
  174. package/dist/admin/admin/src/translations/ko.json.mjs.map +1 -1
  175. package/dist/admin/admin/src/translations/ml.json.js +0 -21
  176. package/dist/admin/admin/src/translations/ml.json.js.map +1 -1
  177. package/dist/admin/admin/src/translations/ml.json.mjs +0 -21
  178. package/dist/admin/admin/src/translations/ml.json.mjs.map +1 -1
  179. package/dist/admin/admin/src/translations/nl.json.js +0 -39
  180. package/dist/admin/admin/src/translations/nl.json.js.map +1 -1
  181. package/dist/admin/admin/src/translations/nl.json.mjs +0 -39
  182. package/dist/admin/admin/src/translations/nl.json.mjs.map +1 -1
  183. package/dist/admin/admin/src/translations/pl.json.js +0 -21
  184. package/dist/admin/admin/src/translations/pl.json.js.map +1 -1
  185. package/dist/admin/admin/src/translations/pl.json.mjs +0 -21
  186. package/dist/admin/admin/src/translations/pl.json.mjs.map +1 -1
  187. package/dist/admin/admin/src/translations/pt-BR.json.js +0 -25
  188. package/dist/admin/admin/src/translations/pt-BR.json.js.map +1 -1
  189. package/dist/admin/admin/src/translations/pt-BR.json.mjs +0 -25
  190. package/dist/admin/admin/src/translations/pt-BR.json.mjs.map +1 -1
  191. package/dist/admin/admin/src/translations/ru.json.js +0 -44
  192. package/dist/admin/admin/src/translations/ru.json.js.map +1 -1
  193. package/dist/admin/admin/src/translations/ru.json.mjs +0 -44
  194. package/dist/admin/admin/src/translations/ru.json.mjs.map +1 -1
  195. package/dist/admin/admin/src/translations/sa.json.js +0 -21
  196. package/dist/admin/admin/src/translations/sa.json.js.map +1 -1
  197. package/dist/admin/admin/src/translations/sa.json.mjs +0 -21
  198. package/dist/admin/admin/src/translations/sa.json.mjs.map +1 -1
  199. package/dist/admin/admin/src/translations/sv.json.js +0 -39
  200. package/dist/admin/admin/src/translations/sv.json.js.map +1 -1
  201. package/dist/admin/admin/src/translations/sv.json.mjs +0 -39
  202. package/dist/admin/admin/src/translations/sv.json.mjs.map +1 -1
  203. package/dist/admin/admin/src/translations/tr.json.js +0 -39
  204. package/dist/admin/admin/src/translations/tr.json.js.map +1 -1
  205. package/dist/admin/admin/src/translations/tr.json.mjs +0 -39
  206. package/dist/admin/admin/src/translations/tr.json.mjs.map +1 -1
  207. package/dist/admin/admin/src/translations/uk.json.js +0 -44
  208. package/dist/admin/admin/src/translations/uk.json.js.map +1 -1
  209. package/dist/admin/admin/src/translations/uk.json.mjs +0 -44
  210. package/dist/admin/admin/src/translations/uk.json.mjs.map +1 -1
  211. package/dist/admin/admin/src/translations/vi.json.js +0 -44
  212. package/dist/admin/admin/src/translations/vi.json.js.map +1 -1
  213. package/dist/admin/admin/src/translations/vi.json.mjs +0 -44
  214. package/dist/admin/admin/src/translations/vi.json.mjs.map +1 -1
  215. package/dist/admin/admin/src/translations/zh-Hans.json.js +0 -44
  216. package/dist/admin/admin/src/translations/zh-Hans.json.js.map +1 -1
  217. package/dist/admin/admin/src/translations/zh-Hans.json.mjs +0 -44
  218. package/dist/admin/admin/src/translations/zh-Hans.json.mjs.map +1 -1
  219. package/dist/admin/admin/src/translations/zh.json.js +0 -39
  220. package/dist/admin/admin/src/translations/zh.json.js.map +1 -1
  221. package/dist/admin/admin/src/translations/zh.json.mjs +0 -39
  222. package/dist/admin/admin/src/translations/zh.json.mjs.map +1 -1
  223. package/dist/admin/admin/tests/mockData.js +0 -1413
  224. package/dist/admin/admin/tests/mockData.js.map +1 -1
  225. package/dist/admin/admin/tests/mockData.mjs +0 -1413
  226. package/dist/admin/admin/tests/mockData.mjs.map +1 -1
  227. package/dist/admin/admin/tests/server.js +0 -99
  228. package/dist/admin/admin/tests/server.js.map +1 -1
  229. package/dist/admin/admin/tests/server.mjs +0 -80
  230. package/dist/admin/admin/tests/server.mjs.map +1 -1
  231. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/SingleSignOnPage.js +1 -0
  232. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/SingleSignOnPage.js.map +1 -1
  233. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/SingleSignOnPage.mjs +1 -0
  234. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/SingleSignOnPage.mjs.map +1 -1
  235. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/Users/components/CreateActionEE.js +2 -0
  236. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/Users/components/CreateActionEE.js.map +1 -1
  237. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/Users/components/CreateActionEE.mjs +2 -0
  238. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/Users/components/CreateActionEE.mjs.map +1 -1
  239. package/dist/admin/index.js +3 -0
  240. package/dist/admin/index.js.map +1 -1
  241. package/dist/admin/index.mjs +1 -1
  242. package/dist/admin/src/components/MainNav/NavLink.d.ts +2 -2
  243. package/dist/admin/src/constants/theme.d.ts +2 -1
  244. package/dist/admin/src/core/apis/router.d.ts +1 -0
  245. package/dist/admin/src/features/Tracking.d.ts +1 -1
  246. package/dist/admin/src/hooks/useMenu.d.ts +1 -0
  247. package/dist/admin/src/index.d.ts +1 -1
  248. package/dist/admin/tests/mockData.d.ts +0 -972
  249. package/dist/server/server/src/services/permission/permissions-manager/permission-fields.js +53 -0
  250. package/dist/server/server/src/services/permission/permissions-manager/permission-fields.js.map +1 -0
  251. package/dist/server/server/src/services/permission/permissions-manager/permission-fields.mjs +51 -0
  252. package/dist/server/server/src/services/permission/permissions-manager/permission-fields.mjs.map +1 -0
  253. package/dist/server/server/src/services/permission/permissions-manager/sanitize.js +7 -8
  254. package/dist/server/server/src/services/permission/permissions-manager/sanitize.js.map +1 -1
  255. package/dist/server/server/src/services/permission/permissions-manager/sanitize.mjs +10 -11
  256. package/dist/server/server/src/services/permission/permissions-manager/sanitize.mjs.map +1 -1
  257. package/dist/server/server/src/services/permission/permissions-manager/validate.js +7 -8
  258. package/dist/server/server/src/services/permission/permissions-manager/validate.js.map +1 -1
  259. package/dist/server/server/src/services/permission/permissions-manager/validate.mjs +10 -11
  260. package/dist/server/server/src/services/permission/permissions-manager/validate.mjs.map +1 -1
  261. package/dist/server/src/services/permission/permissions-manager/permission-fields.d.ts +21 -0
  262. package/dist/server/src/services/permission/permissions-manager/permission-fields.d.ts.map +1 -0
  263. package/dist/server/src/services/permission/permissions-manager/sanitize.d.ts.map +1 -1
  264. package/dist/server/src/services/permission/permissions-manager/validate.d.ts.map +1 -1
  265. package/package.json +7 -7
  266. package/dist/admin/admin/src/pages/Marketplace/MarketplacePage.js +0 -339
  267. package/dist/admin/admin/src/pages/Marketplace/MarketplacePage.js.map +0 -1
  268. package/dist/admin/admin/src/pages/Marketplace/MarketplacePage.mjs +0 -317
  269. package/dist/admin/admin/src/pages/Marketplace/MarketplacePage.mjs.map +0 -1
  270. package/dist/admin/admin/src/pages/Marketplace/components/NpmPackageCard.js +0 -329
  271. package/dist/admin/admin/src/pages/Marketplace/components/NpmPackageCard.js.map +0 -1
  272. package/dist/admin/admin/src/pages/Marketplace/components/NpmPackageCard.mjs +0 -308
  273. package/dist/admin/admin/src/pages/Marketplace/components/NpmPackageCard.mjs.map +0 -1
  274. package/dist/admin/admin/src/pages/Marketplace/components/NpmPackagesFilters.js +0 -121
  275. package/dist/admin/admin/src/pages/Marketplace/components/NpmPackagesFilters.js.map +0 -1
  276. package/dist/admin/admin/src/pages/Marketplace/components/NpmPackagesFilters.mjs +0 -119
  277. package/dist/admin/admin/src/pages/Marketplace/components/NpmPackagesFilters.mjs.map +0 -1
  278. package/dist/admin/admin/src/pages/Marketplace/components/NpmPackagesGrid.js +0 -93
  279. package/dist/admin/admin/src/pages/Marketplace/components/NpmPackagesGrid.js.map +0 -1
  280. package/dist/admin/admin/src/pages/Marketplace/components/NpmPackagesGrid.mjs +0 -91
  281. package/dist/admin/admin/src/pages/Marketplace/components/NpmPackagesGrid.mjs.map +0 -1
  282. package/dist/admin/admin/src/pages/Marketplace/components/OfflineLayout.js +0 -81
  283. package/dist/admin/admin/src/pages/Marketplace/components/OfflineLayout.js.map +0 -1
  284. package/dist/admin/admin/src/pages/Marketplace/components/OfflineLayout.mjs +0 -79
  285. package/dist/admin/admin/src/pages/Marketplace/components/OfflineLayout.mjs.map +0 -1
  286. package/dist/admin/admin/src/pages/Marketplace/components/PageHeader.js +0 -38
  287. package/dist/admin/admin/src/pages/Marketplace/components/PageHeader.js.map +0 -1
  288. package/dist/admin/admin/src/pages/Marketplace/components/PageHeader.mjs +0 -36
  289. package/dist/admin/admin/src/pages/Marketplace/components/PageHeader.mjs.map +0 -1
  290. package/dist/admin/admin/src/pages/Marketplace/components/SortSelect.js +0 -85
  291. package/dist/admin/admin/src/pages/Marketplace/components/SortSelect.js.map +0 -1
  292. package/dist/admin/admin/src/pages/Marketplace/components/SortSelect.mjs +0 -83
  293. package/dist/admin/admin/src/pages/Marketplace/components/SortSelect.mjs.map +0 -1
  294. package/dist/admin/admin/src/pages/Marketplace/hooks/useMarketplaceData.js +0 -134
  295. package/dist/admin/admin/src/pages/Marketplace/hooks/useMarketplaceData.js.map +0 -1
  296. package/dist/admin/admin/src/pages/Marketplace/hooks/useMarketplaceData.mjs +0 -113
  297. package/dist/admin/admin/src/pages/Marketplace/hooks/useMarketplaceData.mjs.map +0 -1
  298. package/dist/admin/admin/src/pages/Marketplace/hooks/useNavigatorOnline.js +0 -44
  299. package/dist/admin/admin/src/pages/Marketplace/hooks/useNavigatorOnline.js.map +0 -1
  300. package/dist/admin/admin/src/pages/Marketplace/hooks/useNavigatorOnline.mjs +0 -23
  301. package/dist/admin/admin/src/pages/Marketplace/hooks/useNavigatorOnline.mjs.map +0 -1
  302. package/dist/admin/src/pages/Marketplace/MarketplacePage.d.ts +0 -19
  303. package/dist/admin/src/pages/Marketplace/components/NpmPackageCard.d.ts +0 -13
  304. package/dist/admin/src/pages/Marketplace/components/NpmPackagesFilters.d.ts +0 -13
  305. package/dist/admin/src/pages/Marketplace/components/NpmPackagesGrid.d.ts +0 -13
  306. package/dist/admin/src/pages/Marketplace/components/OfflineLayout.d.ts +0 -2
  307. package/dist/admin/src/pages/Marketplace/components/PageHeader.d.ts +0 -8
  308. package/dist/admin/src/pages/Marketplace/components/SortSelect.d.ts +0 -51
  309. package/dist/admin/src/pages/Marketplace/hooks/useMarketplaceData.d.ts +0 -93
  310. package/dist/admin/src/pages/Marketplace/hooks/useNavigatorOnline.d.ts +0 -5
@@ -1 +1 @@
1
- {"version":3,"file":"Tracking.js","sources":["../../../../../admin/src/features/Tracking.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport axios, { AxiosResponse } from 'axios';\n\nimport { Tours } from '../components/GuidedTour/Tours';\nimport { useDeviceType } from '../hooks/useDeviceType';\nimport { useInitQuery, useTelemetryPropertiesQuery } from '../services/admin';\n\nimport { useAppInfo } from './AppInfo';\nimport { useAuth } from './Auth';\nimport { useStrapiApp } from './StrapiApp';\n\nexport interface TelemetryProperties {\n useTypescriptOnServer?: boolean;\n useTypescriptOnAdmin?: boolean;\n isHostedOnStrapiCloud?: boolean;\n numberOfAllContentTypes?: number;\n numberOfComponents?: number;\n numberOfDynamicZones?: number;\n}\n\nexport interface TrackingContextValue {\n uuid?: string | boolean;\n telemetryProperties?: TelemetryProperties;\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Context\n * -----------------------------------------------------------------------------------------------*/\n\nconst TrackingContext = React.createContext<TrackingContextValue>({\n uuid: false,\n});\n\n/* -------------------------------------------------------------------------------------------------\n * Provider\n * -----------------------------------------------------------------------------------------------*/\n\nexport interface TrackingProviderProps {\n children: React.ReactNode;\n}\n\nconst TrackingProvider = ({ children }: TrackingProviderProps) => {\n const token = useAuth('App', (state) => state.token);\n const { data: initData } = useInitQuery();\n const { uuid } = initData ?? {};\n const getAllWidgets = useStrapiApp('TrackingProvider', (state) => state.widgets.getAll);\n\n const { data } = useTelemetryPropertiesQuery(undefined, {\n skip: !initData?.uuid || !token,\n });\n React.useEffect(() => {\n if (uuid && data) {\n const event = 'didInitializeAdministration';\n try {\n fetch(`${process.env.STRAPI_ANALYTICS_URL || 'https://analytics.strapi.io'}/api/v2/track`, {\n method: 'POST',\n body: JSON.stringify({\n // This event is anonymous\n event,\n userId: '',\n eventPropeties: {},\n groupProperties: {\n ...data,\n projectId: uuid,\n registeredWidgets: getAllWidgets().map((widget) => widget.uid),\n },\n }),\n headers: {\n 'Content-Type': 'application/json',\n 'X-Strapi-Event': event,\n },\n });\n } catch {\n // silence is golden\n }\n }\n }, [data, uuid, getAllWidgets]);\n const value = React.useMemo(\n () => ({\n uuid,\n telemetryProperties: data,\n }),\n [uuid, data]\n );\n\n return <TrackingContext.Provider value={value}>{children}</TrackingContext.Provider>;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Hook\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * We can group these events together because none have properties so there's no benefit\n * to having them as separate types.\n *\n * Meanwhile those with properties have different property shapes corresponding to the specific\n * event so understanding which properties go with which event is very helpful.\n */\nexport interface EventWithoutProperties {\n name:\n | 'changeComponentsOrder'\n | 'didAddComponentToDynamicZone'\n | 'didBulkDeleteEntries'\n | 'didNotBulkDeleteEntries'\n | 'didChangeDisplayedFields'\n | 'didCheckDraftRelations'\n | 'didClickGuidedTourHomepageApiTokens'\n | 'didClickGuidedTourHomepageContentManager'\n | 'didClickGuidedTourHomepageContentTypeBuilder'\n | 'didClickGuidedTourStep1CollectionType'\n | 'didClickGuidedTourStep2ContentManager'\n | 'didClickGuidedTourStep3ApiTokens'\n | 'didClickonBlogSection'\n | 'didClickonCodeExampleSection'\n | 'didClickonReadTheDocumentationSection'\n | 'didClickOnTryStrapiCloudSection'\n | 'didClickonTutorialSection'\n | 'didCreateGuidedTourCollectionType'\n | 'didCreateGuidedTourEntry'\n | 'didCreateNewRole'\n | 'didCreateRole'\n | 'didDeleteToken'\n | 'didDuplicateRole'\n | 'didEditEditSettings'\n | 'didEditEmailTemplates'\n | 'didEditFieldNameOnContentType'\n | 'didEditListSettings'\n | 'didEditMediaLibraryConfig'\n | 'didEditNameOfContentType'\n | 'didGenerateGuidedTourApiTokens'\n | 'didGoToMarketplace'\n | 'didLaunchGuidedtour'\n | 'didMissMarketplacePlugin'\n | 'didNotCreateFirstAdmin'\n | 'didNotSaveComponent'\n | 'didPluginLearnMore'\n | 'didBulkPublishEntries'\n | 'didNotBulkPublishEntries'\n | 'didUnpublishEntry'\n | 'didBulkUnpublishEntries'\n | 'didNotBulkUnpublishEntries'\n | 'didSaveComponent'\n | 'didSaveContentType'\n | 'didSearch'\n | 'didSkipGuidedtour'\n | 'didSubmitPlugin'\n | 'didSubmitProvider'\n | 'didUpdateConditions'\n | 'didSelectAllMediaLibraryElements'\n | 'didSelectContentTypeFieldSettings'\n | 'didSelectContentTypeSettings'\n | 'didEditAuthenticationProvider'\n | 'didRestoreHistoryVersion'\n | 'hasClickedCTBAddFieldBanner'\n | 'removeComponentFromDynamicZone'\n | 'willAddMoreFieldToContentType'\n | 'willBulkDeleteEntries'\n | 'willBulkPublishEntries'\n | 'willBulkUnpublishEntries'\n | 'willChangeNumberOfEntriesPerPage'\n | 'willCheckDraftRelations'\n | 'willCreateComponent'\n | 'willCreateComponentFromAttributesModal'\n | 'willCreateContentType'\n | 'willCreateFirstAdmin'\n | 'willCreateNewRole'\n | 'willCreateRole'\n | 'willCreateSingleType'\n | 'willCreateStage'\n | 'willCreateWorkflow'\n | 'willDeleteEntryFromList'\n | 'willDeleteFieldOfContentType'\n | 'willDuplicateRole'\n | 'willEditEditLayout'\n | 'willEditEmailTemplates'\n | 'willEditEntryFromButton'\n | 'willEditEntryFromList'\n | 'willEditReleaseFromHome'\n | 'willEditFieldOfContentType'\n | 'willEditMediaLibraryConfig'\n | 'willEditNameOfContentType'\n | 'willEditNameOfSingleType'\n | 'willEditAuthenticationProvider'\n | 'willEditFieldNameOnContentType'\n | 'willEditStage'\n | 'willFilterEntries'\n | 'willInstallPlugin'\n | 'willOpenAuditLogDetailsFromHome'\n | 'willUnpublishEntry'\n | 'willSaveComponent'\n | 'willSaveContentType'\n | 'willSaveContentTypeLayout'\n | 'didEditFieldNameOnContentType'\n | 'didCreateRelease'\n | 'didStartNewChat'\n | 'didLaunchGuidedtour'\n | 'didEditAICaption'\n | 'didEditAIAlternativeText';\n properties?: never;\n}\n\ninterface DidAccessAuthenticatedAdministrationEvent {\n name: 'didAccessAuthenticatedAdministration';\n properties: {\n registeredWidgets: string[];\n projectId: string;\n };\n}\n\ninterface DidFilterMediaLibraryElementsEvent {\n name: 'didFilterMediaLibraryElements';\n properties: MediaEvents['properties'] & {\n filter: string;\n };\n}\n\ninterface DidSortMediaLibraryElementsEvent {\n name: 'didSortMediaLibraryElements';\n properties: MediaEvents['properties'] & {\n sort: string;\n };\n}\n\ninterface DidCropFileEvent {\n name: 'didCropFile';\n properties: MediaEvents['properties'] & {\n duplicatedFile: null | boolean;\n };\n}\n\ninterface DidSelectFile {\n name: 'didSelectFile';\n properties: MediaEvents['properties'] & {\n source: 'url' | 'computer';\n };\n}\n\ninterface DidEditMediaLibraryElementsEvent {\n name: 'didEditMediaLibraryElements';\n properties: MediaEvents['properties'] & {\n type: string;\n changeLocation: string | boolean;\n };\n}\n\ninterface MediaEvents {\n name:\n | 'didSearchMediaLibraryElements'\n | 'didReplaceMedia'\n | 'didAddMediaLibraryFolders'\n | 'willAddMediaLibraryAssets';\n properties: {\n location: string;\n };\n}\n\ninterface DidSelectContentTypeFieldTypeEvent {\n name: 'didSelectContentTypeFieldType';\n properties: {\n type?: string;\n };\n}\n\ninterface DidChangeModeEvent {\n name: 'didChangeMode';\n properties: {\n newMode: string;\n };\n}\ninterface DidSubmitWithErrorsFirstAdminEvent {\n name: 'didSubmitWithErrorsFirstAdmin';\n properties: {\n count: string;\n };\n}\n\ninterface WillNavigateEvent {\n name: 'willNavigate';\n properties: {\n from: string;\n to: string;\n };\n}\n\ninterface DidAccessTokenListEvent {\n name: 'didAccessTokenList';\n properties: {\n tokenType: TokenEvents['properties']['tokenType'];\n number: number;\n };\n}\ninterface LogoEvent {\n name: 'didChangeLogo' | 'didClickResetLogo';\n properties: {\n logo: 'menu' | 'auth';\n };\n}\n\ninterface TokenEvents {\n name:\n | 'didCopyTokenKey'\n | 'didAddTokenFromList'\n | 'didEditTokenFromList'\n | 'willAccessTokenList'\n | 'willAddTokenFromList'\n | 'willCreateToken'\n | 'willDeleteToken'\n | 'willEditToken'\n | 'willEditTokenFromList';\n properties: {\n tokenType: 'api-token' | 'transfer-token';\n };\n}\n\ninterface WillModifyTokenEvent {\n name: 'didCreateToken' | 'didEditToken';\n properties: {\n tokenType: TokenEvents['properties']['tokenType'];\n type: 'custom' | 'full-access' | 'read-only' | Array<'push' | 'pull' | 'push-pull'>;\n };\n}\n\ninterface DeleteEntryEvents {\n name: 'willDeleteEntry' | 'didDeleteEntry' | 'didNotDeleteEntry';\n properties: {\n status?: string;\n error?: unknown;\n };\n}\n\ninterface CreateEntryEvents {\n name: 'willCreateEntry' | 'didCreateEntry' | 'didNotCreateEntry';\n properties: {\n documentId?: string;\n status?: string;\n error?: unknown;\n fromPreview?: boolean;\n fromRelationModal?: boolean;\n };\n}\n\ninterface PublishEntryEvents {\n name: 'willPublishEntry' | 'didPublishEntry';\n properties: {\n documentId?: string;\n fromPreview?: boolean;\n fromRelationModal?: boolean;\n };\n}\n\ninterface UpdateEntryEvents {\n name: 'willEditEntry' | 'didEditEntry' | 'didNotEditEntry';\n properties: {\n documentId?: string;\n status?: string;\n error?: unknown;\n fromPreview?: boolean;\n fromRelationModal?: boolean;\n };\n}\n\ninterface DidFilterEntriesEvent {\n name: 'didFilterEntries';\n properties: {\n useRelation: boolean;\n };\n}\n\ninterface DidPublishRelease {\n name: 'didPublishRelease';\n properties: {\n totalEntries: number;\n totalPublishedEntries: number;\n totalUnpublishedEntries: number;\n };\n}\n\ninterface DidUsePresetPromptEvent {\n name: 'didUsePresetPrompt';\n properties: {\n promptType:\n | 'generate-product-schema'\n | 'tell-me-about-the-content-type-builder'\n | 'tell-me-about-strapi';\n };\n}\n\ninterface DidAnswerMessageEvent {\n name: 'didAnswerMessage';\n properties: {\n successful: boolean;\n };\n}\n\ninterface DidVoteAnswerEvent {\n name: 'didVoteAnswer';\n properties: {\n value: 'positive' | 'negative';\n };\n}\n\ninterface DidUpdateCTBSchema {\n name: 'didUpdateCTBSchema';\n properties: {\n success: boolean;\n newContentTypes: number;\n editedContentTypes: number;\n deletedContentTypes: number;\n newComponents: number;\n editedComponents: number;\n deletedComponents: number;\n newFields: number;\n editedFields: number;\n deletedFields: number;\n };\n}\n\ninterface DidSkipGuidedTour {\n name: 'didSkipGuidedTour';\n properties: {\n name: keyof Tours | 'all';\n };\n}\n\ninterface DidCompleteGuidedTour {\n name: 'didCompleteGuidedTour';\n properties: {\n name: keyof Tours | 'all';\n };\n}\n\ninterface DidStartGuidedTour {\n name: 'didStartGuidedTour';\n properties: {\n name: keyof Tours;\n fromHomepage?: boolean;\n };\n}\n\ninterface WillEditEntryFromHome {\n name: 'willEditEntryFromHome';\n properties: {\n entryType: 'edited' | 'published' | 'assigned';\n };\n}\n\ninterface DidOpenHomeWidgetLink {\n name: 'didOpenHomeWidgetLink';\n properties: {\n widgetUID: string;\n };\n}\n\ninterface DidOpenKeyStatisticsWidgetLink {\n name: 'didOpenKeyStatisticsWidgetLink';\n properties: {\n itemKey: string;\n };\n}\n\ntype EventsWithProperties =\n | CreateEntryEvents\n | PublishEntryEvents\n | DidAccessAuthenticatedAdministrationEvent\n | DidAccessTokenListEvent\n | DidChangeModeEvent\n | DidCropFileEvent\n | DeleteEntryEvents\n | DidEditMediaLibraryElementsEvent\n | DidFilterMediaLibraryElementsEvent\n | DidFilterEntriesEvent\n | DidSelectContentTypeFieldTypeEvent\n | DidSelectFile\n | DidSortMediaLibraryElementsEvent\n | DidSubmitWithErrorsFirstAdminEvent\n | DidUsePresetPromptEvent\n | DidAnswerMessageEvent\n | DidVoteAnswerEvent\n | LogoEvent\n | TokenEvents\n | UpdateEntryEvents\n | WillModifyTokenEvent\n | WillNavigateEvent\n | DidPublishRelease\n | MediaEvents\n | DidUpdateCTBSchema\n | DidSkipGuidedTour\n | DidCompleteGuidedTour\n | DidStartGuidedTour\n | DidOpenHomeWidgetLink\n | DidOpenKeyStatisticsWidgetLink\n | WillEditEntryFromHome;\n\nexport type TrackingEvent = EventWithoutProperties | EventsWithProperties;\nexport interface UseTrackingReturn {\n /**\n * This type helps show all the available event names before you start typing,\n * however autocomplete isn't great.\n */\n trackUsage<TEvent extends TrackingEvent>(\n event: TEvent['name'],\n properties: TEvent['properties']\n ): Promise<null | AxiosResponse<string>>;\n trackUsage<TEvent extends Extract<TrackingEvent, { properties?: never }>>(\n event: TEvent['name'],\n properties?: never\n ): Promise<null | AxiosResponse<string>>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n trackUsage<TEvent extends Extract<TrackingEvent, { properties: object }>>(\n event: TEvent['name'],\n properties: TEvent['properties']\n ): Promise<null | AxiosResponse<string>>;\n}\n\n/**\n * @description Used to send amplitude events to the Strapi Tracking hub.\n *\n * @example\n * ```tsx\n * import { useTracking } from '@strapi/strapi/admin';\n *\n * const MyComponent = () => {\n * const { trackUsage } = useTracking();\n *\n * const handleClick = () => {\n * trackUsage('my-event', { myProperty: 'myValue' });\n * }\n *\n * return <button onClick={handleClick}>Send Event</button>\n * }\n * ```\n */\nconst useTracking = (): UseTrackingReturn => {\n const deviceType = useDeviceType();\n const { uuid, telemetryProperties } = React.useContext(TrackingContext);\n const userId = useAppInfo('useTracking', (state) => state.userId);\n const trackUsage = React.useCallback(\n async <TEvent extends TrackingEvent>(\n event: TEvent['name'],\n properties?: TEvent['properties']\n ) => {\n try {\n if (uuid && !window.strapi.telemetryDisabled) {\n const res = await axios.post<string>(\n `${process.env.STRAPI_ANALYTICS_URL || 'https://analytics.strapi.io'}/api/v2/track`,\n {\n event,\n userId,\n eventProperties: { ...properties },\n userProperties: {\n deviceType,\n },\n groupProperties: {\n ...telemetryProperties,\n projectId: uuid,\n projectType: window.strapi.projectType,\n },\n },\n {\n headers: {\n 'Content-Type': 'application/json',\n 'X-Strapi-Event': event,\n },\n }\n );\n\n return res;\n }\n } catch (err) {\n // Silence is golden\n }\n\n return null;\n },\n [telemetryProperties, userId, uuid]\n );\n\n return { trackUsage };\n};\n\nexport { TrackingProvider, useTracking };\n"],"names":["TrackingContext","React","createContext","uuid","TrackingProvider","children","token","useAuth","state","data","initData","useInitQuery","getAllWidgets","useStrapiApp","widgets","getAll","useTelemetryPropertiesQuery","undefined","skip","useEffect","event","fetch","process","env","STRAPI_ANALYTICS_URL","method","body","JSON","stringify","userId","eventPropeties","groupProperties","projectId","registeredWidgets","map","widget","uid","headers","value","useMemo","telemetryProperties","_jsx","Provider","useTracking","deviceType","useDeviceType","useContext","useAppInfo","trackUsage","useCallback","properties","window","strapi","telemetryDisabled","res","axios","post","eventProperties","userProperties","projectType","err"],"mappings":"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"}
1
+ {"version":3,"file":"Tracking.js","sources":["../../../../../admin/src/features/Tracking.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport axios, { AxiosResponse } from 'axios';\n\nimport { Tours } from '../components/GuidedTour/Tours';\nimport { useDeviceType } from '../hooks/useDeviceType';\nimport { useInitQuery, useTelemetryPropertiesQuery } from '../services/admin';\n\nimport { useAppInfo } from './AppInfo';\nimport { useAuth } from './Auth';\nimport { useStrapiApp } from './StrapiApp';\n\nexport interface TelemetryProperties {\n useTypescriptOnServer?: boolean;\n useTypescriptOnAdmin?: boolean;\n isHostedOnStrapiCloud?: boolean;\n numberOfAllContentTypes?: number;\n numberOfComponents?: number;\n numberOfDynamicZones?: number;\n}\n\nexport interface TrackingContextValue {\n uuid?: string | boolean;\n telemetryProperties?: TelemetryProperties;\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Context\n * -----------------------------------------------------------------------------------------------*/\n\nconst TrackingContext = React.createContext<TrackingContextValue>({\n uuid: false,\n});\n\n/* -------------------------------------------------------------------------------------------------\n * Provider\n * -----------------------------------------------------------------------------------------------*/\n\nexport interface TrackingProviderProps {\n children: React.ReactNode;\n}\n\nconst TrackingProvider = ({ children }: TrackingProviderProps) => {\n const token = useAuth('App', (state) => state.token);\n const { data: initData } = useInitQuery();\n const { uuid } = initData ?? {};\n const getAllWidgets = useStrapiApp('TrackingProvider', (state) => state.widgets.getAll);\n\n const { data } = useTelemetryPropertiesQuery(undefined, {\n skip: !initData?.uuid || !token,\n });\n React.useEffect(() => {\n if (uuid && data) {\n const event = 'didInitializeAdministration';\n try {\n fetch(`${process.env.STRAPI_ANALYTICS_URL || 'https://analytics.strapi.io'}/api/v2/track`, {\n method: 'POST',\n body: JSON.stringify({\n // This event is anonymous\n event,\n userId: '',\n eventPropeties: {},\n groupProperties: {\n ...data,\n projectId: uuid,\n registeredWidgets: getAllWidgets().map((widget) => widget.uid),\n },\n }),\n headers: {\n 'Content-Type': 'application/json',\n 'X-Strapi-Event': event,\n },\n });\n } catch {\n // silence is golden\n }\n }\n }, [data, uuid, getAllWidgets]);\n const value = React.useMemo(\n () => ({\n uuid,\n telemetryProperties: data,\n }),\n [uuid, data]\n );\n\n return <TrackingContext.Provider value={value}>{children}</TrackingContext.Provider>;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Hook\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * We can group these events together because none have properties so there's no benefit\n * to having them as separate types.\n *\n * Meanwhile those with properties have different property shapes corresponding to the specific\n * event so understanding which properties go with which event is very helpful.\n */\nexport interface EventWithoutProperties {\n name:\n | 'changeComponentsOrder'\n | 'didAddComponentToDynamicZone'\n | 'didBulkDeleteEntries'\n | 'didNotBulkDeleteEntries'\n | 'didChangeDisplayedFields'\n | 'didCheckDraftRelations'\n | 'didClickGuidedTourHomepageApiTokens'\n | 'didClickGuidedTourHomepageContentManager'\n | 'didClickGuidedTourHomepageContentTypeBuilder'\n | 'didClickGuidedTourStep1CollectionType'\n | 'didClickGuidedTourStep2ContentManager'\n | 'didClickGuidedTourStep3ApiTokens'\n | 'didClickonBlogSection'\n | 'didClickonCodeExampleSection'\n | 'didClickonReadTheDocumentationSection'\n | 'didClickOnTryStrapiCloudSection'\n | 'didClickonTutorialSection'\n | 'didCreateGuidedTourCollectionType'\n | 'didCreateGuidedTourEntry'\n | 'didCreateNewRole'\n | 'didCreateRole'\n | 'didDeleteToken'\n | 'didDuplicateRole'\n | 'didEditEditSettings'\n | 'didEditEmailTemplates'\n | 'didEditFieldNameOnContentType'\n | 'didEditListSettings'\n | 'didEditMediaLibraryConfig'\n | 'didEditNameOfContentType'\n | 'didGenerateGuidedTourApiTokens'\n | 'didLaunchGuidedtour'\n | 'didNotCreateFirstAdmin'\n | 'didNotSaveComponent'\n | 'didPluginLearnMore'\n | 'didBulkPublishEntries'\n | 'didNotBulkPublishEntries'\n | 'didUnpublishEntry'\n | 'didBulkUnpublishEntries'\n | 'didNotBulkUnpublishEntries'\n | 'didSaveComponent'\n | 'didSaveContentType'\n | 'didSearch'\n | 'didSkipGuidedtour'\n | 'didSubmitPlugin'\n | 'didSubmitProvider'\n | 'didUpdateConditions'\n | 'didSelectAllMediaLibraryElements'\n | 'didSelectContentTypeFieldSettings'\n | 'didSelectContentTypeSettings'\n | 'didEditAuthenticationProvider'\n | 'didRestoreHistoryVersion'\n | 'hasClickedCTBAddFieldBanner'\n | 'removeComponentFromDynamicZone'\n | 'willAddMoreFieldToContentType'\n | 'willBulkDeleteEntries'\n | 'willBulkPublishEntries'\n | 'willBulkUnpublishEntries'\n | 'willChangeNumberOfEntriesPerPage'\n | 'willCheckDraftRelations'\n | 'willCreateComponent'\n | 'willCreateComponentFromAttributesModal'\n | 'willCreateContentType'\n | 'willCreateFirstAdmin'\n | 'willCreateNewRole'\n | 'willCreateRole'\n | 'willCreateSingleType'\n | 'willCreateStage'\n | 'willCreateWorkflow'\n | 'willDeleteEntryFromList'\n | 'willDeleteFieldOfContentType'\n | 'willDuplicateRole'\n | 'willEditEditLayout'\n | 'willEditEmailTemplates'\n | 'willEditEntryFromButton'\n | 'willEditEntryFromList'\n | 'willEditReleaseFromHome'\n | 'willEditFieldOfContentType'\n | 'willEditMediaLibraryConfig'\n | 'willEditNameOfContentType'\n | 'willEditNameOfSingleType'\n | 'willEditAuthenticationProvider'\n | 'willEditFieldNameOnContentType'\n | 'willEditStage'\n | 'willFilterEntries'\n | 'willInstallPlugin'\n | 'willOpenAuditLogDetailsFromHome'\n | 'willUnpublishEntry'\n | 'willSaveComponent'\n | 'willSaveContentType'\n | 'willSaveContentTypeLayout'\n | 'didEditFieldNameOnContentType'\n | 'didCreateRelease'\n | 'didStartNewChat'\n | 'didLaunchGuidedtour'\n | 'didEditAICaption'\n | 'didEditAIAlternativeText'\n | 'didGenerateMetadataRetroactively';\n\n properties?: never;\n}\n\ninterface DidAccessAuthenticatedAdministrationEvent {\n name: 'didAccessAuthenticatedAdministration';\n properties: {\n registeredWidgets: string[];\n projectId: string;\n };\n}\n\ninterface DidFilterMediaLibraryElementsEvent {\n name: 'didFilterMediaLibraryElements';\n properties: MediaEvents['properties'] & {\n filter: string;\n };\n}\n\ninterface DidSortMediaLibraryElementsEvent {\n name: 'didSortMediaLibraryElements';\n properties: MediaEvents['properties'] & {\n sort: string;\n };\n}\n\ninterface DidCropFileEvent {\n name: 'didCropFile';\n properties: MediaEvents['properties'] & {\n duplicatedFile: null | boolean;\n };\n}\n\ninterface DidSelectFile {\n name: 'didSelectFile';\n properties: MediaEvents['properties'] & {\n source: 'url' | 'computer';\n };\n}\n\ninterface DidEditMediaLibraryElementsEvent {\n name: 'didEditMediaLibraryElements';\n properties: MediaEvents['properties'] & {\n type: string;\n changeLocation: string | boolean;\n };\n}\n\ninterface MediaEvents {\n name:\n | 'didSearchMediaLibraryElements'\n | 'didReplaceMedia'\n | 'didAddMediaLibraryFolders'\n | 'willAddMediaLibraryAssets';\n properties: {\n location: string;\n };\n}\n\ninterface DidSelectContentTypeFieldTypeEvent {\n name: 'didSelectContentTypeFieldType';\n properties: {\n type?: string;\n };\n}\n\ninterface DidChangeModeEvent {\n name: 'didChangeMode';\n properties: {\n newMode: string;\n };\n}\ninterface DidSubmitWithErrorsFirstAdminEvent {\n name: 'didSubmitWithErrorsFirstAdmin';\n properties: {\n count: string;\n };\n}\n\ninterface WillNavigateEvent {\n name: 'willNavigate';\n properties: {\n from: string;\n to: string;\n };\n}\n\ninterface DidAccessTokenListEvent {\n name: 'didAccessTokenList';\n properties: {\n tokenType: TokenEvents['properties']['tokenType'];\n number: number;\n };\n}\ninterface LogoEvent {\n name: 'didChangeLogo' | 'didClickResetLogo';\n properties: {\n logo: 'menu' | 'auth';\n };\n}\n\ninterface TokenEvents {\n name:\n | 'didCopyTokenKey'\n | 'didAddTokenFromList'\n | 'didEditTokenFromList'\n | 'willAccessTokenList'\n | 'willAddTokenFromList'\n | 'willCreateToken'\n | 'willDeleteToken'\n | 'willEditToken'\n | 'willEditTokenFromList';\n properties: {\n tokenType: 'api-token' | 'transfer-token';\n };\n}\n\ninterface WillModifyTokenEvent {\n name: 'didCreateToken' | 'didEditToken';\n properties: {\n tokenType: TokenEvents['properties']['tokenType'];\n type: 'custom' | 'full-access' | 'read-only' | Array<'push' | 'pull' | 'push-pull'>;\n };\n}\n\ninterface DeleteEntryEvents {\n name: 'willDeleteEntry' | 'didDeleteEntry' | 'didNotDeleteEntry';\n properties: {\n status?: string;\n error?: unknown;\n };\n}\n\ninterface CreateEntryEvents {\n name: 'willCreateEntry' | 'didCreateEntry' | 'didNotCreateEntry';\n properties: {\n documentId?: string;\n status?: string;\n error?: unknown;\n fromPreview?: boolean;\n fromRelationModal?: boolean;\n };\n}\n\ninterface PublishEntryEvents {\n name: 'willPublishEntry' | 'didPublishEntry';\n properties: {\n documentId?: string;\n fromPreview?: boolean;\n fromRelationModal?: boolean;\n };\n}\n\ninterface UpdateEntryEvents {\n name: 'willEditEntry' | 'didEditEntry' | 'didNotEditEntry';\n properties: {\n documentId?: string;\n status?: string;\n error?: unknown;\n fromPreview?: boolean;\n fromRelationModal?: boolean;\n };\n}\n\ninterface DidFilterEntriesEvent {\n name: 'didFilterEntries';\n properties: {\n useRelation: boolean;\n };\n}\n\ninterface DidPublishRelease {\n name: 'didPublishRelease';\n properties: {\n totalEntries: number;\n totalPublishedEntries: number;\n totalUnpublishedEntries: number;\n };\n}\n\ninterface DidUsePresetPromptEvent {\n name: 'didUsePresetPrompt';\n properties: {\n promptType:\n | 'generate-product-schema'\n | 'tell-me-about-the-content-type-builder'\n | 'tell-me-about-strapi';\n };\n}\n\ninterface DidAnswerMessageEvent {\n name: 'didAnswerMessage';\n properties: {\n successful: boolean;\n };\n}\n\ninterface DidVoteAnswerEvent {\n name: 'didVoteAnswer';\n properties: {\n value: 'positive' | 'negative';\n };\n}\n\ninterface DidUpdateCTBSchema {\n name: 'didUpdateCTBSchema';\n properties: {\n success: boolean;\n newContentTypes: number;\n editedContentTypes: number;\n deletedContentTypes: number;\n newComponents: number;\n editedComponents: number;\n deletedComponents: number;\n newFields: number;\n editedFields: number;\n deletedFields: number;\n };\n}\n\ninterface DidSkipGuidedTour {\n name: 'didSkipGuidedTour';\n properties: {\n name: keyof Tours | 'all';\n };\n}\n\ninterface DidCompleteGuidedTour {\n name: 'didCompleteGuidedTour';\n properties: {\n name: keyof Tours | 'all';\n };\n}\n\ninterface DidStartGuidedTour {\n name: 'didStartGuidedTour';\n properties: {\n name: keyof Tours;\n fromHomepage?: boolean;\n };\n}\n\ninterface WillEditEntryFromHome {\n name: 'willEditEntryFromHome';\n properties: {\n entryType: 'edited' | 'published' | 'assigned';\n };\n}\n\ninterface DidOpenHomeWidgetLink {\n name: 'didOpenHomeWidgetLink';\n properties: {\n widgetUID: string;\n };\n}\n\ninterface DidOpenKeyStatisticsWidgetLink {\n name: 'didOpenKeyStatisticsWidgetLink';\n properties: {\n itemKey: string;\n };\n}\n\ntype EventsWithProperties =\n | CreateEntryEvents\n | PublishEntryEvents\n | DidAccessAuthenticatedAdministrationEvent\n | DidAccessTokenListEvent\n | DidChangeModeEvent\n | DidCropFileEvent\n | DeleteEntryEvents\n | DidEditMediaLibraryElementsEvent\n | DidFilterMediaLibraryElementsEvent\n | DidFilterEntriesEvent\n | DidSelectContentTypeFieldTypeEvent\n | DidSelectFile\n | DidSortMediaLibraryElementsEvent\n | DidSubmitWithErrorsFirstAdminEvent\n | DidUsePresetPromptEvent\n | DidAnswerMessageEvent\n | DidVoteAnswerEvent\n | LogoEvent\n | TokenEvents\n | UpdateEntryEvents\n | WillModifyTokenEvent\n | WillNavigateEvent\n | DidPublishRelease\n | MediaEvents\n | DidUpdateCTBSchema\n | DidSkipGuidedTour\n | DidCompleteGuidedTour\n | DidStartGuidedTour\n | DidOpenHomeWidgetLink\n | DidOpenKeyStatisticsWidgetLink\n | WillEditEntryFromHome;\n\nexport type TrackingEvent = EventWithoutProperties | EventsWithProperties;\nexport interface UseTrackingReturn {\n /**\n * This type helps show all the available event names before you start typing,\n * however autocomplete isn't great.\n */\n trackUsage<TEvent extends TrackingEvent>(\n event: TEvent['name'],\n properties: TEvent['properties']\n ): Promise<null | AxiosResponse<string>>;\n trackUsage<TEvent extends Extract<TrackingEvent, { properties?: never }>>(\n event: TEvent['name'],\n properties?: never\n ): Promise<null | AxiosResponse<string>>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n trackUsage<TEvent extends Extract<TrackingEvent, { properties: object }>>(\n event: TEvent['name'],\n properties: TEvent['properties']\n ): Promise<null | AxiosResponse<string>>;\n}\n\n/**\n * @description Used to send amplitude events to the Strapi Tracking hub.\n *\n * @example\n * ```tsx\n * import { useTracking } from '@strapi/strapi/admin';\n *\n * const MyComponent = () => {\n * const { trackUsage } = useTracking();\n *\n * const handleClick = () => {\n * trackUsage('my-event', { myProperty: 'myValue' });\n * }\n *\n * return <button onClick={handleClick}>Send Event</button>\n * }\n * ```\n */\nconst useTracking = (): UseTrackingReturn => {\n const deviceType = useDeviceType();\n const { uuid, telemetryProperties } = React.useContext(TrackingContext);\n const userId = useAppInfo('useTracking', (state) => state.userId);\n const trackUsage = React.useCallback(\n async <TEvent extends TrackingEvent>(\n event: TEvent['name'],\n properties?: TEvent['properties']\n ) => {\n try {\n if (uuid && !window.strapi.telemetryDisabled) {\n const res = await axios.post<string>(\n `${process.env.STRAPI_ANALYTICS_URL || 'https://analytics.strapi.io'}/api/v2/track`,\n {\n event,\n userId,\n eventProperties: { ...properties },\n userProperties: {\n deviceType,\n },\n groupProperties: {\n ...telemetryProperties,\n projectId: uuid,\n projectType: window.strapi.projectType,\n },\n },\n {\n headers: {\n 'Content-Type': 'application/json',\n 'X-Strapi-Event': event,\n },\n }\n );\n\n return res;\n }\n } catch (err) {\n // Silence is golden\n }\n\n return null;\n },\n [telemetryProperties, userId, uuid]\n );\n\n return { trackUsage };\n};\n\nexport { TrackingProvider, useTracking };\n"],"names":["TrackingContext","React","createContext","uuid","TrackingProvider","children","token","useAuth","state","data","initData","useInitQuery","getAllWidgets","useStrapiApp","widgets","getAll","useTelemetryPropertiesQuery","undefined","skip","useEffect","event","fetch","process","env","STRAPI_ANALYTICS_URL","method","body","JSON","stringify","userId","eventPropeties","groupProperties","projectId","registeredWidgets","map","widget","uid","headers","value","useMemo","telemetryProperties","_jsx","Provider","useTracking","deviceType","useDeviceType","useContext","useAppInfo","trackUsage","useCallback","properties","window","strapi","telemetryDisabled","res","axios","post","eventProperties","userProperties","projectType","err"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0BA;;AAEkG,qGAElG,MAAMA,eAAAA,iBAAkBC,gBAAMC,CAAAA,aAAa,CAAuB;IAChEC,IAAM,EAAA;AACR,CAAA,CAAA;AAUA,MAAMC,gBAAmB,GAAA,CAAC,EAAEC,QAAQ,EAAyB,GAAA;AAC3D,IAAA,MAAMC,QAAQC,YAAQ,CAAA,KAAA,EAAO,CAACC,KAAAA,GAAUA,MAAMF,KAAK,CAAA;AACnD,IAAA,MAAM,EAAEG,IAAAA,EAAMC,QAAQ,EAAE,GAAGC,kBAAAA,EAAAA;AAC3B,IAAA,MAAM,EAAER,IAAI,EAAE,GAAGO,YAAY,EAAC;IAC9B,MAAME,aAAAA,GAAgBC,uBAAa,kBAAoB,EAAA,CAACL,QAAUA,KAAMM,CAAAA,OAAO,CAACC,MAAM,CAAA;AAEtF,IAAA,MAAM,EAAEN,IAAI,EAAE,GAAGO,kCAA4BC,SAAW,EAAA;QACtDC,IAAM,EAAA,CAACR,QAAUP,EAAAA,IAAAA,IAAQ,CAACG;AAC5B,KAAA,CAAA;AACAL,IAAAA,gBAAAA,CAAMkB,SAAS,CAAC,IAAA;AACd,QAAA,IAAIhB,QAAQM,IAAM,EAAA;AAChB,YAAA,MAAMW,KAAQ,GAAA,6BAAA;YACd,IAAI;gBACFC,KAAM,CAAA,CAAA,EAAGC,QAAQC,GAAG,CAACC,oBAAoB,IAAI,6BAAA,CAA8B,aAAa,CAAC,EAAE;oBACzFC,MAAQ,EAAA,MAAA;oBACRC,IAAMC,EAAAA,IAAAA,CAAKC,SAAS,CAAC;;AAEnBR,wBAAAA,KAAAA;wBACAS,MAAQ,EAAA,EAAA;AACRC,wBAAAA,cAAAA,EAAgB,EAAC;wBACjBC,eAAiB,EAAA;AACf,4BAAA,GAAGtB,IAAI;4BACPuB,SAAW7B,EAAAA,IAAAA;AACX8B,4BAAAA,iBAAAA,EAAmBrB,gBAAgBsB,GAAG,CAAC,CAACC,MAAAA,GAAWA,OAAOC,GAAG;AAC/D;AACF,qBAAA,CAAA;oBACAC,OAAS,EAAA;wBACP,cAAgB,EAAA,kBAAA;wBAChB,gBAAkBjB,EAAAA;AACpB;AACF,iBAAA,CAAA;AACF,aAAA,CAAE,OAAM;;AAER;AACF;KACC,EAAA;AAACX,QAAAA,IAAAA;AAAMN,QAAAA,IAAAA;AAAMS,QAAAA;AAAc,KAAA,CAAA;AAC9B,IAAA,MAAM0B,KAAQrC,GAAAA,gBAAAA,CAAMsC,OAAO,CACzB,KAAO;AACLpC,YAAAA,IAAAA;YACAqC,mBAAqB/B,EAAAA;AACvB,SAAA,CACA,EAAA;AAACN,QAAAA,IAAAA;AAAMM,QAAAA;AAAK,KAAA,CAAA;IAGd,qBAAOgC,cAAA,CAACzC,gBAAgB0C,QAAQ,EAAA;QAACJ,KAAOA,EAAAA,KAAAA;AAAQjC,QAAAA,QAAAA,EAAAA;;AAClD;AA6aA;;;;;;;;;;;;;;;;;AAiBC,UACKsC,WAAc,GAAA,IAAA;AAClB,IAAA,MAAMC,UAAaC,GAAAA,2BAAAA,EAAAA;IACnB,MAAM,EAAE1C,IAAI,EAAEqC,mBAAmB,EAAE,GAAGvC,gBAAAA,CAAM6C,UAAU,CAAC9C,eAAAA,CAAAA;AACvD,IAAA,MAAM6B,SAASkB,kBAAW,CAAA,aAAA,EAAe,CAACvC,KAAAA,GAAUA,MAAMqB,MAAM,CAAA;AAChE,IAAA,MAAMmB,UAAa/C,GAAAA,gBAAAA,CAAMgD,WAAW,CAClC,OACE7B,KACA8B,EAAAA,UAAAA,GAAAA;QAEA,IAAI;AACF,YAAA,IAAI/C,QAAQ,CAACgD,MAAAA,CAAOC,MAAM,CAACC,iBAAiB,EAAE;AAC5C,gBAAA,MAAMC,GAAM,GAAA,MAAMC,KAAMC,CAAAA,IAAI,CAC1B,CAAGlC,EAAAA,OAAAA,CAAQC,GAAG,CAACC,oBAAoB,IAAI,6BAA8B,CAAA,aAAa,CAAC,EACnF;AACEJ,oBAAAA,KAAAA;AACAS,oBAAAA,MAAAA;oBACA4B,eAAiB,EAAA;AAAE,wBAAA,GAAGP;AAAW,qBAAA;oBACjCQ,cAAgB,EAAA;AACdd,wBAAAA;AACF,qBAAA;oBACAb,eAAiB,EAAA;AACf,wBAAA,GAAGS,mBAAmB;wBACtBR,SAAW7B,EAAAA,IAAAA;wBACXwD,WAAaR,EAAAA,MAAAA,CAAOC,MAAM,CAACO;AAC7B;iBAEF,EAAA;oBACEtB,OAAS,EAAA;wBACP,cAAgB,EAAA,kBAAA;wBAChB,gBAAkBjB,EAAAA;AACpB;AACF,iBAAA,CAAA;gBAGF,OAAOkC,GAAAA;AACT;AACF,SAAA,CAAE,OAAOM,GAAK,EAAA;;AAEd;QAEA,OAAO,IAAA;KAET,EAAA;AAACpB,QAAAA,mBAAAA;AAAqBX,QAAAA,MAAAA;AAAQ1B,QAAAA;AAAK,KAAA,CAAA;IAGrC,OAAO;AAAE6C,QAAAA;AAAW,KAAA;AACtB;;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"Tracking.mjs","sources":["../../../../../admin/src/features/Tracking.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport axios, { AxiosResponse } from 'axios';\n\nimport { Tours } from '../components/GuidedTour/Tours';\nimport { useDeviceType } from '../hooks/useDeviceType';\nimport { useInitQuery, useTelemetryPropertiesQuery } from '../services/admin';\n\nimport { useAppInfo } from './AppInfo';\nimport { useAuth } from './Auth';\nimport { useStrapiApp } from './StrapiApp';\n\nexport interface TelemetryProperties {\n useTypescriptOnServer?: boolean;\n useTypescriptOnAdmin?: boolean;\n isHostedOnStrapiCloud?: boolean;\n numberOfAllContentTypes?: number;\n numberOfComponents?: number;\n numberOfDynamicZones?: number;\n}\n\nexport interface TrackingContextValue {\n uuid?: string | boolean;\n telemetryProperties?: TelemetryProperties;\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Context\n * -----------------------------------------------------------------------------------------------*/\n\nconst TrackingContext = React.createContext<TrackingContextValue>({\n uuid: false,\n});\n\n/* -------------------------------------------------------------------------------------------------\n * Provider\n * -----------------------------------------------------------------------------------------------*/\n\nexport interface TrackingProviderProps {\n children: React.ReactNode;\n}\n\nconst TrackingProvider = ({ children }: TrackingProviderProps) => {\n const token = useAuth('App', (state) => state.token);\n const { data: initData } = useInitQuery();\n const { uuid } = initData ?? {};\n const getAllWidgets = useStrapiApp('TrackingProvider', (state) => state.widgets.getAll);\n\n const { data } = useTelemetryPropertiesQuery(undefined, {\n skip: !initData?.uuid || !token,\n });\n React.useEffect(() => {\n if (uuid && data) {\n const event = 'didInitializeAdministration';\n try {\n fetch(`${process.env.STRAPI_ANALYTICS_URL || 'https://analytics.strapi.io'}/api/v2/track`, {\n method: 'POST',\n body: JSON.stringify({\n // This event is anonymous\n event,\n userId: '',\n eventPropeties: {},\n groupProperties: {\n ...data,\n projectId: uuid,\n registeredWidgets: getAllWidgets().map((widget) => widget.uid),\n },\n }),\n headers: {\n 'Content-Type': 'application/json',\n 'X-Strapi-Event': event,\n },\n });\n } catch {\n // silence is golden\n }\n }\n }, [data, uuid, getAllWidgets]);\n const value = React.useMemo(\n () => ({\n uuid,\n telemetryProperties: data,\n }),\n [uuid, data]\n );\n\n return <TrackingContext.Provider value={value}>{children}</TrackingContext.Provider>;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Hook\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * We can group these events together because none have properties so there's no benefit\n * to having them as separate types.\n *\n * Meanwhile those with properties have different property shapes corresponding to the specific\n * event so understanding which properties go with which event is very helpful.\n */\nexport interface EventWithoutProperties {\n name:\n | 'changeComponentsOrder'\n | 'didAddComponentToDynamicZone'\n | 'didBulkDeleteEntries'\n | 'didNotBulkDeleteEntries'\n | 'didChangeDisplayedFields'\n | 'didCheckDraftRelations'\n | 'didClickGuidedTourHomepageApiTokens'\n | 'didClickGuidedTourHomepageContentManager'\n | 'didClickGuidedTourHomepageContentTypeBuilder'\n | 'didClickGuidedTourStep1CollectionType'\n | 'didClickGuidedTourStep2ContentManager'\n | 'didClickGuidedTourStep3ApiTokens'\n | 'didClickonBlogSection'\n | 'didClickonCodeExampleSection'\n | 'didClickonReadTheDocumentationSection'\n | 'didClickOnTryStrapiCloudSection'\n | 'didClickonTutorialSection'\n | 'didCreateGuidedTourCollectionType'\n | 'didCreateGuidedTourEntry'\n | 'didCreateNewRole'\n | 'didCreateRole'\n | 'didDeleteToken'\n | 'didDuplicateRole'\n | 'didEditEditSettings'\n | 'didEditEmailTemplates'\n | 'didEditFieldNameOnContentType'\n | 'didEditListSettings'\n | 'didEditMediaLibraryConfig'\n | 'didEditNameOfContentType'\n | 'didGenerateGuidedTourApiTokens'\n | 'didGoToMarketplace'\n | 'didLaunchGuidedtour'\n | 'didMissMarketplacePlugin'\n | 'didNotCreateFirstAdmin'\n | 'didNotSaveComponent'\n | 'didPluginLearnMore'\n | 'didBulkPublishEntries'\n | 'didNotBulkPublishEntries'\n | 'didUnpublishEntry'\n | 'didBulkUnpublishEntries'\n | 'didNotBulkUnpublishEntries'\n | 'didSaveComponent'\n | 'didSaveContentType'\n | 'didSearch'\n | 'didSkipGuidedtour'\n | 'didSubmitPlugin'\n | 'didSubmitProvider'\n | 'didUpdateConditions'\n | 'didSelectAllMediaLibraryElements'\n | 'didSelectContentTypeFieldSettings'\n | 'didSelectContentTypeSettings'\n | 'didEditAuthenticationProvider'\n | 'didRestoreHistoryVersion'\n | 'hasClickedCTBAddFieldBanner'\n | 'removeComponentFromDynamicZone'\n | 'willAddMoreFieldToContentType'\n | 'willBulkDeleteEntries'\n | 'willBulkPublishEntries'\n | 'willBulkUnpublishEntries'\n | 'willChangeNumberOfEntriesPerPage'\n | 'willCheckDraftRelations'\n | 'willCreateComponent'\n | 'willCreateComponentFromAttributesModal'\n | 'willCreateContentType'\n | 'willCreateFirstAdmin'\n | 'willCreateNewRole'\n | 'willCreateRole'\n | 'willCreateSingleType'\n | 'willCreateStage'\n | 'willCreateWorkflow'\n | 'willDeleteEntryFromList'\n | 'willDeleteFieldOfContentType'\n | 'willDuplicateRole'\n | 'willEditEditLayout'\n | 'willEditEmailTemplates'\n | 'willEditEntryFromButton'\n | 'willEditEntryFromList'\n | 'willEditReleaseFromHome'\n | 'willEditFieldOfContentType'\n | 'willEditMediaLibraryConfig'\n | 'willEditNameOfContentType'\n | 'willEditNameOfSingleType'\n | 'willEditAuthenticationProvider'\n | 'willEditFieldNameOnContentType'\n | 'willEditStage'\n | 'willFilterEntries'\n | 'willInstallPlugin'\n | 'willOpenAuditLogDetailsFromHome'\n | 'willUnpublishEntry'\n | 'willSaveComponent'\n | 'willSaveContentType'\n | 'willSaveContentTypeLayout'\n | 'didEditFieldNameOnContentType'\n | 'didCreateRelease'\n | 'didStartNewChat'\n | 'didLaunchGuidedtour'\n | 'didEditAICaption'\n | 'didEditAIAlternativeText';\n properties?: never;\n}\n\ninterface DidAccessAuthenticatedAdministrationEvent {\n name: 'didAccessAuthenticatedAdministration';\n properties: {\n registeredWidgets: string[];\n projectId: string;\n };\n}\n\ninterface DidFilterMediaLibraryElementsEvent {\n name: 'didFilterMediaLibraryElements';\n properties: MediaEvents['properties'] & {\n filter: string;\n };\n}\n\ninterface DidSortMediaLibraryElementsEvent {\n name: 'didSortMediaLibraryElements';\n properties: MediaEvents['properties'] & {\n sort: string;\n };\n}\n\ninterface DidCropFileEvent {\n name: 'didCropFile';\n properties: MediaEvents['properties'] & {\n duplicatedFile: null | boolean;\n };\n}\n\ninterface DidSelectFile {\n name: 'didSelectFile';\n properties: MediaEvents['properties'] & {\n source: 'url' | 'computer';\n };\n}\n\ninterface DidEditMediaLibraryElementsEvent {\n name: 'didEditMediaLibraryElements';\n properties: MediaEvents['properties'] & {\n type: string;\n changeLocation: string | boolean;\n };\n}\n\ninterface MediaEvents {\n name:\n | 'didSearchMediaLibraryElements'\n | 'didReplaceMedia'\n | 'didAddMediaLibraryFolders'\n | 'willAddMediaLibraryAssets';\n properties: {\n location: string;\n };\n}\n\ninterface DidSelectContentTypeFieldTypeEvent {\n name: 'didSelectContentTypeFieldType';\n properties: {\n type?: string;\n };\n}\n\ninterface DidChangeModeEvent {\n name: 'didChangeMode';\n properties: {\n newMode: string;\n };\n}\ninterface DidSubmitWithErrorsFirstAdminEvent {\n name: 'didSubmitWithErrorsFirstAdmin';\n properties: {\n count: string;\n };\n}\n\ninterface WillNavigateEvent {\n name: 'willNavigate';\n properties: {\n from: string;\n to: string;\n };\n}\n\ninterface DidAccessTokenListEvent {\n name: 'didAccessTokenList';\n properties: {\n tokenType: TokenEvents['properties']['tokenType'];\n number: number;\n };\n}\ninterface LogoEvent {\n name: 'didChangeLogo' | 'didClickResetLogo';\n properties: {\n logo: 'menu' | 'auth';\n };\n}\n\ninterface TokenEvents {\n name:\n | 'didCopyTokenKey'\n | 'didAddTokenFromList'\n | 'didEditTokenFromList'\n | 'willAccessTokenList'\n | 'willAddTokenFromList'\n | 'willCreateToken'\n | 'willDeleteToken'\n | 'willEditToken'\n | 'willEditTokenFromList';\n properties: {\n tokenType: 'api-token' | 'transfer-token';\n };\n}\n\ninterface WillModifyTokenEvent {\n name: 'didCreateToken' | 'didEditToken';\n properties: {\n tokenType: TokenEvents['properties']['tokenType'];\n type: 'custom' | 'full-access' | 'read-only' | Array<'push' | 'pull' | 'push-pull'>;\n };\n}\n\ninterface DeleteEntryEvents {\n name: 'willDeleteEntry' | 'didDeleteEntry' | 'didNotDeleteEntry';\n properties: {\n status?: string;\n error?: unknown;\n };\n}\n\ninterface CreateEntryEvents {\n name: 'willCreateEntry' | 'didCreateEntry' | 'didNotCreateEntry';\n properties: {\n documentId?: string;\n status?: string;\n error?: unknown;\n fromPreview?: boolean;\n fromRelationModal?: boolean;\n };\n}\n\ninterface PublishEntryEvents {\n name: 'willPublishEntry' | 'didPublishEntry';\n properties: {\n documentId?: string;\n fromPreview?: boolean;\n fromRelationModal?: boolean;\n };\n}\n\ninterface UpdateEntryEvents {\n name: 'willEditEntry' | 'didEditEntry' | 'didNotEditEntry';\n properties: {\n documentId?: string;\n status?: string;\n error?: unknown;\n fromPreview?: boolean;\n fromRelationModal?: boolean;\n };\n}\n\ninterface DidFilterEntriesEvent {\n name: 'didFilterEntries';\n properties: {\n useRelation: boolean;\n };\n}\n\ninterface DidPublishRelease {\n name: 'didPublishRelease';\n properties: {\n totalEntries: number;\n totalPublishedEntries: number;\n totalUnpublishedEntries: number;\n };\n}\n\ninterface DidUsePresetPromptEvent {\n name: 'didUsePresetPrompt';\n properties: {\n promptType:\n | 'generate-product-schema'\n | 'tell-me-about-the-content-type-builder'\n | 'tell-me-about-strapi';\n };\n}\n\ninterface DidAnswerMessageEvent {\n name: 'didAnswerMessage';\n properties: {\n successful: boolean;\n };\n}\n\ninterface DidVoteAnswerEvent {\n name: 'didVoteAnswer';\n properties: {\n value: 'positive' | 'negative';\n };\n}\n\ninterface DidUpdateCTBSchema {\n name: 'didUpdateCTBSchema';\n properties: {\n success: boolean;\n newContentTypes: number;\n editedContentTypes: number;\n deletedContentTypes: number;\n newComponents: number;\n editedComponents: number;\n deletedComponents: number;\n newFields: number;\n editedFields: number;\n deletedFields: number;\n };\n}\n\ninterface DidSkipGuidedTour {\n name: 'didSkipGuidedTour';\n properties: {\n name: keyof Tours | 'all';\n };\n}\n\ninterface DidCompleteGuidedTour {\n name: 'didCompleteGuidedTour';\n properties: {\n name: keyof Tours | 'all';\n };\n}\n\ninterface DidStartGuidedTour {\n name: 'didStartGuidedTour';\n properties: {\n name: keyof Tours;\n fromHomepage?: boolean;\n };\n}\n\ninterface WillEditEntryFromHome {\n name: 'willEditEntryFromHome';\n properties: {\n entryType: 'edited' | 'published' | 'assigned';\n };\n}\n\ninterface DidOpenHomeWidgetLink {\n name: 'didOpenHomeWidgetLink';\n properties: {\n widgetUID: string;\n };\n}\n\ninterface DidOpenKeyStatisticsWidgetLink {\n name: 'didOpenKeyStatisticsWidgetLink';\n properties: {\n itemKey: string;\n };\n}\n\ntype EventsWithProperties =\n | CreateEntryEvents\n | PublishEntryEvents\n | DidAccessAuthenticatedAdministrationEvent\n | DidAccessTokenListEvent\n | DidChangeModeEvent\n | DidCropFileEvent\n | DeleteEntryEvents\n | DidEditMediaLibraryElementsEvent\n | DidFilterMediaLibraryElementsEvent\n | DidFilterEntriesEvent\n | DidSelectContentTypeFieldTypeEvent\n | DidSelectFile\n | DidSortMediaLibraryElementsEvent\n | DidSubmitWithErrorsFirstAdminEvent\n | DidUsePresetPromptEvent\n | DidAnswerMessageEvent\n | DidVoteAnswerEvent\n | LogoEvent\n | TokenEvents\n | UpdateEntryEvents\n | WillModifyTokenEvent\n | WillNavigateEvent\n | DidPublishRelease\n | MediaEvents\n | DidUpdateCTBSchema\n | DidSkipGuidedTour\n | DidCompleteGuidedTour\n | DidStartGuidedTour\n | DidOpenHomeWidgetLink\n | DidOpenKeyStatisticsWidgetLink\n | WillEditEntryFromHome;\n\nexport type TrackingEvent = EventWithoutProperties | EventsWithProperties;\nexport interface UseTrackingReturn {\n /**\n * This type helps show all the available event names before you start typing,\n * however autocomplete isn't great.\n */\n trackUsage<TEvent extends TrackingEvent>(\n event: TEvent['name'],\n properties: TEvent['properties']\n ): Promise<null | AxiosResponse<string>>;\n trackUsage<TEvent extends Extract<TrackingEvent, { properties?: never }>>(\n event: TEvent['name'],\n properties?: never\n ): Promise<null | AxiosResponse<string>>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n trackUsage<TEvent extends Extract<TrackingEvent, { properties: object }>>(\n event: TEvent['name'],\n properties: TEvent['properties']\n ): Promise<null | AxiosResponse<string>>;\n}\n\n/**\n * @description Used to send amplitude events to the Strapi Tracking hub.\n *\n * @example\n * ```tsx\n * import { useTracking } from '@strapi/strapi/admin';\n *\n * const MyComponent = () => {\n * const { trackUsage } = useTracking();\n *\n * const handleClick = () => {\n * trackUsage('my-event', { myProperty: 'myValue' });\n * }\n *\n * return <button onClick={handleClick}>Send Event</button>\n * }\n * ```\n */\nconst useTracking = (): UseTrackingReturn => {\n const deviceType = useDeviceType();\n const { uuid, telemetryProperties } = React.useContext(TrackingContext);\n const userId = useAppInfo('useTracking', (state) => state.userId);\n const trackUsage = React.useCallback(\n async <TEvent extends TrackingEvent>(\n event: TEvent['name'],\n properties?: TEvent['properties']\n ) => {\n try {\n if (uuid && !window.strapi.telemetryDisabled) {\n const res = await axios.post<string>(\n `${process.env.STRAPI_ANALYTICS_URL || 'https://analytics.strapi.io'}/api/v2/track`,\n {\n event,\n userId,\n eventProperties: { ...properties },\n userProperties: {\n deviceType,\n },\n groupProperties: {\n ...telemetryProperties,\n projectId: uuid,\n projectType: window.strapi.projectType,\n },\n },\n {\n headers: {\n 'Content-Type': 'application/json',\n 'X-Strapi-Event': event,\n },\n }\n );\n\n return res;\n }\n } catch (err) {\n // Silence is golden\n }\n\n return null;\n },\n [telemetryProperties, userId, uuid]\n );\n\n return { trackUsage };\n};\n\nexport { TrackingProvider, useTracking };\n"],"names":["TrackingContext","React","createContext","uuid","TrackingProvider","children","token","useAuth","state","data","initData","useInitQuery","getAllWidgets","useStrapiApp","widgets","getAll","useTelemetryPropertiesQuery","undefined","skip","useEffect","event","fetch","process","env","STRAPI_ANALYTICS_URL","method","body","JSON","stringify","userId","eventPropeties","groupProperties","projectId","registeredWidgets","map","widget","uid","headers","value","useMemo","telemetryProperties","_jsx","Provider","useTracking","deviceType","useDeviceType","useContext","useAppInfo","trackUsage","useCallback","properties","window","strapi","telemetryDisabled","res","axios","post","eventProperties","userProperties","projectType","err"],"mappings":"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"}
1
+ {"version":3,"file":"Tracking.mjs","sources":["../../../../../admin/src/features/Tracking.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport axios, { AxiosResponse } from 'axios';\n\nimport { Tours } from '../components/GuidedTour/Tours';\nimport { useDeviceType } from '../hooks/useDeviceType';\nimport { useInitQuery, useTelemetryPropertiesQuery } from '../services/admin';\n\nimport { useAppInfo } from './AppInfo';\nimport { useAuth } from './Auth';\nimport { useStrapiApp } from './StrapiApp';\n\nexport interface TelemetryProperties {\n useTypescriptOnServer?: boolean;\n useTypescriptOnAdmin?: boolean;\n isHostedOnStrapiCloud?: boolean;\n numberOfAllContentTypes?: number;\n numberOfComponents?: number;\n numberOfDynamicZones?: number;\n}\n\nexport interface TrackingContextValue {\n uuid?: string | boolean;\n telemetryProperties?: TelemetryProperties;\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Context\n * -----------------------------------------------------------------------------------------------*/\n\nconst TrackingContext = React.createContext<TrackingContextValue>({\n uuid: false,\n});\n\n/* -------------------------------------------------------------------------------------------------\n * Provider\n * -----------------------------------------------------------------------------------------------*/\n\nexport interface TrackingProviderProps {\n children: React.ReactNode;\n}\n\nconst TrackingProvider = ({ children }: TrackingProviderProps) => {\n const token = useAuth('App', (state) => state.token);\n const { data: initData } = useInitQuery();\n const { uuid } = initData ?? {};\n const getAllWidgets = useStrapiApp('TrackingProvider', (state) => state.widgets.getAll);\n\n const { data } = useTelemetryPropertiesQuery(undefined, {\n skip: !initData?.uuid || !token,\n });\n React.useEffect(() => {\n if (uuid && data) {\n const event = 'didInitializeAdministration';\n try {\n fetch(`${process.env.STRAPI_ANALYTICS_URL || 'https://analytics.strapi.io'}/api/v2/track`, {\n method: 'POST',\n body: JSON.stringify({\n // This event is anonymous\n event,\n userId: '',\n eventPropeties: {},\n groupProperties: {\n ...data,\n projectId: uuid,\n registeredWidgets: getAllWidgets().map((widget) => widget.uid),\n },\n }),\n headers: {\n 'Content-Type': 'application/json',\n 'X-Strapi-Event': event,\n },\n });\n } catch {\n // silence is golden\n }\n }\n }, [data, uuid, getAllWidgets]);\n const value = React.useMemo(\n () => ({\n uuid,\n telemetryProperties: data,\n }),\n [uuid, data]\n );\n\n return <TrackingContext.Provider value={value}>{children}</TrackingContext.Provider>;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Hook\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * We can group these events together because none have properties so there's no benefit\n * to having them as separate types.\n *\n * Meanwhile those with properties have different property shapes corresponding to the specific\n * event so understanding which properties go with which event is very helpful.\n */\nexport interface EventWithoutProperties {\n name:\n | 'changeComponentsOrder'\n | 'didAddComponentToDynamicZone'\n | 'didBulkDeleteEntries'\n | 'didNotBulkDeleteEntries'\n | 'didChangeDisplayedFields'\n | 'didCheckDraftRelations'\n | 'didClickGuidedTourHomepageApiTokens'\n | 'didClickGuidedTourHomepageContentManager'\n | 'didClickGuidedTourHomepageContentTypeBuilder'\n | 'didClickGuidedTourStep1CollectionType'\n | 'didClickGuidedTourStep2ContentManager'\n | 'didClickGuidedTourStep3ApiTokens'\n | 'didClickonBlogSection'\n | 'didClickonCodeExampleSection'\n | 'didClickonReadTheDocumentationSection'\n | 'didClickOnTryStrapiCloudSection'\n | 'didClickonTutorialSection'\n | 'didCreateGuidedTourCollectionType'\n | 'didCreateGuidedTourEntry'\n | 'didCreateNewRole'\n | 'didCreateRole'\n | 'didDeleteToken'\n | 'didDuplicateRole'\n | 'didEditEditSettings'\n | 'didEditEmailTemplates'\n | 'didEditFieldNameOnContentType'\n | 'didEditListSettings'\n | 'didEditMediaLibraryConfig'\n | 'didEditNameOfContentType'\n | 'didGenerateGuidedTourApiTokens'\n | 'didLaunchGuidedtour'\n | 'didNotCreateFirstAdmin'\n | 'didNotSaveComponent'\n | 'didPluginLearnMore'\n | 'didBulkPublishEntries'\n | 'didNotBulkPublishEntries'\n | 'didUnpublishEntry'\n | 'didBulkUnpublishEntries'\n | 'didNotBulkUnpublishEntries'\n | 'didSaveComponent'\n | 'didSaveContentType'\n | 'didSearch'\n | 'didSkipGuidedtour'\n | 'didSubmitPlugin'\n | 'didSubmitProvider'\n | 'didUpdateConditions'\n | 'didSelectAllMediaLibraryElements'\n | 'didSelectContentTypeFieldSettings'\n | 'didSelectContentTypeSettings'\n | 'didEditAuthenticationProvider'\n | 'didRestoreHistoryVersion'\n | 'hasClickedCTBAddFieldBanner'\n | 'removeComponentFromDynamicZone'\n | 'willAddMoreFieldToContentType'\n | 'willBulkDeleteEntries'\n | 'willBulkPublishEntries'\n | 'willBulkUnpublishEntries'\n | 'willChangeNumberOfEntriesPerPage'\n | 'willCheckDraftRelations'\n | 'willCreateComponent'\n | 'willCreateComponentFromAttributesModal'\n | 'willCreateContentType'\n | 'willCreateFirstAdmin'\n | 'willCreateNewRole'\n | 'willCreateRole'\n | 'willCreateSingleType'\n | 'willCreateStage'\n | 'willCreateWorkflow'\n | 'willDeleteEntryFromList'\n | 'willDeleteFieldOfContentType'\n | 'willDuplicateRole'\n | 'willEditEditLayout'\n | 'willEditEmailTemplates'\n | 'willEditEntryFromButton'\n | 'willEditEntryFromList'\n | 'willEditReleaseFromHome'\n | 'willEditFieldOfContentType'\n | 'willEditMediaLibraryConfig'\n | 'willEditNameOfContentType'\n | 'willEditNameOfSingleType'\n | 'willEditAuthenticationProvider'\n | 'willEditFieldNameOnContentType'\n | 'willEditStage'\n | 'willFilterEntries'\n | 'willInstallPlugin'\n | 'willOpenAuditLogDetailsFromHome'\n | 'willUnpublishEntry'\n | 'willSaveComponent'\n | 'willSaveContentType'\n | 'willSaveContentTypeLayout'\n | 'didEditFieldNameOnContentType'\n | 'didCreateRelease'\n | 'didStartNewChat'\n | 'didLaunchGuidedtour'\n | 'didEditAICaption'\n | 'didEditAIAlternativeText'\n | 'didGenerateMetadataRetroactively';\n\n properties?: never;\n}\n\ninterface DidAccessAuthenticatedAdministrationEvent {\n name: 'didAccessAuthenticatedAdministration';\n properties: {\n registeredWidgets: string[];\n projectId: string;\n };\n}\n\ninterface DidFilterMediaLibraryElementsEvent {\n name: 'didFilterMediaLibraryElements';\n properties: MediaEvents['properties'] & {\n filter: string;\n };\n}\n\ninterface DidSortMediaLibraryElementsEvent {\n name: 'didSortMediaLibraryElements';\n properties: MediaEvents['properties'] & {\n sort: string;\n };\n}\n\ninterface DidCropFileEvent {\n name: 'didCropFile';\n properties: MediaEvents['properties'] & {\n duplicatedFile: null | boolean;\n };\n}\n\ninterface DidSelectFile {\n name: 'didSelectFile';\n properties: MediaEvents['properties'] & {\n source: 'url' | 'computer';\n };\n}\n\ninterface DidEditMediaLibraryElementsEvent {\n name: 'didEditMediaLibraryElements';\n properties: MediaEvents['properties'] & {\n type: string;\n changeLocation: string | boolean;\n };\n}\n\ninterface MediaEvents {\n name:\n | 'didSearchMediaLibraryElements'\n | 'didReplaceMedia'\n | 'didAddMediaLibraryFolders'\n | 'willAddMediaLibraryAssets';\n properties: {\n location: string;\n };\n}\n\ninterface DidSelectContentTypeFieldTypeEvent {\n name: 'didSelectContentTypeFieldType';\n properties: {\n type?: string;\n };\n}\n\ninterface DidChangeModeEvent {\n name: 'didChangeMode';\n properties: {\n newMode: string;\n };\n}\ninterface DidSubmitWithErrorsFirstAdminEvent {\n name: 'didSubmitWithErrorsFirstAdmin';\n properties: {\n count: string;\n };\n}\n\ninterface WillNavigateEvent {\n name: 'willNavigate';\n properties: {\n from: string;\n to: string;\n };\n}\n\ninterface DidAccessTokenListEvent {\n name: 'didAccessTokenList';\n properties: {\n tokenType: TokenEvents['properties']['tokenType'];\n number: number;\n };\n}\ninterface LogoEvent {\n name: 'didChangeLogo' | 'didClickResetLogo';\n properties: {\n logo: 'menu' | 'auth';\n };\n}\n\ninterface TokenEvents {\n name:\n | 'didCopyTokenKey'\n | 'didAddTokenFromList'\n | 'didEditTokenFromList'\n | 'willAccessTokenList'\n | 'willAddTokenFromList'\n | 'willCreateToken'\n | 'willDeleteToken'\n | 'willEditToken'\n | 'willEditTokenFromList';\n properties: {\n tokenType: 'api-token' | 'transfer-token';\n };\n}\n\ninterface WillModifyTokenEvent {\n name: 'didCreateToken' | 'didEditToken';\n properties: {\n tokenType: TokenEvents['properties']['tokenType'];\n type: 'custom' | 'full-access' | 'read-only' | Array<'push' | 'pull' | 'push-pull'>;\n };\n}\n\ninterface DeleteEntryEvents {\n name: 'willDeleteEntry' | 'didDeleteEntry' | 'didNotDeleteEntry';\n properties: {\n status?: string;\n error?: unknown;\n };\n}\n\ninterface CreateEntryEvents {\n name: 'willCreateEntry' | 'didCreateEntry' | 'didNotCreateEntry';\n properties: {\n documentId?: string;\n status?: string;\n error?: unknown;\n fromPreview?: boolean;\n fromRelationModal?: boolean;\n };\n}\n\ninterface PublishEntryEvents {\n name: 'willPublishEntry' | 'didPublishEntry';\n properties: {\n documentId?: string;\n fromPreview?: boolean;\n fromRelationModal?: boolean;\n };\n}\n\ninterface UpdateEntryEvents {\n name: 'willEditEntry' | 'didEditEntry' | 'didNotEditEntry';\n properties: {\n documentId?: string;\n status?: string;\n error?: unknown;\n fromPreview?: boolean;\n fromRelationModal?: boolean;\n };\n}\n\ninterface DidFilterEntriesEvent {\n name: 'didFilterEntries';\n properties: {\n useRelation: boolean;\n };\n}\n\ninterface DidPublishRelease {\n name: 'didPublishRelease';\n properties: {\n totalEntries: number;\n totalPublishedEntries: number;\n totalUnpublishedEntries: number;\n };\n}\n\ninterface DidUsePresetPromptEvent {\n name: 'didUsePresetPrompt';\n properties: {\n promptType:\n | 'generate-product-schema'\n | 'tell-me-about-the-content-type-builder'\n | 'tell-me-about-strapi';\n };\n}\n\ninterface DidAnswerMessageEvent {\n name: 'didAnswerMessage';\n properties: {\n successful: boolean;\n };\n}\n\ninterface DidVoteAnswerEvent {\n name: 'didVoteAnswer';\n properties: {\n value: 'positive' | 'negative';\n };\n}\n\ninterface DidUpdateCTBSchema {\n name: 'didUpdateCTBSchema';\n properties: {\n success: boolean;\n newContentTypes: number;\n editedContentTypes: number;\n deletedContentTypes: number;\n newComponents: number;\n editedComponents: number;\n deletedComponents: number;\n newFields: number;\n editedFields: number;\n deletedFields: number;\n };\n}\n\ninterface DidSkipGuidedTour {\n name: 'didSkipGuidedTour';\n properties: {\n name: keyof Tours | 'all';\n };\n}\n\ninterface DidCompleteGuidedTour {\n name: 'didCompleteGuidedTour';\n properties: {\n name: keyof Tours | 'all';\n };\n}\n\ninterface DidStartGuidedTour {\n name: 'didStartGuidedTour';\n properties: {\n name: keyof Tours;\n fromHomepage?: boolean;\n };\n}\n\ninterface WillEditEntryFromHome {\n name: 'willEditEntryFromHome';\n properties: {\n entryType: 'edited' | 'published' | 'assigned';\n };\n}\n\ninterface DidOpenHomeWidgetLink {\n name: 'didOpenHomeWidgetLink';\n properties: {\n widgetUID: string;\n };\n}\n\ninterface DidOpenKeyStatisticsWidgetLink {\n name: 'didOpenKeyStatisticsWidgetLink';\n properties: {\n itemKey: string;\n };\n}\n\ntype EventsWithProperties =\n | CreateEntryEvents\n | PublishEntryEvents\n | DidAccessAuthenticatedAdministrationEvent\n | DidAccessTokenListEvent\n | DidChangeModeEvent\n | DidCropFileEvent\n | DeleteEntryEvents\n | DidEditMediaLibraryElementsEvent\n | DidFilterMediaLibraryElementsEvent\n | DidFilterEntriesEvent\n | DidSelectContentTypeFieldTypeEvent\n | DidSelectFile\n | DidSortMediaLibraryElementsEvent\n | DidSubmitWithErrorsFirstAdminEvent\n | DidUsePresetPromptEvent\n | DidAnswerMessageEvent\n | DidVoteAnswerEvent\n | LogoEvent\n | TokenEvents\n | UpdateEntryEvents\n | WillModifyTokenEvent\n | WillNavigateEvent\n | DidPublishRelease\n | MediaEvents\n | DidUpdateCTBSchema\n | DidSkipGuidedTour\n | DidCompleteGuidedTour\n | DidStartGuidedTour\n | DidOpenHomeWidgetLink\n | DidOpenKeyStatisticsWidgetLink\n | WillEditEntryFromHome;\n\nexport type TrackingEvent = EventWithoutProperties | EventsWithProperties;\nexport interface UseTrackingReturn {\n /**\n * This type helps show all the available event names before you start typing,\n * however autocomplete isn't great.\n */\n trackUsage<TEvent extends TrackingEvent>(\n event: TEvent['name'],\n properties: TEvent['properties']\n ): Promise<null | AxiosResponse<string>>;\n trackUsage<TEvent extends Extract<TrackingEvent, { properties?: never }>>(\n event: TEvent['name'],\n properties?: never\n ): Promise<null | AxiosResponse<string>>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n trackUsage<TEvent extends Extract<TrackingEvent, { properties: object }>>(\n event: TEvent['name'],\n properties: TEvent['properties']\n ): Promise<null | AxiosResponse<string>>;\n}\n\n/**\n * @description Used to send amplitude events to the Strapi Tracking hub.\n *\n * @example\n * ```tsx\n * import { useTracking } from '@strapi/strapi/admin';\n *\n * const MyComponent = () => {\n * const { trackUsage } = useTracking();\n *\n * const handleClick = () => {\n * trackUsage('my-event', { myProperty: 'myValue' });\n * }\n *\n * return <button onClick={handleClick}>Send Event</button>\n * }\n * ```\n */\nconst useTracking = (): UseTrackingReturn => {\n const deviceType = useDeviceType();\n const { uuid, telemetryProperties } = React.useContext(TrackingContext);\n const userId = useAppInfo('useTracking', (state) => state.userId);\n const trackUsage = React.useCallback(\n async <TEvent extends TrackingEvent>(\n event: TEvent['name'],\n properties?: TEvent['properties']\n ) => {\n try {\n if (uuid && !window.strapi.telemetryDisabled) {\n const res = await axios.post<string>(\n `${process.env.STRAPI_ANALYTICS_URL || 'https://analytics.strapi.io'}/api/v2/track`,\n {\n event,\n userId,\n eventProperties: { ...properties },\n userProperties: {\n deviceType,\n },\n groupProperties: {\n ...telemetryProperties,\n projectId: uuid,\n projectType: window.strapi.projectType,\n },\n },\n {\n headers: {\n 'Content-Type': 'application/json',\n 'X-Strapi-Event': event,\n },\n }\n );\n\n return res;\n }\n } catch (err) {\n // Silence is golden\n }\n\n return null;\n },\n [telemetryProperties, userId, uuid]\n );\n\n return { trackUsage };\n};\n\nexport { TrackingProvider, useTracking };\n"],"names":["TrackingContext","React","createContext","uuid","TrackingProvider","children","token","useAuth","state","data","initData","useInitQuery","getAllWidgets","useStrapiApp","widgets","getAll","useTelemetryPropertiesQuery","undefined","skip","useEffect","event","fetch","process","env","STRAPI_ANALYTICS_URL","method","body","JSON","stringify","userId","eventPropeties","groupProperties","projectId","registeredWidgets","map","widget","uid","headers","value","useMemo","telemetryProperties","_jsx","Provider","useTracking","deviceType","useDeviceType","useContext","useAppInfo","trackUsage","useCallback","properties","window","strapi","telemetryDisabled","res","axios","post","eventProperties","userProperties","projectType","err"],"mappings":"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"}
@@ -48,7 +48,8 @@ const useMenu = (shouldUpdateStrapi)=>{
48
48
  id: 'global.marketplace',
49
49
  defaultMessage: 'Marketplace'
50
50
  },
51
- to: '/marketplace',
51
+ to: 'https://market.strapi.io',
52
+ target: '_blank',
52
53
  permissions: permissions.marketplace?.main ?? [],
53
54
  position: 7
54
55
  },
@@ -1 +1 @@
1
- {"version":3,"file":"useMenu.js","sources":["../../../../../admin/src/hooks/useMenu.ts"],"sourcesContent":["import * as React from 'react';\n\nimport { Cog, ShoppingCart, House } from '@strapi/icons';\nimport cloneDeep from 'lodash/cloneDeep';\n\nimport { useTypedSelector } from '../core/store/hooks';\nimport { useAuth, AuthContextValue } from '../features/Auth';\nimport { StrapiAppContextValue, useStrapiApp } from '../features/StrapiApp';\n\n/* -------------------------------------------------------------------------------------------------\n * useMenu\n * -----------------------------------------------------------------------------------------------*/\n\nexport type MenuItem = Omit<StrapiAppContextValue['menu'][number], 'Component'> & {\n navigationLink?: string;\n};\nexport type MobileMenuItem = {\n to: string;\n link?: string;\n};\n\nexport interface Menu {\n generalSectionLinks: MenuItem[];\n pluginsSectionLinks: MenuItem[];\n topMobileNavigation: MobileMenuItem[];\n burgerMobileNavigation: MobileMenuItem[];\n isLoading: boolean;\n}\n\nconst useMenu = (shouldUpdateStrapi: boolean) => {\n const checkUserHasPermissions = useAuth('useMenu', (state) => state.checkUserHasPermissions);\n const menu = useStrapiApp('useMenu', (state) => state.menu);\n const permissions = useTypedSelector((state) => state.admin_app.permissions);\n const [menuWithUserPermissions, setMenuWithUserPermissions] = React.useState<Menu>({\n generalSectionLinks: [\n {\n icon: House,\n intlLabel: {\n id: 'global.home',\n defaultMessage: 'Home',\n },\n to: '/',\n permissions: [],\n position: 0,\n },\n {\n icon: ShoppingCart,\n intlLabel: {\n id: 'global.marketplace',\n defaultMessage: 'Marketplace',\n },\n to: '/marketplace',\n permissions: permissions.marketplace?.main ?? [],\n position: 7,\n },\n {\n icon: Cog,\n intlLabel: {\n id: 'global.settings',\n defaultMessage: 'Settings',\n },\n to: '/settings',\n // Permissions of this link are retrieved in the init phase\n // using the settings menu\n permissions: [],\n notificationsCount: 0,\n position: 9,\n },\n ],\n pluginsSectionLinks: [],\n topMobileNavigation: [\n {\n to: '/',\n },\n {\n to: 'content-manager',\n },\n {\n to: 'plugins/content-releases',\n },\n {\n to: 'plugins/upload',\n },\n ],\n burgerMobileNavigation: [\n {\n to: '/settings',\n },\n ],\n isLoading: true,\n });\n const generalSectionLinksRef = React.useRef(menuWithUserPermissions.generalSectionLinks);\n\n React.useEffect(() => {\n async function applyMenuPermissions() {\n const authorizedPluginSectionLinks = await getPluginSectionLinks(\n menu,\n checkUserHasPermissions\n );\n\n const authorizedGeneralSectionLinks = await getGeneralLinks(\n generalSectionLinksRef.current,\n shouldUpdateStrapi,\n checkUserHasPermissions\n );\n\n setMenuWithUserPermissions((state) => ({\n ...state,\n generalSectionLinks: authorizedGeneralSectionLinks,\n pluginsSectionLinks: authorizedPluginSectionLinks,\n isLoading: false,\n }));\n }\n\n applyMenuPermissions();\n }, [\n setMenuWithUserPermissions,\n generalSectionLinksRef,\n menu,\n permissions,\n shouldUpdateStrapi,\n checkUserHasPermissions,\n ]);\n\n return menuWithUserPermissions;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Utils\n * -----------------------------------------------------------------------------------------------*/\n\nconst getGeneralLinks = async (\n generalSectionRawLinks: MenuItem[],\n shouldUpdateStrapi: boolean = false,\n checkUserHasPermissions: AuthContextValue['checkUserHasPermissions']\n) => {\n const generalSectionLinksPermissions = await Promise.all(\n generalSectionRawLinks.map(({ permissions }) => checkUserHasPermissions(permissions))\n );\n\n const authorizedGeneralSectionLinks = generalSectionRawLinks.filter(\n (_, index) => generalSectionLinksPermissions[index].length > 0\n );\n\n const settingsLinkIndex = authorizedGeneralSectionLinks.findIndex(\n (obj) => obj.to === '/settings'\n );\n\n if (settingsLinkIndex === -1) {\n return [];\n }\n\n const authorizedGeneralLinksClone = cloneDeep(authorizedGeneralSectionLinks);\n\n authorizedGeneralLinksClone[settingsLinkIndex].notificationsCount = shouldUpdateStrapi ? 1 : 0;\n\n return authorizedGeneralLinksClone;\n};\n\nconst getPluginSectionLinks = async (\n pluginsSectionRawLinks: MenuItem[],\n checkUserHasPermissions: AuthContextValue['checkUserHasPermissions']\n) => {\n const pluginSectionLinksPermissions = await Promise.all(\n pluginsSectionRawLinks.map(({ permissions }) => checkUserHasPermissions(permissions))\n );\n\n const authorizedPluginSectionLinks = pluginsSectionRawLinks.filter(\n (_, index) => pluginSectionLinksPermissions[index].length > 0\n );\n\n return authorizedPluginSectionLinks;\n};\n\nexport { useMenu };\n"],"names":["useMenu","shouldUpdateStrapi","checkUserHasPermissions","useAuth","state","menu","useStrapiApp","permissions","useTypedSelector","admin_app","menuWithUserPermissions","setMenuWithUserPermissions","React","useState","generalSectionLinks","icon","House","intlLabel","id","defaultMessage","to","position","ShoppingCart","marketplace","main","Cog","notificationsCount","pluginsSectionLinks","topMobileNavigation","burgerMobileNavigation","isLoading","generalSectionLinksRef","useRef","useEffect","applyMenuPermissions","authorizedPluginSectionLinks","getPluginSectionLinks","authorizedGeneralSectionLinks","getGeneralLinks","current","generalSectionRawLinks","generalSectionLinksPermissions","Promise","all","map","filter","_","index","length","settingsLinkIndex","findIndex","obj","authorizedGeneralLinksClone","cloneDeep","pluginsSectionRawLinks","pluginSectionLinksPermissions"],"mappings":"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"}
1
+ {"version":3,"file":"useMenu.js","sources":["../../../../../admin/src/hooks/useMenu.ts"],"sourcesContent":["import * as React from 'react';\n\nimport { Cog, ShoppingCart, House } from '@strapi/icons';\nimport cloneDeep from 'lodash/cloneDeep';\n\nimport { useTypedSelector } from '../core/store/hooks';\nimport { useAuth, AuthContextValue } from '../features/Auth';\nimport { StrapiAppContextValue, useStrapiApp } from '../features/StrapiApp';\n\n/* -------------------------------------------------------------------------------------------------\n * useMenu\n * -----------------------------------------------------------------------------------------------*/\n\nexport type MenuItem = Omit<StrapiAppContextValue['menu'][number], 'Component'> & {\n navigationLink?: string;\n};\nexport type MobileMenuItem = {\n to: string;\n target?: string;\n link?: string;\n};\n\nexport interface Menu {\n generalSectionLinks: MenuItem[];\n pluginsSectionLinks: MenuItem[];\n topMobileNavigation: MobileMenuItem[];\n burgerMobileNavigation: MobileMenuItem[];\n isLoading: boolean;\n}\n\nconst useMenu = (shouldUpdateStrapi: boolean) => {\n const checkUserHasPermissions = useAuth('useMenu', (state) => state.checkUserHasPermissions);\n const menu = useStrapiApp('useMenu', (state) => state.menu);\n const permissions = useTypedSelector((state) => state.admin_app.permissions);\n const [menuWithUserPermissions, setMenuWithUserPermissions] = React.useState<Menu>({\n generalSectionLinks: [\n {\n icon: House,\n intlLabel: {\n id: 'global.home',\n defaultMessage: 'Home',\n },\n to: '/',\n permissions: [],\n position: 0,\n },\n {\n icon: ShoppingCart,\n intlLabel: {\n id: 'global.marketplace',\n defaultMessage: 'Marketplace',\n },\n to: 'https://market.strapi.io',\n target: '_blank',\n permissions: permissions.marketplace?.main ?? [],\n position: 7,\n },\n {\n icon: Cog,\n intlLabel: {\n id: 'global.settings',\n defaultMessage: 'Settings',\n },\n to: '/settings',\n // Permissions of this link are retrieved in the init phase\n // using the settings menu\n permissions: [],\n notificationsCount: 0,\n position: 9,\n },\n ],\n pluginsSectionLinks: [],\n topMobileNavigation: [\n {\n to: '/',\n },\n {\n to: 'content-manager',\n },\n {\n to: 'plugins/content-releases',\n },\n {\n to: 'plugins/upload',\n },\n ],\n burgerMobileNavigation: [\n {\n to: '/settings',\n },\n ],\n isLoading: true,\n });\n const generalSectionLinksRef = React.useRef(menuWithUserPermissions.generalSectionLinks);\n\n React.useEffect(() => {\n async function applyMenuPermissions() {\n const authorizedPluginSectionLinks = await getPluginSectionLinks(\n menu,\n checkUserHasPermissions\n );\n\n const authorizedGeneralSectionLinks = await getGeneralLinks(\n generalSectionLinksRef.current,\n shouldUpdateStrapi,\n checkUserHasPermissions\n );\n\n setMenuWithUserPermissions((state) => ({\n ...state,\n generalSectionLinks: authorizedGeneralSectionLinks,\n pluginsSectionLinks: authorizedPluginSectionLinks,\n isLoading: false,\n }));\n }\n\n applyMenuPermissions();\n }, [\n setMenuWithUserPermissions,\n generalSectionLinksRef,\n menu,\n permissions,\n shouldUpdateStrapi,\n checkUserHasPermissions,\n ]);\n\n return menuWithUserPermissions;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Utils\n * -----------------------------------------------------------------------------------------------*/\n\nconst getGeneralLinks = async (\n generalSectionRawLinks: MenuItem[],\n shouldUpdateStrapi: boolean = false,\n checkUserHasPermissions: AuthContextValue['checkUserHasPermissions']\n) => {\n const generalSectionLinksPermissions = await Promise.all(\n generalSectionRawLinks.map(({ permissions }) => checkUserHasPermissions(permissions))\n );\n\n const authorizedGeneralSectionLinks = generalSectionRawLinks.filter(\n (_, index) => generalSectionLinksPermissions[index].length > 0\n );\n\n const settingsLinkIndex = authorizedGeneralSectionLinks.findIndex(\n (obj) => obj.to === '/settings'\n );\n\n if (settingsLinkIndex === -1) {\n return [];\n }\n\n const authorizedGeneralLinksClone = cloneDeep(authorizedGeneralSectionLinks);\n\n authorizedGeneralLinksClone[settingsLinkIndex].notificationsCount = shouldUpdateStrapi ? 1 : 0;\n\n return authorizedGeneralLinksClone;\n};\n\nconst getPluginSectionLinks = async (\n pluginsSectionRawLinks: MenuItem[],\n checkUserHasPermissions: AuthContextValue['checkUserHasPermissions']\n) => {\n const pluginSectionLinksPermissions = await Promise.all(\n pluginsSectionRawLinks.map(({ permissions }) => checkUserHasPermissions(permissions))\n );\n\n const authorizedPluginSectionLinks = pluginsSectionRawLinks.filter(\n (_, index) => pluginSectionLinksPermissions[index].length > 0\n );\n\n return authorizedPluginSectionLinks;\n};\n\nexport { useMenu };\n"],"names":["useMenu","shouldUpdateStrapi","checkUserHasPermissions","useAuth","state","menu","useStrapiApp","permissions","useTypedSelector","admin_app","menuWithUserPermissions","setMenuWithUserPermissions","React","useState","generalSectionLinks","icon","House","intlLabel","id","defaultMessage","to","position","ShoppingCart","target","marketplace","main","Cog","notificationsCount","pluginsSectionLinks","topMobileNavigation","burgerMobileNavigation","isLoading","generalSectionLinksRef","useRef","useEffect","applyMenuPermissions","authorizedPluginSectionLinks","getPluginSectionLinks","authorizedGeneralSectionLinks","getGeneralLinks","current","generalSectionRawLinks","generalSectionLinksPermissions","Promise","all","map","filter","_","index","length","settingsLinkIndex","findIndex","obj","authorizedGeneralLinksClone","cloneDeep","pluginsSectionRawLinks","pluginSectionLinksPermissions"],"mappings":"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"}
@@ -27,7 +27,8 @@ const useMenu = (shouldUpdateStrapi)=>{
27
27
  id: 'global.marketplace',
28
28
  defaultMessage: 'Marketplace'
29
29
  },
30
- to: '/marketplace',
30
+ to: 'https://market.strapi.io',
31
+ target: '_blank',
31
32
  permissions: permissions.marketplace?.main ?? [],
32
33
  position: 7
33
34
  },
@@ -1 +1 @@
1
- {"version":3,"file":"useMenu.mjs","sources":["../../../../../admin/src/hooks/useMenu.ts"],"sourcesContent":["import * as React from 'react';\n\nimport { Cog, ShoppingCart, House } from '@strapi/icons';\nimport cloneDeep from 'lodash/cloneDeep';\n\nimport { useTypedSelector } from '../core/store/hooks';\nimport { useAuth, AuthContextValue } from '../features/Auth';\nimport { StrapiAppContextValue, useStrapiApp } from '../features/StrapiApp';\n\n/* -------------------------------------------------------------------------------------------------\n * useMenu\n * -----------------------------------------------------------------------------------------------*/\n\nexport type MenuItem = Omit<StrapiAppContextValue['menu'][number], 'Component'> & {\n navigationLink?: string;\n};\nexport type MobileMenuItem = {\n to: string;\n link?: string;\n};\n\nexport interface Menu {\n generalSectionLinks: MenuItem[];\n pluginsSectionLinks: MenuItem[];\n topMobileNavigation: MobileMenuItem[];\n burgerMobileNavigation: MobileMenuItem[];\n isLoading: boolean;\n}\n\nconst useMenu = (shouldUpdateStrapi: boolean) => {\n const checkUserHasPermissions = useAuth('useMenu', (state) => state.checkUserHasPermissions);\n const menu = useStrapiApp('useMenu', (state) => state.menu);\n const permissions = useTypedSelector((state) => state.admin_app.permissions);\n const [menuWithUserPermissions, setMenuWithUserPermissions] = React.useState<Menu>({\n generalSectionLinks: [\n {\n icon: House,\n intlLabel: {\n id: 'global.home',\n defaultMessage: 'Home',\n },\n to: '/',\n permissions: [],\n position: 0,\n },\n {\n icon: ShoppingCart,\n intlLabel: {\n id: 'global.marketplace',\n defaultMessage: 'Marketplace',\n },\n to: '/marketplace',\n permissions: permissions.marketplace?.main ?? [],\n position: 7,\n },\n {\n icon: Cog,\n intlLabel: {\n id: 'global.settings',\n defaultMessage: 'Settings',\n },\n to: '/settings',\n // Permissions of this link are retrieved in the init phase\n // using the settings menu\n permissions: [],\n notificationsCount: 0,\n position: 9,\n },\n ],\n pluginsSectionLinks: [],\n topMobileNavigation: [\n {\n to: '/',\n },\n {\n to: 'content-manager',\n },\n {\n to: 'plugins/content-releases',\n },\n {\n to: 'plugins/upload',\n },\n ],\n burgerMobileNavigation: [\n {\n to: '/settings',\n },\n ],\n isLoading: true,\n });\n const generalSectionLinksRef = React.useRef(menuWithUserPermissions.generalSectionLinks);\n\n React.useEffect(() => {\n async function applyMenuPermissions() {\n const authorizedPluginSectionLinks = await getPluginSectionLinks(\n menu,\n checkUserHasPermissions\n );\n\n const authorizedGeneralSectionLinks = await getGeneralLinks(\n generalSectionLinksRef.current,\n shouldUpdateStrapi,\n checkUserHasPermissions\n );\n\n setMenuWithUserPermissions((state) => ({\n ...state,\n generalSectionLinks: authorizedGeneralSectionLinks,\n pluginsSectionLinks: authorizedPluginSectionLinks,\n isLoading: false,\n }));\n }\n\n applyMenuPermissions();\n }, [\n setMenuWithUserPermissions,\n generalSectionLinksRef,\n menu,\n permissions,\n shouldUpdateStrapi,\n checkUserHasPermissions,\n ]);\n\n return menuWithUserPermissions;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Utils\n * -----------------------------------------------------------------------------------------------*/\n\nconst getGeneralLinks = async (\n generalSectionRawLinks: MenuItem[],\n shouldUpdateStrapi: boolean = false,\n checkUserHasPermissions: AuthContextValue['checkUserHasPermissions']\n) => {\n const generalSectionLinksPermissions = await Promise.all(\n generalSectionRawLinks.map(({ permissions }) => checkUserHasPermissions(permissions))\n );\n\n const authorizedGeneralSectionLinks = generalSectionRawLinks.filter(\n (_, index) => generalSectionLinksPermissions[index].length > 0\n );\n\n const settingsLinkIndex = authorizedGeneralSectionLinks.findIndex(\n (obj) => obj.to === '/settings'\n );\n\n if (settingsLinkIndex === -1) {\n return [];\n }\n\n const authorizedGeneralLinksClone = cloneDeep(authorizedGeneralSectionLinks);\n\n authorizedGeneralLinksClone[settingsLinkIndex].notificationsCount = shouldUpdateStrapi ? 1 : 0;\n\n return authorizedGeneralLinksClone;\n};\n\nconst getPluginSectionLinks = async (\n pluginsSectionRawLinks: MenuItem[],\n checkUserHasPermissions: AuthContextValue['checkUserHasPermissions']\n) => {\n const pluginSectionLinksPermissions = await Promise.all(\n pluginsSectionRawLinks.map(({ permissions }) => checkUserHasPermissions(permissions))\n );\n\n const authorizedPluginSectionLinks = pluginsSectionRawLinks.filter(\n (_, index) => pluginSectionLinksPermissions[index].length > 0\n );\n\n return authorizedPluginSectionLinks;\n};\n\nexport { useMenu };\n"],"names":["useMenu","shouldUpdateStrapi","checkUserHasPermissions","useAuth","state","menu","useStrapiApp","permissions","useTypedSelector","admin_app","menuWithUserPermissions","setMenuWithUserPermissions","React","useState","generalSectionLinks","icon","House","intlLabel","id","defaultMessage","to","position","ShoppingCart","marketplace","main","Cog","notificationsCount","pluginsSectionLinks","topMobileNavigation","burgerMobileNavigation","isLoading","generalSectionLinksRef","useRef","useEffect","applyMenuPermissions","authorizedPluginSectionLinks","getPluginSectionLinks","authorizedGeneralSectionLinks","getGeneralLinks","current","generalSectionRawLinks","generalSectionLinksPermissions","Promise","all","map","filter","_","index","length","settingsLinkIndex","findIndex","obj","authorizedGeneralLinksClone","cloneDeep","pluginsSectionRawLinks","pluginSectionLinksPermissions"],"mappings":"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"}
1
+ {"version":3,"file":"useMenu.mjs","sources":["../../../../../admin/src/hooks/useMenu.ts"],"sourcesContent":["import * as React from 'react';\n\nimport { Cog, ShoppingCart, House } from '@strapi/icons';\nimport cloneDeep from 'lodash/cloneDeep';\n\nimport { useTypedSelector } from '../core/store/hooks';\nimport { useAuth, AuthContextValue } from '../features/Auth';\nimport { StrapiAppContextValue, useStrapiApp } from '../features/StrapiApp';\n\n/* -------------------------------------------------------------------------------------------------\n * useMenu\n * -----------------------------------------------------------------------------------------------*/\n\nexport type MenuItem = Omit<StrapiAppContextValue['menu'][number], 'Component'> & {\n navigationLink?: string;\n};\nexport type MobileMenuItem = {\n to: string;\n target?: string;\n link?: string;\n};\n\nexport interface Menu {\n generalSectionLinks: MenuItem[];\n pluginsSectionLinks: MenuItem[];\n topMobileNavigation: MobileMenuItem[];\n burgerMobileNavigation: MobileMenuItem[];\n isLoading: boolean;\n}\n\nconst useMenu = (shouldUpdateStrapi: boolean) => {\n const checkUserHasPermissions = useAuth('useMenu', (state) => state.checkUserHasPermissions);\n const menu = useStrapiApp('useMenu', (state) => state.menu);\n const permissions = useTypedSelector((state) => state.admin_app.permissions);\n const [menuWithUserPermissions, setMenuWithUserPermissions] = React.useState<Menu>({\n generalSectionLinks: [\n {\n icon: House,\n intlLabel: {\n id: 'global.home',\n defaultMessage: 'Home',\n },\n to: '/',\n permissions: [],\n position: 0,\n },\n {\n icon: ShoppingCart,\n intlLabel: {\n id: 'global.marketplace',\n defaultMessage: 'Marketplace',\n },\n to: 'https://market.strapi.io',\n target: '_blank',\n permissions: permissions.marketplace?.main ?? [],\n position: 7,\n },\n {\n icon: Cog,\n intlLabel: {\n id: 'global.settings',\n defaultMessage: 'Settings',\n },\n to: '/settings',\n // Permissions of this link are retrieved in the init phase\n // using the settings menu\n permissions: [],\n notificationsCount: 0,\n position: 9,\n },\n ],\n pluginsSectionLinks: [],\n topMobileNavigation: [\n {\n to: '/',\n },\n {\n to: 'content-manager',\n },\n {\n to: 'plugins/content-releases',\n },\n {\n to: 'plugins/upload',\n },\n ],\n burgerMobileNavigation: [\n {\n to: '/settings',\n },\n ],\n isLoading: true,\n });\n const generalSectionLinksRef = React.useRef(menuWithUserPermissions.generalSectionLinks);\n\n React.useEffect(() => {\n async function applyMenuPermissions() {\n const authorizedPluginSectionLinks = await getPluginSectionLinks(\n menu,\n checkUserHasPermissions\n );\n\n const authorizedGeneralSectionLinks = await getGeneralLinks(\n generalSectionLinksRef.current,\n shouldUpdateStrapi,\n checkUserHasPermissions\n );\n\n setMenuWithUserPermissions((state) => ({\n ...state,\n generalSectionLinks: authorizedGeneralSectionLinks,\n pluginsSectionLinks: authorizedPluginSectionLinks,\n isLoading: false,\n }));\n }\n\n applyMenuPermissions();\n }, [\n setMenuWithUserPermissions,\n generalSectionLinksRef,\n menu,\n permissions,\n shouldUpdateStrapi,\n checkUserHasPermissions,\n ]);\n\n return menuWithUserPermissions;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Utils\n * -----------------------------------------------------------------------------------------------*/\n\nconst getGeneralLinks = async (\n generalSectionRawLinks: MenuItem[],\n shouldUpdateStrapi: boolean = false,\n checkUserHasPermissions: AuthContextValue['checkUserHasPermissions']\n) => {\n const generalSectionLinksPermissions = await Promise.all(\n generalSectionRawLinks.map(({ permissions }) => checkUserHasPermissions(permissions))\n );\n\n const authorizedGeneralSectionLinks = generalSectionRawLinks.filter(\n (_, index) => generalSectionLinksPermissions[index].length > 0\n );\n\n const settingsLinkIndex = authorizedGeneralSectionLinks.findIndex(\n (obj) => obj.to === '/settings'\n );\n\n if (settingsLinkIndex === -1) {\n return [];\n }\n\n const authorizedGeneralLinksClone = cloneDeep(authorizedGeneralSectionLinks);\n\n authorizedGeneralLinksClone[settingsLinkIndex].notificationsCount = shouldUpdateStrapi ? 1 : 0;\n\n return authorizedGeneralLinksClone;\n};\n\nconst getPluginSectionLinks = async (\n pluginsSectionRawLinks: MenuItem[],\n checkUserHasPermissions: AuthContextValue['checkUserHasPermissions']\n) => {\n const pluginSectionLinksPermissions = await Promise.all(\n pluginsSectionRawLinks.map(({ permissions }) => checkUserHasPermissions(permissions))\n );\n\n const authorizedPluginSectionLinks = pluginsSectionRawLinks.filter(\n (_, index) => pluginSectionLinksPermissions[index].length > 0\n );\n\n return authorizedPluginSectionLinks;\n};\n\nexport { useMenu };\n"],"names":["useMenu","shouldUpdateStrapi","checkUserHasPermissions","useAuth","state","menu","useStrapiApp","permissions","useTypedSelector","admin_app","menuWithUserPermissions","setMenuWithUserPermissions","React","useState","generalSectionLinks","icon","House","intlLabel","id","defaultMessage","to","position","ShoppingCart","target","marketplace","main","Cog","notificationsCount","pluginsSectionLinks","topMobileNavigation","burgerMobileNavigation","isLoading","generalSectionLinksRef","useRef","useEffect","applyMenuPermissions","authorizedPluginSectionLinks","getPluginSectionLinks","authorizedGeneralSectionLinks","getGeneralLinks","current","generalSectionRawLinks","generalSectionLinksPermissions","Promise","all","map","filter","_","index","length","settingsLinkIndex","findIndex","obj","authorizedGeneralLinksClone","cloneDeep","pluginsSectionRawLinks","pluginSectionLinksPermissions"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"AuthenticatedLayout.js","sources":["../../../../../admin/src/layouts/AuthenticatedLayout.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport packageInfo from '@strapi/admin/package.json';\nimport { Box, Flex, SkipToContent } from '@strapi/design-system';\nimport { DndProvider } from 'react-dnd';\nimport { HTML5Backend } from 'react-dnd-html5-backend';\nimport { useIntl } from 'react-intl';\nimport { Outlet } from 'react-router-dom';\nimport lt from 'semver/functions/lt';\nimport valid from 'semver/functions/valid';\n\nimport { LeftMenu } from '../components/LeftMenu';\nimport { NpsSurvey } from '../components/NpsSurvey';\nimport { Page } from '../components/PageHelpers';\nimport { PluginsInitializer } from '../components/PluginsInitializer';\nimport { PrivateRoute } from '../components/PrivateRoute';\nimport { UpsellBanner } from '../components/UpsellBanner';\nimport { HEIGHT_TOP_NAVIGATION } from '../constants/theme';\nimport { AppInfoProvider } from '../features/AppInfo';\nimport { useAuth } from '../features/Auth';\nimport { useConfiguration } from '../features/Configuration';\nimport { useStrapiApp } from '../features/StrapiApp';\nimport { useTracking } from '../features/Tracking';\nimport { useMenu } from '../hooks/useMenu';\nimport { useInformationQuery } from '../services/admin';\nimport { hashAdminUserEmail } from '../utils/users';\n\nconst { version: strapiVersion } = packageInfo;\n\nconst AdminLayout = () => {\n const { formatMessage } = useIntl();\n const userInfo = useAuth('AuthenticatedApp', (state) => state.user);\n const [userId, setUserId] = React.useState<string>();\n const { showReleaseNotification } = useConfiguration('AuthenticatedApp');\n\n const { data: appInfo, isLoading: isLoadingAppInfo } = useInformationQuery();\n const [tagName, setTagName] = React.useState<string>(strapiVersion);\n\n React.useEffect(() => {\n if (showReleaseNotification) {\n fetch('https://api.github.com/repos/strapi/strapi/releases/latest')\n .then(async (res) => {\n if (!res.ok) {\n return;\n }\n\n const response = (await res.json()) as { tag_name: string | null | undefined };\n\n if (!response.tag_name) {\n throw new Error();\n }\n\n setTagName(response.tag_name);\n })\n .catch(() => {\n /**\n * silence is golden & we'll use the strapiVersion as a fallback\n */\n });\n }\n }, [showReleaseNotification]);\n\n React.useEffect(() => {\n hashAdminUserEmail(userInfo).then((id) => {\n if (id) {\n setUserId(id);\n }\n });\n }, [userInfo]);\n\n const { trackUsage } = useTracking();\n\n const {\n isLoading: isLoadingMenu,\n generalSectionLinks,\n pluginsSectionLinks,\n topMobileNavigation,\n burgerMobileNavigation,\n } = useMenu(checkLatestStrapiVersion(strapiVersion, tagName));\n\n const getAllWidgets = useStrapiApp('TrackingProvider', (state) => state.widgets.getAll);\n const projectId = appInfo?.projectId;\n React.useEffect(() => {\n if (projectId) {\n trackUsage('didAccessAuthenticatedAdministration', {\n registeredWidgets: getAllWidgets().map((widget) => widget.uid),\n projectId,\n });\n }\n }, [projectId, getAllWidgets, trackUsage]);\n\n // We don't need to wait for the release query to be fetched before rendering the plugins\n // however, we need the appInfos and the permissions\n if (isLoadingMenu || isLoadingAppInfo) {\n return <Page.Loading />;\n }\n\n return (\n <AppInfoProvider\n {...appInfo}\n userId={userId}\n latestStrapiReleaseTag={tagName}\n shouldUpdateStrapi={checkLatestStrapiVersion(strapiVersion, tagName)}\n >\n <NpsSurvey />\n <PluginsInitializer>\n <DndProvider backend={HTML5Backend}>\n <Box background=\"neutral100\">\n <SkipToContent>\n {formatMessage({ id: 'skipToContent', defaultMessage: 'Skip to content' })}\n </SkipToContent>\n <Flex\n height=\"100dvh\"\n direction={{\n initial: 'column',\n large: 'row',\n }}\n alignItems=\"flex-start\"\n >\n <LeftMenu\n generalSectionLinks={generalSectionLinks}\n pluginsSectionLinks={pluginsSectionLinks}\n topMobileNavigation={topMobileNavigation}\n burgerMobileNavigation={burgerMobileNavigation}\n />\n <Box\n flex={1}\n overflow=\"auto\"\n width=\"100%\"\n height={{\n initial: 'auto',\n large: '100%',\n }}\n >\n <UpsellBanner />\n <Outlet />\n </Box>\n </Flex>\n </Box>\n </DndProvider>\n </PluginsInitializer>\n </AppInfoProvider>\n );\n};\n\nconst PrivateAdminLayout = () => {\n return (\n <PrivateRoute>\n <AdminLayout />\n </PrivateRoute>\n );\n};\n\nconst checkLatestStrapiVersion = (\n currentPackageVersion: string,\n latestPublishedVersion: string = ''\n): boolean => {\n if (!valid(currentPackageVersion) || !valid(latestPublishedVersion)) {\n return false;\n }\n\n return lt(currentPackageVersion, latestPublishedVersion);\n};\n\nexport { AdminLayout, PrivateAdminLayout };\n"],"names":["version","strapiVersion","packageInfo","AdminLayout","formatMessage","useIntl","userInfo","useAuth","state","user","userId","setUserId","React","useState","showReleaseNotification","useConfiguration","data","appInfo","isLoading","isLoadingAppInfo","useInformationQuery","tagName","setTagName","useEffect","fetch","then","res","ok","response","json","tag_name","Error","catch","hashAdminUserEmail","id","trackUsage","useTracking","isLoadingMenu","generalSectionLinks","pluginsSectionLinks","topMobileNavigation","burgerMobileNavigation","useMenu","checkLatestStrapiVersion","getAllWidgets","useStrapiApp","widgets","getAll","projectId","registeredWidgets","map","widget","uid","_jsx","Page","Loading","_jsxs","AppInfoProvider","latestStrapiReleaseTag","shouldUpdateStrapi","NpsSurvey","PluginsInitializer","DndProvider","backend","HTML5Backend","Box","background","SkipToContent","defaultMessage","Flex","height","direction","initial","large","alignItems","LeftMenu","flex","overflow","width","UpsellBanner","Outlet","PrivateAdminLayout","PrivateRoute","currentPackageVersion","latestPublishedVersion","valid","lt"],"mappings":"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"}
1
+ {"version":3,"file":"AuthenticatedLayout.js","sources":["../../../../../admin/src/layouts/AuthenticatedLayout.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport packageInfo from '@strapi/admin/package.json';\nimport { Box, Flex, SkipToContent } from '@strapi/design-system';\nimport { DndProvider } from 'react-dnd';\nimport { HTML5Backend } from 'react-dnd-html5-backend';\nimport { useIntl } from 'react-intl';\nimport { Outlet } from 'react-router-dom';\nimport lt from 'semver/functions/lt';\nimport valid from 'semver/functions/valid';\n\nimport { LeftMenu } from '../components/LeftMenu';\nimport { NpsSurvey } from '../components/NpsSurvey';\nimport { Page } from '../components/PageHelpers';\nimport { PluginsInitializer } from '../components/PluginsInitializer';\nimport { PrivateRoute } from '../components/PrivateRoute';\nimport { UpsellBanner } from '../components/UpsellBanner';\nimport { AppInfoProvider } from '../features/AppInfo';\nimport { useAuth } from '../features/Auth';\nimport { useConfiguration } from '../features/Configuration';\nimport { useStrapiApp } from '../features/StrapiApp';\nimport { useTracking } from '../features/Tracking';\nimport { useMenu } from '../hooks/useMenu';\nimport { useInformationQuery } from '../services/admin';\nimport { hashAdminUserEmail } from '../utils/users';\n\nconst { version: strapiVersion } = packageInfo;\n\nconst AdminLayout = () => {\n const { formatMessage } = useIntl();\n const userInfo = useAuth('AuthenticatedApp', (state) => state.user);\n const [userId, setUserId] = React.useState<string>();\n const { showReleaseNotification } = useConfiguration('AuthenticatedApp');\n\n const { data: appInfo, isLoading: isLoadingAppInfo } = useInformationQuery();\n const [tagName, setTagName] = React.useState<string>(strapiVersion);\n\n React.useEffect(() => {\n if (showReleaseNotification) {\n fetch('https://api.github.com/repos/strapi/strapi/releases/latest')\n .then(async (res) => {\n if (!res.ok) {\n return;\n }\n\n const response = (await res.json()) as { tag_name: string | null | undefined };\n\n if (!response.tag_name) {\n throw new Error();\n }\n\n setTagName(response.tag_name);\n })\n .catch(() => {\n /**\n * silence is golden & we'll use the strapiVersion as a fallback\n */\n });\n }\n }, [showReleaseNotification]);\n\n React.useEffect(() => {\n hashAdminUserEmail(userInfo).then((id) => {\n if (id) {\n setUserId(id);\n }\n });\n }, [userInfo]);\n\n const { trackUsage } = useTracking();\n\n const {\n isLoading: isLoadingMenu,\n generalSectionLinks,\n pluginsSectionLinks,\n topMobileNavigation,\n burgerMobileNavigation,\n } = useMenu(checkLatestStrapiVersion(strapiVersion, tagName));\n\n const getAllWidgets = useStrapiApp('TrackingProvider', (state) => state.widgets.getAll);\n const projectId = appInfo?.projectId;\n React.useEffect(() => {\n if (projectId) {\n trackUsage('didAccessAuthenticatedAdministration', {\n registeredWidgets: getAllWidgets().map((widget) => widget.uid),\n projectId,\n });\n }\n }, [projectId, getAllWidgets, trackUsage]);\n\n // We don't need to wait for the release query to be fetched before rendering the plugins\n // however, we need the appInfos and the permissions\n if (isLoadingMenu || isLoadingAppInfo) {\n return <Page.Loading />;\n }\n\n return (\n <AppInfoProvider\n {...appInfo}\n userId={userId}\n latestStrapiReleaseTag={tagName}\n shouldUpdateStrapi={checkLatestStrapiVersion(strapiVersion, tagName)}\n >\n <NpsSurvey />\n <PluginsInitializer>\n <DndProvider backend={HTML5Backend}>\n <Box background=\"neutral100\">\n <SkipToContent>\n {formatMessage({ id: 'skipToContent', defaultMessage: 'Skip to content' })}\n </SkipToContent>\n <Flex\n height=\"100dvh\"\n direction={{\n initial: 'column',\n large: 'row',\n }}\n alignItems=\"flex-start\"\n >\n <LeftMenu\n generalSectionLinks={generalSectionLinks}\n pluginsSectionLinks={pluginsSectionLinks}\n topMobileNavigation={topMobileNavigation}\n burgerMobileNavigation={burgerMobileNavigation}\n />\n <Box\n flex={1}\n overflow=\"auto\"\n width=\"100%\"\n height={{\n initial: 'auto',\n large: '100%',\n }}\n >\n <UpsellBanner />\n <Outlet />\n </Box>\n </Flex>\n </Box>\n </DndProvider>\n </PluginsInitializer>\n </AppInfoProvider>\n );\n};\n\nconst PrivateAdminLayout = () => {\n return (\n <PrivateRoute>\n <AdminLayout />\n </PrivateRoute>\n );\n};\n\nconst checkLatestStrapiVersion = (\n currentPackageVersion: string,\n latestPublishedVersion: string = ''\n): boolean => {\n if (!valid(currentPackageVersion) || !valid(latestPublishedVersion)) {\n return false;\n }\n\n return lt(currentPackageVersion, latestPublishedVersion);\n};\n\nexport { AdminLayout, PrivateAdminLayout };\n"],"names":["version","strapiVersion","packageInfo","AdminLayout","formatMessage","useIntl","userInfo","useAuth","state","user","userId","setUserId","React","useState","showReleaseNotification","useConfiguration","data","appInfo","isLoading","isLoadingAppInfo","useInformationQuery","tagName","setTagName","useEffect","fetch","then","res","ok","response","json","tag_name","Error","catch","hashAdminUserEmail","id","trackUsage","useTracking","isLoadingMenu","generalSectionLinks","pluginsSectionLinks","topMobileNavigation","burgerMobileNavigation","useMenu","checkLatestStrapiVersion","getAllWidgets","useStrapiApp","widgets","getAll","projectId","registeredWidgets","map","widget","uid","_jsx","Page","Loading","_jsxs","AppInfoProvider","latestStrapiReleaseTag","shouldUpdateStrapi","NpsSurvey","PluginsInitializer","DndProvider","backend","HTML5Backend","Box","background","SkipToContent","defaultMessage","Flex","height","direction","initial","large","alignItems","LeftMenu","flex","overflow","width","UpsellBanner","Outlet","PrivateAdminLayout","PrivateRoute","currentPackageVersion","latestPublishedVersion","valid","lt"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"AuthenticatedLayout.mjs","sources":["../../../../../admin/src/layouts/AuthenticatedLayout.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport packageInfo from '@strapi/admin/package.json';\nimport { Box, Flex, SkipToContent } from '@strapi/design-system';\nimport { DndProvider } from 'react-dnd';\nimport { HTML5Backend } from 'react-dnd-html5-backend';\nimport { useIntl } from 'react-intl';\nimport { Outlet } from 'react-router-dom';\nimport lt from 'semver/functions/lt';\nimport valid from 'semver/functions/valid';\n\nimport { LeftMenu } from '../components/LeftMenu';\nimport { NpsSurvey } from '../components/NpsSurvey';\nimport { Page } from '../components/PageHelpers';\nimport { PluginsInitializer } from '../components/PluginsInitializer';\nimport { PrivateRoute } from '../components/PrivateRoute';\nimport { UpsellBanner } from '../components/UpsellBanner';\nimport { HEIGHT_TOP_NAVIGATION } from '../constants/theme';\nimport { AppInfoProvider } from '../features/AppInfo';\nimport { useAuth } from '../features/Auth';\nimport { useConfiguration } from '../features/Configuration';\nimport { useStrapiApp } from '../features/StrapiApp';\nimport { useTracking } from '../features/Tracking';\nimport { useMenu } from '../hooks/useMenu';\nimport { useInformationQuery } from '../services/admin';\nimport { hashAdminUserEmail } from '../utils/users';\n\nconst { version: strapiVersion } = packageInfo;\n\nconst AdminLayout = () => {\n const { formatMessage } = useIntl();\n const userInfo = useAuth('AuthenticatedApp', (state) => state.user);\n const [userId, setUserId] = React.useState<string>();\n const { showReleaseNotification } = useConfiguration('AuthenticatedApp');\n\n const { data: appInfo, isLoading: isLoadingAppInfo } = useInformationQuery();\n const [tagName, setTagName] = React.useState<string>(strapiVersion);\n\n React.useEffect(() => {\n if (showReleaseNotification) {\n fetch('https://api.github.com/repos/strapi/strapi/releases/latest')\n .then(async (res) => {\n if (!res.ok) {\n return;\n }\n\n const response = (await res.json()) as { tag_name: string | null | undefined };\n\n if (!response.tag_name) {\n throw new Error();\n }\n\n setTagName(response.tag_name);\n })\n .catch(() => {\n /**\n * silence is golden & we'll use the strapiVersion as a fallback\n */\n });\n }\n }, [showReleaseNotification]);\n\n React.useEffect(() => {\n hashAdminUserEmail(userInfo).then((id) => {\n if (id) {\n setUserId(id);\n }\n });\n }, [userInfo]);\n\n const { trackUsage } = useTracking();\n\n const {\n isLoading: isLoadingMenu,\n generalSectionLinks,\n pluginsSectionLinks,\n topMobileNavigation,\n burgerMobileNavigation,\n } = useMenu(checkLatestStrapiVersion(strapiVersion, tagName));\n\n const getAllWidgets = useStrapiApp('TrackingProvider', (state) => state.widgets.getAll);\n const projectId = appInfo?.projectId;\n React.useEffect(() => {\n if (projectId) {\n trackUsage('didAccessAuthenticatedAdministration', {\n registeredWidgets: getAllWidgets().map((widget) => widget.uid),\n projectId,\n });\n }\n }, [projectId, getAllWidgets, trackUsage]);\n\n // We don't need to wait for the release query to be fetched before rendering the plugins\n // however, we need the appInfos and the permissions\n if (isLoadingMenu || isLoadingAppInfo) {\n return <Page.Loading />;\n }\n\n return (\n <AppInfoProvider\n {...appInfo}\n userId={userId}\n latestStrapiReleaseTag={tagName}\n shouldUpdateStrapi={checkLatestStrapiVersion(strapiVersion, tagName)}\n >\n <NpsSurvey />\n <PluginsInitializer>\n <DndProvider backend={HTML5Backend}>\n <Box background=\"neutral100\">\n <SkipToContent>\n {formatMessage({ id: 'skipToContent', defaultMessage: 'Skip to content' })}\n </SkipToContent>\n <Flex\n height=\"100dvh\"\n direction={{\n initial: 'column',\n large: 'row',\n }}\n alignItems=\"flex-start\"\n >\n <LeftMenu\n generalSectionLinks={generalSectionLinks}\n pluginsSectionLinks={pluginsSectionLinks}\n topMobileNavigation={topMobileNavigation}\n burgerMobileNavigation={burgerMobileNavigation}\n />\n <Box\n flex={1}\n overflow=\"auto\"\n width=\"100%\"\n height={{\n initial: 'auto',\n large: '100%',\n }}\n >\n <UpsellBanner />\n <Outlet />\n </Box>\n </Flex>\n </Box>\n </DndProvider>\n </PluginsInitializer>\n </AppInfoProvider>\n );\n};\n\nconst PrivateAdminLayout = () => {\n return (\n <PrivateRoute>\n <AdminLayout />\n </PrivateRoute>\n );\n};\n\nconst checkLatestStrapiVersion = (\n currentPackageVersion: string,\n latestPublishedVersion: string = ''\n): boolean => {\n if (!valid(currentPackageVersion) || !valid(latestPublishedVersion)) {\n return false;\n }\n\n return lt(currentPackageVersion, latestPublishedVersion);\n};\n\nexport { AdminLayout, PrivateAdminLayout };\n"],"names":["version","strapiVersion","packageInfo","AdminLayout","formatMessage","useIntl","userInfo","useAuth","state","user","userId","setUserId","React","useState","showReleaseNotification","useConfiguration","data","appInfo","isLoading","isLoadingAppInfo","useInformationQuery","tagName","setTagName","useEffect","fetch","then","res","ok","response","json","tag_name","Error","catch","hashAdminUserEmail","id","trackUsage","useTracking","isLoadingMenu","generalSectionLinks","pluginsSectionLinks","topMobileNavigation","burgerMobileNavigation","useMenu","checkLatestStrapiVersion","getAllWidgets","useStrapiApp","widgets","getAll","projectId","registeredWidgets","map","widget","uid","_jsx","Page","Loading","_jsxs","AppInfoProvider","latestStrapiReleaseTag","shouldUpdateStrapi","NpsSurvey","PluginsInitializer","DndProvider","backend","HTML5Backend","Box","background","SkipToContent","defaultMessage","Flex","height","direction","initial","large","alignItems","LeftMenu","flex","overflow","width","UpsellBanner","Outlet","PrivateAdminLayout","PrivateRoute","currentPackageVersion","latestPublishedVersion","valid","lt"],"mappings":"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"}
1
+ {"version":3,"file":"AuthenticatedLayout.mjs","sources":["../../../../../admin/src/layouts/AuthenticatedLayout.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport packageInfo from '@strapi/admin/package.json';\nimport { Box, Flex, SkipToContent } from '@strapi/design-system';\nimport { DndProvider } from 'react-dnd';\nimport { HTML5Backend } from 'react-dnd-html5-backend';\nimport { useIntl } from 'react-intl';\nimport { Outlet } from 'react-router-dom';\nimport lt from 'semver/functions/lt';\nimport valid from 'semver/functions/valid';\n\nimport { LeftMenu } from '../components/LeftMenu';\nimport { NpsSurvey } from '../components/NpsSurvey';\nimport { Page } from '../components/PageHelpers';\nimport { PluginsInitializer } from '../components/PluginsInitializer';\nimport { PrivateRoute } from '../components/PrivateRoute';\nimport { UpsellBanner } from '../components/UpsellBanner';\nimport { AppInfoProvider } from '../features/AppInfo';\nimport { useAuth } from '../features/Auth';\nimport { useConfiguration } from '../features/Configuration';\nimport { useStrapiApp } from '../features/StrapiApp';\nimport { useTracking } from '../features/Tracking';\nimport { useMenu } from '../hooks/useMenu';\nimport { useInformationQuery } from '../services/admin';\nimport { hashAdminUserEmail } from '../utils/users';\n\nconst { version: strapiVersion } = packageInfo;\n\nconst AdminLayout = () => {\n const { formatMessage } = useIntl();\n const userInfo = useAuth('AuthenticatedApp', (state) => state.user);\n const [userId, setUserId] = React.useState<string>();\n const { showReleaseNotification } = useConfiguration('AuthenticatedApp');\n\n const { data: appInfo, isLoading: isLoadingAppInfo } = useInformationQuery();\n const [tagName, setTagName] = React.useState<string>(strapiVersion);\n\n React.useEffect(() => {\n if (showReleaseNotification) {\n fetch('https://api.github.com/repos/strapi/strapi/releases/latest')\n .then(async (res) => {\n if (!res.ok) {\n return;\n }\n\n const response = (await res.json()) as { tag_name: string | null | undefined };\n\n if (!response.tag_name) {\n throw new Error();\n }\n\n setTagName(response.tag_name);\n })\n .catch(() => {\n /**\n * silence is golden & we'll use the strapiVersion as a fallback\n */\n });\n }\n }, [showReleaseNotification]);\n\n React.useEffect(() => {\n hashAdminUserEmail(userInfo).then((id) => {\n if (id) {\n setUserId(id);\n }\n });\n }, [userInfo]);\n\n const { trackUsage } = useTracking();\n\n const {\n isLoading: isLoadingMenu,\n generalSectionLinks,\n pluginsSectionLinks,\n topMobileNavigation,\n burgerMobileNavigation,\n } = useMenu(checkLatestStrapiVersion(strapiVersion, tagName));\n\n const getAllWidgets = useStrapiApp('TrackingProvider', (state) => state.widgets.getAll);\n const projectId = appInfo?.projectId;\n React.useEffect(() => {\n if (projectId) {\n trackUsage('didAccessAuthenticatedAdministration', {\n registeredWidgets: getAllWidgets().map((widget) => widget.uid),\n projectId,\n });\n }\n }, [projectId, getAllWidgets, trackUsage]);\n\n // We don't need to wait for the release query to be fetched before rendering the plugins\n // however, we need the appInfos and the permissions\n if (isLoadingMenu || isLoadingAppInfo) {\n return <Page.Loading />;\n }\n\n return (\n <AppInfoProvider\n {...appInfo}\n userId={userId}\n latestStrapiReleaseTag={tagName}\n shouldUpdateStrapi={checkLatestStrapiVersion(strapiVersion, tagName)}\n >\n <NpsSurvey />\n <PluginsInitializer>\n <DndProvider backend={HTML5Backend}>\n <Box background=\"neutral100\">\n <SkipToContent>\n {formatMessage({ id: 'skipToContent', defaultMessage: 'Skip to content' })}\n </SkipToContent>\n <Flex\n height=\"100dvh\"\n direction={{\n initial: 'column',\n large: 'row',\n }}\n alignItems=\"flex-start\"\n >\n <LeftMenu\n generalSectionLinks={generalSectionLinks}\n pluginsSectionLinks={pluginsSectionLinks}\n topMobileNavigation={topMobileNavigation}\n burgerMobileNavigation={burgerMobileNavigation}\n />\n <Box\n flex={1}\n overflow=\"auto\"\n width=\"100%\"\n height={{\n initial: 'auto',\n large: '100%',\n }}\n >\n <UpsellBanner />\n <Outlet />\n </Box>\n </Flex>\n </Box>\n </DndProvider>\n </PluginsInitializer>\n </AppInfoProvider>\n );\n};\n\nconst PrivateAdminLayout = () => {\n return (\n <PrivateRoute>\n <AdminLayout />\n </PrivateRoute>\n );\n};\n\nconst checkLatestStrapiVersion = (\n currentPackageVersion: string,\n latestPublishedVersion: string = ''\n): boolean => {\n if (!valid(currentPackageVersion) || !valid(latestPublishedVersion)) {\n return false;\n }\n\n return lt(currentPackageVersion, latestPublishedVersion);\n};\n\nexport { AdminLayout, PrivateAdminLayout };\n"],"names":["version","strapiVersion","packageInfo","AdminLayout","formatMessage","useIntl","userInfo","useAuth","state","user","userId","setUserId","React","useState","showReleaseNotification","useConfiguration","data","appInfo","isLoading","isLoadingAppInfo","useInformationQuery","tagName","setTagName","useEffect","fetch","then","res","ok","response","json","tag_name","Error","catch","hashAdminUserEmail","id","trackUsage","useTracking","isLoadingMenu","generalSectionLinks","pluginsSectionLinks","topMobileNavigation","burgerMobileNavigation","useMenu","checkLatestStrapiVersion","getAllWidgets","useStrapiApp","widgets","getAll","projectId","registeredWidgets","map","widget","uid","_jsx","Page","Loading","_jsxs","AppInfoProvider","latestStrapiReleaseTag","shouldUpdateStrapi","NpsSurvey","PluginsInitializer","DndProvider","backend","HTML5Backend","Box","background","SkipToContent","defaultMessage","Flex","height","direction","initial","large","alignItems","LeftMenu","flex","overflow","width","UpsellBanner","Outlet","PrivateAdminLayout","PrivateRoute","currentPackageVersion","latestPublishedVersion","valid","lt"],"mappings":"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"}
@@ -60,21 +60,30 @@ const REGISTER_USER_SCHEMA = yup__namespace.object().shape({
60
60
  if (!value || typeof value !== 'string') return true; // validated elsewhere
61
61
  const byteSize = strings.getByteSize(value);
62
62
  return byteSize <= 72;
63
- }).matches(/[a-z]/, {
63
+ }).test('lowercase', {
64
64
  message: {
65
65
  id: 'components.Input.error.contain.lowercase',
66
66
  defaultMessage: 'Password must contain at least 1 lowercase letter'
67
67
  }
68
- }).matches(/[A-Z]/, {
68
+ }, (value)=>{
69
+ if (!value) return true;
70
+ return /[a-z]/.test(value);
71
+ }).test('uppercase', {
69
72
  message: {
70
73
  id: 'components.Input.error.contain.uppercase',
71
74
  defaultMessage: 'Password must contain at least 1 uppercase letter'
72
75
  }
73
- }).matches(/\d/, {
76
+ }, (value)=>{
77
+ if (!value) return true;
78
+ return /[A-Z]/.test(value);
79
+ }).test('number', {
74
80
  message: {
75
81
  id: 'components.Input.error.contain.number',
76
82
  defaultMessage: 'Password must contain at least 1 number'
77
83
  }
84
+ }, (value)=>{
85
+ if (!value) return true;
86
+ return /\d/.test(value);
78
87
  }).required({
79
88
  id: translatedErrors.translatedErrors.required.id,
80
89
  defaultMessage: 'Password is required'
@@ -112,21 +121,30 @@ const REGISTER_ADMIN_SCHEMA = yup__namespace.object().shape({
112
121
  }, function(value) {
113
122
  if (!value) return true;
114
123
  return new TextEncoder().encode(value).length <= 72;
115
- }).matches(/[a-z]/, {
124
+ }).test('lowercase', {
116
125
  message: {
117
126
  id: 'components.Input.error.contain.lowercase',
118
127
  defaultMessage: 'Password must contain at least 1 lowercase letter'
119
128
  }
120
- }).matches(/[A-Z]/, {
129
+ }, (value)=>{
130
+ if (!value) return true;
131
+ return /[a-z]/.test(value);
132
+ }).test('uppercase', {
121
133
  message: {
122
134
  id: 'components.Input.error.contain.uppercase',
123
135
  defaultMessage: 'Password must contain at least 1 uppercase letter'
124
136
  }
125
- }).matches(/\d/, {
137
+ }, (value)=>{
138
+ if (!value) return true;
139
+ return /[A-Z]/.test(value);
140
+ }).test('number', {
126
141
  message: {
127
142
  id: 'components.Input.error.contain.number',
128
143
  defaultMessage: 'Password must contain at least 1 number'
129
144
  }
145
+ }, (value)=>{
146
+ if (!value) return true;
147
+ return /\d/.test(value);
130
148
  }).required({
131
149
  id: translatedErrors.translatedErrors.required.id,
132
150
  defaultMessage: 'Password is required'
@@ -338,12 +356,35 @@ const Register = ({ hasAdmin })=>{
338
356
  }
339
357
  } catch (err) {
340
358
  if (err instanceof yup.ValidationError) {
341
- helpers.setErrors(err.inner.reduce((acc, { message, path })=>{
342
- if (path && typeof message === 'object') {
343
- acc[path] = formatMessage(message);
359
+ const formatDescriptor = (msg)=>{
360
+ try {
361
+ if (!msg) return '';
362
+ if (typeof msg === 'string') return msg;
363
+ // Direct descriptor
364
+ if ('id' in msg && 'defaultMessage' in msg) return formatMessage(msg);
365
+ // Wrapped descriptor: { message: { id, defaultMessage } }
366
+ if (msg.message && typeof msg.message === 'object' && 'id' in msg.message) {
367
+ return formatMessage(msg.message);
368
+ }
369
+ // errors array: [{ id, defaultMessage }]
370
+ if (Array.isArray(msg.errors) && msg.errors.length > 0) {
371
+ const first = msg.errors[0];
372
+ if (typeof first === 'string') return first;
373
+ if (first && typeof first === 'object' && 'id' in first) return formatMessage(first);
374
+ }
375
+ // fallback to defaultMessage if present
376
+ if ('defaultMessage' in msg) return msg.defaultMessage;
377
+ return String(msg);
378
+ } catch (e) {
379
+ return String(msg);
344
380
  }
381
+ };
382
+ const computed = err.inner.reduce((acc, { message, path })=>{
383
+ if (!path) return acc;
384
+ acc[path] = formatDescriptor(message);
345
385
  return acc;
346
- }, {}));
386
+ }, {});
387
+ helpers.setErrors(computed);
347
388
  }
348
389
  setSubmitCount(submitCount + 1);
349
390
  }