@strapi/admin 5.45.1 → 5.46.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 (59) hide show
  1. package/dist/admin/admin/src/components/UpsellBanner.js +112 -61
  2. package/dist/admin/admin/src/components/UpsellBanner.js.map +1 -1
  3. package/dist/admin/admin/src/components/UpsellBanner.mjs +115 -64
  4. package/dist/admin/admin/src/components/UpsellBanner.mjs.map +1 -1
  5. package/dist/admin/admin/src/pages/ProfilePage.js +1 -1
  6. package/dist/admin/admin/src/pages/ProfilePage.js.map +1 -1
  7. package/dist/admin/admin/src/pages/ProfilePage.mjs +1 -1
  8. package/dist/admin/admin/src/pages/ProfilePage.mjs.map +1 -1
  9. package/dist/admin/admin/src/translations/de.json.js +2 -0
  10. package/dist/admin/admin/src/translations/de.json.js.map +1 -1
  11. package/dist/admin/admin/src/translations/de.json.mjs +2 -0
  12. package/dist/admin/admin/src/translations/de.json.mjs.map +1 -1
  13. package/dist/admin/admin/src/translations/en.json.js +3 -0
  14. package/dist/admin/admin/src/translations/en.json.js.map +1 -1
  15. package/dist/admin/admin/src/translations/en.json.mjs +3 -0
  16. package/dist/admin/admin/src/translations/en.json.mjs.map +1 -1
  17. package/dist/admin/admin/src/translations/es.json.js +3 -0
  18. package/dist/admin/admin/src/translations/es.json.js.map +1 -1
  19. package/dist/admin/admin/src/translations/es.json.mjs +3 -0
  20. package/dist/admin/admin/src/translations/es.json.mjs.map +1 -1
  21. package/dist/admin/admin/src/translations/fr.json.js +2 -0
  22. package/dist/admin/admin/src/translations/fr.json.js.map +1 -1
  23. package/dist/admin/admin/src/translations/fr.json.mjs +2 -0
  24. package/dist/admin/admin/src/translations/fr.json.mjs.map +1 -1
  25. package/dist/admin/admin/src/translations/tr.json.js +216 -1
  26. package/dist/admin/admin/src/translations/tr.json.js.map +1 -1
  27. package/dist/admin/admin/src/translations/tr.json.mjs +215 -2
  28. package/dist/admin/admin/src/translations/tr.json.mjs.map +1 -1
  29. package/dist/admin/admin/src/utils/getFetchClient.js +15 -7
  30. package/dist/admin/admin/src/utils/getFetchClient.js.map +1 -1
  31. package/dist/admin/admin/src/utils/getFetchClient.mjs +15 -7
  32. package/dist/admin/admin/src/utils/getFetchClient.mjs.map +1 -1
  33. package/dist/admin/admin/tests/server.js +123 -119
  34. package/dist/admin/admin/tests/server.js.map +1 -1
  35. package/dist/admin/admin/tests/server.mjs +124 -120
  36. package/dist/admin/admin/tests/server.mjs.map +1 -1
  37. package/dist/server/server/src/controllers/api-token.js +4 -5
  38. package/dist/server/server/src/controllers/api-token.js.map +1 -1
  39. package/dist/server/server/src/controllers/api-token.mjs +4 -5
  40. package/dist/server/server/src/controllers/api-token.mjs.map +1 -1
  41. package/dist/server/server/src/services/api-token.js +37 -18
  42. package/dist/server/server/src/services/api-token.js.map +1 -1
  43. package/dist/server/server/src/services/api-token.mjs +38 -19
  44. package/dist/server/server/src/services/api-token.mjs.map +1 -1
  45. package/dist/server/server/src/services/index.js +5 -2
  46. package/dist/server/server/src/services/index.js.map +1 -1
  47. package/dist/server/server/src/services/index.mjs +5 -2
  48. package/dist/server/server/src/services/index.mjs.map +1 -1
  49. package/dist/server/server/src/strategies/content-api-token.js +1 -1
  50. package/dist/server/server/src/strategies/content-api-token.js.map +1 -1
  51. package/dist/server/server/src/strategies/content-api-token.mjs +1 -1
  52. package/dist/server/server/src/strategies/content-api-token.mjs.map +1 -1
  53. package/dist/server/src/controllers/api-token.d.ts.map +1 -1
  54. package/dist/server/src/index.d.ts +1 -0
  55. package/dist/server/src/index.d.ts.map +1 -1
  56. package/dist/server/src/services/api-token.d.ts.map +1 -1
  57. package/dist/server/src/services/index.d.ts +2 -0
  58. package/dist/server/src/services/index.d.ts.map +1 -1
  59. package/package.json +8 -8
@@ -4,6 +4,7 @@ var jsxRuntime = require('react/jsx-runtime');
4
4
  var React = require('react');
5
5
  var ee = require('@strapi/admin/strapi-admin/ee');
6
6
  var designSystem = require('@strapi/design-system');
7
+ var icons = require('@strapi/icons');
7
8
  var dateFns = require('date-fns');
8
9
  var reactIntl = require('react-intl');
9
10
  var styled = require('styled-components');
@@ -17,76 +18,103 @@ const BannerBackground = styled.styled(designSystem.Flex)`
17
18
  ${({ theme })=>theme.colors.primary600} 0%,
18
19
  ${({ theme })=>theme.colors.alternative600} 121.48%
19
20
  );
21
+ position: relative;
20
22
  `;
21
- const Banner = ({ isTrialEndedRecently })=>{
23
+ const FixedButtonWrapper = styled.styled(designSystem.Box)`
24
+ position: fixed;
25
+ display: flex;
26
+ flex-direction: column;
27
+ z-index: 11;
28
+ align-items: flex-end;
29
+ top: 9px;
30
+ right: 16px;
31
+ `;
32
+ const Banner = ({ isTrialEndedRecently, onDismiss })=>{
22
33
  const { formatMessage } = reactIntl.useIntl();
23
- return /*#__PURE__*/ jsxRuntime.jsx(BannerBackground, {
24
- width: "100%",
25
- justifyContent: "center",
26
- children: /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
27
- justifyContent: "center",
28
- alignItems: "center",
29
- width: "100%",
30
- paddingTop: 2,
31
- paddingBottom: 2,
32
- paddingLeft: theme.RESPONSIVE_DEFAULT_SPACING,
33
- paddingRight: theme.RESPONSIVE_DEFAULT_SPACING,
34
- gap: 2,
35
- children: [
36
- /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Box, {
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,
37
48
  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
- })
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
+ ]
51
80
  }),
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).'
81
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Box, {
82
+ children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.LinkButton, {
83
+ width: "max-content",
84
+ variant: "tertiary",
85
+ href: "https://strapi.chargebeeportal.com",
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
+ })
64
94
  })
65
95
  })
66
96
  ]
67
- }),
68
- /*#__PURE__*/ jsxRuntime.jsx(designSystem.Box, {
69
- children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.LinkButton, {
70
- width: "max-content",
71
- variant: "tertiary",
72
- href: "https://strapi.chargebeeportal.com",
73
- target: "_blank",
74
- children: formatMessage(isTrialEndedRecently ? {
75
- id: 'app.components.UpsellBanner.button.ended',
76
- defaultMessage: 'Keep Growth plan'
77
- } : {
78
- id: 'app.components.UpsellBanner.button',
79
- defaultMessage: 'Upgrade now'
80
- })
81
- })
82
97
  })
83
- ]
84
- })
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, {})
108
+ })
109
+ })
110
+ ]
85
111
  });
86
112
  };
87
113
  const UpsellBanner = ()=>{
88
114
  const { license } = ee.useLicenseLimits();
115
+ const { formatMessage } = reactIntl.useIntl();
89
116
  const [cachedTrialEndsAt, setCachedTrialEndsAt] = usePersistentState.useScopedPersistentState('STRAPI_FREE_TRIAL_ENDS_AT', undefined);
117
+ const [dismissedFor, setDismissedFor] = usePersistentState.useScopedPersistentState('STRAPI_UPSELL_BANNER_DISMISSED_FOR', undefined);
90
118
  const sevenDaysAgo = dateFns.subDays(new Date(), 7);
91
119
  const timeLeftData = admin.useGetLicenseTrialTimeLeftQuery(undefined, {
92
120
  skip: !license?.isTrial
@@ -102,12 +130,35 @@ const UpsellBanner = ()=>{
102
130
  // 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
103
131
  // We show the banner to encourage the user to upgrade (for 7 days after the trial ends)
104
132
  const isTrialEndedRecently = Boolean(!license?.isTrial && !window.strapi.isEE && cachedTrialEndsAt && dateFns.isAfter(new Date(cachedTrialEndsAt), sevenDaysAgo));
105
- if (timeLeftData.data?.trialEndsAt || isTrialEndedRecently) {
106
- return /*#__PURE__*/ jsxRuntime.jsx(Banner, {
107
- isTrialEndedRecently: isTrialEndedRecently
133
+ const trialEndsAt = timeLeftData.data?.trialEndsAt ?? cachedTrialEndsAt;
134
+ const toCanonicalISO = (v)=>{
135
+ if (!v) return undefined;
136
+ const date = new Date(v);
137
+ return dateFns.isValid(date) ? date.toISOString() : undefined;
138
+ };
139
+ const isDismissed = Boolean(trialEndsAt && toCanonicalISO(dismissedFor) === toCanonicalISO(trialEndsAt));
140
+ const handleDismiss = ()=>setDismissedFor(toCanonicalISO(trialEndsAt));
141
+ const handleReopen = ()=>setDismissedFor(undefined);
142
+ if (!(timeLeftData.data?.trialEndsAt || isTrialEndedRecently)) {
143
+ return null;
144
+ }
145
+ if (isDismissed) {
146
+ return /*#__PURE__*/ jsxRuntime.jsx(FixedButtonWrapper, {
147
+ children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.IconButton, {
148
+ withTooltip: false,
149
+ label: formatMessage({
150
+ id: 'app.components.UpsellBanner.reopen',
151
+ defaultMessage: 'Reopen banner'
152
+ }),
153
+ onClick: handleReopen,
154
+ children: /*#__PURE__*/ jsxRuntime.jsx(icons.ArrowsOut, {})
155
+ })
108
156
  });
109
157
  }
110
- return null;
158
+ return /*#__PURE__*/ jsxRuntime.jsx(Banner, {
159
+ isTrialEndedRecently: isTrialEndedRecently,
160
+ onDismiss: handleDismiss
161
+ });
111
162
  };
112
163
 
113
164
  exports.UpsellBanner = 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, 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 { 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`;\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={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://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","RESPONSIVE_DEFAULT_SPACING","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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"}
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://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 <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":";;;;;;;;;;;;;;AAaA,MAAMA,gBAAAA,GAAmBC,aAAAA,CAAOC,iBAAAA,CAAK;;;IAGjC,EAAE,CAAC,EAAEC,KAAK,EAAE,GAAKA,KAAAA,CAAMC,MAAM,CAACC,UAAU,CAAC;IACzC,EAAE,CAAC,EAAEF,KAAK,EAAE,GAAKA,KAAAA,CAAMC,MAAM,CAACE,cAAc,CAAC;;;AAGjD,CAAC;AAED,MAAMC,kBAAAA,GAAqBN,aAAAA,CAAOO,gBAAAA,CAAI;;;;;;;;AAQtC,CAAC;AAED,MAAMC,SAAS,CAAC,EACdC,oBAAoB,EACpBC,SAAS,EAIV,GAAA;IACC,MAAM,EAAEC,aAAa,EAAE,GAAGC,iBAAAA,EAAAA;IAE1B,qBACEC,eAAA,CAAAC,mBAAA,EAAA;;0BACEC,cAAA,CAAChB,gBAAAA,EAAAA;gBAAiBiB,KAAAA,EAAM,MAAA;gBAAOC,cAAAA,EAAe,QAAA;AAC5C,gBAAA,QAAA,gBAAAJ,eAAA,CAACZ,iBAAAA,EAAAA;oBACCgB,cAAAA,EAAe,QAAA;oBACfC,UAAAA,EAAW,QAAA;oBACXF,KAAAA,EAAM,MAAA;oBACNG,UAAAA,EAAY,CAAA;oBACZC,aAAAA,EAAe,CAAA;oBACfC,WAAAA,EAAaC,gCAAAA;oBACbC,YAAAA,EAAcD,gCAAAA;oBACdE,GAAAA,EAAK,CAAA;;sCAELX,eAAA,CAACN,gBAAAA,EAAAA;;8CACCQ,cAAA,CAACU,uBAAAA,EAAAA;oCACCC,OAAAA,EAAQ,OAAA;oCACRC,UAAAA,EAAW,MAAA;oCACXC,SAAAA,EAAU,UAAA;oCACVC,SAAAA,EAAU,QAAA;oCACVC,QAAAA,EAAU,CAAA;AAETnB,oCAAAA,QAAAA,EAAAA,aAAAA,CACCF,oBAAAA,GACI;wCACEsB,EAAAA,EAAI,yCAAA;wCACJC,cAAAA,EAAgB;qCAClB,GACA;wCACED,EAAAA,EAAI,mCAAA;wCACJC,cAAAA,EAAgB;AAClB,qCAAA;;8CAGRjB,cAAA,CAACU,uBAAAA,EAAAA;oCACCC,OAAAA,EAAQ,OAAA;oCACRE,SAAAA,EAAU,UAAA;oCACVC,SAAAA,EAAU,QAAA;oCACVN,YAAAA,EAAc,CAAA;oCACdO,QAAAA,EAAU,CAAA;AAETnB,oCAAAA,QAAAA,EAAAA,aAAAA,CACCF,oBAAAA,GACI;wCACEsB,EAAAA,EAAI,wCAAA;wCACJC,cAAAA,EAAgB;qCAClB,GACA;wCACED,EAAAA,EAAI,kCAAA;wCACJC,cAAAA,EACE;AACJ,qCAAA;;;;sCAIVjB,cAAA,CAACR,gBAAAA,EAAAA;AACC,4BAAA,QAAA,gBAAAQ,cAAA,CAACkB,uBAAAA,EAAAA;gCACCjB,KAAAA,EAAM,aAAA;gCACNU,OAAAA,EAAQ,UAAA;gCACRQ,IAAAA,EAAK,oCAAA;gCACLC,MAAAA,EAAO,QAAA;AAENxB,gCAAAA,QAAAA,EAAAA,aAAAA,CACCF,oBAAAA,GACI;oCACEsB,EAAAA,EAAI,0CAAA;oCACJC,cAAAA,EAAgB;iCAClB,GACA;oCACED,EAAAA,EAAI,oCAAA;oCACJC,cAAAA,EAAgB;AAClB,iCAAA;;;;;;0BAMdjB,cAAA,CAACT,kBAAAA,EAAAA;AACC,gBAAA,QAAA,gBAAAS,cAAA,CAACqB,uBAAAA,EAAAA;oBACCC,WAAAA,EAAa,KAAA;AACbC,oBAAAA,KAAAA,EAAO3B,aAAAA,CAAc;wBACnBoB,EAAAA,EAAI,mCAAA;wBACJC,cAAAA,EAAgB;AAClB,qBAAA,CAAA;oBACAO,OAAAA,EAAS7B,SAAAA;AAET,oBAAA,QAAA,gBAAAK,cAAA,CAACyB,WAAAA,EAAAA,EAAAA;;;;;AAKX,CAAA;AAEA,MAAMC,YAAAA,GAAe,IAAA;IACnB,MAAM,EAAEC,OAAO,EAAE,GAAGC,mBAAAA,EAAAA;IACpB,MAAM,EAAEhC,aAAa,EAAE,GAAGC,iBAAAA,EAAAA;AAE1B,IAAA,MAAM,CAACgC,iBAAAA,EAAmBC,oBAAAA,CAAqB,GAAGC,4CAChD,2BAAA,EACAC,SAAAA,CAAAA;AAGF,IAAA,MAAM,CAACC,YAAAA,EAAcC,eAAAA,CAAgB,GAAGH,4CACtC,oCAAA,EACAC,SAAAA,CAAAA;IAGF,MAAMG,YAAAA,GAAeC,eAAAA,CAAQ,IAAIC,IAAAA,EAAAA,EAAQ,CAAA,CAAA;IAEzC,MAAMC,YAAAA,GAAeC,sCAAgCP,SAAAA,EAAW;AAC9DQ,QAAAA,IAAAA,EAAM,CAACb,OAAAA,EAASc;AAClB,KAAA,CAAA;IAEAC,eAAAA,CAAU,IAAA;QACR,IAAIJ,YAAAA,CAAaK,IAAI,EAAEC,WAAAA,EAAa;YAClCd,oBAAAA,CAAqBQ,YAAAA,CAAaK,IAAI,CAACC,WAAW,CAAA;AACpD,QAAA;;IAEF,CAAA,EAAG;AAACN,QAAAA,YAAAA,CAAaK,IAAI,EAAEC;AAAY,KAAA,CAAA;;;AAInC,IAAA,MAAMlD,oBAAAA,GAAuBmD,OAAAA,CAC3B,CAAClB,OAAAA,EAASc,WACR,CAACK,MAAAA,CAAOC,MAAM,CAACC,IAAI,IACnBnB,iBAAAA,IACAoB,eAAAA,CAAQ,IAAIZ,KAAKR,iBAAAA,CAAAA,EAAoBM,YAAAA,CAAAA,CAAAA;AAGzC,IAAA,MAAMS,WAAAA,GAAcN,YAAAA,CAAaK,IAAI,EAAEC,WAAAA,IAAef,iBAAAA;AAEtD,IAAA,MAAMqB,iBAAiB,CAACC,CAAAA,GAAAA;QACtB,IAAI,CAACA,GAAG,OAAOnB,SAAAA;QACf,MAAMoB,IAAAA,GAAO,IAAIf,IAAAA,CAAKc,CAAAA,CAAAA;AACtB,QAAA,OAAOE,eAAAA,CAAQD,IAAAA,CAAAA,GAAQA,IAAAA,CAAKE,WAAW,EAAA,GAAKtB,SAAAA;AAC9C,IAAA,CAAA;AAEA,IAAA,MAAMuB,WAAAA,GAAcV,OAAAA,CAClBD,WAAAA,IAAeM,cAAAA,CAAejB,kBAAkBiB,cAAAA,CAAeN,WAAAA,CAAAA,CAAAA;IAGjE,MAAMY,aAAAA,GAAgB,IAAMtB,eAAAA,CAAgBgB,cAAAA,CAAeN,WAAAA,CAAAA,CAAAA;IAC3D,MAAMa,YAAAA,GAAe,IAAMvB,eAAAA,CAAgBF,SAAAA,CAAAA;AAE3C,IAAA,IAAI,EAAEM,YAAAA,CAAaK,IAAI,EAAEC,WAAAA,IAAelD,oBAAmB,CAAA,EAAI;QAC7D,OAAO,IAAA;AACT,IAAA;AAEA,IAAA,IAAI6D,WAAAA,EAAa;AACf,QAAA,qBACEvD,cAAA,CAACT,kBAAAA,EAAAA;AACC,YAAA,QAAA,gBAAAS,cAAA,CAACqB,uBAAAA,EAAAA;gBACCC,WAAAA,EAAa,KAAA;AACbC,gBAAAA,KAAAA,EAAO3B,aAAAA,CAAc;oBACnBoB,EAAAA,EAAI,oCAAA;oBACJC,cAAAA,EAAgB;AAClB,iBAAA,CAAA;gBACAO,OAAAA,EAASiC,YAAAA;AAET,gBAAA,QAAA,gBAAAzD,cAAA,CAAC0D,eAAAA,EAAAA,EAAAA;;;AAIT,IAAA;AAEA,IAAA,qBAAO1D,cAAA,CAACP,MAAAA,EAAAA;QAAOC,oBAAAA,EAAsBA,oBAAAA;QAAsBC,SAAAA,EAAW6D;;AACxE;;;;"}
@@ -1,8 +1,9 @@
1
- import { jsx, jsxs } from 'react/jsx-runtime';
1
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
2
2
  import { useEffect } from 'react';
3
3
  import { useLicenseLimits } from '@strapi/admin/strapi-admin/ee';
4
- import { Flex, Box, Typography, LinkButton } from '@strapi/design-system';
5
- import { subDays, isAfter } from 'date-fns';
4
+ import { IconButton, Box, Flex, Typography, LinkButton } from '@strapi/design-system';
5
+ import { ArrowsOut, Cross } from '@strapi/icons';
6
+ import { subDays, isAfter, isValid } from 'date-fns';
6
7
  import { useIntl } from 'react-intl';
7
8
  import { styled } from 'styled-components';
8
9
  import { useGetLicenseTrialTimeLeftQuery } from '../services/admin.mjs';
@@ -15,76 +16,103 @@ const BannerBackground = styled(Flex)`
15
16
  ${({ theme })=>theme.colors.primary600} 0%,
16
17
  ${({ theme })=>theme.colors.alternative600} 121.48%
17
18
  );
19
+ position: relative;
18
20
  `;
19
- const Banner = ({ isTrialEndedRecently })=>{
21
+ const FixedButtonWrapper = styled(Box)`
22
+ position: fixed;
23
+ display: flex;
24
+ flex-direction: column;
25
+ z-index: 11;
26
+ align-items: flex-end;
27
+ top: 9px;
28
+ right: 16px;
29
+ `;
30
+ const Banner = ({ isTrialEndedRecently, onDismiss })=>{
20
31
  const { formatMessage } = useIntl();
21
- return /*#__PURE__*/ jsx(BannerBackground, {
22
- width: "100%",
23
- justifyContent: "center",
24
- children: /*#__PURE__*/ jsxs(Flex, {
25
- justifyContent: "center",
26
- alignItems: "center",
27
- width: "100%",
28
- paddingTop: 2,
29
- paddingBottom: 2,
30
- paddingLeft: RESPONSIVE_DEFAULT_SPACING,
31
- paddingRight: RESPONSIVE_DEFAULT_SPACING,
32
- gap: 2,
33
- children: [
34
- /*#__PURE__*/ jsxs(Box, {
32
+ return /*#__PURE__*/ jsxs(Fragment, {
33
+ children: [
34
+ /*#__PURE__*/ jsx(BannerBackground, {
35
+ width: "100%",
36
+ justifyContent: "center",
37
+ children: /*#__PURE__*/ jsxs(Flex, {
38
+ justifyContent: "center",
39
+ alignItems: "center",
40
+ width: "100%",
41
+ paddingTop: 2,
42
+ paddingBottom: 2,
43
+ paddingLeft: RESPONSIVE_DEFAULT_SPACING,
44
+ paddingRight: RESPONSIVE_DEFAULT_SPACING,
45
+ gap: 2,
35
46
  children: [
36
- /*#__PURE__*/ jsx(Typography, {
37
- variant: "delta",
38
- fontWeight: "bold",
39
- textColor: "neutral0",
40
- textAlign: "center",
41
- fontSize: 2,
42
- children: formatMessage(isTrialEndedRecently ? {
43
- id: 'app.components.UpsellBanner.intro.ended',
44
- defaultMessage: 'Your trial has ended: '
45
- } : {
46
- id: 'app.components.UpsellBanner.intro',
47
- defaultMessage: 'Access to Growth plan features: '
48
- })
47
+ /*#__PURE__*/ jsxs(Box, {
48
+ children: [
49
+ /*#__PURE__*/ jsx(Typography, {
50
+ variant: "delta",
51
+ fontWeight: "bold",
52
+ textColor: "neutral0",
53
+ textAlign: "center",
54
+ fontSize: 2,
55
+ children: formatMessage(isTrialEndedRecently ? {
56
+ id: 'app.components.UpsellBanner.intro.ended',
57
+ defaultMessage: 'Your trial has ended: '
58
+ } : {
59
+ id: 'app.components.UpsellBanner.intro',
60
+ defaultMessage: 'Access to Growth plan features: '
61
+ })
62
+ }),
63
+ /*#__PURE__*/ jsx(Typography, {
64
+ variant: "delta",
65
+ textColor: "neutral0",
66
+ textAlign: "center",
67
+ paddingRight: 4,
68
+ fontSize: 2,
69
+ children: formatMessage(isTrialEndedRecently ? {
70
+ id: 'app.components.UpsellBanner.text.ended',
71
+ defaultMessage: 'Keep access to Growth features by upgrading now.'
72
+ } : {
73
+ id: 'app.components.UpsellBanner.text',
74
+ defaultMessage: 'As part of your trial, you can explore premium tools such as Content History, Releases, and Single Sign-On (SSO).'
75
+ })
76
+ })
77
+ ]
49
78
  }),
50
- /*#__PURE__*/ jsx(Typography, {
51
- variant: "delta",
52
- textColor: "neutral0",
53
- textAlign: "center",
54
- paddingRight: 4,
55
- fontSize: 2,
56
- children: formatMessage(isTrialEndedRecently ? {
57
- id: 'app.components.UpsellBanner.text.ended',
58
- defaultMessage: 'Keep access to Growth features by upgrading now.'
59
- } : {
60
- id: 'app.components.UpsellBanner.text',
61
- defaultMessage: 'As part of your trial, you can explore premium tools such as Content History, Releases, and Single Sign-On (SSO).'
79
+ /*#__PURE__*/ jsx(Box, {
80
+ children: /*#__PURE__*/ jsx(LinkButton, {
81
+ width: "max-content",
82
+ variant: "tertiary",
83
+ href: "https://strapi.chargebeeportal.com",
84
+ target: "_blank",
85
+ children: formatMessage(isTrialEndedRecently ? {
86
+ id: 'app.components.UpsellBanner.button.ended',
87
+ defaultMessage: 'Keep Growth plan'
88
+ } : {
89
+ id: 'app.components.UpsellBanner.button',
90
+ defaultMessage: 'Upgrade now'
91
+ })
62
92
  })
63
93
  })
64
94
  ]
65
- }),
66
- /*#__PURE__*/ jsx(Box, {
67
- children: /*#__PURE__*/ jsx(LinkButton, {
68
- width: "max-content",
69
- variant: "tertiary",
70
- href: "https://strapi.chargebeeportal.com",
71
- target: "_blank",
72
- children: formatMessage(isTrialEndedRecently ? {
73
- id: 'app.components.UpsellBanner.button.ended',
74
- defaultMessage: 'Keep Growth plan'
75
- } : {
76
- id: 'app.components.UpsellBanner.button',
77
- defaultMessage: 'Upgrade now'
78
- })
79
- })
80
95
  })
81
- ]
82
- })
96
+ }),
97
+ /*#__PURE__*/ jsx(FixedButtonWrapper, {
98
+ children: /*#__PURE__*/ jsx(IconButton, {
99
+ withTooltip: false,
100
+ label: formatMessage({
101
+ id: 'app.components.UpsellBanner.close',
102
+ defaultMessage: 'Close'
103
+ }),
104
+ onClick: onDismiss,
105
+ children: /*#__PURE__*/ jsx(Cross, {})
106
+ })
107
+ })
108
+ ]
83
109
  });
84
110
  };
85
111
  const UpsellBanner = ()=>{
86
112
  const { license } = useLicenseLimits();
113
+ const { formatMessage } = useIntl();
87
114
  const [cachedTrialEndsAt, setCachedTrialEndsAt] = useScopedPersistentState('STRAPI_FREE_TRIAL_ENDS_AT', undefined);
115
+ const [dismissedFor, setDismissedFor] = useScopedPersistentState('STRAPI_UPSELL_BANNER_DISMISSED_FOR', undefined);
88
116
  const sevenDaysAgo = subDays(new Date(), 7);
89
117
  const timeLeftData = useGetLicenseTrialTimeLeftQuery(undefined, {
90
118
  skip: !license?.isTrial
@@ -100,12 +128,35 @@ const UpsellBanner = ()=>{
100
128
  // 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
101
129
  // We show the banner to encourage the user to upgrade (for 7 days after the trial ends)
102
130
  const isTrialEndedRecently = Boolean(!license?.isTrial && !window.strapi.isEE && cachedTrialEndsAt && isAfter(new Date(cachedTrialEndsAt), sevenDaysAgo));
103
- if (timeLeftData.data?.trialEndsAt || isTrialEndedRecently) {
104
- return /*#__PURE__*/ jsx(Banner, {
105
- isTrialEndedRecently: isTrialEndedRecently
131
+ const trialEndsAt = timeLeftData.data?.trialEndsAt ?? cachedTrialEndsAt;
132
+ const toCanonicalISO = (v)=>{
133
+ if (!v) return undefined;
134
+ const date = new Date(v);
135
+ return isValid(date) ? date.toISOString() : undefined;
136
+ };
137
+ const isDismissed = Boolean(trialEndsAt && toCanonicalISO(dismissedFor) === toCanonicalISO(trialEndsAt));
138
+ const handleDismiss = ()=>setDismissedFor(toCanonicalISO(trialEndsAt));
139
+ const handleReopen = ()=>setDismissedFor(undefined);
140
+ if (!(timeLeftData.data?.trialEndsAt || isTrialEndedRecently)) {
141
+ return null;
142
+ }
143
+ if (isDismissed) {
144
+ return /*#__PURE__*/ jsx(FixedButtonWrapper, {
145
+ children: /*#__PURE__*/ jsx(IconButton, {
146
+ withTooltip: false,
147
+ label: formatMessage({
148
+ id: 'app.components.UpsellBanner.reopen',
149
+ defaultMessage: 'Reopen banner'
150
+ }),
151
+ onClick: handleReopen,
152
+ children: /*#__PURE__*/ jsx(ArrowsOut, {})
153
+ })
106
154
  });
107
155
  }
108
- return null;
156
+ return /*#__PURE__*/ jsx(Banner, {
157
+ isTrialEndedRecently: isTrialEndedRecently,
158
+ onDismiss: handleDismiss
159
+ });
109
160
  };
110
161
 
111
162
  export { UpsellBanner };
@@ -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 { 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`;\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={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://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","RESPONSIVE_DEFAULT_SPACING","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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"}
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, 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://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 <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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"}
@@ -405,7 +405,7 @@ const PreferencesSection = ({ localeNames })=>{
405
405
  }))
406
406
  ],
407
407
  placeholder: formatMessage({
408
- id: 'components.Select.placeholder',
408
+ id: 'app.components.Select.placeholder',
409
409
  defaultMessage: 'Select'
410
410
  }),
411
411
  size: 6,