@strapi/admin 5.52.3 → 5.54.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 (196) hide show
  1. package/dist/admin/admin/src/App.js +1 -1
  2. package/dist/admin/admin/src/App.js.map +1 -1
  3. package/dist/admin/admin/src/App.mjs +1 -1
  4. package/dist/admin/admin/src/App.mjs.map +1 -1
  5. package/dist/admin/admin/src/components/DismissibleBanner.js +60 -0
  6. package/dist/admin/admin/src/components/DismissibleBanner.js.map +1 -0
  7. package/dist/admin/admin/src/components/DismissibleBanner.mjs +58 -0
  8. package/dist/admin/admin/src/components/DismissibleBanner.mjs.map +1 -0
  9. package/dist/admin/admin/src/components/Form.js +11 -2
  10. package/dist/admin/admin/src/components/Form.js.map +1 -1
  11. package/dist/admin/admin/src/components/Form.mjs +11 -2
  12. package/dist/admin/admin/src/components/Form.mjs.map +1 -1
  13. package/dist/admin/admin/src/components/FormInputs/DateTime.js +1 -1
  14. package/dist/admin/admin/src/components/FormInputs/DateTime.js.map +1 -1
  15. package/dist/admin/admin/src/components/FormInputs/DateTime.mjs +1 -1
  16. package/dist/admin/admin/src/components/FormInputs/DateTime.mjs.map +1 -1
  17. package/dist/admin/admin/src/components/FormInputs/Time.js +1 -1
  18. package/dist/admin/admin/src/components/FormInputs/Time.js.map +1 -1
  19. package/dist/admin/admin/src/components/FormInputs/Time.mjs +1 -1
  20. package/dist/admin/admin/src/components/FormInputs/Time.mjs.map +1 -1
  21. package/dist/admin/admin/src/components/MainNav/NavUser.js +1 -2
  22. package/dist/admin/admin/src/components/MainNav/NavUser.js.map +1 -1
  23. package/dist/admin/admin/src/components/MainNav/NavUser.mjs +1 -2
  24. package/dist/admin/admin/src/components/MainNav/NavUser.mjs.map +1 -1
  25. package/dist/admin/admin/src/components/MediaLibraryBanner.js +85 -0
  26. package/dist/admin/admin/src/components/MediaLibraryBanner.js.map +1 -0
  27. package/dist/admin/admin/src/components/MediaLibraryBanner.mjs +83 -0
  28. package/dist/admin/admin/src/components/MediaLibraryBanner.mjs.map +1 -0
  29. package/dist/admin/admin/src/components/Providers.js +6 -6
  30. package/dist/admin/admin/src/components/Providers.js.map +1 -1
  31. package/dist/admin/admin/src/components/Providers.mjs +6 -6
  32. package/dist/admin/admin/src/components/Providers.mjs.map +1 -1
  33. package/dist/admin/admin/src/components/UpsellBanner.js +56 -86
  34. package/dist/admin/admin/src/components/UpsellBanner.js.map +1 -1
  35. package/dist/admin/admin/src/components/UpsellBanner.mjs +58 -88
  36. package/dist/admin/admin/src/components/UpsellBanner.mjs.map +1 -1
  37. package/dist/admin/admin/src/core/store/configure.js +14 -2
  38. package/dist/admin/admin/src/core/store/configure.js.map +1 -1
  39. package/dist/admin/admin/src/core/store/configure.mjs +14 -2
  40. package/dist/admin/admin/src/core/store/configure.mjs.map +1 -1
  41. package/dist/admin/admin/src/core/store/hooks.mjs +1 -1
  42. package/dist/admin/admin/src/features/Auth.js +162 -46
  43. package/dist/admin/admin/src/features/Auth.js.map +1 -1
  44. package/dist/admin/admin/src/features/Auth.mjs +164 -48
  45. package/dist/admin/admin/src/features/Auth.mjs.map +1 -1
  46. package/dist/admin/admin/src/hooks/useRegisterUnsavedChanges.js +19 -0
  47. package/dist/admin/admin/src/hooks/useRegisterUnsavedChanges.js.map +1 -0
  48. package/dist/admin/admin/src/hooks/useRegisterUnsavedChanges.mjs +17 -0
  49. package/dist/admin/admin/src/hooks/useRegisterUnsavedChanges.mjs.map +1 -0
  50. package/dist/admin/admin/src/hooks/{useIdleSessionLogout.js → useSessionKeepalive.js} +34 -27
  51. package/dist/admin/admin/src/hooks/useSessionKeepalive.js.map +1 -0
  52. package/dist/admin/admin/src/hooks/{useIdleSessionLogout.mjs → useSessionKeepalive.mjs} +34 -27
  53. package/dist/admin/admin/src/hooks/useSessionKeepalive.mjs.map +1 -0
  54. package/dist/admin/admin/src/layouts/AuthenticatedLayout.js +2 -0
  55. package/dist/admin/admin/src/layouts/AuthenticatedLayout.js.map +1 -1
  56. package/dist/admin/admin/src/layouts/AuthenticatedLayout.mjs +2 -0
  57. package/dist/admin/admin/src/layouts/AuthenticatedLayout.mjs.map +1 -1
  58. package/dist/admin/admin/src/pages/SessionsPage.js +2 -5
  59. package/dist/admin/admin/src/pages/SessionsPage.js.map +1 -1
  60. package/dist/admin/admin/src/pages/SessionsPage.mjs +2 -5
  61. package/dist/admin/admin/src/pages/SessionsPage.mjs.map +1 -1
  62. package/dist/admin/admin/src/render.js +5 -0
  63. package/dist/admin/admin/src/render.js.map +1 -1
  64. package/dist/admin/admin/src/render.mjs +5 -0
  65. package/dist/admin/admin/src/render.mjs.map +1 -1
  66. package/dist/admin/admin/src/translations/en.json.js +30 -0
  67. package/dist/admin/admin/src/translations/en.json.js.map +1 -1
  68. package/dist/admin/admin/src/translations/en.json.mjs +30 -0
  69. package/dist/admin/admin/src/translations/en.json.mjs.map +1 -1
  70. package/dist/admin/admin/src/utils/baseQuery.js +3 -13
  71. package/dist/admin/admin/src/utils/baseQuery.js.map +1 -1
  72. package/dist/admin/admin/src/utils/baseQuery.mjs +3 -13
  73. package/dist/admin/admin/src/utils/baseQuery.mjs.map +1 -1
  74. package/dist/admin/admin/src/utils/getFetchClient.js +152 -48
  75. package/dist/admin/admin/src/utils/getFetchClient.js.map +1 -1
  76. package/dist/admin/admin/src/utils/getFetchClient.mjs +151 -50
  77. package/dist/admin/admin/src/utils/getFetchClient.mjs.map +1 -1
  78. package/dist/admin/admin/src/utils/unsavedChangesRegistry.js +25 -0
  79. package/dist/admin/admin/src/utils/unsavedChangesRegistry.js.map +1 -0
  80. package/dist/admin/admin/src/utils/unsavedChangesRegistry.mjs +22 -0
  81. package/dist/admin/admin/src/utils/unsavedChangesRegistry.mjs.map +1 -0
  82. package/dist/admin/admin/tests/utils.js +14 -14
  83. package/dist/admin/admin/tests/utils.js.map +1 -1
  84. package/dist/admin/admin/tests/utils.mjs +14 -14
  85. package/dist/admin/admin/tests/utils.mjs.map +1 -1
  86. package/dist/admin/ee/admin/src/constants.js +6 -0
  87. package/dist/admin/ee/admin/src/constants.js.map +1 -1
  88. package/dist/admin/ee/admin/src/constants.mjs +6 -0
  89. package/dist/admin/ee/admin/src/constants.mjs.map +1 -1
  90. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/ListPage.js +31 -3
  91. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/ListPage.js.map +1 -1
  92. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/ListPage.mjs +33 -5
  93. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/ListPage.mjs.map +1 -1
  94. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/components/ExportCard.js +177 -0
  95. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/components/ExportCard.js.map +1 -0
  96. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/components/ExportCard.mjs +175 -0
  97. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/components/ExportCard.mjs.map +1 -0
  98. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/hooks/useExportAuditLogs.js +173 -0
  99. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/hooks/useExportAuditLogs.js.map +1 -0
  100. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/hooks/useExportAuditLogs.mjs +151 -0
  101. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/hooks/useExportAuditLogs.mjs.map +1 -0
  102. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.js +14 -1
  103. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.js.map +1 -1
  104. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.mjs +14 -1
  105. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.mjs.map +1 -1
  106. package/dist/admin/index.js +3 -0
  107. package/dist/admin/index.js.map +1 -1
  108. package/dist/admin/index.mjs +1 -1
  109. package/dist/admin/shared/utils/audit-log-export.js +16 -0
  110. package/dist/admin/shared/utils/audit-log-export.js.map +1 -0
  111. package/dist/admin/shared/utils/audit-log-export.mjs +9 -0
  112. package/dist/admin/shared/utils/audit-log-export.mjs.map +1 -0
  113. package/dist/admin/src/components/DismissibleBanner.d.ts +8 -0
  114. package/dist/admin/src/components/MediaLibraryBanner.d.ts +2 -0
  115. package/dist/admin/src/hooks/useRegisterUnsavedChanges.d.ts +6 -0
  116. package/dist/admin/src/hooks/useSessionKeepalive.d.ts +88 -0
  117. package/dist/admin/src/utils/getFetchClient.d.ts +22 -7
  118. package/dist/admin/src/utils/unsavedChangesRegistry.d.ts +11 -0
  119. package/dist/admin/tests/store.d.ts +4 -0
  120. package/dist/admin/tests/utils.d.ts +4 -0
  121. package/dist/ee/admin/src/constants.d.ts +4 -0
  122. package/dist/ee/admin/src/pages/SettingsPage/pages/AuditLogs/components/ExportCard.d.ts +10 -0
  123. package/dist/ee/admin/src/pages/SettingsPage/pages/AuditLogs/hooks/useExportAuditLogs.d.ts +18 -0
  124. package/dist/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.d.ts +13 -0
  125. package/dist/ee/server/src/audit-logs/controllers/audit-logs.d.ts +1 -0
  126. package/dist/ee/server/src/audit-logs/controllers/audit-logs.d.ts.map +1 -1
  127. package/dist/ee/server/src/audit-logs/routes/audit-logs.d.ts.map +1 -1
  128. package/dist/ee/server/src/audit-logs/services/audit-logs.d.ts +24 -3
  129. package/dist/ee/server/src/audit-logs/services/audit-logs.d.ts.map +1 -1
  130. package/dist/ee/server/src/audit-logs/services/lifecycles.d.ts +8 -2
  131. package/dist/ee/server/src/audit-logs/services/lifecycles.d.ts.map +1 -1
  132. package/dist/ee/server/src/audit-logs/utils/csv.d.ts +5 -0
  133. package/dist/ee/server/src/audit-logs/utils/csv.d.ts.map +1 -0
  134. package/dist/ee/server/src/audit-logs/utils/export-token.d.ts +5 -0
  135. package/dist/ee/server/src/audit-logs/utils/export-token.d.ts.map +1 -0
  136. package/dist/ee/server/src/audit-logs/utils.d.ts +10 -0
  137. package/dist/ee/server/src/audit-logs/utils.d.ts.map +1 -0
  138. package/dist/ee/server/src/audit-logs/validation/audit-logs.d.ts +2 -0
  139. package/dist/ee/server/src/audit-logs/validation/audit-logs.d.ts.map +1 -1
  140. package/dist/ee/server/src/config/admin-actions.d.ts.map +1 -1
  141. package/dist/ee/server/src/index.d.ts +1 -0
  142. package/dist/ee/server/src/index.d.ts.map +1 -1
  143. package/dist/server/ee/server/src/audit-logs/controllers/audit-logs.js +50 -0
  144. package/dist/server/ee/server/src/audit-logs/controllers/audit-logs.js.map +1 -1
  145. package/dist/server/ee/server/src/audit-logs/controllers/audit-logs.mjs +51 -1
  146. package/dist/server/ee/server/src/audit-logs/controllers/audit-logs.mjs.map +1 -1
  147. package/dist/server/ee/server/src/audit-logs/routes/audit-logs.js +13 -4
  148. package/dist/server/ee/server/src/audit-logs/routes/audit-logs.js.map +1 -1
  149. package/dist/server/ee/server/src/audit-logs/routes/audit-logs.mjs +13 -4
  150. package/dist/server/ee/server/src/audit-logs/routes/audit-logs.mjs.map +1 -1
  151. package/dist/server/ee/server/src/audit-logs/services/audit-logs.js +201 -7
  152. package/dist/server/ee/server/src/audit-logs/services/audit-logs.js.map +1 -1
  153. package/dist/server/ee/server/src/audit-logs/services/audit-logs.mjs +201 -8
  154. package/dist/server/ee/server/src/audit-logs/services/audit-logs.mjs.map +1 -1
  155. package/dist/server/ee/server/src/audit-logs/services/lifecycles.js +119 -34
  156. package/dist/server/ee/server/src/audit-logs/services/lifecycles.js.map +1 -1
  157. package/dist/server/ee/server/src/audit-logs/services/lifecycles.mjs +119 -34
  158. package/dist/server/ee/server/src/audit-logs/services/lifecycles.mjs.map +1 -1
  159. package/dist/server/ee/server/src/audit-logs/utils/csv.js +33 -0
  160. package/dist/server/ee/server/src/audit-logs/utils/csv.js.map +1 -0
  161. package/dist/server/ee/server/src/audit-logs/utils/csv.mjs +29 -0
  162. package/dist/server/ee/server/src/audit-logs/utils/csv.mjs.map +1 -0
  163. package/dist/server/ee/server/src/audit-logs/utils/export-token.js +33 -0
  164. package/dist/server/ee/server/src/audit-logs/utils/export-token.js.map +1 -0
  165. package/dist/server/ee/server/src/audit-logs/utils/export-token.mjs +29 -0
  166. package/dist/server/ee/server/src/audit-logs/utils/export-token.mjs.map +1 -0
  167. package/dist/server/ee/server/src/audit-logs/utils.js +14 -0
  168. package/dist/server/ee/server/src/audit-logs/utils.js.map +1 -0
  169. package/dist/server/ee/server/src/audit-logs/utils.mjs +12 -0
  170. package/dist/server/ee/server/src/audit-logs/utils.mjs.map +1 -0
  171. package/dist/server/ee/server/src/audit-logs/validation/audit-logs.js +11 -0
  172. package/dist/server/ee/server/src/audit-logs/validation/audit-logs.js.map +1 -1
  173. package/dist/server/ee/server/src/audit-logs/validation/audit-logs.mjs +11 -1
  174. package/dist/server/ee/server/src/audit-logs/validation/audit-logs.mjs.map +1 -1
  175. package/dist/server/ee/server/src/config/admin-actions.js +8 -0
  176. package/dist/server/ee/server/src/config/admin-actions.js.map +1 -1
  177. package/dist/server/ee/server/src/config/admin-actions.mjs +8 -0
  178. package/dist/server/ee/server/src/config/admin-actions.mjs.map +1 -1
  179. package/dist/server/ee/server/src/index.js +10 -0
  180. package/dist/server/ee/server/src/index.js.map +1 -1
  181. package/dist/server/ee/server/src/index.mjs +10 -0
  182. package/dist/server/ee/server/src/index.mjs.map +1 -1
  183. package/dist/server/shared/utils/audit-log-export.js +22 -0
  184. package/dist/server/shared/utils/audit-log-export.js.map +1 -0
  185. package/dist/server/shared/utils/audit-log-export.mjs +12 -0
  186. package/dist/server/shared/utils/audit-log-export.mjs.map +1 -0
  187. package/dist/shared/contracts/audit-logs.d.ts +15 -1
  188. package/dist/shared/contracts/audit-logs.d.ts.map +1 -1
  189. package/dist/shared/contracts/shared.d.ts +1 -0
  190. package/dist/shared/contracts/shared.d.ts.map +1 -1
  191. package/dist/shared/utils/audit-log-export.d.ts +9 -0
  192. package/dist/shared/utils/audit-log-export.d.ts.map +1 -0
  193. package/package.json +7 -7
  194. package/dist/admin/admin/src/hooks/useIdleSessionLogout.js.map +0 -1
  195. package/dist/admin/admin/src/hooks/useIdleSessionLogout.mjs.map +0 -1
  196. package/dist/admin/src/hooks/useIdleSessionLogout.d.ts +0 -87
@@ -0,0 +1,85 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var designSystem = require('@strapi/design-system');
5
+ var icons = require('@strapi/icons');
6
+ var reactIntl = require('react-intl');
7
+ var usePersistentState = require('../hooks/usePersistentState.js');
8
+ var DismissibleBanner = require('./DismissibleBanner.js');
9
+
10
+ const Banner = ({ isLegacyMediaLibrary, onDismiss })=>{
11
+ const { formatMessage } = reactIntl.useIntl();
12
+ return /*#__PURE__*/ jsxRuntime.jsx(DismissibleBanner.DismissibleBanner, {
13
+ onDismiss: onDismiss,
14
+ closeLabel: formatMessage({
15
+ id: 'app.components.MediaLibraryBanner.close',
16
+ defaultMessage: 'Close'
17
+ }),
18
+ message: /*#__PURE__*/ jsxRuntime.jsxs(jsxRuntime.Fragment, {
19
+ children: [
20
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
21
+ variant: "delta",
22
+ fontWeight: "bold",
23
+ textColor: "neutral0",
24
+ textAlign: "center",
25
+ fontSize: 2,
26
+ children: formatMessage({
27
+ id: 'app.components.MediaLibraryBanner.intro',
28
+ defaultMessage: 'Introducing the new Media Library '
29
+ })
30
+ }),
31
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
32
+ variant: "delta",
33
+ textColor: "neutral0",
34
+ textAlign: "center",
35
+ paddingRight: 4,
36
+ fontSize: 2,
37
+ children: formatMessage(isLegacyMediaLibrary ? {
38
+ id: 'app.components.MediaLibraryBanner.text',
39
+ defaultMessage: 'Check the documentation to learn how to switch to the new one.'
40
+ } : {
41
+ id: 'app.components.MediaLibraryBanner.text.enabled',
42
+ defaultMessage: "You're now using the revamped version."
43
+ })
44
+ })
45
+ ]
46
+ }),
47
+ action: isLegacyMediaLibrary ? /*#__PURE__*/ jsxRuntime.jsx(designSystem.LinkButton, {
48
+ width: "max-content",
49
+ variant: "tertiary",
50
+ startIcon: /*#__PURE__*/ jsxRuntime.jsx(icons.ExternalLink, {}),
51
+ href: "https://docs.strapi.io/cms/features/media-library",
52
+ target: "_blank",
53
+ children: formatMessage({
54
+ id: 'app.components.MediaLibraryBanner.button',
55
+ defaultMessage: 'Docs'
56
+ })
57
+ }) : /*#__PURE__*/ jsxRuntime.jsx(designSystem.LinkButton, {
58
+ width: "max-content",
59
+ variant: "tertiary",
60
+ href: "https://strapi.io/blog/strapi-release-roundup-everything-that-changed-between-june-and-august-2026",
61
+ target: "_blank",
62
+ children: formatMessage({
63
+ id: 'app.components.MediaLibraryBanner.button.enabled',
64
+ defaultMessage: 'Read blog post'
65
+ })
66
+ })
67
+ });
68
+ };
69
+ const MediaLibraryBanner = ()=>{
70
+ const isLegacyMediaLibrary = window.strapi.featureFlags.isEnabled('useLegacyMediaLibrary');
71
+ // The flag state is part of the key (not the stored value) so dismissing one
72
+ // message never collides with the other, and toggling `useLegacyMediaLibrary`
73
+ // (enabling it, or rolling it back) brings the banner back with the right message.
74
+ const [isDismissed, setIsDismissed] = usePersistentState.useScopedPersistentState(`STRAPI_MEDIA_LIBRARY_BANNER_DISMISSED_FOR_${isLegacyMediaLibrary}`, false);
75
+ if (isDismissed) {
76
+ return null;
77
+ }
78
+ return /*#__PURE__*/ jsxRuntime.jsx(Banner, {
79
+ isLegacyMediaLibrary: isLegacyMediaLibrary,
80
+ onDismiss: ()=>setIsDismissed(true)
81
+ });
82
+ };
83
+
84
+ exports.MediaLibraryBanner = MediaLibraryBanner;
85
+ //# sourceMappingURL=MediaLibraryBanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MediaLibraryBanner.js","sources":["../../../../../admin/src/components/MediaLibraryBanner.tsx"],"sourcesContent":["import { LinkButton, Typography } from '@strapi/design-system';\nimport { ExternalLink } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport { useScopedPersistentState } from '../hooks/usePersistentState';\n\nimport { DismissibleBanner } from './DismissibleBanner';\n\nconst Banner = ({\n isLegacyMediaLibrary,\n onDismiss,\n}: {\n isLegacyMediaLibrary: boolean;\n onDismiss: () => void;\n}) => {\n const { formatMessage } = useIntl();\n\n return (\n <DismissibleBanner\n onDismiss={onDismiss}\n closeLabel={formatMessage({\n id: 'app.components.MediaLibraryBanner.close',\n defaultMessage: 'Close',\n })}\n message={\n <>\n <Typography\n variant=\"delta\"\n fontWeight=\"bold\"\n textColor=\"neutral0\"\n textAlign=\"center\"\n fontSize={2}\n >\n {formatMessage({\n id: 'app.components.MediaLibraryBanner.intro',\n defaultMessage: 'Introducing the new Media Library ',\n })}\n </Typography>\n <Typography\n variant=\"delta\"\n textColor=\"neutral0\"\n textAlign=\"center\"\n paddingRight={4}\n fontSize={2}\n >\n {formatMessage(\n isLegacyMediaLibrary\n ? {\n id: 'app.components.MediaLibraryBanner.text',\n defaultMessage:\n 'Check the documentation to learn how to switch to the new one.',\n }\n : {\n id: 'app.components.MediaLibraryBanner.text.enabled',\n defaultMessage: \"You're now using the revamped version.\",\n }\n )}\n </Typography>\n </>\n }\n action={\n isLegacyMediaLibrary ? (\n <LinkButton\n width=\"max-content\"\n variant=\"tertiary\"\n startIcon={<ExternalLink />}\n href=\"https://docs.strapi.io/cms/features/media-library\"\n target=\"_blank\"\n >\n {formatMessage({\n id: 'app.components.MediaLibraryBanner.button',\n defaultMessage: 'Docs',\n })}\n </LinkButton>\n ) : (\n <LinkButton\n width=\"max-content\"\n variant=\"tertiary\"\n href=\"https://strapi.io/blog/strapi-release-roundup-everything-that-changed-between-june-and-august-2026\"\n target=\"_blank\"\n >\n {formatMessage({\n id: 'app.components.MediaLibraryBanner.button.enabled',\n defaultMessage: 'Read blog post',\n })}\n </LinkButton>\n )\n }\n />\n );\n};\n\nconst MediaLibraryBanner = () => {\n const isLegacyMediaLibrary = window.strapi.featureFlags.isEnabled('useLegacyMediaLibrary');\n\n // The flag state is part of the key (not the stored value) so dismissing one\n // message never collides with the other, and toggling `useLegacyMediaLibrary`\n // (enabling it, or rolling it back) brings the banner back with the right message.\n const [isDismissed, setIsDismissed] = useScopedPersistentState<boolean>(\n `STRAPI_MEDIA_LIBRARY_BANNER_DISMISSED_FOR_${isLegacyMediaLibrary}`,\n false\n );\n\n if (isDismissed) {\n return null;\n }\n\n return (\n <Banner isLegacyMediaLibrary={isLegacyMediaLibrary} onDismiss={() => setIsDismissed(true)} />\n );\n};\n\nexport { MediaLibraryBanner };\n"],"names":["Banner","isLegacyMediaLibrary","onDismiss","formatMessage","useIntl","_jsx","DismissibleBanner","closeLabel","id","defaultMessage","message","_jsxs","_Fragment","Typography","variant","fontWeight","textColor","textAlign","fontSize","paddingRight","action","LinkButton","width","startIcon","ExternalLink","href","target","MediaLibraryBanner","window","strapi","featureFlags","isEnabled","isDismissed","setIsDismissed","useScopedPersistentState"],"mappings":";;;;;;;;;AAQA,MAAMA,SAAS,CAAC,EACdC,oBAAoB,EACpBC,SAAS,EAIV,GAAA;IACC,MAAM,EAAEC,aAAa,EAAE,GAAGC,iBAAAA,EAAAA;AAE1B,IAAA,qBACEC,cAAA,CAACC,mCAAAA,EAAAA;QACCJ,SAAAA,EAAWA,SAAAA;AACXK,QAAAA,UAAAA,EAAYJ,aAAAA,CAAc;YACxBK,EAAAA,EAAI,yCAAA;YACJC,cAAAA,EAAgB;AAClB,SAAA,CAAA;QACAC,OAAAA,gBACEC,eAAA,CAAAC,mBAAA,EAAA;;8BACEP,cAAA,CAACQ,uBAAAA,EAAAA;oBACCC,OAAAA,EAAQ,OAAA;oBACRC,UAAAA,EAAW,MAAA;oBACXC,SAAAA,EAAU,UAAA;oBACVC,SAAAA,EAAU,QAAA;oBACVC,QAAAA,EAAU,CAAA;8BAETf,aAAAA,CAAc;wBACbK,EAAAA,EAAI,yCAAA;wBACJC,cAAAA,EAAgB;AAClB,qBAAA;;8BAEFJ,cAAA,CAACQ,uBAAAA,EAAAA;oBACCC,OAAAA,EAAQ,OAAA;oBACRE,SAAAA,EAAU,UAAA;oBACVC,SAAAA,EAAU,QAAA;oBACVE,YAAAA,EAAc,CAAA;oBACdD,QAAAA,EAAU,CAAA;AAETf,oBAAAA,QAAAA,EAAAA,aAAAA,CACCF,oBAAAA,GACI;wBACEO,EAAAA,EAAI,wCAAA;wBACJC,cAAAA,EACE;qBACJ,GACA;wBACED,EAAAA,EAAI,gDAAA;wBACJC,cAAAA,EAAgB;AAClB,qBAAA;;;;AAKZW,QAAAA,MAAAA,EACEnB,qCACEI,cAAA,CAACgB,uBAAAA,EAAAA;YACCC,KAAAA,EAAM,aAAA;YACNR,OAAAA,EAAQ,UAAA;AACRS,YAAAA,SAAAA,gBAAWlB,cAAA,CAACmB,kBAAAA,EAAAA,EAAAA,CAAAA;YACZC,IAAAA,EAAK,mDAAA;YACLC,MAAAA,EAAO,QAAA;sBAENvB,aAAAA,CAAc;gBACbK,EAAAA,EAAI,0CAAA;gBACJC,cAAAA,EAAgB;AAClB,aAAA;2BAGFJ,cAAA,CAACgB,uBAAAA,EAAAA;YACCC,KAAAA,EAAM,aAAA;YACNR,OAAAA,EAAQ,UAAA;YACRW,IAAAA,EAAK,oGAAA;YACLC,MAAAA,EAAO,QAAA;sBAENvB,aAAAA,CAAc;gBACbK,EAAAA,EAAI,kDAAA;gBACJC,cAAAA,EAAgB;AAClB,aAAA;;;AAMZ,CAAA;AAEA,MAAMkB,kBAAAA,GAAqB,IAAA;AACzB,IAAA,MAAM1B,uBAAuB2B,MAAAA,CAAOC,MAAM,CAACC,YAAY,CAACC,SAAS,CAAC,uBAAA,CAAA;;;;IAKlE,MAAM,CAACC,aAAaC,cAAAA,CAAe,GAAGC,4CACpC,CAAC,0CAA0C,EAAEjC,oBAAAA,CAAAA,CAAsB,EACnE,KAAA,CAAA;AAGF,IAAA,IAAI+B,WAAAA,EAAa;QACf,OAAO,IAAA;AACT,IAAA;AAEA,IAAA,qBACE3B,cAAA,CAACL,MAAAA,EAAAA;QAAOC,oBAAAA,EAAsBA,oBAAAA;AAAsBC,QAAAA,SAAAA,EAAW,IAAM+B,cAAAA,CAAe,IAAA;;AAExF;;;;"}
@@ -0,0 +1,83 @@
1
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
2
+ import { LinkButton, Typography } from '@strapi/design-system';
3
+ import { ExternalLink } from '@strapi/icons';
4
+ import { useIntl } from 'react-intl';
5
+ import { useScopedPersistentState } from '../hooks/usePersistentState.mjs';
6
+ import { DismissibleBanner } from './DismissibleBanner.mjs';
7
+
8
+ const Banner = ({ isLegacyMediaLibrary, onDismiss })=>{
9
+ const { formatMessage } = useIntl();
10
+ return /*#__PURE__*/ jsx(DismissibleBanner, {
11
+ onDismiss: onDismiss,
12
+ closeLabel: formatMessage({
13
+ id: 'app.components.MediaLibraryBanner.close',
14
+ defaultMessage: 'Close'
15
+ }),
16
+ message: /*#__PURE__*/ jsxs(Fragment, {
17
+ children: [
18
+ /*#__PURE__*/ jsx(Typography, {
19
+ variant: "delta",
20
+ fontWeight: "bold",
21
+ textColor: "neutral0",
22
+ textAlign: "center",
23
+ fontSize: 2,
24
+ children: formatMessage({
25
+ id: 'app.components.MediaLibraryBanner.intro',
26
+ defaultMessage: 'Introducing the new Media Library '
27
+ })
28
+ }),
29
+ /*#__PURE__*/ jsx(Typography, {
30
+ variant: "delta",
31
+ textColor: "neutral0",
32
+ textAlign: "center",
33
+ paddingRight: 4,
34
+ fontSize: 2,
35
+ children: formatMessage(isLegacyMediaLibrary ? {
36
+ id: 'app.components.MediaLibraryBanner.text',
37
+ defaultMessage: 'Check the documentation to learn how to switch to the new one.'
38
+ } : {
39
+ id: 'app.components.MediaLibraryBanner.text.enabled',
40
+ defaultMessage: "You're now using the revamped version."
41
+ })
42
+ })
43
+ ]
44
+ }),
45
+ action: isLegacyMediaLibrary ? /*#__PURE__*/ jsx(LinkButton, {
46
+ width: "max-content",
47
+ variant: "tertiary",
48
+ startIcon: /*#__PURE__*/ jsx(ExternalLink, {}),
49
+ href: "https://docs.strapi.io/cms/features/media-library",
50
+ target: "_blank",
51
+ children: formatMessage({
52
+ id: 'app.components.MediaLibraryBanner.button',
53
+ defaultMessage: 'Docs'
54
+ })
55
+ }) : /*#__PURE__*/ jsx(LinkButton, {
56
+ width: "max-content",
57
+ variant: "tertiary",
58
+ href: "https://strapi.io/blog/strapi-release-roundup-everything-that-changed-between-june-and-august-2026",
59
+ target: "_blank",
60
+ children: formatMessage({
61
+ id: 'app.components.MediaLibraryBanner.button.enabled',
62
+ defaultMessage: 'Read blog post'
63
+ })
64
+ })
65
+ });
66
+ };
67
+ const MediaLibraryBanner = ()=>{
68
+ const isLegacyMediaLibrary = window.strapi.featureFlags.isEnabled('useLegacyMediaLibrary');
69
+ // The flag state is part of the key (not the stored value) so dismissing one
70
+ // message never collides with the other, and toggling `useLegacyMediaLibrary`
71
+ // (enabling it, or rolling it back) brings the banner back with the right message.
72
+ const [isDismissed, setIsDismissed] = useScopedPersistentState(`STRAPI_MEDIA_LIBRARY_BANNER_DISMISSED_FOR_${isLegacyMediaLibrary}`, false);
73
+ if (isDismissed) {
74
+ return null;
75
+ }
76
+ return /*#__PURE__*/ jsx(Banner, {
77
+ isLegacyMediaLibrary: isLegacyMediaLibrary,
78
+ onDismiss: ()=>setIsDismissed(true)
79
+ });
80
+ };
81
+
82
+ export { MediaLibraryBanner };
83
+ //# sourceMappingURL=MediaLibraryBanner.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MediaLibraryBanner.mjs","sources":["../../../../../admin/src/components/MediaLibraryBanner.tsx"],"sourcesContent":["import { LinkButton, Typography } from '@strapi/design-system';\nimport { ExternalLink } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport { useScopedPersistentState } from '../hooks/usePersistentState';\n\nimport { DismissibleBanner } from './DismissibleBanner';\n\nconst Banner = ({\n isLegacyMediaLibrary,\n onDismiss,\n}: {\n isLegacyMediaLibrary: boolean;\n onDismiss: () => void;\n}) => {\n const { formatMessage } = useIntl();\n\n return (\n <DismissibleBanner\n onDismiss={onDismiss}\n closeLabel={formatMessage({\n id: 'app.components.MediaLibraryBanner.close',\n defaultMessage: 'Close',\n })}\n message={\n <>\n <Typography\n variant=\"delta\"\n fontWeight=\"bold\"\n textColor=\"neutral0\"\n textAlign=\"center\"\n fontSize={2}\n >\n {formatMessage({\n id: 'app.components.MediaLibraryBanner.intro',\n defaultMessage: 'Introducing the new Media Library ',\n })}\n </Typography>\n <Typography\n variant=\"delta\"\n textColor=\"neutral0\"\n textAlign=\"center\"\n paddingRight={4}\n fontSize={2}\n >\n {formatMessage(\n isLegacyMediaLibrary\n ? {\n id: 'app.components.MediaLibraryBanner.text',\n defaultMessage:\n 'Check the documentation to learn how to switch to the new one.',\n }\n : {\n id: 'app.components.MediaLibraryBanner.text.enabled',\n defaultMessage: \"You're now using the revamped version.\",\n }\n )}\n </Typography>\n </>\n }\n action={\n isLegacyMediaLibrary ? (\n <LinkButton\n width=\"max-content\"\n variant=\"tertiary\"\n startIcon={<ExternalLink />}\n href=\"https://docs.strapi.io/cms/features/media-library\"\n target=\"_blank\"\n >\n {formatMessage({\n id: 'app.components.MediaLibraryBanner.button',\n defaultMessage: 'Docs',\n })}\n </LinkButton>\n ) : (\n <LinkButton\n width=\"max-content\"\n variant=\"tertiary\"\n href=\"https://strapi.io/blog/strapi-release-roundup-everything-that-changed-between-june-and-august-2026\"\n target=\"_blank\"\n >\n {formatMessage({\n id: 'app.components.MediaLibraryBanner.button.enabled',\n defaultMessage: 'Read blog post',\n })}\n </LinkButton>\n )\n }\n />\n );\n};\n\nconst MediaLibraryBanner = () => {\n const isLegacyMediaLibrary = window.strapi.featureFlags.isEnabled('useLegacyMediaLibrary');\n\n // The flag state is part of the key (not the stored value) so dismissing one\n // message never collides with the other, and toggling `useLegacyMediaLibrary`\n // (enabling it, or rolling it back) brings the banner back with the right message.\n const [isDismissed, setIsDismissed] = useScopedPersistentState<boolean>(\n `STRAPI_MEDIA_LIBRARY_BANNER_DISMISSED_FOR_${isLegacyMediaLibrary}`,\n false\n );\n\n if (isDismissed) {\n return null;\n }\n\n return (\n <Banner isLegacyMediaLibrary={isLegacyMediaLibrary} onDismiss={() => setIsDismissed(true)} />\n );\n};\n\nexport { MediaLibraryBanner };\n"],"names":["Banner","isLegacyMediaLibrary","onDismiss","formatMessage","useIntl","_jsx","DismissibleBanner","closeLabel","id","defaultMessage","message","_jsxs","_Fragment","Typography","variant","fontWeight","textColor","textAlign","fontSize","paddingRight","action","LinkButton","width","startIcon","ExternalLink","href","target","MediaLibraryBanner","window","strapi","featureFlags","isEnabled","isDismissed","setIsDismissed","useScopedPersistentState"],"mappings":";;;;;;;AAQA,MAAMA,SAAS,CAAC,EACdC,oBAAoB,EACpBC,SAAS,EAIV,GAAA;IACC,MAAM,EAAEC,aAAa,EAAE,GAAGC,OAAAA,EAAAA;AAE1B,IAAA,qBACEC,GAAA,CAACC,iBAAAA,EAAAA;QACCJ,SAAAA,EAAWA,SAAAA;AACXK,QAAAA,UAAAA,EAAYJ,aAAAA,CAAc;YACxBK,EAAAA,EAAI,yCAAA;YACJC,cAAAA,EAAgB;AAClB,SAAA,CAAA;QACAC,OAAAA,gBACEC,IAAA,CAAAC,QAAA,EAAA;;8BACEP,GAAA,CAACQ,UAAAA,EAAAA;oBACCC,OAAAA,EAAQ,OAAA;oBACRC,UAAAA,EAAW,MAAA;oBACXC,SAAAA,EAAU,UAAA;oBACVC,SAAAA,EAAU,QAAA;oBACVC,QAAAA,EAAU,CAAA;8BAETf,aAAAA,CAAc;wBACbK,EAAAA,EAAI,yCAAA;wBACJC,cAAAA,EAAgB;AAClB,qBAAA;;8BAEFJ,GAAA,CAACQ,UAAAA,EAAAA;oBACCC,OAAAA,EAAQ,OAAA;oBACRE,SAAAA,EAAU,UAAA;oBACVC,SAAAA,EAAU,QAAA;oBACVE,YAAAA,EAAc,CAAA;oBACdD,QAAAA,EAAU,CAAA;AAETf,oBAAAA,QAAAA,EAAAA,aAAAA,CACCF,oBAAAA,GACI;wBACEO,EAAAA,EAAI,wCAAA;wBACJC,cAAAA,EACE;qBACJ,GACA;wBACED,EAAAA,EAAI,gDAAA;wBACJC,cAAAA,EAAgB;AAClB,qBAAA;;;;AAKZW,QAAAA,MAAAA,EACEnB,qCACEI,GAAA,CAACgB,UAAAA,EAAAA;YACCC,KAAAA,EAAM,aAAA;YACNR,OAAAA,EAAQ,UAAA;AACRS,YAAAA,SAAAA,gBAAWlB,GAAA,CAACmB,YAAAA,EAAAA,EAAAA,CAAAA;YACZC,IAAAA,EAAK,mDAAA;YACLC,MAAAA,EAAO,QAAA;sBAENvB,aAAAA,CAAc;gBACbK,EAAAA,EAAI,0CAAA;gBACJC,cAAAA,EAAgB;AAClB,aAAA;2BAGFJ,GAAA,CAACgB,UAAAA,EAAAA;YACCC,KAAAA,EAAM,aAAA;YACNR,OAAAA,EAAQ,UAAA;YACRW,IAAAA,EAAK,oGAAA;YACLC,MAAAA,EAAO,QAAA;sBAENvB,aAAAA,CAAc;gBACbK,EAAAA,EAAI,kDAAA;gBACJC,cAAAA,EAAgB;AAClB,aAAA;;;AAMZ,CAAA;AAEA,MAAMkB,kBAAAA,GAAqB,IAAA;AACzB,IAAA,MAAM1B,uBAAuB2B,MAAAA,CAAOC,MAAM,CAACC,YAAY,CAACC,SAAS,CAAC,uBAAA,CAAA;;;;IAKlE,MAAM,CAACC,aAAaC,cAAAA,CAAe,GAAGC,yBACpC,CAAC,0CAA0C,EAAEjC,oBAAAA,CAAAA,CAAsB,EACnE,KAAA,CAAA;AAGF,IAAA,IAAI+B,WAAAA,EAAa;QACf,OAAO,IAAA;AACT,IAAA;AAEA,IAAA,qBACE3B,GAAA,CAACL,MAAAA,EAAAA;QAAOC,oBAAAA,EAAsBA,oBAAAA;AAAsBC,QAAAA,SAAAA,EAAW,IAAM+B,cAAAA,CAAe,IAAA;;AAExF;;;;"}
@@ -40,12 +40,12 @@ const Providers = ({ children, strapi, store })=>{
40
40
  store: store,
41
41
  children: /*#__PURE__*/ jsxRuntime.jsx(reactQuery.QueryClientProvider, {
42
42
  client: queryClient,
43
- children: /*#__PURE__*/ jsxRuntime.jsx(Auth.AuthProvider, {
44
- children: /*#__PURE__*/ jsxRuntime.jsx(BackButton.HistoryProvider, {
45
- children: /*#__PURE__*/ jsxRuntime.jsx(LanguageProvider.LanguageProvider, {
46
- messages: strapi.configurations.translations,
47
- children: /*#__PURE__*/ jsxRuntime.jsx(Theme.Theme, {
48
- themes: strapi.configurations.themes,
43
+ children: /*#__PURE__*/ jsxRuntime.jsx(LanguageProvider.LanguageProvider, {
44
+ messages: strapi.configurations.translations,
45
+ children: /*#__PURE__*/ jsxRuntime.jsx(Theme.Theme, {
46
+ themes: strapi.configurations.themes,
47
+ children: /*#__PURE__*/ jsxRuntime.jsx(Auth.AuthProvider, {
48
+ children: /*#__PURE__*/ jsxRuntime.jsx(BackButton.HistoryProvider, {
49
49
  children: /*#__PURE__*/ jsxRuntime.jsx(Notifications.NotificationsProvider, {
50
50
  children: /*#__PURE__*/ jsxRuntime.jsx(Tracking.TrackingProvider, {
51
51
  children: /*#__PURE__*/ jsxRuntime.jsx(GuidedTourProvider.GuidedTourProvider, {
@@ -1 +1 @@
1
- {"version":3,"file":"Providers.js","sources":["../../../../../admin/src/components/Providers.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { QueryClient, QueryClientProvider } from 'react-query';\nimport { Provider } from 'react-redux';\n\nimport { AuthProvider } from '../features/Auth';\nimport { HistoryProvider } from '../features/BackButton';\nimport { ConfigurationProvider } from '../features/Configuration';\nimport { NotificationsProvider } from '../features/Notifications';\nimport { StrapiAppProvider } from '../features/StrapiApp';\nimport { TrackingProvider } from '../features/Tracking';\n\nimport { GuidedTourProvider } from './GuidedTour/GuidedTourProvider';\nimport { LanguageProvider } from './LanguageProvider';\nimport { Theme } from './Theme';\n\nimport type { Store } from '../core/store/configure';\nimport type { StrapiApp } from '../StrapiApp';\n\nconst queryClient = new QueryClient({\n defaultOptions: {\n queries: {\n refetchOnWindowFocus: false,\n },\n },\n});\n\ninterface ProvidersProps {\n children: React.ReactNode;\n strapi: StrapiApp;\n store: Store;\n}\n\nconst Providers = ({ children, strapi, store }: ProvidersProps) => {\n return (\n <StrapiAppProvider\n components={strapi.library.components}\n customFields={strapi.customFields}\n widgets={strapi.widgets}\n fields={strapi.library.fields}\n menu={strapi.router.menu}\n getAdminInjectedComponents={strapi.getAdminInjectedComponents}\n getPlugin={strapi.getPlugin}\n plugins={strapi.plugins}\n rbac={strapi.rbac}\n runHookParallel={strapi.runHookParallel}\n runHookWaterfall={(name, initialValue) => strapi.runHookWaterfall(name, initialValue, store)}\n runHookSeries={strapi.runHookSeries}\n settings={strapi.router.settings}\n >\n <Provider store={store}>\n <QueryClientProvider client={queryClient}>\n <AuthProvider>\n <HistoryProvider>\n <LanguageProvider messages={strapi.configurations.translations}>\n <Theme themes={strapi.configurations.themes}>\n <NotificationsProvider>\n <TrackingProvider>\n <GuidedTourProvider>\n <ConfigurationProvider\n defaultAuthLogo={strapi.configurations.authLogo}\n defaultMenuLogo={strapi.configurations.menuLogo}\n showReleaseNotification={strapi.configurations.notifications.releases}\n >\n {children}\n </ConfigurationProvider>\n </GuidedTourProvider>\n </TrackingProvider>\n </NotificationsProvider>\n </Theme>\n </LanguageProvider>\n </HistoryProvider>\n </AuthProvider>\n </QueryClientProvider>\n </Provider>\n </StrapiAppProvider>\n );\n};\n\nexport { Providers };\n"],"names":["queryClient","QueryClient","defaultOptions","queries","refetchOnWindowFocus","Providers","children","strapi","store","_jsx","StrapiAppProvider","components","library","customFields","widgets","fields","menu","router","getAdminInjectedComponents","getPlugin","plugins","rbac","runHookParallel","runHookWaterfall","name","initialValue","runHookSeries","settings","Provider","QueryClientProvider","client","AuthProvider","HistoryProvider","LanguageProvider","messages","configurations","translations","Theme","themes","NotificationsProvider","TrackingProvider","GuidedTourProvider","ConfigurationProvider","defaultAuthLogo","authLogo","defaultMenuLogo","menuLogo","showReleaseNotification","notifications","releases"],"mappings":";;;;;;;;;;;;;;;;AAmBA,MAAMA,WAAAA,GAAc,IAAIC,sBAAAA,CAAY;IAClCC,cAAAA,EAAgB;QACdC,OAAAA,EAAS;YACPC,oBAAAA,EAAsB;AACxB;AACF;AACF,CAAA,CAAA;AAQA,MAAMC,SAAAA,GAAY,CAAC,EAAEC,QAAQ,EAAEC,MAAM,EAAEC,KAAK,EAAkB,GAAA;AAC5D,IAAA,qBACEC,cAAA,CAACC,2BAAAA,EAAAA;QACCC,UAAAA,EAAYJ,MAAAA,CAAOK,OAAO,CAACD,UAAU;AACrCE,QAAAA,YAAAA,EAAcN,OAAOM,YAAY;AACjCC,QAAAA,OAAAA,EAASP,OAAOO,OAAO;QACvBC,MAAAA,EAAQR,MAAAA,CAAOK,OAAO,CAACG,MAAM;QAC7BC,IAAAA,EAAMT,MAAAA,CAAOU,MAAM,CAACD,IAAI;AACxBE,QAAAA,0BAAAA,EAA4BX,OAAOW,0BAA0B;AAC7DC,QAAAA,SAAAA,EAAWZ,OAAOY,SAAS;AAC3BC,QAAAA,OAAAA,EAASb,OAAOa,OAAO;AACvBC,QAAAA,IAAAA,EAAMd,OAAOc,IAAI;AACjBC,QAAAA,eAAAA,EAAiBf,OAAOe,eAAe;AACvCC,QAAAA,gBAAAA,EAAkB,CAACC,IAAAA,EAAMC,YAAAA,GAAiBlB,OAAOgB,gBAAgB,CAACC,MAAMC,YAAAA,EAAcjB,KAAAA,CAAAA;AACtFkB,QAAAA,aAAAA,EAAenB,OAAOmB,aAAa;QACnCC,QAAAA,EAAUpB,MAAAA,CAAOU,MAAM,CAACU,QAAQ;AAEhC,QAAA,QAAA,gBAAAlB,cAAA,CAACmB,mBAAAA,EAAAA;YAASpB,KAAAA,EAAOA,KAAAA;AACf,YAAA,QAAA,gBAAAC,cAAA,CAACoB,8BAAAA,EAAAA;gBAAoBC,MAAAA,EAAQ9B,WAAAA;AAC3B,gBAAA,QAAA,gBAAAS,cAAA,CAACsB,iBAAAA,EAAAA;AACC,oBAAA,QAAA,gBAAAtB,cAAA,CAACuB,0BAAAA,EAAAA;AACC,wBAAA,QAAA,gBAAAvB,cAAA,CAACwB,iCAAAA,EAAAA;4BAAiBC,QAAAA,EAAU3B,MAAAA,CAAO4B,cAAc,CAACC,YAAY;AAC5D,4BAAA,QAAA,gBAAA3B,cAAA,CAAC4B,WAAAA,EAAAA;gCAAMC,MAAAA,EAAQ/B,MAAAA,CAAO4B,cAAc,CAACG,MAAM;AACzC,gCAAA,QAAA,gBAAA7B,cAAA,CAAC8B,mCAAAA,EAAAA;AACC,oCAAA,QAAA,gBAAA9B,cAAA,CAAC+B,yBAAAA,EAAAA;AACC,wCAAA,QAAA,gBAAA/B,cAAA,CAACgC,qCAAAA,EAAAA;AACC,4CAAA,QAAA,gBAAAhC,cAAA,CAACiC,mCAAAA,EAAAA;gDACCC,eAAAA,EAAiBpC,MAAAA,CAAO4B,cAAc,CAACS,QAAQ;gDAC/CC,eAAAA,EAAiBtC,MAAAA,CAAO4B,cAAc,CAACW,QAAQ;AAC/CC,gDAAAA,uBAAAA,EAAyBxC,MAAAA,CAAO4B,cAAc,CAACa,aAAa,CAACC,QAAQ;AAEpE3C,gDAAAA,QAAAA,EAAAA;;;;;;;;;;;;AAa3B;;;;"}
1
+ {"version":3,"file":"Providers.js","sources":["../../../../../admin/src/components/Providers.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { QueryClient, QueryClientProvider } from 'react-query';\nimport { Provider } from 'react-redux';\n\nimport { AuthProvider } from '../features/Auth';\nimport { HistoryProvider } from '../features/BackButton';\nimport { ConfigurationProvider } from '../features/Configuration';\nimport { NotificationsProvider } from '../features/Notifications';\nimport { StrapiAppProvider } from '../features/StrapiApp';\nimport { TrackingProvider } from '../features/Tracking';\n\nimport { GuidedTourProvider } from './GuidedTour/GuidedTourProvider';\nimport { LanguageProvider } from './LanguageProvider';\nimport { Theme } from './Theme';\n\nimport type { Store } from '../core/store/configure';\nimport type { StrapiApp } from '../StrapiApp';\n\nconst queryClient = new QueryClient({\n defaultOptions: {\n queries: {\n refetchOnWindowFocus: false,\n },\n },\n});\n\ninterface ProvidersProps {\n children: React.ReactNode;\n strapi: StrapiApp;\n store: Store;\n}\n\nconst Providers = ({ children, strapi, store }: ProvidersProps) => {\n return (\n <StrapiAppProvider\n components={strapi.library.components}\n customFields={strapi.customFields}\n widgets={strapi.widgets}\n fields={strapi.library.fields}\n menu={strapi.router.menu}\n getAdminInjectedComponents={strapi.getAdminInjectedComponents}\n getPlugin={strapi.getPlugin}\n plugins={strapi.plugins}\n rbac={strapi.rbac}\n runHookParallel={strapi.runHookParallel}\n runHookWaterfall={(name, initialValue) => strapi.runHookWaterfall(name, initialValue, store)}\n runHookSeries={strapi.runHookSeries}\n settings={strapi.router.settings}\n >\n <Provider store={store}>\n <QueryClientProvider client={queryClient}>\n <LanguageProvider messages={strapi.configurations.translations}>\n <Theme themes={strapi.configurations.themes}>\n <AuthProvider>\n <HistoryProvider>\n <NotificationsProvider>\n <TrackingProvider>\n <GuidedTourProvider>\n <ConfigurationProvider\n defaultAuthLogo={strapi.configurations.authLogo}\n defaultMenuLogo={strapi.configurations.menuLogo}\n showReleaseNotification={strapi.configurations.notifications.releases}\n >\n {children}\n </ConfigurationProvider>\n </GuidedTourProvider>\n </TrackingProvider>\n </NotificationsProvider>\n </HistoryProvider>\n </AuthProvider>\n </Theme>\n </LanguageProvider>\n </QueryClientProvider>\n </Provider>\n </StrapiAppProvider>\n );\n};\n\nexport { Providers };\n"],"names":["queryClient","QueryClient","defaultOptions","queries","refetchOnWindowFocus","Providers","children","strapi","store","_jsx","StrapiAppProvider","components","library","customFields","widgets","fields","menu","router","getAdminInjectedComponents","getPlugin","plugins","rbac","runHookParallel","runHookWaterfall","name","initialValue","runHookSeries","settings","Provider","QueryClientProvider","client","LanguageProvider","messages","configurations","translations","Theme","themes","AuthProvider","HistoryProvider","NotificationsProvider","TrackingProvider","GuidedTourProvider","ConfigurationProvider","defaultAuthLogo","authLogo","defaultMenuLogo","menuLogo","showReleaseNotification","notifications","releases"],"mappings":";;;;;;;;;;;;;;;;AAmBA,MAAMA,WAAAA,GAAc,IAAIC,sBAAAA,CAAY;IAClCC,cAAAA,EAAgB;QACdC,OAAAA,EAAS;YACPC,oBAAAA,EAAsB;AACxB;AACF;AACF,CAAA,CAAA;AAQA,MAAMC,SAAAA,GAAY,CAAC,EAAEC,QAAQ,EAAEC,MAAM,EAAEC,KAAK,EAAkB,GAAA;AAC5D,IAAA,qBACEC,cAAA,CAACC,2BAAAA,EAAAA;QACCC,UAAAA,EAAYJ,MAAAA,CAAOK,OAAO,CAACD,UAAU;AACrCE,QAAAA,YAAAA,EAAcN,OAAOM,YAAY;AACjCC,QAAAA,OAAAA,EAASP,OAAOO,OAAO;QACvBC,MAAAA,EAAQR,MAAAA,CAAOK,OAAO,CAACG,MAAM;QAC7BC,IAAAA,EAAMT,MAAAA,CAAOU,MAAM,CAACD,IAAI;AACxBE,QAAAA,0BAAAA,EAA4BX,OAAOW,0BAA0B;AAC7DC,QAAAA,SAAAA,EAAWZ,OAAOY,SAAS;AAC3BC,QAAAA,OAAAA,EAASb,OAAOa,OAAO;AACvBC,QAAAA,IAAAA,EAAMd,OAAOc,IAAI;AACjBC,QAAAA,eAAAA,EAAiBf,OAAOe,eAAe;AACvCC,QAAAA,gBAAAA,EAAkB,CAACC,IAAAA,EAAMC,YAAAA,GAAiBlB,OAAOgB,gBAAgB,CAACC,MAAMC,YAAAA,EAAcjB,KAAAA,CAAAA;AACtFkB,QAAAA,aAAAA,EAAenB,OAAOmB,aAAa;QACnCC,QAAAA,EAAUpB,MAAAA,CAAOU,MAAM,CAACU,QAAQ;AAEhC,QAAA,QAAA,gBAAAlB,cAAA,CAACmB,mBAAAA,EAAAA;YAASpB,KAAAA,EAAOA,KAAAA;AACf,YAAA,QAAA,gBAAAC,cAAA,CAACoB,8BAAAA,EAAAA;gBAAoBC,MAAAA,EAAQ9B,WAAAA;AAC3B,gBAAA,QAAA,gBAAAS,cAAA,CAACsB,iCAAAA,EAAAA;oBAAiBC,QAAAA,EAAUzB,MAAAA,CAAO0B,cAAc,CAACC,YAAY;AAC5D,oBAAA,QAAA,gBAAAzB,cAAA,CAAC0B,WAAAA,EAAAA;wBAAMC,MAAAA,EAAQ7B,MAAAA,CAAO0B,cAAc,CAACG,MAAM;AACzC,wBAAA,QAAA,gBAAA3B,cAAA,CAAC4B,iBAAAA,EAAAA;AACC,4BAAA,QAAA,gBAAA5B,cAAA,CAAC6B,0BAAAA,EAAAA;AACC,gCAAA,QAAA,gBAAA7B,cAAA,CAAC8B,mCAAAA,EAAAA;AACC,oCAAA,QAAA,gBAAA9B,cAAA,CAAC+B,yBAAAA,EAAAA;AACC,wCAAA,QAAA,gBAAA/B,cAAA,CAACgC,qCAAAA,EAAAA;AACC,4CAAA,QAAA,gBAAAhC,cAAA,CAACiC,mCAAAA,EAAAA;gDACCC,eAAAA,EAAiBpC,MAAAA,CAAO0B,cAAc,CAACW,QAAQ;gDAC/CC,eAAAA,EAAiBtC,MAAAA,CAAO0B,cAAc,CAACa,QAAQ;AAC/CC,gDAAAA,uBAAAA,EAAyBxC,MAAAA,CAAO0B,cAAc,CAACe,aAAa,CAACC,QAAQ;AAEpE3C,gDAAAA,QAAAA,EAAAA;;;;;;;;;;;;AAa3B;;;;"}
@@ -38,12 +38,12 @@ const Providers = ({ children, strapi, store })=>{
38
38
  store: store,
39
39
  children: /*#__PURE__*/ jsx(QueryClientProvider, {
40
40
  client: queryClient,
41
- children: /*#__PURE__*/ jsx(AuthProvider, {
42
- children: /*#__PURE__*/ jsx(HistoryProvider, {
43
- children: /*#__PURE__*/ jsx(LanguageProvider, {
44
- messages: strapi.configurations.translations,
45
- children: /*#__PURE__*/ jsx(Theme, {
46
- themes: strapi.configurations.themes,
41
+ children: /*#__PURE__*/ jsx(LanguageProvider, {
42
+ messages: strapi.configurations.translations,
43
+ children: /*#__PURE__*/ jsx(Theme, {
44
+ themes: strapi.configurations.themes,
45
+ children: /*#__PURE__*/ jsx(AuthProvider, {
46
+ children: /*#__PURE__*/ jsx(HistoryProvider, {
47
47
  children: /*#__PURE__*/ jsx(NotificationsProvider, {
48
48
  children: /*#__PURE__*/ jsx(TrackingProvider, {
49
49
  children: /*#__PURE__*/ jsx(GuidedTourProvider, {
@@ -1 +1 @@
1
- {"version":3,"file":"Providers.mjs","sources":["../../../../../admin/src/components/Providers.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { QueryClient, QueryClientProvider } from 'react-query';\nimport { Provider } from 'react-redux';\n\nimport { AuthProvider } from '../features/Auth';\nimport { HistoryProvider } from '../features/BackButton';\nimport { ConfigurationProvider } from '../features/Configuration';\nimport { NotificationsProvider } from '../features/Notifications';\nimport { StrapiAppProvider } from '../features/StrapiApp';\nimport { TrackingProvider } from '../features/Tracking';\n\nimport { GuidedTourProvider } from './GuidedTour/GuidedTourProvider';\nimport { LanguageProvider } from './LanguageProvider';\nimport { Theme } from './Theme';\n\nimport type { Store } from '../core/store/configure';\nimport type { StrapiApp } from '../StrapiApp';\n\nconst queryClient = new QueryClient({\n defaultOptions: {\n queries: {\n refetchOnWindowFocus: false,\n },\n },\n});\n\ninterface ProvidersProps {\n children: React.ReactNode;\n strapi: StrapiApp;\n store: Store;\n}\n\nconst Providers = ({ children, strapi, store }: ProvidersProps) => {\n return (\n <StrapiAppProvider\n components={strapi.library.components}\n customFields={strapi.customFields}\n widgets={strapi.widgets}\n fields={strapi.library.fields}\n menu={strapi.router.menu}\n getAdminInjectedComponents={strapi.getAdminInjectedComponents}\n getPlugin={strapi.getPlugin}\n plugins={strapi.plugins}\n rbac={strapi.rbac}\n runHookParallel={strapi.runHookParallel}\n runHookWaterfall={(name, initialValue) => strapi.runHookWaterfall(name, initialValue, store)}\n runHookSeries={strapi.runHookSeries}\n settings={strapi.router.settings}\n >\n <Provider store={store}>\n <QueryClientProvider client={queryClient}>\n <AuthProvider>\n <HistoryProvider>\n <LanguageProvider messages={strapi.configurations.translations}>\n <Theme themes={strapi.configurations.themes}>\n <NotificationsProvider>\n <TrackingProvider>\n <GuidedTourProvider>\n <ConfigurationProvider\n defaultAuthLogo={strapi.configurations.authLogo}\n defaultMenuLogo={strapi.configurations.menuLogo}\n showReleaseNotification={strapi.configurations.notifications.releases}\n >\n {children}\n </ConfigurationProvider>\n </GuidedTourProvider>\n </TrackingProvider>\n </NotificationsProvider>\n </Theme>\n </LanguageProvider>\n </HistoryProvider>\n </AuthProvider>\n </QueryClientProvider>\n </Provider>\n </StrapiAppProvider>\n );\n};\n\nexport { Providers };\n"],"names":["queryClient","QueryClient","defaultOptions","queries","refetchOnWindowFocus","Providers","children","strapi","store","_jsx","StrapiAppProvider","components","library","customFields","widgets","fields","menu","router","getAdminInjectedComponents","getPlugin","plugins","rbac","runHookParallel","runHookWaterfall","name","initialValue","runHookSeries","settings","Provider","QueryClientProvider","client","AuthProvider","HistoryProvider","LanguageProvider","messages","configurations","translations","Theme","themes","NotificationsProvider","TrackingProvider","GuidedTourProvider","ConfigurationProvider","defaultAuthLogo","authLogo","defaultMenuLogo","menuLogo","showReleaseNotification","notifications","releases"],"mappings":";;;;;;;;;;;;;;AAmBA,MAAMA,WAAAA,GAAc,IAAIC,WAAAA,CAAY;IAClCC,cAAAA,EAAgB;QACdC,OAAAA,EAAS;YACPC,oBAAAA,EAAsB;AACxB;AACF;AACF,CAAA,CAAA;AAQA,MAAMC,SAAAA,GAAY,CAAC,EAAEC,QAAQ,EAAEC,MAAM,EAAEC,KAAK,EAAkB,GAAA;AAC5D,IAAA,qBACEC,GAAA,CAACC,iBAAAA,EAAAA;QACCC,UAAAA,EAAYJ,MAAAA,CAAOK,OAAO,CAACD,UAAU;AACrCE,QAAAA,YAAAA,EAAcN,OAAOM,YAAY;AACjCC,QAAAA,OAAAA,EAASP,OAAOO,OAAO;QACvBC,MAAAA,EAAQR,MAAAA,CAAOK,OAAO,CAACG,MAAM;QAC7BC,IAAAA,EAAMT,MAAAA,CAAOU,MAAM,CAACD,IAAI;AACxBE,QAAAA,0BAAAA,EAA4BX,OAAOW,0BAA0B;AAC7DC,QAAAA,SAAAA,EAAWZ,OAAOY,SAAS;AAC3BC,QAAAA,OAAAA,EAASb,OAAOa,OAAO;AACvBC,QAAAA,IAAAA,EAAMd,OAAOc,IAAI;AACjBC,QAAAA,eAAAA,EAAiBf,OAAOe,eAAe;AACvCC,QAAAA,gBAAAA,EAAkB,CAACC,IAAAA,EAAMC,YAAAA,GAAiBlB,OAAOgB,gBAAgB,CAACC,MAAMC,YAAAA,EAAcjB,KAAAA,CAAAA;AACtFkB,QAAAA,aAAAA,EAAenB,OAAOmB,aAAa;QACnCC,QAAAA,EAAUpB,MAAAA,CAAOU,MAAM,CAACU,QAAQ;AAEhC,QAAA,QAAA,gBAAAlB,GAAA,CAACmB,QAAAA,EAAAA;YAASpB,KAAAA,EAAOA,KAAAA;AACf,YAAA,QAAA,gBAAAC,GAAA,CAACoB,mBAAAA,EAAAA;gBAAoBC,MAAAA,EAAQ9B,WAAAA;AAC3B,gBAAA,QAAA,gBAAAS,GAAA,CAACsB,YAAAA,EAAAA;AACC,oBAAA,QAAA,gBAAAtB,GAAA,CAACuB,eAAAA,EAAAA;AACC,wBAAA,QAAA,gBAAAvB,GAAA,CAACwB,gBAAAA,EAAAA;4BAAiBC,QAAAA,EAAU3B,MAAAA,CAAO4B,cAAc,CAACC,YAAY;AAC5D,4BAAA,QAAA,gBAAA3B,GAAA,CAAC4B,KAAAA,EAAAA;gCAAMC,MAAAA,EAAQ/B,MAAAA,CAAO4B,cAAc,CAACG,MAAM;AACzC,gCAAA,QAAA,gBAAA7B,GAAA,CAAC8B,qBAAAA,EAAAA;AACC,oCAAA,QAAA,gBAAA9B,GAAA,CAAC+B,gBAAAA,EAAAA;AACC,wCAAA,QAAA,gBAAA/B,GAAA,CAACgC,kBAAAA,EAAAA;AACC,4CAAA,QAAA,gBAAAhC,GAAA,CAACiC,qBAAAA,EAAAA;gDACCC,eAAAA,EAAiBpC,MAAAA,CAAO4B,cAAc,CAACS,QAAQ;gDAC/CC,eAAAA,EAAiBtC,MAAAA,CAAO4B,cAAc,CAACW,QAAQ;AAC/CC,gDAAAA,uBAAAA,EAAyBxC,MAAAA,CAAO4B,cAAc,CAACa,aAAa,CAACC,QAAQ;AAEpE3C,gDAAAA,QAAAA,EAAAA;;;;;;;;;;;;AAa3B;;;;"}
1
+ {"version":3,"file":"Providers.mjs","sources":["../../../../../admin/src/components/Providers.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { QueryClient, QueryClientProvider } from 'react-query';\nimport { Provider } from 'react-redux';\n\nimport { AuthProvider } from '../features/Auth';\nimport { HistoryProvider } from '../features/BackButton';\nimport { ConfigurationProvider } from '../features/Configuration';\nimport { NotificationsProvider } from '../features/Notifications';\nimport { StrapiAppProvider } from '../features/StrapiApp';\nimport { TrackingProvider } from '../features/Tracking';\n\nimport { GuidedTourProvider } from './GuidedTour/GuidedTourProvider';\nimport { LanguageProvider } from './LanguageProvider';\nimport { Theme } from './Theme';\n\nimport type { Store } from '../core/store/configure';\nimport type { StrapiApp } from '../StrapiApp';\n\nconst queryClient = new QueryClient({\n defaultOptions: {\n queries: {\n refetchOnWindowFocus: false,\n },\n },\n});\n\ninterface ProvidersProps {\n children: React.ReactNode;\n strapi: StrapiApp;\n store: Store;\n}\n\nconst Providers = ({ children, strapi, store }: ProvidersProps) => {\n return (\n <StrapiAppProvider\n components={strapi.library.components}\n customFields={strapi.customFields}\n widgets={strapi.widgets}\n fields={strapi.library.fields}\n menu={strapi.router.menu}\n getAdminInjectedComponents={strapi.getAdminInjectedComponents}\n getPlugin={strapi.getPlugin}\n plugins={strapi.plugins}\n rbac={strapi.rbac}\n runHookParallel={strapi.runHookParallel}\n runHookWaterfall={(name, initialValue) => strapi.runHookWaterfall(name, initialValue, store)}\n runHookSeries={strapi.runHookSeries}\n settings={strapi.router.settings}\n >\n <Provider store={store}>\n <QueryClientProvider client={queryClient}>\n <LanguageProvider messages={strapi.configurations.translations}>\n <Theme themes={strapi.configurations.themes}>\n <AuthProvider>\n <HistoryProvider>\n <NotificationsProvider>\n <TrackingProvider>\n <GuidedTourProvider>\n <ConfigurationProvider\n defaultAuthLogo={strapi.configurations.authLogo}\n defaultMenuLogo={strapi.configurations.menuLogo}\n showReleaseNotification={strapi.configurations.notifications.releases}\n >\n {children}\n </ConfigurationProvider>\n </GuidedTourProvider>\n </TrackingProvider>\n </NotificationsProvider>\n </HistoryProvider>\n </AuthProvider>\n </Theme>\n </LanguageProvider>\n </QueryClientProvider>\n </Provider>\n </StrapiAppProvider>\n );\n};\n\nexport { Providers };\n"],"names":["queryClient","QueryClient","defaultOptions","queries","refetchOnWindowFocus","Providers","children","strapi","store","_jsx","StrapiAppProvider","components","library","customFields","widgets","fields","menu","router","getAdminInjectedComponents","getPlugin","plugins","rbac","runHookParallel","runHookWaterfall","name","initialValue","runHookSeries","settings","Provider","QueryClientProvider","client","LanguageProvider","messages","configurations","translations","Theme","themes","AuthProvider","HistoryProvider","NotificationsProvider","TrackingProvider","GuidedTourProvider","ConfigurationProvider","defaultAuthLogo","authLogo","defaultMenuLogo","menuLogo","showReleaseNotification","notifications","releases"],"mappings":";;;;;;;;;;;;;;AAmBA,MAAMA,WAAAA,GAAc,IAAIC,WAAAA,CAAY;IAClCC,cAAAA,EAAgB;QACdC,OAAAA,EAAS;YACPC,oBAAAA,EAAsB;AACxB;AACF;AACF,CAAA,CAAA;AAQA,MAAMC,SAAAA,GAAY,CAAC,EAAEC,QAAQ,EAAEC,MAAM,EAAEC,KAAK,EAAkB,GAAA;AAC5D,IAAA,qBACEC,GAAA,CAACC,iBAAAA,EAAAA;QACCC,UAAAA,EAAYJ,MAAAA,CAAOK,OAAO,CAACD,UAAU;AACrCE,QAAAA,YAAAA,EAAcN,OAAOM,YAAY;AACjCC,QAAAA,OAAAA,EAASP,OAAOO,OAAO;QACvBC,MAAAA,EAAQR,MAAAA,CAAOK,OAAO,CAACG,MAAM;QAC7BC,IAAAA,EAAMT,MAAAA,CAAOU,MAAM,CAACD,IAAI;AACxBE,QAAAA,0BAAAA,EAA4BX,OAAOW,0BAA0B;AAC7DC,QAAAA,SAAAA,EAAWZ,OAAOY,SAAS;AAC3BC,QAAAA,OAAAA,EAASb,OAAOa,OAAO;AACvBC,QAAAA,IAAAA,EAAMd,OAAOc,IAAI;AACjBC,QAAAA,eAAAA,EAAiBf,OAAOe,eAAe;AACvCC,QAAAA,gBAAAA,EAAkB,CAACC,IAAAA,EAAMC,YAAAA,GAAiBlB,OAAOgB,gBAAgB,CAACC,MAAMC,YAAAA,EAAcjB,KAAAA,CAAAA;AACtFkB,QAAAA,aAAAA,EAAenB,OAAOmB,aAAa;QACnCC,QAAAA,EAAUpB,MAAAA,CAAOU,MAAM,CAACU,QAAQ;AAEhC,QAAA,QAAA,gBAAAlB,GAAA,CAACmB,QAAAA,EAAAA;YAASpB,KAAAA,EAAOA,KAAAA;AACf,YAAA,QAAA,gBAAAC,GAAA,CAACoB,mBAAAA,EAAAA;gBAAoBC,MAAAA,EAAQ9B,WAAAA;AAC3B,gBAAA,QAAA,gBAAAS,GAAA,CAACsB,gBAAAA,EAAAA;oBAAiBC,QAAAA,EAAUzB,MAAAA,CAAO0B,cAAc,CAACC,YAAY;AAC5D,oBAAA,QAAA,gBAAAzB,GAAA,CAAC0B,KAAAA,EAAAA;wBAAMC,MAAAA,EAAQ7B,MAAAA,CAAO0B,cAAc,CAACG,MAAM;AACzC,wBAAA,QAAA,gBAAA3B,GAAA,CAAC4B,YAAAA,EAAAA;AACC,4BAAA,QAAA,gBAAA5B,GAAA,CAAC6B,eAAAA,EAAAA;AACC,gCAAA,QAAA,gBAAA7B,GAAA,CAAC8B,qBAAAA,EAAAA;AACC,oCAAA,QAAA,gBAAA9B,GAAA,CAAC+B,gBAAAA,EAAAA;AACC,wCAAA,QAAA,gBAAA/B,GAAA,CAACgC,kBAAAA,EAAAA;AACC,4CAAA,QAAA,gBAAAhC,GAAA,CAACiC,qBAAAA,EAAAA;gDACCC,eAAAA,EAAiBpC,MAAAA,CAAO0B,cAAc,CAACW,QAAQ;gDAC/CC,eAAAA,EAAiBtC,MAAAA,CAAO0B,cAAc,CAACa,QAAQ;AAC/CC,gDAAAA,uBAAAA,EAAyBxC,MAAAA,CAAO0B,cAAc,CAACe,aAAa,CAACC,QAAQ;AAEpE3C,gDAAAA,QAAAA,EAAAA;;;;;;;;;;;;AAa3B;;;;"}
@@ -9,105 +9,75 @@ var dateFns = require('date-fns');
9
9
  var reactIntl = require('react-intl');
10
10
  var styledComponents = require('styled-components');
11
11
  var admin = require('../services/admin.js');
12
- var theme = require('../constants/theme.js');
13
12
  var usePersistentState = require('../hooks/usePersistentState.js');
13
+ var DismissibleBanner = require('./DismissibleBanner.js');
14
14
 
15
- const BannerBackground = styledComponents.styled(designSystem.Flex)`
16
- background: linear-gradient(
17
- 90deg,
18
- ${({ theme })=>theme.colors.primary600} 0%,
19
- ${({ theme })=>theme.colors.alternative600} 121.48%
20
- );
21
- position: relative;
22
- `;
23
- const FixedButtonWrapper = styledComponents.styled(designSystem.Box)`
15
+ /**
16
+ * Unlike `DismissibleBanner`'s own close button, this has no banner box left to
17
+ * anchor to once dismissed (the banner unmounts entirely), so it stays pinned
18
+ * to the viewport instead.
19
+ */ const FixedButtonWrapper = styledComponents.styled(designSystem.Box)`
24
20
  position: fixed;
25
21
  display: flex;
26
22
  flex-direction: column;
27
- z-index: 11;
23
+ z-index: 1;
28
24
  align-items: flex-end;
29
25
  top: 9px;
30
26
  right: 16px;
31
27
  `;
32
28
  const Banner = ({ isTrialEndedRecently, onDismiss })=>{
33
29
  const { formatMessage } = reactIntl.useIntl();
34
- return /*#__PURE__*/ jsxRuntime.jsxs(jsxRuntime.Fragment, {
35
- children: [
36
- /*#__PURE__*/ jsxRuntime.jsx(BannerBackground, {
37
- width: "100%",
38
- justifyContent: "center",
39
- children: /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
40
- justifyContent: "center",
41
- alignItems: "center",
42
- width: "100%",
43
- paddingTop: 2,
44
- paddingBottom: 2,
45
- paddingLeft: theme.RESPONSIVE_DEFAULT_SPACING,
46
- paddingRight: theme.RESPONSIVE_DEFAULT_SPACING,
47
- gap: 2,
48
- children: [
49
- /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Box, {
50
- children: [
51
- /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
52
- variant: "delta",
53
- fontWeight: "bold",
54
- textColor: "neutral0",
55
- textAlign: "center",
56
- fontSize: 2,
57
- children: formatMessage(isTrialEndedRecently ? {
58
- id: 'app.components.UpsellBanner.intro.ended',
59
- defaultMessage: 'Your trial has ended: '
60
- } : {
61
- id: 'app.components.UpsellBanner.intro',
62
- defaultMessage: 'Access to Growth plan features: '
63
- })
64
- }),
65
- /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
66
- variant: "delta",
67
- textColor: "neutral0",
68
- textAlign: "center",
69
- paddingRight: 4,
70
- fontSize: 2,
71
- children: formatMessage(isTrialEndedRecently ? {
72
- id: 'app.components.UpsellBanner.text.ended',
73
- defaultMessage: 'Keep access to Growth features by upgrading now.'
74
- } : {
75
- id: 'app.components.UpsellBanner.text',
76
- defaultMessage: 'As part of your trial, you can explore premium tools such as Content History, Releases, and Single Sign-On (SSO).'
77
- })
78
- })
79
- ]
80
- }),
81
- /*#__PURE__*/ jsxRuntime.jsx(designSystem.Box, {
82
- children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.LinkButton, {
83
- width: "max-content",
84
- variant: "tertiary",
85
- href: "https://billing.strapi.io",
86
- target: "_blank",
87
- children: formatMessage(isTrialEndedRecently ? {
88
- id: 'app.components.UpsellBanner.button.ended',
89
- defaultMessage: 'Keep Growth plan'
90
- } : {
91
- id: 'app.components.UpsellBanner.button',
92
- defaultMessage: 'Upgrade now'
93
- })
94
- })
95
- })
96
- ]
97
- })
98
- }),
99
- /*#__PURE__*/ jsxRuntime.jsx(FixedButtonWrapper, {
100
- children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.IconButton, {
101
- withTooltip: false,
102
- label: formatMessage({
103
- id: 'app.components.UpsellBanner.close',
104
- defaultMessage: 'Close'
105
- }),
106
- onClick: onDismiss,
107
- children: /*#__PURE__*/ jsxRuntime.jsx(icons.Cross, {})
30
+ return /*#__PURE__*/ jsxRuntime.jsx(DismissibleBanner.DismissibleBanner, {
31
+ onDismiss: onDismiss,
32
+ closeLabel: formatMessage({
33
+ id: 'app.components.UpsellBanner.close',
34
+ defaultMessage: 'Close'
35
+ }),
36
+ message: /*#__PURE__*/ jsxRuntime.jsxs(jsxRuntime.Fragment, {
37
+ children: [
38
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
39
+ variant: "delta",
40
+ fontWeight: "bold",
41
+ textColor: "neutral0",
42
+ textAlign: "center",
43
+ fontSize: 2,
44
+ children: formatMessage(isTrialEndedRecently ? {
45
+ id: 'app.components.UpsellBanner.intro.ended',
46
+ defaultMessage: 'Your trial has ended: '
47
+ } : {
48
+ id: 'app.components.UpsellBanner.intro',
49
+ defaultMessage: 'Access to Growth plan features: '
50
+ })
51
+ }),
52
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
53
+ variant: "delta",
54
+ textColor: "neutral0",
55
+ textAlign: "center",
56
+ paddingRight: 4,
57
+ fontSize: 2,
58
+ children: formatMessage(isTrialEndedRecently ? {
59
+ id: 'app.components.UpsellBanner.text.ended',
60
+ defaultMessage: 'Keep access to Growth features by upgrading now.'
61
+ } : {
62
+ id: 'app.components.UpsellBanner.text',
63
+ defaultMessage: 'As part of your trial, you can explore premium tools such as Content History, Releases, and Single Sign-On (SSO).'
64
+ })
108
65
  })
66
+ ]
67
+ }),
68
+ action: /*#__PURE__*/ jsxRuntime.jsx(designSystem.LinkButton, {
69
+ width: "max-content",
70
+ variant: "tertiary",
71
+ href: "https://billing.strapi.io",
72
+ target: "_blank",
73
+ children: formatMessage(isTrialEndedRecently ? {
74
+ id: 'app.components.UpsellBanner.button.ended',
75
+ defaultMessage: 'Keep Growth plan'
76
+ } : {
77
+ id: 'app.components.UpsellBanner.button',
78
+ defaultMessage: 'Upgrade now'
109
79
  })
110
- ]
80
+ })
111
81
  });
112
82
  };
113
83
  const UpsellBanner = ()=>{
@@ -1 +1 @@
1
- {"version":3,"file":"UpsellBanner.js","sources":["../../../../../admin/src/components/UpsellBanner.tsx"],"sourcesContent":["import { useEffect } from 'react';\n\nimport { useLicenseLimits } from '@strapi/admin/strapi-admin/ee';\nimport { Box, Flex, IconButton, LinkButton, Typography } from '@strapi/design-system';\nimport { ArrowsOut, Cross } from '@strapi/icons';\nimport { isAfter, isValid, subDays } from 'date-fns';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { useGetLicenseTrialTimeLeftQuery } from '../../src/services/admin';\nimport { RESPONSIVE_DEFAULT_SPACING } from '../constants/theme';\nimport { useScopedPersistentState } from '../hooks/usePersistentState';\n\nconst BannerBackground = styled(Flex)`\n background: linear-gradient(\n 90deg,\n ${({ theme }) => theme.colors.primary600} 0%,\n ${({ theme }) => theme.colors.alternative600} 121.48%\n );\n position: relative;\n`;\n\nconst FixedButtonWrapper = styled(Box)`\n position: fixed;\n display: flex;\n flex-direction: column;\n z-index: 11;\n align-items: flex-end;\n top: 9px;\n right: 16px;\n`;\n\nconst Banner = ({\n isTrialEndedRecently,\n onDismiss,\n}: {\n isTrialEndedRecently: boolean;\n onDismiss: () => void;\n}) => {\n const { formatMessage } = useIntl();\n\n return (\n <>\n <BannerBackground width=\"100%\" justifyContent=\"center\">\n <Flex\n justifyContent=\"center\"\n alignItems=\"center\"\n width=\"100%\"\n paddingTop={2}\n paddingBottom={2}\n paddingLeft={RESPONSIVE_DEFAULT_SPACING}\n paddingRight={RESPONSIVE_DEFAULT_SPACING}\n gap={2}\n >\n <Box>\n <Typography\n variant=\"delta\"\n fontWeight=\"bold\"\n textColor=\"neutral0\"\n textAlign=\"center\"\n fontSize={2}\n >\n {formatMessage(\n isTrialEndedRecently\n ? {\n id: 'app.components.UpsellBanner.intro.ended',\n defaultMessage: 'Your trial has ended: ',\n }\n : {\n id: 'app.components.UpsellBanner.intro',\n defaultMessage: 'Access to Growth plan features: ',\n }\n )}\n </Typography>\n <Typography\n variant=\"delta\"\n textColor=\"neutral0\"\n textAlign=\"center\"\n paddingRight={4}\n fontSize={2}\n >\n {formatMessage(\n isTrialEndedRecently\n ? {\n id: 'app.components.UpsellBanner.text.ended',\n defaultMessage: 'Keep access to Growth features by upgrading now.',\n }\n : {\n id: 'app.components.UpsellBanner.text',\n defaultMessage:\n 'As part of your trial, you can explore premium tools such as Content History, Releases, and Single Sign-On (SSO).',\n }\n )}\n </Typography>\n </Box>\n <Box>\n <LinkButton\n width=\"max-content\"\n variant=\"tertiary\"\n href=\"https://billing.strapi.io\"\n target=\"_blank\"\n >\n {formatMessage(\n isTrialEndedRecently\n ? {\n id: 'app.components.UpsellBanner.button.ended',\n defaultMessage: 'Keep Growth plan',\n }\n : {\n id: 'app.components.UpsellBanner.button',\n defaultMessage: 'Upgrade now',\n }\n )}\n </LinkButton>\n </Box>\n </Flex>\n </BannerBackground>\n <FixedButtonWrapper>\n <IconButton\n withTooltip={false}\n label={formatMessage({\n id: 'app.components.UpsellBanner.close',\n defaultMessage: 'Close',\n })}\n onClick={onDismiss}\n >\n <Cross />\n </IconButton>\n </FixedButtonWrapper>\n </>\n );\n};\n\nconst UpsellBanner = () => {\n const { license } = useLicenseLimits();\n const { formatMessage } = useIntl();\n\n const [cachedTrialEndsAt, setCachedTrialEndsAt] = useScopedPersistentState<string | undefined>(\n 'STRAPI_FREE_TRIAL_ENDS_AT',\n undefined\n );\n\n const [dismissedFor, setDismissedFor] = useScopedPersistentState<string | undefined>(\n 'STRAPI_UPSELL_BANNER_DISMISSED_FOR',\n undefined\n );\n\n const sevenDaysAgo = subDays(new Date(), 7);\n\n const timeLeftData = useGetLicenseTrialTimeLeftQuery(undefined, {\n skip: !license?.isTrial,\n });\n\n useEffect(() => {\n if (timeLeftData.data?.trialEndsAt) {\n setCachedTrialEndsAt(timeLeftData.data.trialEndsAt);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [timeLeftData.data?.trialEndsAt]);\n\n // When the license is not a trial + not EE, and the cached trial end date is found in the localstorage, that means the trial has ended\n // We show the banner to encourage the user to upgrade (for 7 days after the trial ends)\n const isTrialEndedRecently = Boolean(\n !license?.isTrial &&\n !window.strapi.isEE &&\n cachedTrialEndsAt &&\n isAfter(new Date(cachedTrialEndsAt), sevenDaysAgo)\n );\n\n const trialEndsAt = timeLeftData.data?.trialEndsAt ?? cachedTrialEndsAt;\n\n const toCanonicalISO = (v: string | undefined): string | undefined => {\n if (!v) return undefined;\n const date = new Date(v);\n return isValid(date) ? date.toISOString() : undefined;\n };\n\n const isDismissed = Boolean(\n trialEndsAt && toCanonicalISO(dismissedFor) === toCanonicalISO(trialEndsAt)\n );\n\n const handleDismiss = () => setDismissedFor(toCanonicalISO(trialEndsAt));\n const handleReopen = () => setDismissedFor(undefined);\n\n if (!(timeLeftData.data?.trialEndsAt || isTrialEndedRecently)) {\n return null;\n }\n\n if (isDismissed) {\n return (\n <FixedButtonWrapper>\n <IconButton\n withTooltip={false}\n label={formatMessage({\n id: 'app.components.UpsellBanner.reopen',\n defaultMessage: 'Reopen banner',\n })}\n onClick={handleReopen}\n >\n <ArrowsOut />\n </IconButton>\n </FixedButtonWrapper>\n );\n }\n\n return <Banner isTrialEndedRecently={isTrialEndedRecently} onDismiss={handleDismiss} />;\n};\n\nexport { UpsellBanner };\n"],"names":["BannerBackground","styled","Flex","theme","colors","primary600","alternative600","FixedButtonWrapper","Box","Banner","isTrialEndedRecently","onDismiss","formatMessage","useIntl","_jsxs","_Fragment","_jsx","width","justifyContent","alignItems","paddingTop","paddingBottom","paddingLeft","RESPONSIVE_DEFAULT_SPACING","paddingRight","gap","Typography","variant","fontWeight","textColor","textAlign","fontSize","id","defaultMessage","LinkButton","href","target","IconButton","withTooltip","label","onClick","Cross","UpsellBanner","license","useLicenseLimits","cachedTrialEndsAt","setCachedTrialEndsAt","useScopedPersistentState","undefined","dismissedFor","setDismissedFor","sevenDaysAgo","subDays","Date","timeLeftData","useGetLicenseTrialTimeLeftQuery","skip","isTrial","useEffect","data","trialEndsAt","Boolean","window","strapi","isEE","isAfter","toCanonicalISO","v","date","isValid","toISOString","isDismissed","handleDismiss","handleReopen","ArrowsOut"],"mappings":"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"}
1
+ {"version":3,"file":"UpsellBanner.js","sources":["../../../../../admin/src/components/UpsellBanner.tsx"],"sourcesContent":["import { useEffect } from 'react';\n\nimport { useLicenseLimits } from '@strapi/admin/strapi-admin/ee';\nimport { Box, IconButton, LinkButton, Typography } from '@strapi/design-system';\nimport { ArrowsOut } from '@strapi/icons';\nimport { isAfter, isValid, subDays } from 'date-fns';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { useGetLicenseTrialTimeLeftQuery } from '../../src/services/admin';\nimport { useScopedPersistentState } from '../hooks/usePersistentState';\n\nimport { DismissibleBanner } from './DismissibleBanner';\n\n/**\n * Unlike `DismissibleBanner`'s own close button, this has no banner box left to\n * anchor to once dismissed (the banner unmounts entirely), so it stays pinned\n * to the viewport instead.\n */\nconst FixedButtonWrapper = styled(Box)`\n position: fixed;\n display: flex;\n flex-direction: column;\n z-index: 1;\n align-items: flex-end;\n top: 9px;\n right: 16px;\n`;\n\nconst Banner = ({\n isTrialEndedRecently,\n onDismiss,\n}: {\n isTrialEndedRecently: boolean;\n onDismiss: () => void;\n}) => {\n const { formatMessage } = useIntl();\n\n return (\n <DismissibleBanner\n onDismiss={onDismiss}\n closeLabel={formatMessage({\n id: 'app.components.UpsellBanner.close',\n defaultMessage: 'Close',\n })}\n message={\n <>\n <Typography\n variant=\"delta\"\n fontWeight=\"bold\"\n textColor=\"neutral0\"\n textAlign=\"center\"\n fontSize={2}\n >\n {formatMessage(\n isTrialEndedRecently\n ? {\n id: 'app.components.UpsellBanner.intro.ended',\n defaultMessage: 'Your trial has ended: ',\n }\n : {\n id: 'app.components.UpsellBanner.intro',\n defaultMessage: 'Access to Growth plan features: ',\n }\n )}\n </Typography>\n <Typography\n variant=\"delta\"\n textColor=\"neutral0\"\n textAlign=\"center\"\n paddingRight={4}\n fontSize={2}\n >\n {formatMessage(\n isTrialEndedRecently\n ? {\n id: 'app.components.UpsellBanner.text.ended',\n defaultMessage: 'Keep access to Growth features by upgrading now.',\n }\n : {\n id: 'app.components.UpsellBanner.text',\n defaultMessage:\n 'As part of your trial, you can explore premium tools such as Content History, Releases, and Single Sign-On (SSO).',\n }\n )}\n </Typography>\n </>\n }\n action={\n <LinkButton\n width=\"max-content\"\n variant=\"tertiary\"\n href=\"https://billing.strapi.io\"\n target=\"_blank\"\n >\n {formatMessage(\n isTrialEndedRecently\n ? {\n id: 'app.components.UpsellBanner.button.ended',\n defaultMessage: 'Keep Growth plan',\n }\n : {\n id: 'app.components.UpsellBanner.button',\n defaultMessage: 'Upgrade now',\n }\n )}\n </LinkButton>\n }\n />\n );\n};\n\nconst UpsellBanner = () => {\n const { license } = useLicenseLimits();\n const { formatMessage } = useIntl();\n\n const [cachedTrialEndsAt, setCachedTrialEndsAt] = useScopedPersistentState<string | undefined>(\n 'STRAPI_FREE_TRIAL_ENDS_AT',\n undefined\n );\n\n const [dismissedFor, setDismissedFor] = useScopedPersistentState<string | undefined>(\n 'STRAPI_UPSELL_BANNER_DISMISSED_FOR',\n undefined\n );\n\n const sevenDaysAgo = subDays(new Date(), 7);\n\n const timeLeftData = useGetLicenseTrialTimeLeftQuery(undefined, {\n skip: !license?.isTrial,\n });\n\n useEffect(() => {\n if (timeLeftData.data?.trialEndsAt) {\n setCachedTrialEndsAt(timeLeftData.data.trialEndsAt);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [timeLeftData.data?.trialEndsAt]);\n\n // When the license is not a trial + not EE, and the cached trial end date is found in the localstorage, that means the trial has ended\n // We show the banner to encourage the user to upgrade (for 7 days after the trial ends)\n const isTrialEndedRecently = Boolean(\n !license?.isTrial &&\n !window.strapi.isEE &&\n cachedTrialEndsAt &&\n isAfter(new Date(cachedTrialEndsAt), sevenDaysAgo)\n );\n\n const trialEndsAt = timeLeftData.data?.trialEndsAt ?? cachedTrialEndsAt;\n\n const toCanonicalISO = (v: string | undefined): string | undefined => {\n if (!v) return undefined;\n const date = new Date(v);\n return isValid(date) ? date.toISOString() : undefined;\n };\n\n const isDismissed = Boolean(\n trialEndsAt && toCanonicalISO(dismissedFor) === toCanonicalISO(trialEndsAt)\n );\n\n const handleDismiss = () => setDismissedFor(toCanonicalISO(trialEndsAt));\n const handleReopen = () => setDismissedFor(undefined);\n\n if (!(timeLeftData.data?.trialEndsAt || isTrialEndedRecently)) {\n return null;\n }\n\n if (isDismissed) {\n return (\n <FixedButtonWrapper>\n <IconButton\n withTooltip={false}\n label={formatMessage({\n id: 'app.components.UpsellBanner.reopen',\n defaultMessage: 'Reopen banner',\n })}\n onClick={handleReopen}\n >\n <ArrowsOut />\n </IconButton>\n </FixedButtonWrapper>\n );\n }\n\n return <Banner isTrialEndedRecently={isTrialEndedRecently} onDismiss={handleDismiss} />;\n};\n\nexport { UpsellBanner };\n"],"names":["FixedButtonWrapper","styled","Box","Banner","isTrialEndedRecently","onDismiss","formatMessage","useIntl","_jsx","DismissibleBanner","closeLabel","id","defaultMessage","message","_jsxs","_Fragment","Typography","variant","fontWeight","textColor","textAlign","fontSize","paddingRight","action","LinkButton","width","href","target","UpsellBanner","license","useLicenseLimits","cachedTrialEndsAt","setCachedTrialEndsAt","useScopedPersistentState","undefined","dismissedFor","setDismissedFor","sevenDaysAgo","subDays","Date","timeLeftData","useGetLicenseTrialTimeLeftQuery","skip","isTrial","useEffect","data","trialEndsAt","Boolean","window","strapi","isEE","isAfter","toCanonicalISO","v","date","isValid","toISOString","isDismissed","handleDismiss","handleReopen","IconButton","withTooltip","label","onClick","ArrowsOut"],"mappings":"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"}