@strapi/admin 5.45.1 → 5.46.1
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.
- package/dist/admin/admin/src/StrapiApp.js +2 -1
- package/dist/admin/admin/src/StrapiApp.js.map +1 -1
- package/dist/admin/admin/src/StrapiApp.mjs +2 -1
- package/dist/admin/admin/src/StrapiApp.mjs.map +1 -1
- package/dist/admin/admin/src/components/FormInputs/Date.js +2 -0
- package/dist/admin/admin/src/components/FormInputs/Date.js.map +1 -1
- package/dist/admin/admin/src/components/FormInputs/Date.mjs +2 -0
- package/dist/admin/admin/src/components/FormInputs/Date.mjs.map +1 -1
- package/dist/admin/admin/src/components/FormInputs/DateTime.js +2 -0
- package/dist/admin/admin/src/components/FormInputs/DateTime.js.map +1 -1
- package/dist/admin/admin/src/components/FormInputs/DateTime.mjs +2 -0
- package/dist/admin/admin/src/components/FormInputs/DateTime.mjs.map +1 -1
- package/dist/admin/admin/src/components/UpsellBanner.js +112 -61
- package/dist/admin/admin/src/components/UpsellBanner.js.map +1 -1
- package/dist/admin/admin/src/components/UpsellBanner.mjs +115 -64
- package/dist/admin/admin/src/components/UpsellBanner.mjs.map +1 -1
- package/dist/admin/admin/src/constants.js +5 -0
- package/dist/admin/admin/src/constants.js.map +1 -1
- package/dist/admin/admin/src/constants.mjs +5 -0
- package/dist/admin/admin/src/constants.mjs.map +1 -1
- package/dist/admin/admin/src/pages/ProfilePage.js +1 -1
- package/dist/admin/admin/src/pages/ProfilePage.js.map +1 -1
- package/dist/admin/admin/src/pages/ProfilePage.mjs +1 -1
- package/dist/admin/admin/src/pages/ProfilePage.mjs.map +1 -1
- package/dist/admin/admin/src/translations/de.json.js +2 -0
- package/dist/admin/admin/src/translations/de.json.js.map +1 -1
- package/dist/admin/admin/src/translations/de.json.mjs +2 -0
- package/dist/admin/admin/src/translations/de.json.mjs.map +1 -1
- package/dist/admin/admin/src/translations/en.json.js +3 -0
- package/dist/admin/admin/src/translations/en.json.js.map +1 -1
- package/dist/admin/admin/src/translations/en.json.mjs +3 -0
- package/dist/admin/admin/src/translations/en.json.mjs.map +1 -1
- package/dist/admin/admin/src/translations/es.json.js +3 -0
- package/dist/admin/admin/src/translations/es.json.js.map +1 -1
- package/dist/admin/admin/src/translations/es.json.mjs +3 -0
- package/dist/admin/admin/src/translations/es.json.mjs.map +1 -1
- package/dist/admin/admin/src/translations/fr.json.js +2 -0
- package/dist/admin/admin/src/translations/fr.json.js.map +1 -1
- package/dist/admin/admin/src/translations/fr.json.mjs +2 -0
- package/dist/admin/admin/src/translations/fr.json.mjs.map +1 -1
- package/dist/admin/admin/src/translations/tr.json.js +216 -1
- package/dist/admin/admin/src/translations/tr.json.js.map +1 -1
- package/dist/admin/admin/src/translations/tr.json.mjs +215 -2
- package/dist/admin/admin/src/translations/tr.json.mjs.map +1 -1
- package/dist/admin/admin/src/utils/getFetchClient.js +15 -7
- package/dist/admin/admin/src/utils/getFetchClient.js.map +1 -1
- package/dist/admin/admin/src/utils/getFetchClient.mjs +15 -7
- package/dist/admin/admin/src/utils/getFetchClient.mjs.map +1 -1
- package/dist/admin/admin/tests/server.js +123 -119
- package/dist/admin/admin/tests/server.js.map +1 -1
- package/dist/admin/admin/tests/server.mjs +124 -120
- package/dist/admin/admin/tests/server.mjs.map +1 -1
- package/dist/admin/src/components/SubNav.d.ts +12 -4
- package/dist/admin/src/constants.d.ts +6 -0
- package/dist/admin/src/layouts/UnauthenticatedLayout.d.ts +4 -2
- package/dist/admin/src/pages/Settings/pages/Roles/components/CollapseLabel.d.ts +7 -3
- package/dist/admin/src/pages/Settings/pages/Roles/components/ConditionsButton.d.ts +4 -2
- package/dist/admin/src/pages/Settings/pages/Roles/components/HiddenAction.d.ts +1 -1
- package/dist/server/server/src/controllers/api-token.js +4 -5
- package/dist/server/server/src/controllers/api-token.js.map +1 -1
- package/dist/server/server/src/controllers/api-token.mjs +4 -5
- package/dist/server/server/src/controllers/api-token.mjs.map +1 -1
- package/dist/server/server/src/services/api-token.js +37 -18
- package/dist/server/server/src/services/api-token.js.map +1 -1
- package/dist/server/server/src/services/api-token.mjs +38 -19
- package/dist/server/server/src/services/api-token.mjs.map +1 -1
- package/dist/server/server/src/services/index.js +5 -2
- package/dist/server/server/src/services/index.js.map +1 -1
- package/dist/server/server/src/services/index.mjs +5 -2
- package/dist/server/server/src/services/index.mjs.map +1 -1
- package/dist/server/server/src/strategies/content-api-token.js +1 -1
- package/dist/server/server/src/strategies/content-api-token.js.map +1 -1
- package/dist/server/server/src/strategies/content-api-token.mjs +1 -1
- package/dist/server/server/src/strategies/content-api-token.mjs.map +1 -1
- package/dist/server/src/controllers/api-token.d.ts.map +1 -1
- package/dist/server/src/index.d.ts +1 -0
- package/dist/server/src/index.d.ts.map +1 -1
- package/dist/server/src/services/api-token.d.ts.map +1 -1
- package/dist/server/src/services/index.d.ts +2 -0
- package/dist/server/src/services/index.d.ts.map +1 -1
- package/package.json +10 -10
|
@@ -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
|
|
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.
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
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.
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
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.
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
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
|
-
|
|
106
|
-
|
|
107
|
-
|
|
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
|
|
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":"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"}
|
|
@@ -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 {
|
|
5
|
-
import {
|
|
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
|
|
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__*/
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
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__*/
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
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(
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
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
|
-
|
|
104
|
-
|
|
105
|
-
|
|
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
|
|
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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"}
|
|
@@ -329,6 +329,11 @@ const HOOKS = {
|
|
|
329
329
|
* @type {string}
|
|
330
330
|
*/ INJECT_COLUMN_IN_TABLE: 'Admin/CM/pages/ListView/inject-column-in-table',
|
|
331
331
|
/**
|
|
332
|
+
* Hook that allows to mutate the displayed filters of the list view
|
|
333
|
+
* @constant
|
|
334
|
+
* @type {string}
|
|
335
|
+
*/ INJECT_LIST_VIEW_FILTERS: 'Admin/CM/pages/ListView/inject-in-filters',
|
|
336
|
+
/**
|
|
332
337
|
* Hook that allows to mutate the CM's collection types links pre-set filters
|
|
333
338
|
* @constant
|
|
334
339
|
* @type {string}
|