@strapi/admin 5.25.0 → 5.27.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 (336) hide show
  1. package/dist/admin/admin/src/App.js +6 -2
  2. package/dist/admin/admin/src/App.js.map +1 -1
  3. package/dist/admin/admin/src/App.mjs +7 -3
  4. package/dist/admin/admin/src/App.mjs.map +1 -1
  5. package/dist/admin/admin/src/components/ErrorElement.js +10 -3
  6. package/dist/admin/admin/src/components/ErrorElement.js.map +1 -1
  7. package/dist/admin/admin/src/components/ErrorElement.mjs +10 -3
  8. package/dist/admin/admin/src/components/ErrorElement.mjs.map +1 -1
  9. package/dist/admin/admin/src/components/GuidedTour/Context.js +26 -1
  10. package/dist/admin/admin/src/components/GuidedTour/Context.js.map +1 -1
  11. package/dist/admin/admin/src/components/GuidedTour/Context.mjs +26 -1
  12. package/dist/admin/admin/src/components/GuidedTour/Context.mjs.map +1 -1
  13. package/dist/admin/admin/src/components/GuidedTour/GuidedTourProvider.js +15 -0
  14. package/dist/admin/admin/src/components/GuidedTour/GuidedTourProvider.js.map +1 -0
  15. package/dist/admin/admin/src/components/GuidedTour/GuidedTourProvider.mjs +13 -0
  16. package/dist/admin/admin/src/components/GuidedTour/GuidedTourProvider.mjs.map +1 -0
  17. package/dist/admin/admin/src/components/GuidedTour/Overview.js +2 -1
  18. package/dist/admin/admin/src/components/GuidedTour/Overview.js.map +1 -1
  19. package/dist/admin/admin/src/components/GuidedTour/Overview.mjs +2 -1
  20. package/dist/admin/admin/src/components/GuidedTour/Overview.mjs.map +1 -1
  21. package/dist/admin/admin/src/components/GuidedTour/Steps/ContentTypeBuilderSteps.js +162 -25
  22. package/dist/admin/admin/src/components/GuidedTour/Steps/ContentTypeBuilderSteps.js.map +1 -1
  23. package/dist/admin/admin/src/components/GuidedTour/Steps/ContentTypeBuilderSteps.mjs +164 -27
  24. package/dist/admin/admin/src/components/GuidedTour/Steps/ContentTypeBuilderSteps.mjs.map +1 -1
  25. package/dist/admin/admin/src/components/GuidedTour/Steps/Step.js +28 -9
  26. package/dist/admin/admin/src/components/GuidedTour/Steps/Step.js.map +1 -1
  27. package/dist/admin/admin/src/components/GuidedTour/Steps/Step.mjs +30 -11
  28. package/dist/admin/admin/src/components/GuidedTour/Steps/Step.mjs.map +1 -1
  29. package/dist/admin/admin/src/components/GuidedTour/Tours.js +1 -1
  30. package/dist/admin/admin/src/components/GuidedTour/Tours.js.map +1 -1
  31. package/dist/admin/admin/src/components/GuidedTour/Tours.mjs +1 -1
  32. package/dist/admin/admin/src/components/GuidedTour/Tours.mjs.map +1 -1
  33. package/dist/admin/admin/src/components/GuidedTour/utils/migrations.js +2 -1
  34. package/dist/admin/admin/src/components/GuidedTour/utils/migrations.js.map +1 -1
  35. package/dist/admin/admin/src/components/GuidedTour/utils/migrations.mjs +2 -1
  36. package/dist/admin/admin/src/components/GuidedTour/utils/migrations.mjs.map +1 -1
  37. package/dist/admin/admin/src/components/Layouts/ActionLayout.js +3 -2
  38. package/dist/admin/admin/src/components/Layouts/ActionLayout.js.map +1 -1
  39. package/dist/admin/admin/src/components/Layouts/ActionLayout.mjs +3 -2
  40. package/dist/admin/admin/src/components/Layouts/ActionLayout.mjs.map +1 -1
  41. package/dist/admin/admin/src/components/Layouts/ContentLayout.js +3 -2
  42. package/dist/admin/admin/src/components/Layouts/ContentLayout.js.map +1 -1
  43. package/dist/admin/admin/src/components/Layouts/ContentLayout.mjs +3 -2
  44. package/dist/admin/admin/src/components/Layouts/ContentLayout.mjs.map +1 -1
  45. package/dist/admin/admin/src/components/Layouts/HeaderLayout.js +65 -32
  46. package/dist/admin/admin/src/components/Layouts/HeaderLayout.js.map +1 -1
  47. package/dist/admin/admin/src/components/Layouts/HeaderLayout.mjs +66 -33
  48. package/dist/admin/admin/src/components/Layouts/HeaderLayout.mjs.map +1 -1
  49. package/dist/admin/admin/src/components/Layouts/Layout.js +29 -6
  50. package/dist/admin/admin/src/components/Layouts/Layout.js.map +1 -1
  51. package/dist/admin/admin/src/components/Layouts/Layout.mjs +30 -7
  52. package/dist/admin/admin/src/components/Layouts/Layout.mjs.map +1 -1
  53. package/dist/admin/admin/src/components/LeftMenu.js +147 -92
  54. package/dist/admin/admin/src/components/LeftMenu.js.map +1 -1
  55. package/dist/admin/admin/src/components/LeftMenu.mjs +131 -95
  56. package/dist/admin/admin/src/components/LeftMenu.mjs.map +1 -1
  57. package/dist/admin/admin/src/components/MainNav/MainNav.js +20 -6
  58. package/dist/admin/admin/src/components/MainNav/MainNav.js.map +1 -1
  59. package/dist/admin/admin/src/components/MainNav/MainNav.mjs +20 -6
  60. package/dist/admin/admin/src/components/MainNav/MainNav.mjs.map +1 -1
  61. package/dist/admin/admin/src/components/MainNav/MainNavLinks.js +157 -0
  62. package/dist/admin/admin/src/components/MainNav/MainNavLinks.js.map +1 -0
  63. package/dist/admin/admin/src/components/MainNav/MainNavLinks.mjs +154 -0
  64. package/dist/admin/admin/src/components/MainNav/MainNavLinks.mjs.map +1 -0
  65. package/dist/admin/admin/src/components/MainNav/NavBurgerMenu.js +65 -0
  66. package/dist/admin/admin/src/components/MainNav/NavBurgerMenu.js.map +1 -0
  67. package/dist/admin/admin/src/components/MainNav/NavBurgerMenu.mjs +63 -0
  68. package/dist/admin/admin/src/components/MainNav/NavBurgerMenu.mjs.map +1 -0
  69. package/dist/admin/admin/src/components/MainNav/NavLink.js +2 -1
  70. package/dist/admin/admin/src/components/MainNav/NavLink.js.map +1 -1
  71. package/dist/admin/admin/src/components/MainNav/NavLink.mjs +2 -1
  72. package/dist/admin/admin/src/components/MainNav/NavLink.mjs.map +1 -1
  73. package/dist/admin/admin/src/components/MainNav/NavUser.js +39 -22
  74. package/dist/admin/admin/src/components/MainNav/NavUser.js.map +1 -1
  75. package/dist/admin/admin/src/components/MainNav/NavUser.mjs +39 -22
  76. package/dist/admin/admin/src/components/MainNav/NavUser.mjs.map +1 -1
  77. package/dist/admin/admin/src/components/MainNav/TrialCountdown.js +8 -1
  78. package/dist/admin/admin/src/components/MainNav/TrialCountdown.js.map +1 -1
  79. package/dist/admin/admin/src/components/MainNav/TrialCountdown.mjs +9 -2
  80. package/dist/admin/admin/src/components/MainNav/TrialCountdown.mjs.map +1 -1
  81. package/dist/admin/admin/src/components/NpsSurvey.js +161 -120
  82. package/dist/admin/admin/src/components/NpsSurvey.js.map +1 -1
  83. package/dist/admin/admin/src/components/NpsSurvey.mjs +162 -121
  84. package/dist/admin/admin/src/components/NpsSurvey.mjs.map +1 -1
  85. package/dist/admin/admin/src/components/PageHelpers.js +1 -1
  86. package/dist/admin/admin/src/components/PageHelpers.js.map +1 -1
  87. package/dist/admin/admin/src/components/PageHelpers.mjs +1 -1
  88. package/dist/admin/admin/src/components/PageHelpers.mjs.map +1 -1
  89. package/dist/admin/admin/src/components/Providers.js +2 -4
  90. package/dist/admin/admin/src/components/Providers.js.map +1 -1
  91. package/dist/admin/admin/src/components/Providers.mjs +2 -4
  92. package/dist/admin/admin/src/components/Providers.mjs.map +1 -1
  93. package/dist/admin/admin/src/components/SubNav.js +98 -33
  94. package/dist/admin/admin/src/components/SubNav.js.map +1 -1
  95. package/dist/admin/admin/src/components/SubNav.mjs +99 -34
  96. package/dist/admin/admin/src/components/SubNav.mjs.map +1 -1
  97. package/dist/admin/admin/src/components/UpsellBanner.js +3 -2
  98. package/dist/admin/admin/src/components/UpsellBanner.js.map +1 -1
  99. package/dist/admin/admin/src/components/UpsellBanner.mjs +3 -2
  100. package/dist/admin/admin/src/components/UpsellBanner.mjs.map +1 -1
  101. package/dist/admin/admin/src/constants/theme.js +12 -0
  102. package/dist/admin/admin/src/constants/theme.js.map +1 -0
  103. package/dist/admin/admin/src/constants/theme.mjs +9 -0
  104. package/dist/admin/admin/src/constants/theme.mjs.map +1 -0
  105. package/dist/admin/admin/src/features/Notifications.js +14 -7
  106. package/dist/admin/admin/src/features/Notifications.js.map +1 -1
  107. package/dist/admin/admin/src/features/Notifications.mjs +15 -8
  108. package/dist/admin/admin/src/features/Notifications.mjs.map +1 -1
  109. package/dist/admin/admin/src/features/Tracking.js +7 -2
  110. package/dist/admin/admin/src/features/Tracking.js.map +1 -1
  111. package/dist/admin/admin/src/features/Tracking.mjs +7 -2
  112. package/dist/admin/admin/src/features/Tracking.mjs.map +1 -1
  113. package/dist/admin/admin/src/hooks/useAIAvailability.js +13 -0
  114. package/dist/admin/admin/src/hooks/useAIAvailability.js.map +1 -0
  115. package/dist/admin/admin/src/hooks/useAIAvailability.mjs +11 -0
  116. package/dist/admin/admin/src/hooks/useAIAvailability.mjs.map +1 -0
  117. package/dist/admin/admin/src/hooks/useDeviceType.js +43 -0
  118. package/dist/admin/admin/src/hooks/useDeviceType.js.map +1 -0
  119. package/dist/admin/admin/src/hooks/useDeviceType.mjs +22 -0
  120. package/dist/admin/admin/src/hooks/useDeviceType.mjs.map +1 -0
  121. package/dist/admin/admin/src/hooks/useMediaQuery.js +70 -0
  122. package/dist/admin/admin/src/hooks/useMediaQuery.js.map +1 -0
  123. package/dist/admin/admin/src/hooks/useMediaQuery.mjs +46 -0
  124. package/dist/admin/admin/src/hooks/useMediaQuery.mjs.map +1 -0
  125. package/dist/admin/admin/src/hooks/useMenu.js +19 -0
  126. package/dist/admin/admin/src/hooks/useMenu.js.map +1 -1
  127. package/dist/admin/admin/src/hooks/useMenu.mjs +19 -0
  128. package/dist/admin/admin/src/hooks/useMenu.mjs.map +1 -1
  129. package/dist/admin/admin/src/layouts/AuthenticatedLayout.js +15 -2
  130. package/dist/admin/admin/src/layouts/AuthenticatedLayout.js.map +1 -1
  131. package/dist/admin/admin/src/layouts/AuthenticatedLayout.mjs +15 -2
  132. package/dist/admin/admin/src/layouts/AuthenticatedLayout.mjs.map +1 -1
  133. package/dist/admin/admin/src/layouts/UnauthenticatedLayout.js +11 -7
  134. package/dist/admin/admin/src/layouts/UnauthenticatedLayout.js.map +1 -1
  135. package/dist/admin/admin/src/layouts/UnauthenticatedLayout.mjs +11 -7
  136. package/dist/admin/admin/src/layouts/UnauthenticatedLayout.mjs.map +1 -1
  137. package/dist/admin/admin/src/pages/Auth/components/Login.js +3 -0
  138. package/dist/admin/admin/src/pages/Auth/components/Login.js.map +1 -1
  139. package/dist/admin/admin/src/pages/Auth/components/Login.mjs +3 -0
  140. package/dist/admin/admin/src/pages/Auth/components/Login.mjs.map +1 -1
  141. package/dist/admin/admin/src/pages/Home/HomePage.js +56 -54
  142. package/dist/admin/admin/src/pages/Home/HomePage.js.map +1 -1
  143. package/dist/admin/admin/src/pages/Home/HomePage.mjs +56 -54
  144. package/dist/admin/admin/src/pages/Home/HomePage.mjs.map +1 -1
  145. package/dist/admin/admin/src/pages/ProfilePage.js +54 -51
  146. package/dist/admin/admin/src/pages/ProfilePage.js.map +1 -1
  147. package/dist/admin/admin/src/pages/ProfilePage.mjs +55 -52
  148. package/dist/admin/admin/src/pages/ProfilePage.mjs.map +1 -1
  149. package/dist/admin/admin/src/pages/Settings/Layout.js +42 -6
  150. package/dist/admin/admin/src/pages/Settings/Layout.js.map +1 -1
  151. package/dist/admin/admin/src/pages/Settings/Layout.mjs +43 -7
  152. package/dist/admin/admin/src/pages/Settings/Layout.mjs.map +1 -1
  153. package/dist/admin/admin/src/pages/Settings/components/SettingsNav.js +44 -32
  154. package/dist/admin/admin/src/pages/Settings/components/SettingsNav.js.map +1 -1
  155. package/dist/admin/admin/src/pages/Settings/components/SettingsNav.mjs +45 -33
  156. package/dist/admin/admin/src/pages/Settings/components/SettingsNav.mjs.map +1 -1
  157. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.js +13 -2
  158. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.js.map +1 -1
  159. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.mjs +14 -3
  160. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.mjs.map +1 -1
  161. package/dist/admin/admin/src/pages/Settings/pages/InstalledPlugins.js +1 -1
  162. package/dist/admin/admin/src/pages/Settings/pages/InstalledPlugins.js.map +1 -1
  163. package/dist/admin/admin/src/pages/Settings/pages/InstalledPlugins.mjs +2 -2
  164. package/dist/admin/admin/src/pages/Settings/pages/InstalledPlugins.mjs.map +1 -1
  165. package/dist/admin/admin/src/pages/Settings/pages/PurchaseAuditLogs.js +4 -3
  166. package/dist/admin/admin/src/pages/Settings/pages/PurchaseAuditLogs.js.map +1 -1
  167. package/dist/admin/admin/src/pages/Settings/pages/PurchaseAuditLogs.mjs +5 -4
  168. package/dist/admin/admin/src/pages/Settings/pages/PurchaseAuditLogs.mjs.map +1 -1
  169. package/dist/admin/admin/src/pages/Settings/pages/PurchaseContentHistory.js +4 -3
  170. package/dist/admin/admin/src/pages/Settings/pages/PurchaseContentHistory.js.map +1 -1
  171. package/dist/admin/admin/src/pages/Settings/pages/PurchaseContentHistory.mjs +5 -4
  172. package/dist/admin/admin/src/pages/Settings/pages/PurchaseContentHistory.mjs.map +1 -1
  173. package/dist/admin/admin/src/pages/Settings/pages/PurchaseSingleSignOn.js +4 -3
  174. package/dist/admin/admin/src/pages/Settings/pages/PurchaseSingleSignOn.js.map +1 -1
  175. package/dist/admin/admin/src/pages/Settings/pages/PurchaseSingleSignOn.mjs +5 -4
  176. package/dist/admin/admin/src/pages/Settings/pages/PurchaseSingleSignOn.mjs.map +1 -1
  177. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/ContentTypeCollapses.js +36 -32
  178. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/ContentTypeCollapses.js.map +1 -1
  179. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/ContentTypeCollapses.mjs +36 -32
  180. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/ContentTypeCollapses.mjs.map +1 -1
  181. package/dist/admin/admin/src/pages/Settings/pages/Webhooks/ListPage.js +1 -1
  182. package/dist/admin/admin/src/pages/Settings/pages/Webhooks/ListPage.js.map +1 -1
  183. package/dist/admin/admin/src/pages/Settings/pages/Webhooks/ListPage.mjs +1 -1
  184. package/dist/admin/admin/src/pages/Settings/pages/Webhooks/ListPage.mjs.map +1 -1
  185. package/dist/admin/admin/src/render.js +6 -1
  186. package/dist/admin/admin/src/render.js.map +1 -1
  187. package/dist/admin/admin/src/render.mjs +6 -1
  188. package/dist/admin/admin/src/render.mjs.map +1 -1
  189. package/dist/admin/admin/src/services/api.js +2 -1
  190. package/dist/admin/admin/src/services/api.js.map +1 -1
  191. package/dist/admin/admin/src/services/api.mjs +2 -1
  192. package/dist/admin/admin/src/services/api.mjs.map +1 -1
  193. package/dist/admin/admin/src/services/auth.js +13 -2
  194. package/dist/admin/admin/src/services/auth.js.map +1 -1
  195. package/dist/admin/admin/src/services/auth.mjs +12 -3
  196. package/dist/admin/admin/src/services/auth.mjs.map +1 -1
  197. package/dist/admin/admin/src/translations/en.json.js +3 -0
  198. package/dist/admin/admin/src/translations/en.json.js.map +1 -1
  199. package/dist/admin/admin/src/translations/en.json.mjs +3 -0
  200. package/dist/admin/admin/src/translations/en.json.mjs.map +1 -1
  201. package/dist/admin/ee/admin/src/components/GlobalNotifications.js +11 -0
  202. package/dist/admin/ee/admin/src/components/GlobalNotifications.js.map +1 -0
  203. package/dist/admin/ee/admin/src/components/GlobalNotifications.mjs +9 -0
  204. package/dist/admin/ee/admin/src/components/GlobalNotifications.mjs.map +1 -0
  205. package/dist/admin/ee/admin/src/hooks/useAIAvailability.js +11 -0
  206. package/dist/admin/ee/admin/src/hooks/useAIAvailability.js.map +1 -0
  207. package/dist/admin/ee/admin/src/hooks/useAIAvailability.mjs +9 -0
  208. package/dist/admin/ee/admin/src/hooks/useAIAvailability.mjs.map +1 -0
  209. package/dist/admin/ee/admin/src/hooks/useAIUsageWarning.js +82 -0
  210. package/dist/admin/ee/admin/src/hooks/useAIUsageWarning.js.map +1 -0
  211. package/dist/admin/ee/admin/src/hooks/useAIUsageWarning.mjs +80 -0
  212. package/dist/admin/ee/admin/src/hooks/useAIUsageWarning.mjs.map +1 -0
  213. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AIUsage.js +102 -0
  214. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AIUsage.js.map +1 -0
  215. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AIUsage.mjs +100 -0
  216. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AIUsage.mjs.map +1 -0
  217. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/SingleSignOnPage.js +1 -1
  218. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/SingleSignOnPage.js.map +1 -1
  219. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/SingleSignOnPage.mjs +1 -1
  220. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/SingleSignOnPage.mjs.map +1 -1
  221. package/dist/admin/ee/admin/src/services/ai.js +33 -0
  222. package/dist/admin/ee/admin/src/services/ai.js.map +1 -0
  223. package/dist/admin/ee/admin/src/services/ai.mjs +29 -0
  224. package/dist/admin/ee/admin/src/services/ai.mjs.map +1 -0
  225. package/dist/admin/ee.js +4 -0
  226. package/dist/admin/ee.js.map +1 -1
  227. package/dist/admin/ee.mjs +2 -0
  228. package/dist/admin/ee.mjs.map +1 -1
  229. package/dist/admin/index.js +13 -0
  230. package/dist/admin/index.js.map +1 -1
  231. package/dist/admin/index.mjs +5 -0
  232. package/dist/admin/index.mjs.map +1 -1
  233. package/dist/admin/src/components/GuidedTour/Context.d.ts +11 -0
  234. package/dist/admin/src/components/GuidedTour/GuidedTourProvider.d.ts +6 -0
  235. package/dist/admin/src/components/GuidedTour/Steps/ContentTypeBuilderSteps.d.ts +7 -16
  236. package/dist/admin/src/components/GuidedTour/Tours.d.ts +1 -22
  237. package/dist/admin/src/components/LeftMenu.d.ts +2 -2
  238. package/dist/admin/src/components/MainNav/MainNavLinks.d.ts +11 -0
  239. package/dist/admin/src/components/MainNav/NavBurgerMenu.d.ts +9 -0
  240. package/dist/admin/src/components/MainNav/NavUser.d.ts +5 -4
  241. package/dist/admin/src/components/SubNav.d.ts +18 -5
  242. package/dist/admin/src/constants/theme.d.ts +7 -0
  243. package/dist/admin/src/core/store/configure.d.ts +2 -2
  244. package/dist/admin/src/core/store/hooks.d.ts +2 -2
  245. package/dist/admin/src/ee.d.ts +2 -0
  246. package/dist/admin/src/features/Tracking.d.ts +21 -2
  247. package/dist/admin/src/hooks/useAIAvailability.d.ts +5 -0
  248. package/dist/admin/src/hooks/useAdminRoles.d.ts +1 -1
  249. package/dist/admin/src/hooks/useDeviceType.d.ts +6 -0
  250. package/dist/admin/src/hooks/useMediaQuery.d.ts +21 -0
  251. package/dist/admin/src/hooks/useMenu.d.ts +9 -1
  252. package/dist/admin/src/index.d.ts +6 -0
  253. package/dist/admin/src/pages/Marketplace/hooks/useMarketplaceData.d.ts +2 -2
  254. package/dist/admin/src/pages/Settings/components/SettingsNav.d.ts +3 -6
  255. package/dist/admin/src/pages/Settings/pages/Webhooks/hooks/useWebhooks.d.ts +4 -4
  256. package/dist/admin/src/selectors.d.ts +2 -2
  257. package/dist/admin/src/services/admin.d.ts +7 -6
  258. package/dist/admin/src/services/api.d.ts +1 -1
  259. package/dist/admin/src/services/apiTokens.d.ts +1 -1
  260. package/dist/admin/src/services/auth.d.ts +21 -12
  261. package/dist/admin/src/services/contentApi.d.ts +1 -1
  262. package/dist/admin/src/services/contentManager.d.ts +1 -1
  263. package/dist/admin/src/services/homepage.d.ts +3 -3
  264. package/dist/admin/src/services/transferTokens.d.ts +1 -1
  265. package/dist/admin/src/services/users.d.ts +8 -8
  266. package/dist/admin/src/services/webhooks.d.ts +2 -2
  267. package/dist/admin/tests/utils.d.ts +1 -1
  268. package/dist/ee/admin/src/components/GlobalNotifications.d.ts +1 -0
  269. package/dist/ee/admin/src/hooks/useAIAvailability.d.ts +1 -0
  270. package/dist/ee/admin/src/hooks/useAIUsageWarning.d.ts +5 -0
  271. package/dist/ee/admin/src/hooks/useLicenseLimits.d.ts +1 -1
  272. package/dist/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AIUsage.d.ts +1 -0
  273. package/dist/ee/admin/src/services/ai.d.ts +9 -0
  274. package/dist/ee/admin/src/services/auditLogs.d.ts +1 -1
  275. package/dist/ee/server/src/ai/controllers/ai.d.ts +7 -0
  276. package/dist/ee/server/src/ai/controllers/ai.d.ts.map +1 -0
  277. package/dist/ee/server/src/ai/routes/ai.d.ts +13 -0
  278. package/dist/ee/server/src/ai/routes/ai.d.ts.map +1 -0
  279. package/dist/ee/server/src/controllers/admin.d.ts +3 -0
  280. package/dist/ee/server/src/controllers/admin.d.ts.map +1 -1
  281. package/dist/ee/server/src/controllers/index.d.ts +3 -0
  282. package/dist/ee/server/src/controllers/index.d.ts.map +1 -1
  283. package/dist/ee/server/src/index.d.ts +15 -187
  284. package/dist/ee/server/src/index.d.ts.map +1 -1
  285. package/dist/server/ee/server/src/ai/controllers/ai.js +218 -0
  286. package/dist/server/ee/server/src/ai/controllers/ai.js.map +1 -0
  287. package/dist/server/ee/server/src/ai/controllers/ai.mjs +216 -0
  288. package/dist/server/ee/server/src/ai/controllers/ai.mjs.map +1 -0
  289. package/dist/server/ee/server/src/ai/routes/ai.js +32 -0
  290. package/dist/server/ee/server/src/ai/routes/ai.js.map +1 -0
  291. package/dist/server/ee/server/src/ai/routes/ai.mjs +30 -0
  292. package/dist/server/ee/server/src/ai/routes/ai.mjs.map +1 -0
  293. package/dist/server/ee/server/src/controllers/admin.js +4 -1
  294. package/dist/server/ee/server/src/controllers/admin.js.map +1 -1
  295. package/dist/server/ee/server/src/controllers/admin.mjs +4 -1
  296. package/dist/server/ee/server/src/controllers/admin.mjs.map +1 -1
  297. package/dist/server/ee/server/src/index.js +37 -23
  298. package/dist/server/ee/server/src/index.js.map +1 -1
  299. package/dist/server/ee/server/src/index.mjs +37 -23
  300. package/dist/server/ee/server/src/index.mjs.map +1 -1
  301. package/dist/server/server/src/controllers/admin.js +5 -1
  302. package/dist/server/server/src/controllers/admin.js.map +1 -1
  303. package/dist/server/server/src/controllers/admin.mjs +5 -1
  304. package/dist/server/server/src/controllers/admin.mjs.map +1 -1
  305. package/dist/server/server/src/controllers/authenticated-user.js +15 -0
  306. package/dist/server/server/src/controllers/authenticated-user.js.map +1 -1
  307. package/dist/server/server/src/controllers/authenticated-user.mjs +15 -0
  308. package/dist/server/server/src/controllers/authenticated-user.mjs.map +1 -1
  309. package/dist/server/server/src/routes/users.js +10 -0
  310. package/dist/server/server/src/routes/users.js.map +1 -1
  311. package/dist/server/server/src/routes/users.mjs +10 -0
  312. package/dist/server/server/src/routes/users.mjs.map +1 -1
  313. package/dist/server/server/src/services/user.js +113 -1
  314. package/dist/server/server/src/services/user.js.map +1 -1
  315. package/dist/server/server/src/services/user.mjs +113 -1
  316. package/dist/server/server/src/services/user.mjs.map +1 -1
  317. package/dist/server/src/controllers/admin.d.ts +2 -0
  318. package/dist/server/src/controllers/admin.d.ts.map +1 -1
  319. package/dist/server/src/controllers/authenticated-user.d.ts +1 -0
  320. package/dist/server/src/controllers/authenticated-user.d.ts.map +1 -1
  321. package/dist/server/src/controllers/index.d.ts +3 -0
  322. package/dist/server/src/controllers/index.d.ts.map +1 -1
  323. package/dist/server/src/index.d.ts +7 -0
  324. package/dist/server/src/index.d.ts.map +1 -1
  325. package/dist/server/src/routes/users.d.ts.map +1 -1
  326. package/dist/server/src/services/index.d.ts +4 -0
  327. package/dist/server/src/services/index.d.ts.map +1 -1
  328. package/dist/server/src/services/user.d.ts +4 -0
  329. package/dist/server/src/services/user.d.ts.map +1 -1
  330. package/dist/shared/contracts/admin.d.ts +1 -0
  331. package/dist/shared/contracts/admin.d.ts.map +1 -1
  332. package/dist/shared/contracts/ai.d.ts +40 -0
  333. package/dist/shared/contracts/ai.d.ts.map +1 -0
  334. package/dist/shared/contracts/users.d.ts +32 -0
  335. package/dist/shared/contracts/users.d.ts.map +1 -1
  336. package/package.json +7 -7
@@ -1 +1 @@
1
- {"version":3,"file":"Notifications.mjs","sources":["../../../../../admin/src/features/Notifications.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Alert, AlertVariant, Flex, useCallbackRef, Link } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\ninterface NotificationLink {\n label: string;\n target?: string;\n url: string;\n}\n\ninterface NotificationConfig {\n blockTransition?: boolean;\n link?: NotificationLink;\n message?: string;\n onClose?: () => void;\n timeout?: number;\n title?: string;\n type?: 'info' | 'warning' | 'danger' | 'success';\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Context\n * -----------------------------------------------------------------------------------------------*/\n\ninterface NotificationsContextValue {\n /**\n * Toggles a notification, wrapped in `useCallback` for a stable identity.\n */\n toggleNotification: (config: NotificationConfig) => void;\n}\n\nconst NotificationsContext = React.createContext<NotificationsContextValue>({\n toggleNotification: () => {},\n});\n\n/* -------------------------------------------------------------------------------------------------\n * Provider\n * -----------------------------------------------------------------------------------------------*/\n\ninterface NotificationsProviderProps {\n children: React.ReactNode;\n}\ninterface Notification extends NotificationConfig {\n id: number;\n}\n\n/**\n * @internal\n * @description DO NOT USE. This will be removed before stable release of v5.\n */\nconst NotificationsProvider = ({ children }: NotificationsProviderProps) => {\n const notificationIdRef = React.useRef(0);\n\n const [notifications, setNotifications] = React.useState<Notification[]>([]);\n\n const toggleNotification = React.useCallback(\n ({ type, message, link, timeout, blockTransition, onClose, title }: NotificationConfig) => {\n setNotifications((s) => [\n ...s,\n {\n id: notificationIdRef.current++,\n type,\n message,\n link,\n timeout,\n blockTransition,\n onClose,\n title,\n },\n ]);\n },\n []\n );\n\n const clearNotification = React.useCallback((id: number) => {\n setNotifications((s) => s.filter((n) => n.id !== id));\n }, []);\n\n const value = React.useMemo(() => ({ toggleNotification }), [toggleNotification]);\n\n return (\n <NotificationsContext.Provider value={value}>\n <Flex\n left=\"50%\"\n marginLeft=\"-250px\"\n position=\"fixed\"\n direction=\"column\"\n alignItems=\"stretch\"\n gap={2}\n top={`4.6rem`}\n width={`50rem`}\n zIndex=\"notification\"\n >\n {notifications.map((notification) => {\n return (\n <Notification\n key={notification.id}\n {...notification}\n clearNotification={clearNotification}\n />\n );\n })}\n </Flex>\n {children}\n </NotificationsContext.Provider>\n );\n};\n\ninterface NotificationProps extends Notification {\n clearNotification: (id: number) => void;\n}\n\nconst Notification = ({\n clearNotification,\n blockTransition = false,\n id,\n link,\n message,\n onClose,\n timeout = 2500,\n title,\n type,\n}: NotificationProps) => {\n const { formatMessage } = useIntl();\n /**\n * Chances are `onClose` won't be classed as stabilised,\n * so we use `useCallbackRef` to avoid make it stable.\n */\n const onCloseCallback = useCallbackRef(onClose);\n\n const handleClose = React.useCallback(() => {\n onCloseCallback();\n\n clearNotification(id);\n }, [clearNotification, id, onCloseCallback]);\n\n // eslint-disable-next-line consistent-return\n React.useEffect(() => {\n if (!blockTransition) {\n const timeoutReference = setTimeout(() => {\n handleClose();\n }, timeout);\n\n return () => {\n clearTimeout(timeoutReference);\n };\n }\n }, [blockTransition, handleClose, timeout]);\n\n const getVariant = (): AlertVariant => {\n switch (type) {\n case 'info':\n return 'default';\n case 'danger':\n return 'danger';\n case 'warning':\n return 'warning';\n default:\n return 'success';\n }\n };\n\n return (\n <Alert\n action={\n link ? (\n <Link href={link.url} isExternal>\n {link.label}\n </Link>\n ) : undefined\n }\n onClose={handleClose}\n closeLabel={formatMessage({\n id: 'global.close',\n defaultMessage: 'Close',\n })}\n title={title}\n variant={getVariant()}\n >\n {message}\n </Alert>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Hook\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * @preserve\n * @description Returns an object to interact with the notification\n * system. The callbacks are wrapped in `useCallback` for a stable\n * identity.\n *\n * @example\n * ```tsx\n * import { useNotification } from '@strapi/strapi/admin';\n *\n * const MyComponent = () => {\n * const { toggleNotification } = useNotification();\n *\n * return <button onClick={() => toggleNotification({ message: 'Hello world!' })}>Click me</button>;\n */\nconst useNotification = () => React.useContext(NotificationsContext);\n\nexport { NotificationsProvider, useNotification };\nexport type { NotificationConfig, NotificationsContextValue };\n"],"names":["NotificationsContext","React","createContext","toggleNotification","NotificationsProvider","children","notificationIdRef","useRef","notifications","setNotifications","useState","useCallback","type","message","link","timeout","blockTransition","onClose","title","s","id","current","clearNotification","filter","n","value","useMemo","_jsxs","Provider","_jsx","Flex","left","marginLeft","position","direction","alignItems","gap","top","width","zIndex","map","notification","Notification","formatMessage","useIntl","onCloseCallback","useCallbackRef","handleClose","useEffect","timeoutReference","setTimeout","clearTimeout","getVariant","Alert","action","Link","href","url","isExternal","label","undefined","closeLabel","defaultMessage","variant","useNotification","useContext"],"mappings":"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"}
1
+ {"version":3,"file":"Notifications.mjs","sources":["../../../../../admin/src/features/Notifications.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Alert, AlertVariant, Flex, useCallbackRef, Link, Box } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\nimport { HEIGHT_TOP_NAVIGATION } from '../constants/theme';\n\ninterface NotificationLink {\n label: string;\n target?: string;\n url: string;\n}\n\ninterface NotificationConfig {\n blockTransition?: boolean;\n link?: NotificationLink;\n message?: string;\n onClose?: () => void;\n timeout?: number;\n title?: string;\n type?: 'info' | 'warning' | 'danger' | 'success';\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Context\n * -----------------------------------------------------------------------------------------------*/\n\ninterface NotificationsContextValue {\n /**\n * Toggles a notification, wrapped in `useCallback` for a stable identity.\n */\n toggleNotification: (config: NotificationConfig) => void;\n}\n\nconst NotificationsContext = React.createContext<NotificationsContextValue>({\n toggleNotification: () => {},\n});\n\n/* -------------------------------------------------------------------------------------------------\n * Provider\n * -----------------------------------------------------------------------------------------------*/\n\ninterface NotificationsProviderProps {\n children: React.ReactNode;\n}\ninterface Notification extends NotificationConfig {\n id: number;\n}\n\n/**\n * @internal\n * @description DO NOT USE. This will be removed before stable release of v5.\n */\nconst NotificationsProvider = ({ children }: NotificationsProviderProps) => {\n const notificationIdRef = React.useRef(0);\n\n const [notifications, setNotifications] = React.useState<Notification[]>([]);\n\n const toggleNotification = React.useCallback(\n ({ type, message, link, timeout, blockTransition, onClose, title }: NotificationConfig) => {\n setNotifications((s) => [\n ...s,\n {\n id: notificationIdRef.current++,\n type,\n message,\n link,\n timeout,\n blockTransition,\n onClose,\n title,\n },\n ]);\n },\n []\n );\n\n const clearNotification = React.useCallback((id: number) => {\n setNotifications((s) => s.filter((n) => n.id !== id));\n }, []);\n\n const value = React.useMemo(() => ({ toggleNotification }), [toggleNotification]);\n\n return (\n <NotificationsContext.Provider value={value}>\n <Flex\n left=\"50%\"\n transform=\"translateX(-50%)\"\n position=\"fixed\"\n direction=\"column\"\n alignItems=\"stretch\"\n gap={4}\n marginTop={4}\n top={HEIGHT_TOP_NAVIGATION}\n width=\"100%\"\n maxWidth={`50rem`}\n zIndex=\"notification\"\n >\n {notifications.map((notification) => {\n return (\n <Box key={notification.id} paddingLeft={4} paddingRight={4}>\n <Notification {...notification} clearNotification={clearNotification} />\n </Box>\n );\n })}\n </Flex>\n {children}\n </NotificationsContext.Provider>\n );\n};\n\ninterface NotificationProps extends Notification {\n clearNotification: (id: number) => void;\n}\n\nconst Notification = ({\n clearNotification,\n blockTransition = false,\n id,\n link,\n message,\n onClose,\n timeout = 2500,\n title,\n type,\n}: NotificationProps) => {\n const { formatMessage } = useIntl();\n /**\n * Chances are `onClose` won't be classed as stabilised,\n * so we use `useCallbackRef` to avoid make it stable.\n */\n const onCloseCallback = useCallbackRef(onClose);\n\n const handleClose = React.useCallback(() => {\n onCloseCallback();\n\n clearNotification(id);\n }, [clearNotification, id, onCloseCallback]);\n\n // eslint-disable-next-line consistent-return\n React.useEffect(() => {\n if (!blockTransition) {\n const timeoutReference = setTimeout(() => {\n handleClose();\n }, timeout);\n\n return () => {\n clearTimeout(timeoutReference);\n };\n }\n }, [blockTransition, handleClose, timeout]);\n\n const getVariant = (): AlertVariant => {\n switch (type) {\n case 'info':\n return 'default';\n case 'danger':\n return 'danger';\n case 'warning':\n return 'warning';\n default:\n return 'success';\n }\n };\n\n return (\n <Alert\n action={\n link ? (\n <Link href={link.url} isExternal>\n {link.label}\n </Link>\n ) : undefined\n }\n onClose={handleClose}\n closeLabel={formatMessage({\n id: 'global.close',\n defaultMessage: 'Close',\n })}\n title={title}\n variant={getVariant()}\n >\n {message}\n </Alert>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Hook\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * @preserve\n * @description Returns an object to interact with the notification\n * system. The callbacks are wrapped in `useCallback` for a stable\n * identity.\n *\n * @example\n * ```tsx\n * import { useNotification } from '@strapi/strapi/admin';\n *\n * const MyComponent = () => {\n * const { toggleNotification } = useNotification();\n *\n * return <button onClick={() => toggleNotification({ message: 'Hello world!' })}>Click me</button>;\n */\nconst useNotification = () => React.useContext(NotificationsContext);\n\nexport { NotificationsProvider, useNotification };\nexport type { NotificationConfig, NotificationsContextValue };\n"],"names":["NotificationsContext","React","createContext","toggleNotification","NotificationsProvider","children","notificationIdRef","useRef","notifications","setNotifications","useState","useCallback","type","message","link","timeout","blockTransition","onClose","title","s","id","current","clearNotification","filter","n","value","useMemo","_jsxs","Provider","_jsx","Flex","left","transform","position","direction","alignItems","gap","marginTop","top","HEIGHT_TOP_NAVIGATION","width","maxWidth","zIndex","map","notification","Box","paddingLeft","paddingRight","Notification","formatMessage","useIntl","onCloseCallback","useCallbackRef","handleClose","useEffect","timeoutReference","setTimeout","clearTimeout","getVariant","Alert","action","Link","href","url","isExternal","label","undefined","closeLabel","defaultMessage","variant","useNotification","useContext"],"mappings":";;;;;;AAkCA,MAAMA,oBAAAA,iBAAuBC,KAAMC,CAAAA,aAAa,CAA4B;AAC1EC,IAAAA,kBAAAA,EAAoB,IAAO;AAC7B,CAAA,CAAA;AAaA;;;AAGC,IACKC,MAAAA,qBAAAA,GAAwB,CAAC,EAAEC,QAAQ,EAA8B,GAAA;IACrE,MAAMC,iBAAAA,GAAoBL,KAAMM,CAAAA,MAAM,CAAC,CAAA,CAAA;AAEvC,IAAA,MAAM,CAACC,aAAeC,EAAAA,gBAAAA,CAAiB,GAAGR,KAAMS,CAAAA,QAAQ,CAAiB,EAAE,CAAA;AAE3E,IAAA,MAAMP,qBAAqBF,KAAMU,CAAAA,WAAW,CAC1C,CAAC,EAAEC,IAAI,EAAEC,OAAO,EAAEC,IAAI,EAAEC,OAAO,EAAEC,eAAe,EAAEC,OAAO,EAAEC,KAAK,EAAsB,GAAA;AACpFT,QAAAA,gBAAAA,CAAiB,CAACU,CAAM,GAAA;AACnBA,gBAAAA,GAAAA,CAAAA;AACH,gBAAA;AACEC,oBAAAA,EAAAA,EAAId,kBAAkBe,OAAO,EAAA;AAC7BT,oBAAAA,IAAAA;AACAC,oBAAAA,OAAAA;AACAC,oBAAAA,IAAAA;AACAC,oBAAAA,OAAAA;AACAC,oBAAAA,eAAAA;AACAC,oBAAAA,OAAAA;AACAC,oBAAAA;AACF;AACD,aAAA,CAAA;AACH,KAAA,EACA,EAAE,CAAA;AAGJ,IAAA,MAAMI,iBAAoBrB,GAAAA,KAAAA,CAAMU,WAAW,CAAC,CAACS,EAAAA,GAAAA;QAC3CX,gBAAiB,CAAA,CAACU,IAAMA,CAAEI,CAAAA,MAAM,CAAC,CAACC,CAAAA,GAAMA,CAAEJ,CAAAA,EAAE,KAAKA,EAAAA,CAAAA,CAAAA;AACnD,KAAA,EAAG,EAAE,CAAA;AAEL,IAAA,MAAMK,KAAQxB,GAAAA,KAAAA,CAAMyB,OAAO,CAAC,KAAO;AAAEvB,YAAAA;AAAmB,SAAA,CAAI,EAAA;AAACA,QAAAA;AAAmB,KAAA,CAAA;IAEhF,qBACEwB,IAAA,CAAC3B,qBAAqB4B,QAAQ,EAAA;QAACH,KAAOA,EAAAA,KAAAA;;0BACpCI,GAACC,CAAAA,IAAAA,EAAAA;gBACCC,IAAK,EAAA,KAAA;gBACLC,SAAU,EAAA,kBAAA;gBACVC,QAAS,EAAA,OAAA;gBACTC,SAAU,EAAA,QAAA;gBACVC,UAAW,EAAA,SAAA;gBACXC,GAAK,EAAA,CAAA;gBACLC,SAAW,EAAA,CAAA;gBACXC,GAAKC,EAAAA,qBAAAA;gBACLC,KAAM,EAAA,MAAA;gBACNC,QAAU,EAAA,CAAC,KAAK,CAAC;gBACjBC,MAAO,EAAA,cAAA;0BAENlC,aAAcmC,CAAAA,GAAG,CAAC,CAACC,YAAAA,GAAAA;AAClB,oBAAA,qBACEf,GAACgB,CAAAA,GAAAA,EAAAA;wBAA0BC,WAAa,EAAA,CAAA;wBAAGC,YAAc,EAAA,CAAA;AACvD,wBAAA,QAAA,gBAAAlB,GAACmB,CAAAA,YAAAA,EAAAA;AAAc,4BAAA,GAAGJ,YAAY;4BAAEtB,iBAAmBA,EAAAA;;AAD3CsB,qBAAAA,EAAAA,YAAAA,CAAaxB,EAAE,CAAA;AAI7B,iBAAA;;AAEDf,YAAAA;;;AAGP;AAMA,MAAM2C,YAAAA,GAAe,CAAC,EACpB1B,iBAAiB,EACjBN,eAAkB,GAAA,KAAK,EACvBI,EAAE,EACFN,IAAI,EACJD,OAAO,EACPI,OAAO,EACPF,OAAAA,GAAU,IAAI,EACdG,KAAK,EACLN,IAAI,EACc,GAAA;IAClB,MAAM,EAAEqC,aAAa,EAAE,GAAGC,OAAAA,EAAAA;AAC1B;;;MAIA,MAAMC,kBAAkBC,cAAenC,CAAAA,OAAAA,CAAAA;IAEvC,MAAMoC,WAAAA,GAAcpD,KAAMU,CAAAA,WAAW,CAAC,IAAA;AACpCwC,QAAAA,eAAAA,EAAAA;QAEA7B,iBAAkBF,CAAAA,EAAAA,CAAAA;KACjB,EAAA;AAACE,QAAAA,iBAAAA;AAAmBF,QAAAA,EAAAA;AAAI+B,QAAAA;AAAgB,KAAA,CAAA;;AAG3ClD,IAAAA,KAAAA,CAAMqD,SAAS,CAAC,IAAA;AACd,QAAA,IAAI,CAACtC,eAAiB,EAAA;AACpB,YAAA,MAAMuC,mBAAmBC,UAAW,CAAA,IAAA;AAClCH,gBAAAA,WAAAA,EAAAA;aACCtC,EAAAA,OAAAA,CAAAA;YAEH,OAAO,IAAA;gBACL0C,YAAaF,CAAAA,gBAAAA,CAAAA;AACf,aAAA;AACF;KACC,EAAA;AAACvC,QAAAA,eAAAA;AAAiBqC,QAAAA,WAAAA;AAAatC,QAAAA;AAAQ,KAAA,CAAA;AAE1C,IAAA,MAAM2C,UAAa,GAAA,IAAA;QACjB,OAAQ9C,IAAAA;YACN,KAAK,MAAA;gBACH,OAAO,SAAA;YACT,KAAK,QAAA;gBACH,OAAO,QAAA;YACT,KAAK,SAAA;gBACH,OAAO,SAAA;AACT,YAAA;gBACE,OAAO,SAAA;AACX;AACF,KAAA;AAEA,IAAA,qBACEiB,GAAC8B,CAAAA,KAAAA,EAAAA;AACCC,QAAAA,MAAAA,EACE9C,qBACEe,GAACgC,CAAAA,IAAAA,EAAAA;AAAKC,YAAAA,IAAAA,EAAMhD,KAAKiD,GAAG;YAAEC,UAAU,EAAA,IAAA;AAC7BlD,YAAAA,QAAAA,EAAAA,IAAAA,CAAKmD;AAENC,SAAAA,CAAAA,GAAAA,SAAAA;QAENjD,OAASoC,EAAAA,WAAAA;AACTc,QAAAA,UAAAA,EAAYlB,aAAc,CAAA;YACxB7B,EAAI,EAAA,cAAA;YACJgD,cAAgB,EAAA;AAClB,SAAA,CAAA;QACAlD,KAAOA,EAAAA,KAAAA;QACPmD,OAASX,EAAAA,UAAAA,EAAAA;AAER7C,QAAAA,QAAAA,EAAAA;;AAGP,CAAA;AAEA;;;;;;;;;;;;;;;;AAkBC,IACKyD,MAAAA,eAAAA,GAAkB,IAAMrE,KAAAA,CAAMsE,UAAU,CAACvE,oBAAAA;;;;"}
@@ -3,6 +3,7 @@
3
3
  var jsxRuntime = require('react/jsx-runtime');
4
4
  var React = require('react');
5
5
  var axios = require('axios');
6
+ var useDeviceType = require('../hooks/useDeviceType.js');
6
7
  var admin = require('../services/admin.js');
7
8
  var AppInfo = require('./AppInfo.js');
8
9
  var Auth = require('./Auth.js');
@@ -101,6 +102,7 @@ const TrackingProvider = ({ children })=>{
101
102
  * }
102
103
  * ```
103
104
  */ const useTracking = ()=>{
105
+ const deviceType = useDeviceType.useDeviceType();
104
106
  const { uuid, telemetryProperties } = React__namespace.useContext(TrackingContext);
105
107
  const userId = AppInfo.useAppInfo('useTracking', (state)=>state.userId);
106
108
  const trackUsage = React__namespace.useCallback(async (event, properties)=>{
@@ -112,11 +114,14 @@ const TrackingProvider = ({ children })=>{
112
114
  eventProperties: {
113
115
  ...properties
114
116
  },
115
- userProperties: {},
117
+ userProperties: {
118
+ deviceType
119
+ },
116
120
  groupProperties: {
117
121
  ...telemetryProperties,
118
122
  projectId: uuid,
119
- projectType: window.strapi.projectType
123
+ projectType: window.strapi.projectType,
124
+ aiLicenseKey: window.strapi.aiLicenseKey
120
125
  }
121
126
  }, {
122
127
  headers: {
@@ -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 { 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 | 'didLaunchGuidedtour';\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 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 | 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 { 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 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","useContext","useAppInfo","trackUsage","useCallback","properties","window","strapi","telemetryDisabled","res","axios","post","eventProperties","userProperties","projectType","err"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyBA;;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,CAAC,EAAEC,OAAAA,CAAQC,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;AA+YA;;;;;;;;;;;;;;;;;AAiBC,UACKsC,WAAc,GAAA,IAAA;IAClB,MAAM,EAAExC,IAAI,EAAEqC,mBAAmB,EAAE,GAAGvC,gBAAAA,CAAM2C,UAAU,CAAC5C,eAAAA,CAAAA;AACvD,IAAA,MAAM6B,SAASgB,kBAAW,CAAA,aAAA,EAAe,CAACrC,KAAAA,GAAUA,MAAMqB,MAAM,CAAA;AAChE,IAAA,MAAMiB,UAAa7C,GAAAA,gBAAAA,CAAM8C,WAAW,CAClC,OACE3B,KACA4B,EAAAA,UAAAA,GAAAA;QAEA,IAAI;AACF,YAAA,IAAI7C,QAAQ,CAAC8C,MAAAA,CAAOC,MAAM,CAACC,iBAAiB,EAAE;AAC5C,gBAAA,MAAMC,GAAM,GAAA,MAAMC,KAAMC,CAAAA,IAAI,CAC1B,CAAC,EAAEhC,OAAQC,CAAAA,GAAG,CAACC,oBAAoB,IAAI,6BAA8B,CAAA,aAAa,CAAC,EACnF;AACEJ,oBAAAA,KAAAA;AACAS,oBAAAA,MAAAA;oBACA0B,eAAiB,EAAA;AAAE,wBAAA,GAAGP;AAAW,qBAAA;AACjCQ,oBAAAA,cAAAA,EAAgB,EAAC;oBACjBzB,eAAiB,EAAA;AACf,wBAAA,GAAGS,mBAAmB;wBACtBR,SAAW7B,EAAAA,IAAAA;wBACXsD,WAAaR,EAAAA,MAAAA,CAAOC,MAAM,CAACO;AAC7B;iBAEF,EAAA;oBACEpB,OAAS,EAAA;wBACP,cAAgB,EAAA,kBAAA;wBAChB,gBAAkBjB,EAAAA;AACpB;AACF,iBAAA,CAAA;gBAGF,OAAOgC,GAAAA;AACT;AACF,SAAA,CAAE,OAAOM,GAAK,EAAA;;AAEd;QAEA,OAAO,IAAA;KAET,EAAA;AAAClB,QAAAA,mBAAAA;AAAqBX,QAAAA,MAAAA;AAAQ1B,QAAAA;AAAK,KAAA,CAAA;IAGrC,OAAO;AAAE2C,QAAAA;AAAW,KAAA;AACtB;;;;;"}
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 aiLicenseKey?: string;\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 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 aiLicenseKey: window.strapi.aiLicenseKey,\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","aiLicenseKey","err"],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import { jsx } from 'react/jsx-runtime';
2
2
  import * as React from 'react';
3
3
  import axios from 'axios';
4
+ import { useDeviceType } from '../hooks/useDeviceType.mjs';
4
5
  import { useInitQuery, useTelemetryPropertiesQuery } from '../services/admin.mjs';
5
6
  import { useAppInfo } from './AppInfo.mjs';
6
7
  import { useAuth } from './Auth.mjs';
@@ -80,6 +81,7 @@ const TrackingProvider = ({ children })=>{
80
81
  * }
81
82
  * ```
82
83
  */ const useTracking = ()=>{
84
+ const deviceType = useDeviceType();
83
85
  const { uuid, telemetryProperties } = React.useContext(TrackingContext);
84
86
  const userId = useAppInfo('useTracking', (state)=>state.userId);
85
87
  const trackUsage = React.useCallback(async (event, properties)=>{
@@ -91,11 +93,14 @@ const TrackingProvider = ({ children })=>{
91
93
  eventProperties: {
92
94
  ...properties
93
95
  },
94
- userProperties: {},
96
+ userProperties: {
97
+ deviceType
98
+ },
95
99
  groupProperties: {
96
100
  ...telemetryProperties,
97
101
  projectId: uuid,
98
- projectType: window.strapi.projectType
102
+ projectType: window.strapi.projectType,
103
+ aiLicenseKey: window.strapi.aiLicenseKey
99
104
  }
100
105
  }, {
101
106
  headers: {
@@ -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 { 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 | 'didLaunchGuidedtour';\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 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 | 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 { 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 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","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 aiLicenseKey?: string;\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 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 aiLicenseKey: window.strapi.aiLicenseKey,\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","aiLicenseKey","err"],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * @internal
5
+ * @description Checks if the AI feature is enabled.
6
+ */ const useAIAvailability = ()=>{
7
+ const isAiEnabled = window.strapi.ai?.enabled !== false;
8
+ const isEE = window.strapi?.isEE;
9
+ return !!isEE && isAiEnabled;
10
+ };
11
+
12
+ exports.useAIAvailability = useAIAvailability;
13
+ //# sourceMappingURL=useAIAvailability.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAIAvailability.js","sources":["../../../../../admin/src/hooks/useAIAvailability.ts"],"sourcesContent":["/**\n * @internal\n * @description Checks if the AI feature is enabled.\n */\nexport const useAIAvailability = (): boolean => {\n const isAiEnabled = window.strapi.ai?.enabled !== false;\n const isEE = window.strapi?.isEE;\n\n return !!isEE && isAiEnabled;\n};\n"],"names":["useAIAvailability","isAiEnabled","window","strapi","ai","enabled","isEE"],"mappings":";;AAAA;;;UAIaA,iBAAoB,GAAA,IAAA;AAC/B,IAAA,MAAMC,cAAcC,MAAOC,CAAAA,MAAM,CAACC,EAAE,EAAEC,OAAY,KAAA,KAAA;IAClD,MAAMC,IAAAA,GAAOJ,MAAOC,CAAAA,MAAM,EAAEG,IAAAA;IAE5B,OAAO,CAAC,CAACA,IAAQL,IAAAA,WAAAA;AACnB;;;;"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * @internal
3
+ * @description Checks if the AI feature is enabled.
4
+ */ const useAIAvailability = ()=>{
5
+ const isAiEnabled = window.strapi.ai?.enabled !== false;
6
+ const isEE = window.strapi?.isEE;
7
+ return !!isEE && isAiEnabled;
8
+ };
9
+
10
+ export { useAIAvailability };
11
+ //# sourceMappingURL=useAIAvailability.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAIAvailability.mjs","sources":["../../../../../admin/src/hooks/useAIAvailability.ts"],"sourcesContent":["/**\n * @internal\n * @description Checks if the AI feature is enabled.\n */\nexport const useAIAvailability = (): boolean => {\n const isAiEnabled = window.strapi.ai?.enabled !== false;\n const isEE = window.strapi?.isEE;\n\n return !!isEE && isAiEnabled;\n};\n"],"names":["useAIAvailability","isAiEnabled","window","strapi","ai","enabled","isEE"],"mappings":"AAAA;;;UAIaA,iBAAoB,GAAA,IAAA;AAC/B,IAAA,MAAMC,cAAcC,MAAOC,CAAAA,MAAM,CAACC,EAAE,EAAEC,OAAY,KAAA,KAAA;IAClD,MAAMC,IAAAA,GAAOJ,MAAOC,CAAAA,MAAM,EAAEG,IAAAA;IAE5B,OAAO,CAAC,CAACA,IAAQL,IAAAA,WAAAA;AACnB;;;;"}
@@ -0,0 +1,43 @@
1
+ 'use strict';
2
+
3
+ var React = require('react');
4
+
5
+ function _interopNamespaceDefault(e) {
6
+ var n = Object.create(null);
7
+ if (e) {
8
+ Object.keys(e).forEach(function (k) {
9
+ if (k !== 'default') {
10
+ var d = Object.getOwnPropertyDescriptor(e, k);
11
+ Object.defineProperty(n, k, d.get ? d : {
12
+ enumerable: true,
13
+ get: function () { return e[k]; }
14
+ });
15
+ }
16
+ });
17
+ }
18
+ n.default = e;
19
+ return Object.freeze(n);
20
+ }
21
+
22
+ var React__namespace = /*#__PURE__*/_interopNamespaceDefault(React);
23
+
24
+ /**
25
+ * Hook to detect the device type used by the user
26
+ * @returns {DeviceType} The device type
27
+ */ function useDeviceType() {
28
+ const [deviceType, setDeviceType] = React__namespace.useState('desktop');
29
+ React__namespace.useEffect(()=>{
30
+ const userAgent = navigator.userAgent.toLowerCase();
31
+ if (/mobile|iphone|ipod|android.*mobile|windows phone/.test(userAgent)) {
32
+ setDeviceType('mobile');
33
+ } else if (/ipad|tablet|android(?!.*mobile)/.test(userAgent)) {
34
+ setDeviceType('tablet');
35
+ } else {
36
+ setDeviceType('desktop');
37
+ }
38
+ }, []);
39
+ return deviceType;
40
+ }
41
+
42
+ exports.useDeviceType = useDeviceType;
43
+ //# sourceMappingURL=useDeviceType.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useDeviceType.js","sources":["../../../../../admin/src/hooks/useDeviceType.ts"],"sourcesContent":["import * as React from 'react';\n\nexport type DeviceType = 'mobile' | 'tablet' | 'desktop';\n\n/**\n * Hook to detect the device type used by the user\n * @returns {DeviceType} The device type\n */\nexport function useDeviceType(): DeviceType {\n const [deviceType, setDeviceType] = React.useState<DeviceType>('desktop');\n\n React.useEffect(() => {\n const userAgent = navigator.userAgent.toLowerCase();\n\n if (/mobile|iphone|ipod|android.*mobile|windows phone/.test(userAgent)) {\n setDeviceType('mobile');\n } else if (/ipad|tablet|android(?!.*mobile)/.test(userAgent)) {\n setDeviceType('tablet');\n } else {\n setDeviceType('desktop');\n }\n }, []);\n\n return deviceType;\n}\n"],"names":["useDeviceType","deviceType","setDeviceType","React","useState","useEffect","userAgent","navigator","toLowerCase","test"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAIA;;;AAGC,IACM,SAASA,aAAAA,GAAAA;AACd,IAAA,MAAM,CAACC,UAAYC,EAAAA,aAAAA,CAAc,GAAGC,gBAAAA,CAAMC,QAAQ,CAAa,SAAA,CAAA;AAE/DD,IAAAA,gBAAAA,CAAME,SAAS,CAAC,IAAA;AACd,QAAA,MAAMC,SAAYC,GAAAA,SAAAA,CAAUD,SAAS,CAACE,WAAW,EAAA;QAEjD,IAAI,kDAAA,CAAmDC,IAAI,CAACH,SAAY,CAAA,EAAA;YACtEJ,aAAc,CAAA,QAAA,CAAA;AAChB,SAAA,MAAO,IAAI,iCAAA,CAAkCO,IAAI,CAACH,SAAY,CAAA,EAAA;YAC5DJ,aAAc,CAAA,QAAA,CAAA;SACT,MAAA;YACLA,aAAc,CAAA,SAAA,CAAA;AAChB;AACF,KAAA,EAAG,EAAE,CAAA;IAEL,OAAOD,UAAAA;AACT;;;;"}
@@ -0,0 +1,22 @@
1
+ import * as React from 'react';
2
+
3
+ /**
4
+ * Hook to detect the device type used by the user
5
+ * @returns {DeviceType} The device type
6
+ */ function useDeviceType() {
7
+ const [deviceType, setDeviceType] = React.useState('desktop');
8
+ React.useEffect(()=>{
9
+ const userAgent = navigator.userAgent.toLowerCase();
10
+ if (/mobile|iphone|ipod|android.*mobile|windows phone/.test(userAgent)) {
11
+ setDeviceType('mobile');
12
+ } else if (/ipad|tablet|android(?!.*mobile)/.test(userAgent)) {
13
+ setDeviceType('tablet');
14
+ } else {
15
+ setDeviceType('desktop');
16
+ }
17
+ }, []);
18
+ return deviceType;
19
+ }
20
+
21
+ export { useDeviceType };
22
+ //# sourceMappingURL=useDeviceType.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useDeviceType.mjs","sources":["../../../../../admin/src/hooks/useDeviceType.ts"],"sourcesContent":["import * as React from 'react';\n\nexport type DeviceType = 'mobile' | 'tablet' | 'desktop';\n\n/**\n * Hook to detect the device type used by the user\n * @returns {DeviceType} The device type\n */\nexport function useDeviceType(): DeviceType {\n const [deviceType, setDeviceType] = React.useState<DeviceType>('desktop');\n\n React.useEffect(() => {\n const userAgent = navigator.userAgent.toLowerCase();\n\n if (/mobile|iphone|ipod|android.*mobile|windows phone/.test(userAgent)) {\n setDeviceType('mobile');\n } else if (/ipad|tablet|android(?!.*mobile)/.test(userAgent)) {\n setDeviceType('tablet');\n } else {\n setDeviceType('desktop');\n }\n }, []);\n\n return deviceType;\n}\n"],"names":["useDeviceType","deviceType","setDeviceType","React","useState","useEffect","userAgent","navigator","toLowerCase","test"],"mappings":";;AAIA;;;AAGC,IACM,SAASA,aAAAA,GAAAA;AACd,IAAA,MAAM,CAACC,UAAYC,EAAAA,aAAAA,CAAc,GAAGC,KAAAA,CAAMC,QAAQ,CAAa,SAAA,CAAA;AAE/DD,IAAAA,KAAAA,CAAME,SAAS,CAAC,IAAA;AACd,QAAA,MAAMC,SAAYC,GAAAA,SAAAA,CAAUD,SAAS,CAACE,WAAW,EAAA;QAEjD,IAAI,kDAAA,CAAmDC,IAAI,CAACH,SAAY,CAAA,EAAA;YACtEJ,aAAc,CAAA,QAAA,CAAA;AAChB,SAAA,MAAO,IAAI,iCAAA,CAAkCO,IAAI,CAACH,SAAY,CAAA,EAAA;YAC5DJ,aAAc,CAAA,QAAA,CAAA;SACT,MAAA;YACLA,aAAc,CAAA,SAAA,CAAA;AAChB;AACF,KAAA,EAAG,EAAE,CAAA;IAEL,OAAOD,UAAAA;AACT;;;;"}
@@ -0,0 +1,70 @@
1
+ 'use strict';
2
+
3
+ var React = require('react');
4
+ var styled = require('styled-components');
5
+
6
+ function _interopNamespaceDefault(e) {
7
+ var n = Object.create(null);
8
+ if (e) {
9
+ Object.keys(e).forEach(function (k) {
10
+ if (k !== 'default') {
11
+ var d = Object.getOwnPropertyDescriptor(e, k);
12
+ Object.defineProperty(n, k, d.get ? d : {
13
+ enumerable: true,
14
+ get: function () { return e[k]; }
15
+ });
16
+ }
17
+ });
18
+ }
19
+ n.default = e;
20
+ return Object.freeze(n);
21
+ }
22
+
23
+ var React__namespace = /*#__PURE__*/_interopNamespaceDefault(React);
24
+
25
+ /**
26
+ * Hook to detect if a media query matches
27
+ * @param query - Media query string (e.g., '(min-width: 768px)' or theme.breakpoints.large)
28
+ * @returns boolean indicating if the media query matches
29
+ */ const useMediaQuery = (query)=>{
30
+ const cleanQuery = query.replace('@media', '').trim();
31
+ const [matches, setMatches] = React__namespace.useState(()=>window.matchMedia(cleanQuery).matches);
32
+ React__namespace.useEffect(()=>{
33
+ const mediaQuery = window.matchMedia(cleanQuery);
34
+ const handler = (e)=>setMatches(e.matches);
35
+ mediaQuery.addEventListener('change', handler);
36
+ return ()=>mediaQuery.removeEventListener('change', handler);
37
+ }, [
38
+ cleanQuery
39
+ ]);
40
+ return matches;
41
+ };
42
+ /**
43
+ * Hook to detect if the current viewport is desktop size
44
+ * Uses the theme's large breakpoint
45
+ */ const useIsDesktop = ()=>{
46
+ const theme = styled.useTheme();
47
+ return useMediaQuery(theme.breakpoints.large);
48
+ };
49
+ /**
50
+ * Hook to detect if the current viewport is tablet size
51
+ * Uses the theme's medium breakpoint
52
+ */ const useIsTablet = ()=>{
53
+ const theme = styled.useTheme();
54
+ const isTabletOrAbove = useMediaQuery(theme.breakpoints.medium);
55
+ const isDesktop = useMediaQuery(theme.breakpoints.large);
56
+ return isTabletOrAbove && !isDesktop;
57
+ };
58
+ /**
59
+ * Hook to detect if the current viewport is mobile size
60
+ * Uses the theme's medium breakpoint (inverted)
61
+ */ const useIsMobile = ()=>{
62
+ const theme = styled.useTheme();
63
+ return !useMediaQuery(theme.breakpoints.medium);
64
+ };
65
+
66
+ exports.useIsDesktop = useIsDesktop;
67
+ exports.useIsMobile = useIsMobile;
68
+ exports.useIsTablet = useIsTablet;
69
+ exports.useMediaQuery = useMediaQuery;
70
+ //# sourceMappingURL=useMediaQuery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useMediaQuery.js","sources":["../../../../../admin/src/hooks/useMediaQuery.ts"],"sourcesContent":["import * as React from 'react';\n\nimport { useTheme } from 'styled-components';\n\n/**\n * Hook to detect if a media query matches\n * @param query - Media query string (e.g., '(min-width: 768px)' or theme.breakpoints.large)\n * @returns boolean indicating if the media query matches\n */\nexport const useMediaQuery = (query: string): boolean => {\n const cleanQuery = query.replace('@media', '').trim();\n\n const [matches, setMatches] = React.useState(() => window.matchMedia(cleanQuery).matches);\n\n React.useEffect(() => {\n const mediaQuery = window.matchMedia(cleanQuery);\n const handler = (e: MediaQueryListEvent) => setMatches(e.matches);\n\n mediaQuery.addEventListener('change', handler);\n\n return () => mediaQuery.removeEventListener('change', handler);\n }, [cleanQuery]);\n\n return matches;\n};\n\n/**\n * Hook to detect if the current viewport is desktop size\n * Uses the theme's large breakpoint\n */\nexport const useIsDesktop = (): boolean => {\n const theme = useTheme();\n return useMediaQuery(theme.breakpoints.large);\n};\n\n/**\n * Hook to detect if the current viewport is tablet size\n * Uses the theme's medium breakpoint\n */\nexport const useIsTablet = (): boolean => {\n const theme = useTheme();\n const isTabletOrAbove = useMediaQuery(theme.breakpoints.medium);\n const isDesktop = useMediaQuery(theme.breakpoints.large);\n return isTabletOrAbove && !isDesktop;\n};\n\n/**\n * Hook to detect if the current viewport is mobile size\n * Uses the theme's medium breakpoint (inverted)\n */\nexport const useIsMobile = (): boolean => {\n const theme = useTheme();\n return !useMediaQuery(theme.breakpoints.medium);\n};\n"],"names":["useMediaQuery","query","cleanQuery","replace","trim","matches","setMatches","React","useState","window","matchMedia","useEffect","mediaQuery","handler","e","addEventListener","removeEventListener","useIsDesktop","theme","useTheme","breakpoints","large","useIsTablet","isTabletOrAbove","medium","isDesktop","useIsMobile"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAIA;;;;IAKaA,MAAAA,aAAAA,GAAgB,CAACC,KAAAA,GAAAA;AAC5B,IAAA,MAAMC,aAAaD,KAAME,CAAAA,OAAO,CAAC,QAAA,EAAU,IAAIC,IAAI,EAAA;AAEnD,IAAA,MAAM,CAACC,OAAAA,EAASC,UAAW,CAAA,GAAGC,gBAAMC,CAAAA,QAAQ,CAAC,IAAMC,MAAOC,CAAAA,UAAU,CAACR,UAAAA,CAAAA,CAAYG,OAAO,CAAA;AAExFE,IAAAA,gBAAAA,CAAMI,SAAS,CAAC,IAAA;QACd,MAAMC,UAAAA,GAAaH,MAAOC,CAAAA,UAAU,CAACR,UAAAA,CAAAA;AACrC,QAAA,MAAMW,OAAU,GAAA,CAACC,CAA2BR,GAAAA,UAAAA,CAAWQ,EAAET,OAAO,CAAA;QAEhEO,UAAWG,CAAAA,gBAAgB,CAAC,QAAUF,EAAAA,OAAAA,CAAAA;AAEtC,QAAA,OAAO,IAAMD,UAAAA,CAAWI,mBAAmB,CAAC,QAAUH,EAAAA,OAAAA,CAAAA;KACrD,EAAA;AAACX,QAAAA;AAAW,KAAA,CAAA;IAEf,OAAOG,OAAAA;AACT;AAEA;;;UAIaY,YAAe,GAAA,IAAA;AAC1B,IAAA,MAAMC,KAAQC,GAAAA,eAAAA,EAAAA;AACd,IAAA,OAAOnB,aAAckB,CAAAA,KAAAA,CAAME,WAAW,CAACC,KAAK,CAAA;AAC9C;AAEA;;;UAIaC,WAAc,GAAA,IAAA;AACzB,IAAA,MAAMJ,KAAQC,GAAAA,eAAAA,EAAAA;AACd,IAAA,MAAMI,eAAkBvB,GAAAA,aAAAA,CAAckB,KAAME,CAAAA,WAAW,CAACI,MAAM,CAAA;AAC9D,IAAA,MAAMC,SAAYzB,GAAAA,aAAAA,CAAckB,KAAME,CAAAA,WAAW,CAACC,KAAK,CAAA;AACvD,IAAA,OAAOE,mBAAmB,CAACE,SAAAA;AAC7B;AAEA;;;UAIaC,WAAc,GAAA,IAAA;AACzB,IAAA,MAAMR,KAAQC,GAAAA,eAAAA,EAAAA;AACd,IAAA,OAAO,CAACnB,aAAAA,CAAckB,KAAME,CAAAA,WAAW,CAACI,MAAM,CAAA;AAChD;;;;;;;"}
@@ -0,0 +1,46 @@
1
+ import * as React from 'react';
2
+ import { useTheme } from 'styled-components';
3
+
4
+ /**
5
+ * Hook to detect if a media query matches
6
+ * @param query - Media query string (e.g., '(min-width: 768px)' or theme.breakpoints.large)
7
+ * @returns boolean indicating if the media query matches
8
+ */ const useMediaQuery = (query)=>{
9
+ const cleanQuery = query.replace('@media', '').trim();
10
+ const [matches, setMatches] = React.useState(()=>window.matchMedia(cleanQuery).matches);
11
+ React.useEffect(()=>{
12
+ const mediaQuery = window.matchMedia(cleanQuery);
13
+ const handler = (e)=>setMatches(e.matches);
14
+ mediaQuery.addEventListener('change', handler);
15
+ return ()=>mediaQuery.removeEventListener('change', handler);
16
+ }, [
17
+ cleanQuery
18
+ ]);
19
+ return matches;
20
+ };
21
+ /**
22
+ * Hook to detect if the current viewport is desktop size
23
+ * Uses the theme's large breakpoint
24
+ */ const useIsDesktop = ()=>{
25
+ const theme = useTheme();
26
+ return useMediaQuery(theme.breakpoints.large);
27
+ };
28
+ /**
29
+ * Hook to detect if the current viewport is tablet size
30
+ * Uses the theme's medium breakpoint
31
+ */ const useIsTablet = ()=>{
32
+ const theme = useTheme();
33
+ const isTabletOrAbove = useMediaQuery(theme.breakpoints.medium);
34
+ const isDesktop = useMediaQuery(theme.breakpoints.large);
35
+ return isTabletOrAbove && !isDesktop;
36
+ };
37
+ /**
38
+ * Hook to detect if the current viewport is mobile size
39
+ * Uses the theme's medium breakpoint (inverted)
40
+ */ const useIsMobile = ()=>{
41
+ const theme = useTheme();
42
+ return !useMediaQuery(theme.breakpoints.medium);
43
+ };
44
+
45
+ export { useIsDesktop, useIsMobile, useIsTablet, useMediaQuery };
46
+ //# sourceMappingURL=useMediaQuery.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useMediaQuery.mjs","sources":["../../../../../admin/src/hooks/useMediaQuery.ts"],"sourcesContent":["import * as React from 'react';\n\nimport { useTheme } from 'styled-components';\n\n/**\n * Hook to detect if a media query matches\n * @param query - Media query string (e.g., '(min-width: 768px)' or theme.breakpoints.large)\n * @returns boolean indicating if the media query matches\n */\nexport const useMediaQuery = (query: string): boolean => {\n const cleanQuery = query.replace('@media', '').trim();\n\n const [matches, setMatches] = React.useState(() => window.matchMedia(cleanQuery).matches);\n\n React.useEffect(() => {\n const mediaQuery = window.matchMedia(cleanQuery);\n const handler = (e: MediaQueryListEvent) => setMatches(e.matches);\n\n mediaQuery.addEventListener('change', handler);\n\n return () => mediaQuery.removeEventListener('change', handler);\n }, [cleanQuery]);\n\n return matches;\n};\n\n/**\n * Hook to detect if the current viewport is desktop size\n * Uses the theme's large breakpoint\n */\nexport const useIsDesktop = (): boolean => {\n const theme = useTheme();\n return useMediaQuery(theme.breakpoints.large);\n};\n\n/**\n * Hook to detect if the current viewport is tablet size\n * Uses the theme's medium breakpoint\n */\nexport const useIsTablet = (): boolean => {\n const theme = useTheme();\n const isTabletOrAbove = useMediaQuery(theme.breakpoints.medium);\n const isDesktop = useMediaQuery(theme.breakpoints.large);\n return isTabletOrAbove && !isDesktop;\n};\n\n/**\n * Hook to detect if the current viewport is mobile size\n * Uses the theme's medium breakpoint (inverted)\n */\nexport const useIsMobile = (): boolean => {\n const theme = useTheme();\n return !useMediaQuery(theme.breakpoints.medium);\n};\n"],"names":["useMediaQuery","query","cleanQuery","replace","trim","matches","setMatches","React","useState","window","matchMedia","useEffect","mediaQuery","handler","e","addEventListener","removeEventListener","useIsDesktop","theme","useTheme","breakpoints","large","useIsTablet","isTabletOrAbove","medium","isDesktop","useIsMobile"],"mappings":";;;AAIA;;;;IAKaA,MAAAA,aAAAA,GAAgB,CAACC,KAAAA,GAAAA;AAC5B,IAAA,MAAMC,aAAaD,KAAME,CAAAA,OAAO,CAAC,QAAA,EAAU,IAAIC,IAAI,EAAA;AAEnD,IAAA,MAAM,CAACC,OAAAA,EAASC,UAAW,CAAA,GAAGC,KAAMC,CAAAA,QAAQ,CAAC,IAAMC,MAAOC,CAAAA,UAAU,CAACR,UAAAA,CAAAA,CAAYG,OAAO,CAAA;AAExFE,IAAAA,KAAAA,CAAMI,SAAS,CAAC,IAAA;QACd,MAAMC,UAAAA,GAAaH,MAAOC,CAAAA,UAAU,CAACR,UAAAA,CAAAA;AACrC,QAAA,MAAMW,OAAU,GAAA,CAACC,CAA2BR,GAAAA,UAAAA,CAAWQ,EAAET,OAAO,CAAA;QAEhEO,UAAWG,CAAAA,gBAAgB,CAAC,QAAUF,EAAAA,OAAAA,CAAAA;AAEtC,QAAA,OAAO,IAAMD,UAAAA,CAAWI,mBAAmB,CAAC,QAAUH,EAAAA,OAAAA,CAAAA;KACrD,EAAA;AAACX,QAAAA;AAAW,KAAA,CAAA;IAEf,OAAOG,OAAAA;AACT;AAEA;;;UAIaY,YAAe,GAAA,IAAA;AAC1B,IAAA,MAAMC,KAAQC,GAAAA,QAAAA,EAAAA;AACd,IAAA,OAAOnB,aAAckB,CAAAA,KAAAA,CAAME,WAAW,CAACC,KAAK,CAAA;AAC9C;AAEA;;;UAIaC,WAAc,GAAA,IAAA;AACzB,IAAA,MAAMJ,KAAQC,GAAAA,QAAAA,EAAAA;AACd,IAAA,MAAMI,eAAkBvB,GAAAA,aAAAA,CAAckB,KAAME,CAAAA,WAAW,CAACI,MAAM,CAAA;AAC9D,IAAA,MAAMC,SAAYzB,GAAAA,aAAAA,CAAckB,KAAME,CAAAA,WAAW,CAACC,KAAK,CAAA;AACvD,IAAA,OAAOE,mBAAmB,CAACE,SAAAA;AAC7B;AAEA;;;UAIaC,WAAc,GAAA,IAAA;AACzB,IAAA,MAAMR,KAAQC,GAAAA,QAAAA,EAAAA;AACd,IAAA,OAAO,CAACnB,aAAAA,CAAckB,KAAME,CAAAA,WAAW,CAACI,MAAM,CAAA;AAChD;;;;"}
@@ -67,6 +67,25 @@ const useMenu = (shouldUpdateStrapi)=>{
67
67
  }
68
68
  ],
69
69
  pluginsSectionLinks: [],
70
+ topMobileNavigation: [
71
+ {
72
+ to: '/'
73
+ },
74
+ {
75
+ to: 'content-manager'
76
+ },
77
+ {
78
+ to: 'plugins/content-releases'
79
+ },
80
+ {
81
+ to: 'plugins/upload'
82
+ }
83
+ ],
84
+ burgerMobileNavigation: [
85
+ {
86
+ to: '/settings'
87
+ }
88
+ ],
70
89
  isLoading: true
71
90
  });
72
91
  const generalSectionLinksRef = React__namespace.useRef(menuWithUserPermissions.generalSectionLinks);