@strapi/admin 5.18.0 → 5.19.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 (90) hide show
  1. package/dist/admin/admin/src/components/GuidedTour/Provider.js +2 -1
  2. package/dist/admin/admin/src/components/GuidedTour/Provider.js.map +1 -1
  3. package/dist/admin/admin/src/components/GuidedTour/Provider.mjs +2 -1
  4. package/dist/admin/admin/src/components/GuidedTour/Provider.mjs.map +1 -1
  5. package/dist/admin/admin/src/components/LeftMenu.js +52 -29
  6. package/dist/admin/admin/src/components/LeftMenu.js.map +1 -1
  7. package/dist/admin/admin/src/components/LeftMenu.mjs +52 -29
  8. package/dist/admin/admin/src/components/LeftMenu.mjs.map +1 -1
  9. package/dist/admin/admin/src/components/MainNav/NavLink.js +4 -42
  10. package/dist/admin/admin/src/components/MainNav/NavLink.js.map +1 -1
  11. package/dist/admin/admin/src/components/MainNav/NavLink.mjs +4 -23
  12. package/dist/admin/admin/src/components/MainNav/NavLink.mjs.map +1 -1
  13. package/dist/admin/admin/src/components/NpsSurvey.js +1 -1
  14. package/dist/admin/admin/src/components/NpsSurvey.js.map +1 -1
  15. package/dist/admin/admin/src/components/NpsSurvey.mjs +1 -1
  16. package/dist/admin/admin/src/components/NpsSurvey.mjs.map +1 -1
  17. package/dist/admin/admin/src/components/SubNav.js +17 -11
  18. package/dist/admin/admin/src/components/SubNav.js.map +1 -1
  19. package/dist/admin/admin/src/components/SubNav.mjs +18 -12
  20. package/dist/admin/admin/src/components/SubNav.mjs.map +1 -1
  21. package/dist/admin/admin/src/components/UnstableGuidedTour/Context.js +30 -0
  22. package/dist/admin/admin/src/components/UnstableGuidedTour/Context.js.map +1 -1
  23. package/dist/admin/admin/src/components/UnstableGuidedTour/Context.mjs +30 -0
  24. package/dist/admin/admin/src/components/UnstableGuidedTour/Context.mjs.map +1 -1
  25. package/dist/admin/admin/src/components/UnstableGuidedTour/Overview.js +53 -16
  26. package/dist/admin/admin/src/components/UnstableGuidedTour/Overview.js.map +1 -1
  27. package/dist/admin/admin/src/components/UnstableGuidedTour/Overview.mjs +54 -17
  28. package/dist/admin/admin/src/components/UnstableGuidedTour/Overview.mjs.map +1 -1
  29. package/dist/admin/admin/src/components/UnstableGuidedTour/Step.js +83 -37
  30. package/dist/admin/admin/src/components/UnstableGuidedTour/Step.js.map +1 -1
  31. package/dist/admin/admin/src/components/UnstableGuidedTour/Step.mjs +85 -40
  32. package/dist/admin/admin/src/components/UnstableGuidedTour/Step.mjs.map +1 -1
  33. package/dist/admin/admin/src/components/UnstableGuidedTour/Tours.js +73 -51
  34. package/dist/admin/admin/src/components/UnstableGuidedTour/Tours.js.map +1 -1
  35. package/dist/admin/admin/src/components/UnstableGuidedTour/Tours.mjs +69 -47
  36. package/dist/admin/admin/src/components/UnstableGuidedTour/Tours.mjs.map +1 -1
  37. package/dist/admin/admin/src/components/UpsellBanner.js +1 -1
  38. package/dist/admin/admin/src/components/UpsellBanner.js.map +1 -1
  39. package/dist/admin/admin/src/components/UpsellBanner.mjs +2 -2
  40. package/dist/admin/admin/src/components/UpsellBanner.mjs.map +1 -1
  41. package/dist/admin/admin/src/features/Tracking.js +34 -1
  42. package/dist/admin/admin/src/features/Tracking.js.map +1 -1
  43. package/dist/admin/admin/src/features/Tracking.mjs +34 -1
  44. package/dist/admin/admin/src/features/Tracking.mjs.map +1 -1
  45. package/dist/admin/admin/src/hooks/usePersistentState.js +10 -0
  46. package/dist/admin/admin/src/hooks/usePersistentState.js.map +1 -1
  47. package/dist/admin/admin/src/hooks/usePersistentState.mjs +10 -1
  48. package/dist/admin/admin/src/hooks/usePersistentState.mjs.map +1 -1
  49. package/dist/admin/admin/src/pages/Home/HomePage.js +1 -0
  50. package/dist/admin/admin/src/pages/Home/HomePage.js.map +1 -1
  51. package/dist/admin/admin/src/pages/Home/HomePage.mjs +1 -0
  52. package/dist/admin/admin/src/pages/Home/HomePage.mjs.map +1 -1
  53. package/dist/admin/admin/src/pages/Home/components/FreeTrialEndedModal.js +2 -2
  54. package/dist/admin/admin/src/pages/Home/components/FreeTrialEndedModal.js.map +1 -1
  55. package/dist/admin/admin/src/pages/Home/components/FreeTrialEndedModal.mjs +3 -3
  56. package/dist/admin/admin/src/pages/Home/components/FreeTrialEndedModal.mjs.map +1 -1
  57. package/dist/admin/admin/src/pages/Home/components/FreeTrialWelcomeModal.js +1 -1
  58. package/dist/admin/admin/src/pages/Home/components/FreeTrialWelcomeModal.js.map +1 -1
  59. package/dist/admin/admin/src/pages/Home/components/FreeTrialWelcomeModal.mjs +2 -2
  60. package/dist/admin/admin/src/pages/Home/components/FreeTrialWelcomeModal.mjs.map +1 -1
  61. package/dist/admin/admin/src/pages/ProfilePage.js +297 -254
  62. package/dist/admin/admin/src/pages/ProfilePage.js.map +1 -1
  63. package/dist/admin/admin/src/pages/ProfilePage.mjs +297 -254
  64. package/dist/admin/admin/src/pages/ProfilePage.mjs.map +1 -1
  65. package/dist/admin/admin/src/pages/Settings/components/SettingsNav.js +12 -1
  66. package/dist/admin/admin/src/pages/Settings/components/SettingsNav.js.map +1 -1
  67. package/dist/admin/admin/src/pages/Settings/components/SettingsNav.mjs +12 -1
  68. package/dist/admin/admin/src/pages/Settings/components/SettingsNav.mjs.map +1 -1
  69. package/dist/admin/admin/src/pages/UseCasePage.js +1 -1
  70. package/dist/admin/admin/src/pages/UseCasePage.js.map +1 -1
  71. package/dist/admin/admin/src/pages/UseCasePage.mjs +1 -1
  72. package/dist/admin/admin/src/pages/UseCasePage.mjs.map +1 -1
  73. package/dist/admin/admin/src/translations/en.json.js +14 -1
  74. package/dist/admin/admin/src/translations/en.json.js.map +1 -1
  75. package/dist/admin/admin/src/translations/en.json.mjs +14 -1
  76. package/dist/admin/admin/src/translations/en.json.mjs.map +1 -1
  77. package/dist/admin/admin/src/translations/es.json.js +2 -1
  78. package/dist/admin/admin/src/translations/es.json.js.map +1 -1
  79. package/dist/admin/admin/src/translations/es.json.mjs +2 -1
  80. package/dist/admin/admin/src/translations/es.json.mjs.map +1 -1
  81. package/dist/admin/ee/admin/src/constants.js +4 -2
  82. package/dist/admin/ee/admin/src/constants.js.map +1 -1
  83. package/dist/admin/ee/admin/src/constants.mjs +4 -2
  84. package/dist/admin/ee/admin/src/constants.mjs.map +1 -1
  85. package/dist/admin/src/components/SubNav.d.ts +2 -1
  86. package/dist/admin/src/components/UnstableGuidedTour/Context.d.ts +2 -0
  87. package/dist/admin/src/components/UnstableGuidedTour/Step.d.ts +9 -3
  88. package/dist/admin/src/features/Tracking.d.ts +22 -3
  89. package/dist/admin/src/hooks/usePersistentState.d.ts +2 -1
  90. package/package.json +9 -9
@@ -1,21 +1,30 @@
1
1
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
2
2
  import * as React from 'react';
3
- import { Box, Flex, LinkButton, Portal, Popover } from '@strapi/design-system';
3
+ import { Box, Portal, Popover, Button } from '@strapi/design-system';
4
4
  import { FormattedMessage } from 'react-intl';
5
- import { NavLink } from 'react-router-dom';
6
5
  import { styled } from 'styled-components';
7
6
  import { useGetGuidedTourMetaQuery } from '../../services/admin.mjs';
8
7
  import { unstableUseGuidedTour } from './Context.mjs';
9
- import { createStepComponents } from './Step.mjs';
8
+ import { StepCount, createStepComponents } from './Step.mjs';
10
9
 
11
10
  /* -------------------------------------------------------------------------------------------------
12
11
  * Tours
13
- * -----------------------------------------------------------------------------------------------*/ const tours = {
12
+ * -----------------------------------------------------------------------------------------------*/ const GotItAction = ({ onClick })=>{
13
+ return /*#__PURE__*/ jsx(Button, {
14
+ onClick: onClick,
15
+ children: /*#__PURE__*/ jsx(FormattedMessage, {
16
+ id: "tours.gotIt",
17
+ defaultMessage: "Got it"
18
+ })
19
+ });
20
+ };
21
+ const tours = {
14
22
  contentTypeBuilder: createTour('contentTypeBuilder', [
15
23
  {
16
24
  name: 'Introduction',
17
25
  content: (Step)=>/*#__PURE__*/ jsxs(Step.Root, {
18
26
  side: "bottom",
27
+ withArrow: false,
19
28
  children: [
20
29
  /*#__PURE__*/ jsx(Step.Title, {
21
30
  id: "tours.contentTypeBuilder.Introduction.title",
@@ -35,7 +44,7 @@ import { createStepComponents } from './Step.mjs';
35
44
  name: 'CollectionTypes',
36
45
  content: (Step)=>/*#__PURE__*/ jsxs(Step.Root, {
37
46
  side: "right",
38
- sideOffset: 26,
47
+ sideOffset: 16,
39
48
  children: [
40
49
  /*#__PURE__*/ jsx(Step.Title, {
41
50
  id: "tours.contentTypeBuilder.CollectionTypes.title",
@@ -43,7 +52,7 @@ import { createStepComponents } from './Step.mjs';
43
52
  }),
44
53
  /*#__PURE__*/ jsx(Step.Content, {
45
54
  id: "tours.contentTypeBuilder.CollectionTypes.content",
46
- defaultMessage: "Create and manage your content structure with collection types, single types and components."
55
+ defaultMessage: "A content structure that can manage multiple entries, such as articles or products."
47
56
  }),
48
57
  /*#__PURE__*/ jsx(Step.Actions, {})
49
58
  ]
@@ -53,7 +62,7 @@ import { createStepComponents } from './Step.mjs';
53
62
  name: 'SingleTypes',
54
63
  content: (Step)=>/*#__PURE__*/ jsxs(Step.Root, {
55
64
  side: "right",
56
- sideOffset: 26,
65
+ sideOffset: 16,
57
66
  children: [
58
67
  /*#__PURE__*/ jsx(Step.Title, {
59
68
  id: "tours.contentTypeBuilder.SingleTypes.title",
@@ -69,9 +78,9 @@ import { createStepComponents } from './Step.mjs';
69
78
  },
70
79
  {
71
80
  name: 'Components',
72
- content: (Step)=>/*#__PURE__*/ jsxs(Step.Root, {
81
+ content: (Step, { dispatch })=>/*#__PURE__*/ jsxs(Step.Root, {
73
82
  side: "right",
74
- sideOffset: 26,
83
+ sideOffset: 16,
75
84
  children: [
76
85
  /*#__PURE__*/ jsx(Step.Title, {
77
86
  id: "tours.contentTypeBuilder.Components.title",
@@ -81,7 +90,19 @@ import { createStepComponents } from './Step.mjs';
81
90
  id: "tours.contentTypeBuilder.Components.content",
82
91
  defaultMessage: "A reusable content structure that can be used across multiple content types, such as buttons, sliders or cards."
83
92
  }),
84
- /*#__PURE__*/ jsx(Step.Actions, {})
93
+ /*#__PURE__*/ jsxs(Step.Actions, {
94
+ children: [
95
+ /*#__PURE__*/ jsx(StepCount, {
96
+ tourName: "contentTypeBuilder"
97
+ }),
98
+ /*#__PURE__*/ jsx(GotItAction, {
99
+ onClick: ()=>dispatch({
100
+ type: 'next_step',
101
+ payload: 'contentTypeBuilder'
102
+ })
103
+ })
104
+ ]
105
+ })
85
106
  ]
86
107
  })
87
108
  },
@@ -89,7 +110,6 @@ import { createStepComponents } from './Step.mjs';
89
110
  name: 'Finish',
90
111
  content: (Step)=>/*#__PURE__*/ jsxs(Step.Root, {
91
112
  side: "right",
92
- sideOffset: 32,
93
113
  children: [
94
114
  /*#__PURE__*/ jsx(Step.Title, {
95
115
  id: "tours.contentTypeBuilder.Finish.title",
@@ -111,8 +131,10 @@ import { createStepComponents } from './Step.mjs';
111
131
  contentManager: createTour('contentManager', [
112
132
  {
113
133
  name: 'Introduction',
134
+ when: (completedActions)=>completedActions.includes('didCreateContentTypeSchema'),
114
135
  content: (Step)=>/*#__PURE__*/ jsxs(Step.Root, {
115
136
  side: "top",
137
+ withArrow: false,
116
138
  children: [
117
139
  /*#__PURE__*/ jsx(Step.Title, {
118
140
  id: "tours.contentManager.Introduction.title",
@@ -131,9 +153,7 @@ import { createStepComponents } from './Step.mjs';
131
153
  {
132
154
  name: 'Fields',
133
155
  content: (Step)=>/*#__PURE__*/ jsxs(Step.Root, {
134
- side: 'top',
135
- align: "start",
136
- sideOffset: -36,
156
+ sideOffset: -12,
137
157
  children: [
138
158
  /*#__PURE__*/ jsx(Step.Title, {
139
159
  id: "tours.contentManager.Fields.title",
@@ -149,10 +169,9 @@ import { createStepComponents } from './Step.mjs';
149
169
  },
150
170
  {
151
171
  name: 'Publish',
152
- content: (Step)=>/*#__PURE__*/ jsxs(Step.Root, {
172
+ content: (Step, { dispatch })=>/*#__PURE__*/ jsxs(Step.Root, {
153
173
  side: "left",
154
174
  align: "center",
155
- sideOffset: 20,
156
175
  children: [
157
176
  /*#__PURE__*/ jsx(Step.Title, {
158
177
  id: "tours.contentManager.Publish.title",
@@ -162,7 +181,19 @@ import { createStepComponents } from './Step.mjs';
162
181
  id: "tours.contentManager.Publish.content",
163
182
  defaultMessage: "Publish entries to make their content available through the Document Service API."
164
183
  }),
165
- /*#__PURE__*/ jsx(Step.Actions, {})
184
+ /*#__PURE__*/ jsxs(Step.Actions, {
185
+ children: [
186
+ /*#__PURE__*/ jsx(StepCount, {
187
+ tourName: "contentManager"
188
+ }),
189
+ /*#__PURE__*/ jsx(GotItAction, {
190
+ onClick: ()=>dispatch({
191
+ type: 'next_step',
192
+ payload: 'contentManager'
193
+ })
194
+ })
195
+ ]
196
+ })
166
197
  ]
167
198
  })
168
199
  },
@@ -170,7 +201,6 @@ import { createStepComponents } from './Step.mjs';
170
201
  name: 'Finish',
171
202
  content: (Step)=>/*#__PURE__*/ jsxs(Step.Root, {
172
203
  side: "right",
173
- sideOffset: 32,
174
204
  children: [
175
205
  /*#__PURE__*/ jsx(Step.Title, {
176
206
  id: "tours.contentManager.FinalStep.title",
@@ -194,6 +224,7 @@ import { createStepComponents } from './Step.mjs';
194
224
  name: 'Introduction',
195
225
  content: (Step)=>/*#__PURE__*/ jsxs(Step.Root, {
196
226
  sideOffset: -36,
227
+ withArrow: false,
197
228
  children: [
198
229
  /*#__PURE__*/ jsx(Step.Title, {
199
230
  id: "tours.apiTokens.Introduction.title",
@@ -207,15 +238,14 @@ import { createStepComponents } from './Step.mjs';
207
238
  showSkip: true
208
239
  })
209
240
  ]
210
- }),
211
- when: (completedActions)=>!completedActions.includes('didCreateApiToken')
241
+ })
212
242
  },
213
243
  {
214
244
  name: 'CreateAnAPIToken',
215
245
  content: (Step)=>/*#__PURE__*/ jsxs(Step.Root, {
216
246
  side: "bottom",
217
- sideOffset: 20,
218
247
  align: "end",
248
+ sideOffset: -10,
219
249
  children: [
220
250
  /*#__PURE__*/ jsx(Step.Title, {
221
251
  id: "tours.apiTokens.CreateAnAPIToken.title",
@@ -231,9 +261,10 @@ import { createStepComponents } from './Step.mjs';
231
261
  },
232
262
  {
233
263
  name: 'CopyAPIToken',
234
- content: (Step)=>/*#__PURE__*/ jsxs(Step.Root, {
264
+ content: (Step, { dispatch })=>/*#__PURE__*/ jsxs(Step.Root, {
235
265
  side: "bottom",
236
266
  align: "start",
267
+ sideOffset: -5,
237
268
  children: [
238
269
  /*#__PURE__*/ jsx(Step.Title, {
239
270
  id: "tours.apiTokens.CopyAPIToken.title",
@@ -243,19 +274,28 @@ import { createStepComponents } from './Step.mjs';
243
274
  id: "tours.apiTokens.CopyAPIToken.content",
244
275
  defaultMessage: "Make sure to do it now, you won’t be able to see it again. You’ll need to generate a new one if you lose it."
245
276
  }),
246
- /*#__PURE__*/ jsx(Step.Actions, {})
277
+ /*#__PURE__*/ jsxs(Step.Actions, {
278
+ children: [
279
+ /*#__PURE__*/ jsx(StepCount, {
280
+ tourName: "apiTokens"
281
+ }),
282
+ /*#__PURE__*/ jsx(GotItAction, {
283
+ onClick: ()=>dispatch({
284
+ type: 'next_step',
285
+ payload: 'apiTokens'
286
+ })
287
+ })
288
+ ]
289
+ })
247
290
  ]
248
291
  }),
249
292
  when: (completedActions)=>completedActions.includes('didCreateApiToken')
250
293
  },
251
294
  {
252
295
  name: 'Finish',
253
- content: (Step)=>{
254
- const dispatch = unstableUseGuidedTour('GuidedTourPopover', (s)=>s.dispatch);
255
- return /*#__PURE__*/ jsxs(Step.Root, {
296
+ content: (Step)=>/*#__PURE__*/ jsxs(Step.Root, {
256
297
  side: "right",
257
298
  align: "start",
258
- sideOffset: 32,
259
299
  children: [
260
300
  /*#__PURE__*/ jsx(Step.Title, {
261
301
  id: "tours.apiTokens.FinalStep.title",
@@ -267,28 +307,10 @@ import { createStepComponents } from './Step.mjs';
267
307
  }),
268
308
  /*#__PURE__*/ jsx(Step.Actions, {
269
309
  showStepCount: false,
270
- children: /*#__PURE__*/ jsx(Flex, {
271
- justifyContent: "end",
272
- width: '100%',
273
- children: /*#__PURE__*/ jsx(LinkButton, {
274
- onClick: ()=>{
275
- dispatch({
276
- type: 'next_step',
277
- payload: 'apiTokens'
278
- });
279
- },
280
- tag: NavLink,
281
- to: "/",
282
- children: /*#__PURE__*/ jsx(FormattedMessage, {
283
- id: "tours.gotIt",
284
- defaultMessage: "Got it"
285
- })
286
- })
287
- })
310
+ to: "/"
288
311
  })
289
312
  ]
290
- });
291
- },
313
+ }),
292
314
  when: (completedActions)=>completedActions.includes('didCopyApiToken')
293
315
  }
294
316
  ]),
@@ -1 +1 @@
1
- {"version":3,"file":"Tours.mjs","sources":["../../../../../../admin/src/components/UnstableGuidedTour/Tours.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Box, Popover, Portal, Flex, LinkButton } from '@strapi/design-system';\nimport { FormattedMessage } from 'react-intl';\nimport { NavLink } from 'react-router-dom';\nimport { styled } from 'styled-components';\n\nimport { useGetGuidedTourMetaQuery } from '../../services/admin';\n\nimport {\n type State,\n type Action,\n unstableUseGuidedTour,\n ValidTourName,\n ExtendedCompletedActions,\n} from './Context';\nimport { Step, createStepComponents } from './Step';\n\n/* -------------------------------------------------------------------------------------------------\n * Tours\n * -----------------------------------------------------------------------------------------------*/\n\nconst tours = {\n contentTypeBuilder: createTour('contentTypeBuilder', [\n {\n name: 'Introduction',\n content: (Step) => (\n <Step.Root side=\"bottom\">\n <Step.Title\n id=\"tours.contentTypeBuilder.Introduction.title\"\n defaultMessage=\"Content-Type Builder\"\n />\n <Step.Content\n id=\"tours.contentTypeBuilder.Introduction.content\"\n defaultMessage=\"Create and manage your content structure with collection types, single types and components.\"\n />\n <Step.Actions showSkip />\n </Step.Root>\n ),\n },\n {\n name: 'CollectionTypes',\n content: (Step) => (\n <Step.Root side=\"right\" sideOffset={26}>\n <Step.Title\n id=\"tours.contentTypeBuilder.CollectionTypes.title\"\n defaultMessage=\"Collection Types\"\n />\n <Step.Content\n id=\"tours.contentTypeBuilder.CollectionTypes.content\"\n defaultMessage=\"Create and manage your content structure with collection types, single types and components.\"\n />\n <Step.Actions />\n </Step.Root>\n ),\n },\n {\n name: 'SingleTypes',\n content: (Step) => (\n <Step.Root side=\"right\" sideOffset={26}>\n <Step.Title\n id=\"tours.contentTypeBuilder.SingleTypes.title\"\n defaultMessage=\"Single Types\"\n />\n <Step.Content\n id=\"tours.contentTypeBuilder.SingleTypes.content\"\n defaultMessage=\"A content structure that can manage a single entry, such as a homepage or a header.\"\n />\n <Step.Actions />\n </Step.Root>\n ),\n },\n {\n name: 'Components',\n content: (Step) => (\n <Step.Root side=\"right\" sideOffset={26}>\n <Step.Title id=\"tours.contentTypeBuilder.Components.title\" defaultMessage=\"Components\" />\n <Step.Content\n id=\"tours.contentTypeBuilder.Components.content\"\n defaultMessage=\"A reusable content structure that can be used across multiple content types, such as buttons, sliders or cards.\"\n />\n <Step.Actions />\n </Step.Root>\n ),\n },\n {\n name: 'Finish',\n content: (Step) => (\n <Step.Root side=\"right\" sideOffset={32}>\n <Step.Title\n id=\"tours.contentTypeBuilder.Finish.title\"\n defaultMessage=\"It’s time to create content!\"\n />\n <Step.Content\n id=\"tours.contentTypeBuilder.Finish.content\"\n defaultMessage=\"Now that you created content types, you’ll be able to create content in the content manager.\"\n />\n <Step.Actions showStepCount={false} to=\"/content-manager\" />\n </Step.Root>\n ),\n when: (completedActions) => completedActions.includes('didCreateContentTypeSchema'),\n },\n ]),\n contentManager: createTour('contentManager', [\n {\n name: 'Introduction',\n content: (Step) => (\n <Step.Root side=\"top\">\n <Step.Title\n id=\"tours.contentManager.Introduction.title\"\n defaultMessage=\"Content manager\"\n />\n <Step.Content\n id=\"tours.contentManager.Introduction.content\"\n defaultMessage=\"Create and manage content from your collection types and single types.\"\n />\n <Step.Actions showSkip />\n </Step.Root>\n ),\n },\n {\n name: 'Fields',\n content: (Step) => (\n <Step.Root side={'top'} align=\"start\" sideOffset={-36}>\n <Step.Title id=\"tours.contentManager.Fields.title\" defaultMessage=\"Fields\" />\n <Step.Content\n id=\"tours.contentManager.Fields.content\"\n defaultMessage=\"Add content to the fields created in the Content-Type Builder.\"\n />\n <Step.Actions />\n </Step.Root>\n ),\n },\n {\n name: 'Publish',\n content: (Step) => (\n <Step.Root side=\"left\" align=\"center\" sideOffset={20}>\n <Step.Title id=\"tours.contentManager.Publish.title\" defaultMessage=\"Publish\" />\n <Step.Content\n id=\"tours.contentManager.Publish.content\"\n defaultMessage=\"Publish entries to make their content available through the Document Service API.\"\n />\n <Step.Actions />\n </Step.Root>\n ),\n },\n {\n name: 'Finish',\n content: (Step) => (\n <Step.Root side=\"right\" sideOffset={32}>\n <Step.Title\n id=\"tours.contentManager.FinalStep.title\"\n defaultMessage=\"It’s time to create API Tokens!\"\n />\n <Step.Content\n id=\"tours.contentManager.FinalStep.content\"\n defaultMessage=\"Now that you’ve created and published content, time to create API tokens and set up permissions.\"\n />\n <Step.Actions showStepCount={false} to=\"/settings/api-tokens\" />\n </Step.Root>\n ),\n when: (completedActions) => completedActions.includes('didCreateContent'),\n },\n ]),\n apiTokens: createTour('apiTokens', [\n {\n name: 'Introduction',\n content: (Step) => (\n <Step.Root sideOffset={-36}>\n <Step.Title id=\"tours.apiTokens.Introduction.title\" defaultMessage=\"API tokens\" />\n <Step.Content\n id=\"tours.apiTokens.Introduction.content\"\n defaultMessage=\"Create and manage API tokens with highly customizable permissions.\"\n />\n <Step.Actions showSkip />\n </Step.Root>\n ),\n when: (completedActions) => !completedActions.includes('didCreateApiToken'),\n },\n {\n name: 'CreateAnAPIToken',\n content: (Step) => (\n <Step.Root side=\"bottom\" sideOffset={20} align=\"end\">\n <Step.Title\n id=\"tours.apiTokens.CreateAnAPIToken.title\"\n defaultMessage=\"Create an API token\"\n />\n <Step.Content\n id=\"tours.apiTokens.CreateAnAPIToken.content\"\n defaultMessage=\"Create a new API token. Choose a name, duration and type.\"\n />\n <Step.Actions />\n </Step.Root>\n ),\n },\n {\n name: 'CopyAPIToken',\n content: (Step) => (\n <Step.Root side=\"bottom\" align=\"start\">\n <Step.Title\n id=\"tours.apiTokens.CopyAPIToken.title\"\n defaultMessage=\"Copy your new API token\"\n />\n <Step.Content\n id=\"tours.apiTokens.CopyAPIToken.content\"\n defaultMessage=\"Make sure to do it now, you won’t be able to see it again. You’ll need to generate a new one if you lose it.\"\n />\n <Step.Actions />\n </Step.Root>\n ),\n when: (completedActions) => completedActions.includes('didCreateApiToken'),\n },\n {\n name: 'Finish',\n content: (Step) => {\n const dispatch = unstableUseGuidedTour('GuidedTourPopover', (s) => s.dispatch);\n return (\n <Step.Root side=\"right\" align=\"start\" sideOffset={32}>\n <Step.Title\n id=\"tours.apiTokens.FinalStep.title\"\n defaultMessage=\"It’s time to deploy your application!\"\n />\n <Step.Content\n id=\"tours.apiTokens.FinalStep.content\"\n defaultMessage=\"Your application is ready to be deployed and its content to be shared with the world!\"\n />\n <Step.Actions showStepCount={false}>\n <Flex justifyContent=\"end\" width={'100%'}>\n <LinkButton\n onClick={() => {\n dispatch({ type: 'next_step', payload: 'apiTokens' });\n }}\n tag={NavLink}\n to=\"/\"\n >\n <FormattedMessage id=\"tours.gotIt\" defaultMessage=\"Got it\" />\n </LinkButton>\n </Flex>\n </Step.Actions>\n </Step.Root>\n );\n },\n when: (completedActions) => completedActions.includes('didCopyApiToken'),\n },\n ]),\n strapiCloud: createTour('strapiCloud', []),\n} as const;\n\ntype Tours = typeof tours;\n\n/* -------------------------------------------------------------------------------------------------\n * GuidedTourTooltip\n * -----------------------------------------------------------------------------------------------*/\n\ntype Content = (\n Step: Step,\n {\n state,\n dispatch,\n }: {\n state: State;\n dispatch: React.Dispatch<Action>;\n }\n) => React.ReactNode;\n\ntype GuidedTourTooltipProps = {\n children: React.ReactNode;\n content: Content;\n tourName: ValidTourName;\n step: number;\n when?: (completedActions: ExtendedCompletedActions) => boolean;\n};\n\nconst UnstableGuidedTourTooltip = ({ children, ...props }: GuidedTourTooltipProps) => {\n const state = unstableUseGuidedTour('TooltipWrapper', (s) => s.state);\n const hasFutureFlag = window.strapi.future.isEnabled('unstableGuidedTour');\n\n if (!state.enabled) {\n return <>{children}</>;\n }\n\n if (!hasFutureFlag) {\n return <>{children}</>;\n }\n\n return <GuidedTourTooltipImpl {...props}>{children}</GuidedTourTooltipImpl>;\n};\n\nconst GuidedTourOverlay = styled(Box)`\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background-color: rgba(50, 50, 77, 0.2);\n z-index: 10;\n`;\n\nconst GuidedTourTooltipImpl = ({\n children,\n content,\n tourName,\n step,\n when,\n}: GuidedTourTooltipProps) => {\n const { data: guidedTourMeta } = useGetGuidedTourMetaQuery();\n\n const state = unstableUseGuidedTour('UnstableGuidedTourTooltip', (s) => s.state);\n const dispatch = unstableUseGuidedTour('UnstableGuidedTourTooltip', (s) => s.dispatch);\n\n const isCurrentStep = state.tours[tourName].currentStep === step;\n const isStepConditionMet = when ? when(state.completedActions) : true;\n const isPopoverOpen =\n guidedTourMeta?.data?.isFirstSuperAdminUser &&\n !state.tours[tourName].isCompleted &&\n isCurrentStep &&\n isStepConditionMet;\n\n // Lock the scroll\n React.useEffect(() => {\n if (!isPopoverOpen) return;\n\n const originalStyle = window.getComputedStyle(document.body).overflow;\n document.body.style.overflow = 'hidden';\n\n return () => {\n document.body.style.overflow = originalStyle;\n };\n }, [isPopoverOpen]);\n\n // TODO: This isn't great but the only solution for syncing the completed actions\n React.useEffect(() => {\n dispatch({\n type: 'set_completed_actions',\n payload: guidedTourMeta?.data?.completedActions ?? [],\n });\n }, [dispatch, guidedTourMeta?.data?.completedActions]);\n\n const Step = React.useMemo(() => createStepComponents(tourName), [tourName]);\n\n return (\n <>\n {isPopoverOpen && (\n <Portal>\n <GuidedTourOverlay />\n </Portal>\n )}\n <Popover.Root open={isPopoverOpen}>\n <Popover.Anchor>{children}</Popover.Anchor>\n {content(Step, { state, dispatch })}\n </Popover.Root>\n </>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Tour factory\n * -----------------------------------------------------------------------------------------------*/\n\ntype TourStep<P extends string> = {\n name: P;\n content: Content;\n when?: (completedActions: ExtendedCompletedActions) => boolean;\n};\n\nfunction createTour<const T extends ReadonlyArray<TourStep<string>>>(tourName: string, steps: T) {\n type Components = {\n [K in T[number]['name']]: React.ComponentType<{ children: React.ReactNode }>;\n };\n\n const tour = steps.reduce((acc, step, index) => {\n if (step.name in acc) {\n throw Error(`The tour: ${tourName} with step: ${step.name} has already been registered`);\n }\n\n acc[step.name as keyof Components] = ({ children }: { children: React.ReactNode }) => {\n return (\n <UnstableGuidedTourTooltip\n tourName={tourName as ValidTourName}\n step={index}\n content={step.content}\n when={step.when}\n >\n {children}\n </UnstableGuidedTourTooltip>\n );\n };\n\n return acc;\n }, {} as Components);\n\n return tour;\n}\n\nexport type { Content, Tours };\nexport { tours };\n"],"names":["tours","contentTypeBuilder","createTour","name","content","Step","_jsxs","Root","side","_jsx","Title","id","defaultMessage","Content","Actions","showSkip","sideOffset","showStepCount","to","when","completedActions","includes","contentManager","align","apiTokens","dispatch","unstableUseGuidedTour","s","Flex","justifyContent","width","LinkButton","onClick","type","payload","tag","NavLink","FormattedMessage","strapiCloud","UnstableGuidedTourTooltip","children","props","state","hasFutureFlag","window","strapi","future","isEnabled","enabled","_Fragment","GuidedTourTooltipImpl","GuidedTourOverlay","styled","Box","tourName","step","data","guidedTourMeta","useGetGuidedTourMetaQuery","isCurrentStep","currentStep","isStepConditionMet","isPopoverOpen","isFirstSuperAdminUser","isCompleted","React","useEffect","originalStyle","getComputedStyle","document","body","overflow","style","useMemo","createStepComponents","Portal","Popover","open","Anchor","steps","tour","reduce","acc","index","Error"],"mappings":"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"}
1
+ {"version":3,"file":"Tours.mjs","sources":["../../../../../../admin/src/components/UnstableGuidedTour/Tours.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Box, Popover, Portal, Button } from '@strapi/design-system';\nimport { FormattedMessage } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { useGetGuidedTourMetaQuery } from '../../services/admin';\n\nimport {\n type State,\n type Action,\n unstableUseGuidedTour,\n ValidTourName,\n ExtendedCompletedActions,\n} from './Context';\nimport { Step, StepCount, createStepComponents } from './Step';\n\n/* -------------------------------------------------------------------------------------------------\n * Tours\n * -----------------------------------------------------------------------------------------------*/\n\nconst GotItAction = ({ onClick }: { onClick: () => void }) => {\n return (\n <Button onClick={onClick}>\n <FormattedMessage id=\"tours.gotIt\" defaultMessage=\"Got it\" />\n </Button>\n );\n};\n\nconst tours = {\n contentTypeBuilder: createTour('contentTypeBuilder', [\n {\n name: 'Introduction',\n content: (Step) => (\n <Step.Root side=\"bottom\" withArrow={false}>\n <Step.Title\n id=\"tours.contentTypeBuilder.Introduction.title\"\n defaultMessage=\"Content-Type Builder\"\n />\n <Step.Content\n id=\"tours.contentTypeBuilder.Introduction.content\"\n defaultMessage=\"Create and manage your content structure with collection types, single types and components.\"\n />\n <Step.Actions showSkip />\n </Step.Root>\n ),\n },\n {\n name: 'CollectionTypes',\n content: (Step) => (\n <Step.Root side=\"right\" sideOffset={16}>\n <Step.Title\n id=\"tours.contentTypeBuilder.CollectionTypes.title\"\n defaultMessage=\"Collection Types\"\n />\n <Step.Content\n id=\"tours.contentTypeBuilder.CollectionTypes.content\"\n defaultMessage=\"A content structure that can manage multiple entries, such as articles or products.\"\n />\n <Step.Actions />\n </Step.Root>\n ),\n },\n {\n name: 'SingleTypes',\n content: (Step) => (\n <Step.Root side=\"right\" sideOffset={16}>\n <Step.Title\n id=\"tours.contentTypeBuilder.SingleTypes.title\"\n defaultMessage=\"Single Types\"\n />\n <Step.Content\n id=\"tours.contentTypeBuilder.SingleTypes.content\"\n defaultMessage=\"A content structure that can manage a single entry, such as a homepage or a header.\"\n />\n <Step.Actions />\n </Step.Root>\n ),\n },\n {\n name: 'Components',\n content: (Step, { dispatch }) => (\n <Step.Root side=\"right\" sideOffset={16}>\n <Step.Title id=\"tours.contentTypeBuilder.Components.title\" defaultMessage=\"Components\" />\n <Step.Content\n id=\"tours.contentTypeBuilder.Components.content\"\n defaultMessage=\"A reusable content structure that can be used across multiple content types, such as buttons, sliders or cards.\"\n />\n <Step.Actions>\n <StepCount tourName=\"contentTypeBuilder\" />\n <GotItAction\n onClick={() => dispatch({ type: 'next_step', payload: 'contentTypeBuilder' })}\n />\n </Step.Actions>\n </Step.Root>\n ),\n },\n {\n name: 'Finish',\n content: (Step) => (\n <Step.Root side=\"right\">\n <Step.Title\n id=\"tours.contentTypeBuilder.Finish.title\"\n defaultMessage=\"It’s time to create content!\"\n />\n <Step.Content\n id=\"tours.contentTypeBuilder.Finish.content\"\n defaultMessage=\"Now that you created content types, you’ll be able to create content in the content manager.\"\n />\n <Step.Actions showStepCount={false} to=\"/content-manager\" />\n </Step.Root>\n ),\n when: (completedActions) => completedActions.includes('didCreateContentTypeSchema'),\n },\n ]),\n contentManager: createTour('contentManager', [\n {\n name: 'Introduction',\n when: (completedActions) => completedActions.includes('didCreateContentTypeSchema'),\n content: (Step) => (\n <Step.Root side=\"top\" withArrow={false}>\n <Step.Title\n id=\"tours.contentManager.Introduction.title\"\n defaultMessage=\"Content manager\"\n />\n <Step.Content\n id=\"tours.contentManager.Introduction.content\"\n defaultMessage=\"Create and manage content from your collection types and single types.\"\n />\n <Step.Actions showSkip />\n </Step.Root>\n ),\n },\n {\n name: 'Fields',\n content: (Step) => (\n <Step.Root sideOffset={-12}>\n <Step.Title id=\"tours.contentManager.Fields.title\" defaultMessage=\"Fields\" />\n <Step.Content\n id=\"tours.contentManager.Fields.content\"\n defaultMessage=\"Add content to the fields created in the Content-Type Builder.\"\n />\n <Step.Actions />\n </Step.Root>\n ),\n },\n {\n name: 'Publish',\n content: (Step, { dispatch }) => (\n <Step.Root side=\"left\" align=\"center\">\n <Step.Title id=\"tours.contentManager.Publish.title\" defaultMessage=\"Publish\" />\n <Step.Content\n id=\"tours.contentManager.Publish.content\"\n defaultMessage=\"Publish entries to make their content available through the Document Service API.\"\n />\n <Step.Actions>\n <StepCount tourName=\"contentManager\" />\n <GotItAction\n onClick={() => dispatch({ type: 'next_step', payload: 'contentManager' })}\n />\n </Step.Actions>\n </Step.Root>\n ),\n },\n {\n name: 'Finish',\n content: (Step) => (\n <Step.Root side=\"right\">\n <Step.Title\n id=\"tours.contentManager.FinalStep.title\"\n defaultMessage=\"It’s time to create API Tokens!\"\n />\n <Step.Content\n id=\"tours.contentManager.FinalStep.content\"\n defaultMessage=\"Now that you’ve created and published content, time to create API tokens and set up permissions.\"\n />\n <Step.Actions showStepCount={false} to=\"/settings/api-tokens\" />\n </Step.Root>\n ),\n when: (completedActions) => completedActions.includes('didCreateContent'),\n },\n ]),\n apiTokens: createTour('apiTokens', [\n {\n name: 'Introduction',\n content: (Step) => (\n <Step.Root sideOffset={-36} withArrow={false}>\n <Step.Title id=\"tours.apiTokens.Introduction.title\" defaultMessage=\"API tokens\" />\n <Step.Content\n id=\"tours.apiTokens.Introduction.content\"\n defaultMessage=\"Create and manage API tokens with highly customizable permissions.\"\n />\n <Step.Actions showSkip />\n </Step.Root>\n ),\n },\n {\n name: 'CreateAnAPIToken',\n content: (Step) => (\n <Step.Root side=\"bottom\" align=\"end\" sideOffset={-10}>\n <Step.Title\n id=\"tours.apiTokens.CreateAnAPIToken.title\"\n defaultMessage=\"Create an API token\"\n />\n <Step.Content\n id=\"tours.apiTokens.CreateAnAPIToken.content\"\n defaultMessage=\"Create a new API token. Choose a name, duration and type.\"\n />\n <Step.Actions />\n </Step.Root>\n ),\n },\n {\n name: 'CopyAPIToken',\n content: (Step, { dispatch }) => (\n <Step.Root side=\"bottom\" align=\"start\" sideOffset={-5}>\n <Step.Title\n id=\"tours.apiTokens.CopyAPIToken.title\"\n defaultMessage=\"Copy your new API token\"\n />\n <Step.Content\n id=\"tours.apiTokens.CopyAPIToken.content\"\n defaultMessage=\"Make sure to do it now, you won’t be able to see it again. You’ll need to generate a new one if you lose it.\"\n />\n <Step.Actions>\n <StepCount tourName=\"apiTokens\" />\n <GotItAction onClick={() => dispatch({ type: 'next_step', payload: 'apiTokens' })} />\n </Step.Actions>\n </Step.Root>\n ),\n when: (completedActions) => completedActions.includes('didCreateApiToken'),\n },\n {\n name: 'Finish',\n content: (Step) => (\n <Step.Root side=\"right\" align=\"start\">\n <Step.Title\n id=\"tours.apiTokens.FinalStep.title\"\n defaultMessage=\"It’s time to deploy your application!\"\n />\n <Step.Content\n id=\"tours.apiTokens.FinalStep.content\"\n defaultMessage=\"Your application is ready to be deployed and its content to be shared with the world!\"\n />\n <Step.Actions showStepCount={false} to=\"/\" />\n </Step.Root>\n ),\n when: (completedActions) => completedActions.includes('didCopyApiToken'),\n },\n ]),\n strapiCloud: createTour('strapiCloud', []),\n} as const;\n\ntype Tours = typeof tours;\n\n/* -------------------------------------------------------------------------------------------------\n * GuidedTourTooltip\n * -----------------------------------------------------------------------------------------------*/\n\ntype Content = (\n Step: Step,\n {\n state,\n dispatch,\n }: {\n state: State;\n dispatch: React.Dispatch<Action>;\n }\n) => React.ReactNode;\n\ntype GuidedTourTooltipProps = {\n children: React.ReactNode;\n content: Content;\n tourName: ValidTourName;\n step: number;\n when?: (completedActions: ExtendedCompletedActions) => boolean;\n};\n\nconst UnstableGuidedTourTooltip = ({ children, ...props }: GuidedTourTooltipProps) => {\n const state = unstableUseGuidedTour('TooltipWrapper', (s) => s.state);\n const hasFutureFlag = window.strapi.future.isEnabled('unstableGuidedTour');\n\n if (!state.enabled) {\n return <>{children}</>;\n }\n\n if (!hasFutureFlag) {\n return <>{children}</>;\n }\n\n return <GuidedTourTooltipImpl {...props}>{children}</GuidedTourTooltipImpl>;\n};\n\nconst GuidedTourOverlay = styled(Box)`\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background-color: rgba(50, 50, 77, 0.2);\n z-index: 10;\n`;\n\nconst GuidedTourTooltipImpl = ({\n children,\n content,\n tourName,\n step,\n when,\n}: GuidedTourTooltipProps) => {\n const { data: guidedTourMeta } = useGetGuidedTourMetaQuery();\n\n const state = unstableUseGuidedTour('UnstableGuidedTourTooltip', (s) => s.state);\n const dispatch = unstableUseGuidedTour('UnstableGuidedTourTooltip', (s) => s.dispatch);\n\n const isCurrentStep = state.tours[tourName].currentStep === step;\n const isStepConditionMet = when ? when(state.completedActions) : true;\n const isPopoverOpen =\n guidedTourMeta?.data?.isFirstSuperAdminUser &&\n !state.tours[tourName].isCompleted &&\n isCurrentStep &&\n isStepConditionMet;\n\n // Lock the scroll\n React.useEffect(() => {\n if (!isPopoverOpen) return;\n\n const originalStyle = window.getComputedStyle(document.body).overflow;\n document.body.style.overflow = 'hidden';\n\n return () => {\n document.body.style.overflow = originalStyle;\n };\n }, [isPopoverOpen]);\n\n // TODO: This isn't great but the only solution for syncing the completed actions\n React.useEffect(() => {\n dispatch({\n type: 'set_completed_actions',\n payload: guidedTourMeta?.data?.completedActions ?? [],\n });\n }, [dispatch, guidedTourMeta?.data?.completedActions]);\n\n const Step = React.useMemo(() => createStepComponents(tourName), [tourName]);\n\n return (\n <>\n {isPopoverOpen && (\n <Portal>\n <GuidedTourOverlay />\n </Portal>\n )}\n <Popover.Root open={isPopoverOpen}>\n <Popover.Anchor>{children}</Popover.Anchor>\n {content(Step, { state, dispatch })}\n </Popover.Root>\n </>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Tour factory\n * -----------------------------------------------------------------------------------------------*/\n\ntype TourStep<P extends string> = {\n name: P;\n content: Content;\n when?: (completedActions: ExtendedCompletedActions) => boolean;\n};\n\nfunction createTour<const T extends ReadonlyArray<TourStep<string>>>(tourName: string, steps: T) {\n type Components = {\n [K in T[number]['name']]: React.ComponentType<{ children: React.ReactNode }>;\n };\n\n const tour = steps.reduce((acc, step, index) => {\n if (step.name in acc) {\n throw Error(`The tour: ${tourName} with step: ${step.name} has already been registered`);\n }\n\n acc[step.name as keyof Components] = ({ children }: { children: React.ReactNode }) => {\n return (\n <UnstableGuidedTourTooltip\n tourName={tourName as ValidTourName}\n step={index}\n content={step.content}\n when={step.when}\n >\n {children}\n </UnstableGuidedTourTooltip>\n );\n };\n\n return acc;\n }, {} as Components);\n\n return tour;\n}\n\nexport type { Content, Tours };\nexport { tours };\n"],"names":["GotItAction","onClick","_jsx","Button","FormattedMessage","id","defaultMessage","tours","contentTypeBuilder","createTour","name","content","Step","_jsxs","Root","side","withArrow","Title","Content","Actions","showSkip","sideOffset","dispatch","StepCount","tourName","type","payload","showStepCount","to","when","completedActions","includes","contentManager","align","apiTokens","strapiCloud","UnstableGuidedTourTooltip","children","props","state","unstableUseGuidedTour","s","hasFutureFlag","window","strapi","future","isEnabled","enabled","_Fragment","GuidedTourTooltipImpl","GuidedTourOverlay","styled","Box","step","data","guidedTourMeta","useGetGuidedTourMetaQuery","isCurrentStep","currentStep","isStepConditionMet","isPopoverOpen","isFirstSuperAdminUser","isCompleted","React","useEffect","originalStyle","getComputedStyle","document","body","overflow","style","useMemo","createStepComponents","Portal","Popover","open","Anchor","steps","tour","reduce","acc","index","Error"],"mappings":"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"}
@@ -85,7 +85,7 @@ const Banner = ({ isTrialEndedRecently })=>{
85
85
  };
86
86
  const UpsellBanner = ()=>{
87
87
  const { license } = ee.useLicenseLimits();
88
- const [cachedTrialEndsAt, setCachedTrialEndsAt] = usePersistentState.usePersistentState('STRAPI_FREE_TRIAL_ENDS_AT', undefined);
88
+ const [cachedTrialEndsAt, setCachedTrialEndsAt] = usePersistentState.useScopedPersistentState('STRAPI_FREE_TRIAL_ENDS_AT', undefined);
89
89
  const sevenDaysAgo = dateFns.subDays(new Date(), 7);
90
90
  const timeLeftData = admin.useGetLicenseTrialTimeLeftQuery(undefined, {
91
91
  skip: !license?.isTrial
@@ -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, LinkButton, Typography } from '@strapi/design-system';\nimport { isAfter, subDays } from 'date-fns';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { useGetLicenseTrialTimeLeftQuery } from '../../src/services/admin';\nimport { usePersistentState } 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`;\n\nconst Banner = ({ isTrialEndedRecently }: { isTrialEndedRecently: boolean }) => {\n const { formatMessage } = useIntl();\n\n return (\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={10}\n paddingRight={10}\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://strapi.chargebeeportal.com\"\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 );\n};\n\nconst UpsellBanner = () => {\n const { license } = useLicenseLimits();\n\n const [cachedTrialEndsAt, setCachedTrialEndsAt] = usePersistentState<string | undefined>(\n 'STRAPI_FREE_TRIAL_ENDS_AT',\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 if (timeLeftData.data?.trialEndsAt || isTrialEndedRecently) {\n return <Banner isTrialEndedRecently={isTrialEndedRecently} />;\n }\n\n return null;\n};\n\nexport { UpsellBanner };\n"],"names":["BannerBackground","styled","Flex","theme","colors","primary600","alternative600","Banner","isTrialEndedRecently","formatMessage","useIntl","_jsx","width","justifyContent","_jsxs","alignItems","paddingTop","paddingBottom","paddingLeft","paddingRight","gap","Box","Typography","variant","fontWeight","textColor","textAlign","fontSize","id","defaultMessage","LinkButton","href","target","UpsellBanner","license","useLicenseLimits","cachedTrialEndsAt","setCachedTrialEndsAt","usePersistentState","undefined","sevenDaysAgo","subDays","Date","timeLeftData","useGetLicenseTrialTimeLeftQuery","skip","isTrial","useEffect","data","trialEndsAt","Boolean","window","strapi","isEE","isAfter"],"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, Flex, LinkButton, Typography } from '@strapi/design-system';\nimport { isAfter, 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\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`;\n\nconst Banner = ({ isTrialEndedRecently }: { isTrialEndedRecently: boolean }) => {\n const { formatMessage } = useIntl();\n\n return (\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={10}\n paddingRight={10}\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://strapi.chargebeeportal.com\"\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 );\n};\n\nconst UpsellBanner = () => {\n const { license } = useLicenseLimits();\n\n const [cachedTrialEndsAt, setCachedTrialEndsAt] = useScopedPersistentState<string | undefined>(\n 'STRAPI_FREE_TRIAL_ENDS_AT',\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 if (timeLeftData.data?.trialEndsAt || isTrialEndedRecently) {\n return <Banner isTrialEndedRecently={isTrialEndedRecently} />;\n }\n\n return null;\n};\n\nexport { UpsellBanner };\n"],"names":["BannerBackground","styled","Flex","theme","colors","primary600","alternative600","Banner","isTrialEndedRecently","formatMessage","useIntl","_jsx","width","justifyContent","_jsxs","alignItems","paddingTop","paddingBottom","paddingLeft","paddingRight","gap","Box","Typography","variant","fontWeight","textColor","textAlign","fontSize","id","defaultMessage","LinkButton","href","target","UpsellBanner","license","useLicenseLimits","cachedTrialEndsAt","setCachedTrialEndsAt","useScopedPersistentState","undefined","sevenDaysAgo","subDays","Date","timeLeftData","useGetLicenseTrialTimeLeftQuery","skip","isTrial","useEffect","data","trialEndsAt","Boolean","window","strapi","isEE","isAfter"],"mappings":"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"}
@@ -6,7 +6,7 @@ import { subDays, isAfter } from 'date-fns';
6
6
  import { useIntl } from 'react-intl';
7
7
  import { styled } from 'styled-components';
8
8
  import { useGetLicenseTrialTimeLeftQuery } from '../services/admin.mjs';
9
- import { usePersistentState } from '../hooks/usePersistentState.mjs';
9
+ import { useScopedPersistentState } from '../hooks/usePersistentState.mjs';
10
10
 
11
11
  const BannerBackground = styled(Flex)`
12
12
  background: linear-gradient(
@@ -83,7 +83,7 @@ const Banner = ({ isTrialEndedRecently })=>{
83
83
  };
84
84
  const UpsellBanner = ()=>{
85
85
  const { license } = useLicenseLimits();
86
- const [cachedTrialEndsAt, setCachedTrialEndsAt] = usePersistentState('STRAPI_FREE_TRIAL_ENDS_AT', undefined);
86
+ const [cachedTrialEndsAt, setCachedTrialEndsAt] = useScopedPersistentState('STRAPI_FREE_TRIAL_ENDS_AT', undefined);
87
87
  const sevenDaysAgo = subDays(new Date(), 7);
88
88
  const timeLeftData = useGetLicenseTrialTimeLeftQuery(undefined, {
89
89
  skip: !license?.isTrial
@@ -1 +1 @@
1
- {"version":3,"file":"UpsellBanner.mjs","sources":["../../../../../admin/src/components/UpsellBanner.tsx"],"sourcesContent":["import { useEffect } from 'react';\n\nimport { useLicenseLimits } from '@strapi/admin/strapi-admin/ee';\nimport { Box, Flex, LinkButton, Typography } from '@strapi/design-system';\nimport { isAfter, subDays } from 'date-fns';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { useGetLicenseTrialTimeLeftQuery } from '../../src/services/admin';\nimport { usePersistentState } 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`;\n\nconst Banner = ({ isTrialEndedRecently }: { isTrialEndedRecently: boolean }) => {\n const { formatMessage } = useIntl();\n\n return (\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={10}\n paddingRight={10}\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://strapi.chargebeeportal.com\"\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 );\n};\n\nconst UpsellBanner = () => {\n const { license } = useLicenseLimits();\n\n const [cachedTrialEndsAt, setCachedTrialEndsAt] = usePersistentState<string | undefined>(\n 'STRAPI_FREE_TRIAL_ENDS_AT',\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 if (timeLeftData.data?.trialEndsAt || isTrialEndedRecently) {\n return <Banner isTrialEndedRecently={isTrialEndedRecently} />;\n }\n\n return null;\n};\n\nexport { UpsellBanner };\n"],"names":["BannerBackground","styled","Flex","theme","colors","primary600","alternative600","Banner","isTrialEndedRecently","formatMessage","useIntl","_jsx","width","justifyContent","_jsxs","alignItems","paddingTop","paddingBottom","paddingLeft","paddingRight","gap","Box","Typography","variant","fontWeight","textColor","textAlign","fontSize","id","defaultMessage","LinkButton","href","target","UpsellBanner","license","useLicenseLimits","cachedTrialEndsAt","setCachedTrialEndsAt","usePersistentState","undefined","sevenDaysAgo","subDays","Date","timeLeftData","useGetLicenseTrialTimeLeftQuery","skip","isTrial","useEffect","data","trialEndsAt","Boolean","window","strapi","isEE","isAfter"],"mappings":"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"}
1
+ {"version":3,"file":"UpsellBanner.mjs","sources":["../../../../../admin/src/components/UpsellBanner.tsx"],"sourcesContent":["import { useEffect } from 'react';\n\nimport { useLicenseLimits } from '@strapi/admin/strapi-admin/ee';\nimport { Box, Flex, LinkButton, Typography } from '@strapi/design-system';\nimport { isAfter, 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\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`;\n\nconst Banner = ({ isTrialEndedRecently }: { isTrialEndedRecently: boolean }) => {\n const { formatMessage } = useIntl();\n\n return (\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={10}\n paddingRight={10}\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://strapi.chargebeeportal.com\"\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 );\n};\n\nconst UpsellBanner = () => {\n const { license } = useLicenseLimits();\n\n const [cachedTrialEndsAt, setCachedTrialEndsAt] = useScopedPersistentState<string | undefined>(\n 'STRAPI_FREE_TRIAL_ENDS_AT',\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 if (timeLeftData.data?.trialEndsAt || isTrialEndedRecently) {\n return <Banner isTrialEndedRecently={isTrialEndedRecently} />;\n }\n\n return null;\n};\n\nexport { UpsellBanner };\n"],"names":["BannerBackground","styled","Flex","theme","colors","primary600","alternative600","Banner","isTrialEndedRecently","formatMessage","useIntl","_jsx","width","justifyContent","_jsxs","alignItems","paddingTop","paddingBottom","paddingLeft","paddingRight","gap","Box","Typography","variant","fontWeight","textColor","textAlign","fontSize","id","defaultMessage","LinkButton","href","target","UpsellBanner","license","useLicenseLimits","cachedTrialEndsAt","setCachedTrialEndsAt","useScopedPersistentState","undefined","sevenDaysAgo","subDays","Date","timeLeftData","useGetLicenseTrialTimeLeftQuery","skip","isTrial","useEffect","data","trialEndsAt","Boolean","window","strapi","isEE","isAfter"],"mappings":"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"}
@@ -6,6 +6,7 @@ var axios = require('axios');
6
6
  var admin = require('../services/admin.js');
7
7
  var AppInfo = require('./AppInfo.js');
8
8
  var Auth = require('./Auth.js');
9
+ var StrapiApp = require('./StrapiApp.js');
9
10
 
10
11
  function _interopNamespaceDefault(e) {
11
12
  var n = Object.create(null);
@@ -35,9 +36,41 @@ const TrackingProvider = ({ children })=>{
35
36
  const token = Auth.useAuth('App', (state)=>state.token);
36
37
  const { data: initData } = admin.useInitQuery();
37
38
  const { uuid } = initData ?? {};
39
+ const getAllWidgets = StrapiApp.useStrapiApp('TrackingProvider', (state)=>state.widgets.getAll);
38
40
  const { data } = admin.useTelemetryPropertiesQuery(undefined, {
39
41
  skip: !initData?.uuid || !token
40
42
  });
43
+ React__namespace.useEffect(()=>{
44
+ if (uuid && data) {
45
+ const event = 'didInitializeAdministration';
46
+ try {
47
+ fetch(`${process.env.STRAPI_ANALYTICS_URL || 'https://analytics.strapi.io'}/api/v2/track`, {
48
+ method: 'POST',
49
+ body: JSON.stringify({
50
+ // This event is anonymous
51
+ event,
52
+ userId: '',
53
+ eventPropeties: {},
54
+ groupProperties: {
55
+ ...data,
56
+ projectId: uuid,
57
+ registeredWidgets: getAllWidgets().map((widget)=>widget.uid)
58
+ }
59
+ }),
60
+ headers: {
61
+ 'Content-Type': 'application/json',
62
+ 'X-Strapi-Event': event
63
+ }
64
+ });
65
+ } catch {
66
+ // silence is golden
67
+ }
68
+ }
69
+ }, [
70
+ data,
71
+ uuid,
72
+ getAllWidgets
73
+ ]);
41
74
  const value = React__namespace.useMemo(()=>({
42
75
  uuid,
43
76
  telemetryProperties: data
@@ -73,7 +106,7 @@ const TrackingProvider = ({ children })=>{
73
106
  const trackUsage = React__namespace.useCallback(async (event, properties)=>{
74
107
  try {
75
108
  if (uuid && !window.strapi.telemetryDisabled) {
76
- const res = await axios.post('https://analytics.strapi.io/api/v2/track', {
109
+ const res = await axios.post(`${process.env.STRAPI_ANALYTICS_URL || 'https://analytics.strapi.io'}/api/v2/track`, {
77
110
  event,
78
111
  userId,
79
112
  eventProperties: {