@northern.tech/store 0.19.2 → 0.20.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 (149) hide show
  1. package/dist/actions.cjs +3 -0
  2. package/dist/actions.cjs.map +1 -1
  3. package/dist/actions.d.cts +2 -1
  4. package/dist/actions.d.ts +2 -1
  5. package/dist/actions.js +5 -5
  6. package/dist/api/general-api.js +1 -1
  7. package/dist/api/users-api.js +1 -1
  8. package/dist/appSlice/constants.cjs +3 -45
  9. package/dist/appSlice/constants.cjs.map +1 -1
  10. package/dist/appSlice/constants.d.cts +0 -15
  11. package/dist/appSlice/constants.d.ts +0 -15
  12. package/dist/appSlice/constants.js +1 -1
  13. package/dist/appSlice/index.js +1 -1
  14. package/dist/appSlice/mocks.js +1 -1
  15. package/dist/appSlice/thunks.cjs +14 -56
  16. package/dist/appSlice/thunks.cjs.map +1 -1
  17. package/dist/appSlice/thunks.js +16 -16
  18. package/dist/auth.js +1 -1
  19. package/dist/{chunk-RJRZXDVT.js → chunk-3JBVI4UH.js} +7 -7
  20. package/dist/{chunk-43ZBO3JW.js → chunk-4ZYLGBJU.js} +2 -2
  21. package/dist/{chunk-B3C6H2PR.js → chunk-7WIISD2N.js} +17 -14
  22. package/dist/{chunk-B3C6H2PR.js.map → chunk-7WIISD2N.js.map} +1 -1
  23. package/dist/{chunk-KJ2SUFAU.js → chunk-AY7E7VA6.js} +81 -16
  24. package/dist/chunk-AY7E7VA6.js.map +1 -0
  25. package/dist/{chunk-AJ6DIDO4.js → chunk-DBBE6D36.js} +4 -46
  26. package/dist/chunk-DBBE6D36.js.map +1 -0
  27. package/dist/{chunk-AV7SRATY.js → chunk-E657OJL4.js} +6 -6
  28. package/dist/{chunk-XOASGJZU.js → chunk-FXKMYYK5.js} +13 -13
  29. package/dist/{chunk-ZAZTNDSY.js → chunk-P3N2J3QT.js} +9 -9
  30. package/dist/{chunk-42GZ6FGV.js → chunk-PL6RIFD5.js} +2 -2
  31. package/dist/{chunk-VCEFZTWS.js → chunk-TIL2S3JA.js} +4 -1
  32. package/dist/chunk-TIL2S3JA.js.map +1 -0
  33. package/dist/{chunk-45BHMNX6.js → chunk-V6BWOIRC.js} +6 -6
  34. package/dist/{chunk-O7DR57RN.js → chunk-ZGRY42BZ.js} +9 -12
  35. package/dist/{chunk-O7DR57RN.js.map → chunk-ZGRY42BZ.js.map} +1 -1
  36. package/dist/{chunk-3NOV7X4M.js → chunk-ZZQJWNQT.js} +3 -1
  37. package/dist/chunk-ZZQJWNQT.js.map +1 -0
  38. package/dist/commonConstants.js +1 -1
  39. package/dist/commonSelectors.cjs +11 -56
  40. package/dist/commonSelectors.cjs.map +1 -1
  41. package/dist/commonSelectors.js +8 -8
  42. package/dist/constants.cjs +3 -45
  43. package/dist/constants.cjs.map +1 -1
  44. package/dist/constants.js +1 -1
  45. package/dist/deploymentsSlice/constants.js +1 -1
  46. package/dist/deploymentsSlice/index.js +1 -1
  47. package/dist/deploymentsSlice/mocks.js +1 -1
  48. package/dist/deploymentsSlice/selectors.js +1 -1
  49. package/dist/deploymentsSlice/thunks.cjs +14 -56
  50. package/dist/deploymentsSlice/thunks.cjs.map +1 -1
  51. package/dist/deploymentsSlice/thunks.js +16 -16
  52. package/dist/devicesSlice/constants.js +1 -1
  53. package/dist/devicesSlice/index.js +1 -1
  54. package/dist/devicesSlice/mocks.js +1 -1
  55. package/dist/devicesSlice/selectors.cjs +8 -11
  56. package/dist/devicesSlice/selectors.cjs.map +1 -1
  57. package/dist/devicesSlice/selectors.js +2 -2
  58. package/dist/devicesSlice/thunks.cjs +14 -56
  59. package/dist/devicesSlice/thunks.cjs.map +1 -1
  60. package/dist/devicesSlice/thunks.js +16 -16
  61. package/dist/liststatehook.js +1 -1
  62. package/dist/locationutils.js +1 -1
  63. package/dist/monitorSlice/index.js +1 -1
  64. package/dist/monitorSlice/mocks.js +1 -1
  65. package/dist/monitorSlice/thunks.cjs +14 -56
  66. package/dist/monitorSlice/thunks.cjs.map +1 -1
  67. package/dist/monitorSlice/thunks.js +14 -14
  68. package/dist/onboardingSlice/thunks.cjs +14 -56
  69. package/dist/onboardingSlice/thunks.cjs.map +1 -1
  70. package/dist/onboardingSlice/thunks.js +16 -16
  71. package/dist/organizationSlice/constants.js +1 -1
  72. package/dist/organizationSlice/index.cjs +3 -0
  73. package/dist/organizationSlice/index.cjs.map +1 -1
  74. package/dist/organizationSlice/index.d.cts +4 -1
  75. package/dist/organizationSlice/index.d.ts +4 -1
  76. package/dist/organizationSlice/index.js +2 -2
  77. package/dist/organizationSlice/mocks.cjs +175 -0
  78. package/dist/organizationSlice/mocks.cjs.map +1 -1
  79. package/dist/organizationSlice/mocks.d.cts +121 -2
  80. package/dist/organizationSlice/mocks.d.ts +121 -2
  81. package/dist/organizationSlice/mocks.js +87 -2
  82. package/dist/organizationSlice/mocks.js.map +1 -1
  83. package/dist/organizationSlice/selectors.cjs +3 -0
  84. package/dist/organizationSlice/selectors.cjs.map +1 -1
  85. package/dist/organizationSlice/selectors.d.cts +3 -2
  86. package/dist/organizationSlice/selectors.d.ts +3 -2
  87. package/dist/organizationSlice/selectors.js +4 -2
  88. package/dist/organizationSlice/thunks.cjs +97 -71
  89. package/dist/organizationSlice/thunks.cjs.map +1 -1
  90. package/dist/organizationSlice/thunks.d.cts +17 -3
  91. package/dist/organizationSlice/thunks.d.ts +17 -3
  92. package/dist/organizationSlice/thunks.js +22 -18
  93. package/dist/organizationSlice/types.cjs.map +1 -1
  94. package/dist/organizationSlice/types.d.cts +30 -7
  95. package/dist/organizationSlice/types.d.ts +30 -7
  96. package/dist/releasesSlice/index.js +1 -1
  97. package/dist/releasesSlice/mocks.js +1 -1
  98. package/dist/releasesSlice/selectors.cjs.map +1 -1
  99. package/dist/releasesSlice/selectors.js +3 -3
  100. package/dist/releasesSlice/thunks.cjs +14 -56
  101. package/dist/releasesSlice/thunks.cjs.map +1 -1
  102. package/dist/releasesSlice/thunks.js +14 -14
  103. package/dist/selectors.cjs +14 -56
  104. package/dist/selectors.cjs.map +1 -1
  105. package/dist/selectors.d.cts +1 -1
  106. package/dist/selectors.d.ts +1 -1
  107. package/dist/selectors.js +28 -26
  108. package/dist/sockethook.js +1 -1
  109. package/dist/store.cjs +3 -0
  110. package/dist/store.cjs.map +1 -1
  111. package/dist/store.js +6 -6
  112. package/dist/storehooks.cjs +93 -70
  113. package/dist/storehooks.cjs.map +1 -1
  114. package/dist/storehooks.js +20 -18
  115. package/dist/storehooks.js.map +1 -1
  116. package/dist/thunks.cjs +95 -69
  117. package/dist/thunks.cjs.map +1 -1
  118. package/dist/thunks.d.cts +1 -1
  119. package/dist/thunks.d.ts +1 -1
  120. package/dist/thunks.js +20 -16
  121. package/dist/useDeploymentDevice.cjs +14 -56
  122. package/dist/useDeploymentDevice.cjs.map +1 -1
  123. package/dist/useDeploymentDevice.js +16 -16
  124. package/dist/usersSlice/constants.js +1 -1
  125. package/dist/usersSlice/index.js +1 -1
  126. package/dist/usersSlice/mocks.js +1 -1
  127. package/dist/usersSlice/selectors.cjs +3 -45
  128. package/dist/usersSlice/selectors.cjs.map +1 -1
  129. package/dist/usersSlice/selectors.js +3 -3
  130. package/dist/usersSlice/thunks.cjs +14 -56
  131. package/dist/usersSlice/thunks.cjs.map +1 -1
  132. package/dist/usersSlice/thunks.js +16 -16
  133. package/dist/utils.cjs +18 -57
  134. package/dist/utils.cjs.map +1 -1
  135. package/dist/utils.d.cts +1 -3
  136. package/dist/utils.d.ts +1 -3
  137. package/dist/utils.js +2 -2
  138. package/package.json +1 -1
  139. package/dist/chunk-3NOV7X4M.js.map +0 -1
  140. package/dist/chunk-AJ6DIDO4.js.map +0 -1
  141. package/dist/chunk-KJ2SUFAU.js.map +0 -1
  142. package/dist/chunk-VCEFZTWS.js.map +0 -1
  143. /package/dist/{chunk-RJRZXDVT.js.map → chunk-3JBVI4UH.js.map} +0 -0
  144. /package/dist/{chunk-43ZBO3JW.js.map → chunk-4ZYLGBJU.js.map} +0 -0
  145. /package/dist/{chunk-AV7SRATY.js.map → chunk-E657OJL4.js.map} +0 -0
  146. /package/dist/{chunk-XOASGJZU.js.map → chunk-FXKMYYK5.js.map} +0 -0
  147. /package/dist/{chunk-ZAZTNDSY.js.map → chunk-P3N2J3QT.js.map} +0 -0
  148. /package/dist/{chunk-42GZ6FGV.js.map → chunk-PL6RIFD5.js.map} +0 -0
  149. /package/dist/{chunk-45BHMNX6.js.map → chunk-V6BWOIRC.js.map} +0 -0
@@ -11,27 +11,28 @@ import {
11
11
  getIntegrations,
12
12
  getLatestReleaseInfo,
13
13
  getOnboardingState as getOnboardingState2,
14
+ getProducts,
14
15
  getRoles,
15
16
  getUserOrganization,
16
17
  getUserSettings as getUserSettings2,
17
18
  saveGlobalSettings,
18
19
  saveUserSettings
19
- } from "./chunk-KJ2SUFAU.js";
20
+ } from "./chunk-AY7E7VA6.js";
20
21
  import {
21
22
  getReleases
22
- } from "./chunk-AV7SRATY.js";
23
- import "./chunk-45BHMNX6.js";
24
- import "./chunk-ZAZTNDSY.js";
23
+ } from "./chunk-E657OJL4.js";
24
+ import "./chunk-V6BWOIRC.js";
25
+ import "./chunk-P3N2J3QT.js";
25
26
  import "./chunk-XJLZK4QY.js";
26
27
  import "./chunk-IRQRV552.js";
27
28
  import {
28
29
  actions_default
29
- } from "./chunk-RJRZXDVT.js";
30
- import "./chunk-TRKA7XYU.js";
30
+ } from "./chunk-3JBVI4UH.js";
31
+ import "./chunk-CQXDAXQF.js";
31
32
  import "./chunk-YR65C62H.js";
32
- import "./chunk-VCEFZTWS.js";
33
+ import "./chunk-TRKA7XYU.js";
33
34
  import "./chunk-PVCHKW35.js";
34
- import "./chunk-CQXDAXQF.js";
35
+ import "./chunk-TIL2S3JA.js";
35
36
  import "./chunk-VODRLEDP.js";
36
37
  import "./chunk-6WJI4MOP.js";
37
38
  import "./chunk-OLKM53RL.js";
@@ -44,30 +45,30 @@ import {
44
45
  getIsEnterprise,
45
46
  getOnboardingState,
46
47
  getUserCapabilities
47
- } from "./chunk-XOASGJZU.js";
48
- import "./chunk-42GZ6FGV.js";
48
+ } from "./chunk-FXKMYYK5.js";
49
+ import "./chunk-JIS4PA3R.js";
49
50
  import {
50
51
  getGlobalSettings,
51
52
  getOfflineThresholdSettings,
52
53
  getUserSettings
53
- } from "./chunk-43ZBO3JW.js";
54
+ } from "./chunk-4ZYLGBJU.js";
55
+ import "./chunk-PL6RIFD5.js";
56
+ import "./chunk-YO22XLHI.js";
54
57
  import {
55
58
  getIsServiceProvider
56
- } from "./chunk-3NOV7X4M.js";
57
- import "./chunk-YO22XLHI.js";
58
- import "./chunk-JIS4PA3R.js";
59
+ } from "./chunk-ZZQJWNQT.js";
59
60
  import "./chunk-WR6RQKF5.js";
60
61
  import {
61
62
  getDevicesByStatus,
62
63
  getSortedFilteringAttributes
63
- } from "./chunk-O7DR57RN.js";
64
+ } from "./chunk-ZGRY42BZ.js";
64
65
  import {
65
66
  getFeatures
66
67
  } from "./chunk-4BHM6WVX.js";
67
68
  import {
68
69
  getComparisonCompatibleVersion,
69
70
  stringToBoolean
70
- } from "./chunk-B3C6H2PR.js";
71
+ } from "./chunk-7WIISD2N.js";
71
72
  import {
72
73
  DEPLOYMENT_STATES,
73
74
  DEVICE_STATES,
@@ -77,7 +78,7 @@ import {
77
78
  import "./chunk-2DYA3X77.js";
78
79
  import "./chunk-FAJ3I2UQ.js";
79
80
  import "./chunk-ZKAH3APE.js";
80
- import "./chunk-AJ6DIDO4.js";
81
+ import "./chunk-DBBE6D36.js";
81
82
 
82
83
  // src/storehooks.ts
83
84
  import { useCallback, useEffect, useRef, useState } from "react";
@@ -201,7 +202,8 @@ var useAppInit = (userId) => {
201
202
  dispatch(getGroups()),
202
203
  dispatch(getIntegrations()),
203
204
  dispatch(getReleases()),
204
- dispatch(getAllDeviceCounts()).unwrap()
205
+ dispatch(getAllDeviceCounts()).unwrap(),
206
+ dispatch(getProducts())
205
207
  ];
206
208
  if (hasMultitenancy) {
207
209
  tasks.push(dispatch(getDeviceLimits()));
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/storehooks.ts"],"sourcesContent":["// Copyright 2024 Northern.tech AS\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// @ts-nocheck\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\n\nimport { extractErrorMessage } from '@northern.tech/utils/helpers';\nimport dayjs from 'dayjs';\nimport durationDayJs from 'dayjs/plugin/duration.js';\nimport Cookies from 'universal-cookie';\n\nimport storeActions from './actions';\nimport { getSessionInfo } from './auth';\nimport { DEPLOYMENT_STATES, DEVICE_STATES, TIMEOUTS, timeUnits } from './constants';\nimport {\n getDevicesByStatus as getDevicesByStatusSelector,\n getFeatures,\n getGlobalSettings as getGlobalSettingsSelector,\n getIsEnterprise,\n getIsServiceProvider,\n getOfflineThresholdSettings,\n getOnboardingState as getOnboardingStateSelector,\n getSortedFilteringAttributes,\n getUserCapabilities,\n getUserSettings as getUserSettingsSelector\n} from './selectors';\nimport {\n getAllDeviceCounts,\n getDeploymentsByStatus,\n getDeviceAttributes,\n getDeviceById,\n getDeviceLimits,\n getDevicesByStatus,\n getDynamicGroups,\n getGlobalSettings,\n getGroups,\n getIntegrations,\n getLatestReleaseInfo,\n getOnboardingState,\n getReleases,\n getRoles,\n getUserOrganization,\n getUserSettings,\n saveGlobalSettings,\n saveUserSettings\n} from './thunks';\nimport { getComparisonCompatibleVersion, stringToBoolean } from './utils';\n\nconst cookies = new Cookies();\ndayjs.extend(durationDayJs);\n\nconst { setDeviceListState, setFirstLoginAfterSignup, setTooltipsState, setShowStartupNotification } = storeActions;\n\nconst featureFlags = [\n 'hasAiEnabled',\n 'hasAuditlogs',\n 'hasMultitenancy',\n 'hasDeltaProgress',\n 'hasDeviceConfig',\n 'hasDeviceConnect',\n 'hasFeedbackEnabled',\n 'hasOldTheme',\n 'hasReporting',\n 'hasMonitor',\n 'hasMCUEnabled',\n 'isEnterprise'\n];\n\nconst environmentDatas = ['commit', 'feedbackProbability', 'hostAddress', 'hostedAnnouncement', 'recaptchaSiteKey', 'sentry', 'stripeAPIKey', 'trackerCode'];\n\nexport const parseEnvironmentInfo = () => (dispatch, getState) => {\n const state = getState();\n let onboardingComplete = state.onboarding.complete || !!JSON.parse(window.localStorage.getItem('onboardingComplete') ?? 'false');\n let demoArtifactPort = 85;\n let environmentData = {};\n let environmentFeatures = {};\n let versionInfo = {};\n if (mender_environment) {\n const {\n features = {},\n demoArtifactPort: port,\n disableOnboarding,\n integrationVersion,\n menderVersion,\n menderArtifactVersion,\n metaMenderVersion\n } = mender_environment;\n demoArtifactPort = port || demoArtifactPort;\n environmentData = environmentDatas.reduce((accu, flag) => ({ ...accu, [flag]: mender_environment[flag] || state.app[flag] }), {});\n environmentFeatures = {\n ...featureFlags.reduce((accu, flag) => ({ ...accu, [flag]: stringToBoolean(features[flag]) }), {}),\n isHosted: stringToBoolean(features.isHosted) || window.location.hostname.includes('hosted.mender.io')\n };\n onboardingComplete = !stringToBoolean(environmentFeatures.isHosted) || stringToBoolean(disableOnboarding) || onboardingComplete;\n versionInfo = {\n docs: isNaN(integrationVersion.charAt(0)) ? '' : integrationVersion.split('.').slice(0, 2).join('.'),\n remainder: {\n Integration: getComparisonCompatibleVersion(integrationVersion),\n 'Mender-Client': getComparisonCompatibleVersion(menderVersion),\n 'Mender-Artifact': menderArtifactVersion,\n 'Meta-Mender': metaMenderVersion\n }\n };\n }\n return Promise.all([\n dispatch(storeActions.successfullyLoggedIn(getSessionInfo())),\n dispatch(storeActions.setOnboardingComplete(onboardingComplete)),\n dispatch(storeActions.setDemoArtifactPort(demoArtifactPort)),\n dispatch(storeActions.setFeatures(environmentFeatures)),\n dispatch(storeActions.setVersionInformation({ ...versionInfo.remainder, docsVersion: versionInfo.docs })),\n dispatch(storeActions.setEnvironmentData(environmentData)),\n dispatch(getLatestReleaseInfo())\n ]);\n};\n\nconst maybeAddOnboardingTasks = ({ devicesByStatus, dispatch, onboardingState, tasks }) => {\n if (!onboardingState.showTips || onboardingState.complete) {\n return tasks;\n }\n // try to retrieve full device details for onboarding devices to ensure ips etc. are available\n // we only load the first few/ 20 devices, as it is possible the onboarding is left dangling\n // and a lot of devices are present and we don't want to flood the backend for this\n return devicesByStatus[DEVICE_STATES.accepted].deviceIds.reduce((accu, id) => {\n accu.push(dispatch(getDeviceById(id)));\n return accu;\n }, tasks);\n};\n\nexport const useAppInit = userId => {\n const dispatch = useDispatch();\n const [coreInitDone, setCoreInitDone] = useState(false);\n const isEnterprise = useSelector(getIsEnterprise);\n const { hasMultitenancy, isHosted } = useSelector(getFeatures);\n const devicesByStatus = useSelector(getDevicesByStatusSelector);\n const onboardingState = useSelector(getOnboardingStateSelector);\n const { columnSelection = [], trackingConsentGiven: hasTrackingEnabled, tooltips = {} } = useSelector(getUserSettingsSelector);\n const { canManageUsers } = useSelector(getUserCapabilities);\n const { interval, intervalUnit } = useSelector(getOfflineThresholdSettings);\n const { id_attribute } = useSelector(getGlobalSettingsSelector);\n const { identityAttributes } = useSelector(getSortedFilteringAttributes);\n const isServiceProvider = useSelector(getIsServiceProvider);\n const coreInitRunning = useRef(false);\n const fullInitRunning = useRef(false);\n\n const retrieveCoreData = useCallback(() => {\n const tasks = [\n dispatch(parseEnvironmentInfo()),\n dispatch(getUserSettings()),\n dispatch(getGlobalSettings()),\n dispatch(setFirstLoginAfterSignup(stringToBoolean(cookies.get('firstLoginAfterSignup'))))\n ];\n const multitenancy = hasMultitenancy || isHosted || isEnterprise;\n if (multitenancy) {\n tasks.push(dispatch(getUserOrganization()));\n }\n return Promise.all(tasks);\n }, [dispatch, hasMultitenancy, isHosted, isEnterprise]);\n\n const retrieveAppData = useCallback(() => {\n if (isServiceProvider) {\n return Promise.resolve(dispatch(getRoles()));\n }\n const tasks = [\n dispatch(getDeviceAttributes()),\n dispatch(getDeploymentsByStatus({ status: DEPLOYMENT_STATES.finished, shouldSelect: false })),\n dispatch(getDeploymentsByStatus({ status: DEPLOYMENT_STATES.inprogress })),\n dispatch(getDevicesByStatus({ status: DEVICE_STATES.accepted })),\n dispatch(getDevicesByStatus({ status: DEVICE_STATES.pending })),\n dispatch(getDevicesByStatus({ status: DEVICE_STATES.preauth })),\n dispatch(getDevicesByStatus({ status: DEVICE_STATES.rejected })),\n dispatch(getDynamicGroups()),\n dispatch(getGroups()),\n dispatch(getIntegrations()),\n dispatch(getReleases()),\n dispatch(getAllDeviceCounts()).unwrap()\n ];\n if (hasMultitenancy) {\n tasks.push(dispatch(getDeviceLimits()));\n tasks.push(dispatch(getRoles()));\n }\n return Promise.all(tasks);\n }, [dispatch, hasMultitenancy, isServiceProvider]);\n\n const interpretAppData = useCallback(() => {\n const settings = {};\n if (cookies.get('_ga') && typeof hasTrackingEnabled === 'undefined') {\n settings.trackingConsentGiven = true;\n }\n let tasks = [\n dispatch(setDeviceListState({ selectedAttributes: columnSelection.map(column => ({ attribute: column.key, scope: column.scope })) })),\n dispatch(setTooltipsState(tooltips)), // tooltips read state is primarily trusted from the redux store, except on app init - here user settings are the reference\n dispatch(saveUserSettings(settings))\n ];\n // checks if user id is set and if cookie for helptips exists for that user\n tasks = maybeAddOnboardingTasks({ devicesByStatus, dispatch, tasks, onboardingState });\n\n if (canManageUsers && intervalUnit && intervalUnit !== timeUnits.days) {\n const duration = dayjs.duration(interval, intervalUnit);\n const days = duration.asDays();\n if (days < 1) {\n tasks.push(Promise.resolve(setTimeout(() => dispatch(setShowStartupNotification(true)), TIMEOUTS.fiveSeconds)));\n } else {\n const roundedDays = Math.max(1, Math.round(days));\n tasks.push(dispatch(saveGlobalSettings({ offlineThreshold: { interval: roundedDays, intervalUnit: timeUnits.days } })));\n }\n }\n\n // the following is used as a migration and initialization of the stored identity attribute\n // changing the default device attribute to the first non-deviceId attribute, unless a stored\n // id attribute setting exists\n const identityOptions = identityAttributes.filter(attribute => !['id', 'Device ID', 'status'].includes(attribute));\n if (!id_attribute && identityOptions.length) {\n tasks.push(dispatch(saveGlobalSettings({ id_attribute: { attribute: identityOptions[0], scope: 'identity' } })));\n } else if (typeof id_attribute === 'string') {\n let attribute = id_attribute;\n if (attribute === 'Device ID') {\n attribute = 'id';\n }\n tasks.push(dispatch(saveGlobalSettings({ id_attribute: { attribute, scope: 'identity' } })));\n }\n tasks.push(dispatch(storeActions.setAppInitDone()));\n return Promise.all(tasks);\n }, [\n columnSelection,\n dispatch,\n identityAttributes,\n hasTrackingEnabled,\n canManageUsers,\n devicesByStatus,\n id_attribute,\n interval,\n intervalUnit,\n onboardingState,\n tooltips\n ]);\n\n const initializeAppData = useCallback(\n () =>\n retrieveAppData()\n .then(interpretAppData)\n // this is allowed to fail if no user information are available\n .catch(err => console.log(extractErrorMessage(err)))\n .then(() => dispatch(getOnboardingState())),\n [dispatch, retrieveAppData, interpretAppData]\n );\n\n useEffect(() => {\n if (!userId || coreInitRunning.current) {\n return;\n }\n coreInitRunning.current = true;\n retrieveCoreData().then(() => setCoreInitDone(true));\n }, [userId, retrieveCoreData]);\n\n useEffect(() => {\n if (fullInitRunning.current || !coreInitDone) {\n return;\n }\n fullInitRunning.current = true;\n initializeAppData();\n }, [initializeAppData, coreInitDone]);\n\n return { coreInitDone };\n};\n"],"mappings":"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","names":["getUserSettings","getGlobalSettings","getDevicesByStatus","getOnboardingState"]}
1
+ {"version":3,"sources":["../src/storehooks.ts"],"sourcesContent":["// Copyright 2024 Northern.tech AS\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// @ts-nocheck\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\n\nimport { extractErrorMessage } from '@northern.tech/utils/helpers';\nimport dayjs from 'dayjs';\nimport durationDayJs from 'dayjs/plugin/duration.js';\nimport Cookies from 'universal-cookie';\n\nimport storeActions from './actions';\nimport { getSessionInfo } from './auth';\nimport { DEPLOYMENT_STATES, DEVICE_STATES, TIMEOUTS, timeUnits } from './constants';\nimport {\n getDevicesByStatus as getDevicesByStatusSelector,\n getFeatures,\n getGlobalSettings as getGlobalSettingsSelector,\n getIsEnterprise,\n getIsServiceProvider,\n getOfflineThresholdSettings,\n getOnboardingState as getOnboardingStateSelector,\n getSortedFilteringAttributes,\n getUserCapabilities,\n getUserSettings as getUserSettingsSelector\n} from './selectors';\nimport {\n getAllDeviceCounts,\n getDeploymentsByStatus,\n getDeviceAttributes,\n getDeviceById,\n getDeviceLimits,\n getDevicesByStatus,\n getDynamicGroups,\n getGlobalSettings,\n getGroups,\n getIntegrations,\n getLatestReleaseInfo,\n getOnboardingState,\n getProducts,\n getReleases,\n getRoles,\n getUserOrganization,\n getUserSettings,\n saveGlobalSettings,\n saveUserSettings\n} from './thunks';\nimport { getComparisonCompatibleVersion, stringToBoolean } from './utils';\n\nconst cookies = new Cookies();\ndayjs.extend(durationDayJs);\n\nconst { setDeviceListState, setFirstLoginAfterSignup, setTooltipsState, setShowStartupNotification } = storeActions;\n\nconst featureFlags = [\n 'hasAiEnabled',\n 'hasAuditlogs',\n 'hasMultitenancy',\n 'hasDeltaProgress',\n 'hasDeviceConfig',\n 'hasDeviceConnect',\n 'hasFeedbackEnabled',\n 'hasOldTheme',\n 'hasReporting',\n 'hasMonitor',\n 'hasMCUEnabled',\n 'isEnterprise'\n];\n\nconst environmentDatas = ['commit', 'feedbackProbability', 'hostAddress', 'hostedAnnouncement', 'recaptchaSiteKey', 'sentry', 'stripeAPIKey', 'trackerCode'];\n\nexport const parseEnvironmentInfo = () => (dispatch, getState) => {\n const state = getState();\n let onboardingComplete = state.onboarding.complete || !!JSON.parse(window.localStorage.getItem('onboardingComplete') ?? 'false');\n let demoArtifactPort = 85;\n let environmentData = {};\n let environmentFeatures = {};\n let versionInfo = {};\n if (mender_environment) {\n const {\n features = {},\n demoArtifactPort: port,\n disableOnboarding,\n integrationVersion,\n menderVersion,\n menderArtifactVersion,\n metaMenderVersion\n } = mender_environment;\n demoArtifactPort = port || demoArtifactPort;\n environmentData = environmentDatas.reduce((accu, flag) => ({ ...accu, [flag]: mender_environment[flag] || state.app[flag] }), {});\n environmentFeatures = {\n ...featureFlags.reduce((accu, flag) => ({ ...accu, [flag]: stringToBoolean(features[flag]) }), {}),\n isHosted: stringToBoolean(features.isHosted) || window.location.hostname.includes('hosted.mender.io')\n };\n onboardingComplete = !stringToBoolean(environmentFeatures.isHosted) || stringToBoolean(disableOnboarding) || onboardingComplete;\n versionInfo = {\n docs: isNaN(integrationVersion.charAt(0)) ? '' : integrationVersion.split('.').slice(0, 2).join('.'),\n remainder: {\n Integration: getComparisonCompatibleVersion(integrationVersion),\n 'Mender-Client': getComparisonCompatibleVersion(menderVersion),\n 'Mender-Artifact': menderArtifactVersion,\n 'Meta-Mender': metaMenderVersion\n }\n };\n }\n return Promise.all([\n dispatch(storeActions.successfullyLoggedIn(getSessionInfo())),\n dispatch(storeActions.setOnboardingComplete(onboardingComplete)),\n dispatch(storeActions.setDemoArtifactPort(demoArtifactPort)),\n dispatch(storeActions.setFeatures(environmentFeatures)),\n dispatch(storeActions.setVersionInformation({ ...versionInfo.remainder, docsVersion: versionInfo.docs })),\n dispatch(storeActions.setEnvironmentData(environmentData)),\n dispatch(getLatestReleaseInfo())\n ]);\n};\n\nconst maybeAddOnboardingTasks = ({ devicesByStatus, dispatch, onboardingState, tasks }) => {\n if (!onboardingState.showTips || onboardingState.complete) {\n return tasks;\n }\n // try to retrieve full device details for onboarding devices to ensure ips etc. are available\n // we only load the first few/ 20 devices, as it is possible the onboarding is left dangling\n // and a lot of devices are present and we don't want to flood the backend for this\n return devicesByStatus[DEVICE_STATES.accepted].deviceIds.reduce((accu, id) => {\n accu.push(dispatch(getDeviceById(id)));\n return accu;\n }, tasks);\n};\n\nexport const useAppInit = userId => {\n const dispatch = useDispatch();\n const [coreInitDone, setCoreInitDone] = useState(false);\n const isEnterprise = useSelector(getIsEnterprise);\n const { hasMultitenancy, isHosted } = useSelector(getFeatures);\n const devicesByStatus = useSelector(getDevicesByStatusSelector);\n const onboardingState = useSelector(getOnboardingStateSelector);\n const { columnSelection = [], trackingConsentGiven: hasTrackingEnabled, tooltips = {} } = useSelector(getUserSettingsSelector);\n const { canManageUsers } = useSelector(getUserCapabilities);\n const { interval, intervalUnit } = useSelector(getOfflineThresholdSettings);\n const { id_attribute } = useSelector(getGlobalSettingsSelector);\n const { identityAttributes } = useSelector(getSortedFilteringAttributes);\n const isServiceProvider = useSelector(getIsServiceProvider);\n const coreInitRunning = useRef(false);\n const fullInitRunning = useRef(false);\n\n const retrieveCoreData = useCallback(() => {\n const tasks = [\n dispatch(parseEnvironmentInfo()),\n dispatch(getUserSettings()),\n dispatch(getGlobalSettings()),\n dispatch(setFirstLoginAfterSignup(stringToBoolean(cookies.get('firstLoginAfterSignup'))))\n ];\n const multitenancy = hasMultitenancy || isHosted || isEnterprise;\n if (multitenancy) {\n tasks.push(dispatch(getUserOrganization()));\n }\n return Promise.all(tasks);\n }, [dispatch, hasMultitenancy, isHosted, isEnterprise]);\n\n const retrieveAppData = useCallback(() => {\n if (isServiceProvider) {\n return Promise.resolve(dispatch(getRoles()));\n }\n const tasks = [\n dispatch(getDeviceAttributes()),\n dispatch(getDeploymentsByStatus({ status: DEPLOYMENT_STATES.finished, shouldSelect: false })),\n dispatch(getDeploymentsByStatus({ status: DEPLOYMENT_STATES.inprogress })),\n dispatch(getDevicesByStatus({ status: DEVICE_STATES.accepted })),\n dispatch(getDevicesByStatus({ status: DEVICE_STATES.pending })),\n dispatch(getDevicesByStatus({ status: DEVICE_STATES.preauth })),\n dispatch(getDevicesByStatus({ status: DEVICE_STATES.rejected })),\n dispatch(getDynamicGroups()),\n dispatch(getGroups()),\n dispatch(getIntegrations()),\n dispatch(getReleases()),\n dispatch(getAllDeviceCounts()).unwrap(),\n dispatch(getProducts())\n ];\n if (hasMultitenancy) {\n tasks.push(dispatch(getDeviceLimits()));\n tasks.push(dispatch(getRoles()));\n }\n return Promise.all(tasks);\n }, [dispatch, hasMultitenancy, isServiceProvider]);\n\n const interpretAppData = useCallback(() => {\n const settings = {};\n if (cookies.get('_ga') && typeof hasTrackingEnabled === 'undefined') {\n settings.trackingConsentGiven = true;\n }\n let tasks = [\n dispatch(setDeviceListState({ selectedAttributes: columnSelection.map(column => ({ attribute: column.key, scope: column.scope })) })),\n dispatch(setTooltipsState(tooltips)), // tooltips read state is primarily trusted from the redux store, except on app init - here user settings are the reference\n dispatch(saveUserSettings(settings))\n ];\n // checks if user id is set and if cookie for helptips exists for that user\n tasks = maybeAddOnboardingTasks({ devicesByStatus, dispatch, tasks, onboardingState });\n\n if (canManageUsers && intervalUnit && intervalUnit !== timeUnits.days) {\n const duration = dayjs.duration(interval, intervalUnit);\n const days = duration.asDays();\n if (days < 1) {\n tasks.push(Promise.resolve(setTimeout(() => dispatch(setShowStartupNotification(true)), TIMEOUTS.fiveSeconds)));\n } else {\n const roundedDays = Math.max(1, Math.round(days));\n tasks.push(dispatch(saveGlobalSettings({ offlineThreshold: { interval: roundedDays, intervalUnit: timeUnits.days } })));\n }\n }\n\n // the following is used as a migration and initialization of the stored identity attribute\n // changing the default device attribute to the first non-deviceId attribute, unless a stored\n // id attribute setting exists\n const identityOptions = identityAttributes.filter(attribute => !['id', 'Device ID', 'status'].includes(attribute));\n if (!id_attribute && identityOptions.length) {\n tasks.push(dispatch(saveGlobalSettings({ id_attribute: { attribute: identityOptions[0], scope: 'identity' } })));\n } else if (typeof id_attribute === 'string') {\n let attribute = id_attribute;\n if (attribute === 'Device ID') {\n attribute = 'id';\n }\n tasks.push(dispatch(saveGlobalSettings({ id_attribute: { attribute, scope: 'identity' } })));\n }\n tasks.push(dispatch(storeActions.setAppInitDone()));\n return Promise.all(tasks);\n }, [\n columnSelection,\n dispatch,\n identityAttributes,\n hasTrackingEnabled,\n canManageUsers,\n devicesByStatus,\n id_attribute,\n interval,\n intervalUnit,\n onboardingState,\n tooltips\n ]);\n\n const initializeAppData = useCallback(\n () =>\n retrieveAppData()\n .then(interpretAppData)\n // this is allowed to fail if no user information are available\n .catch(err => console.log(extractErrorMessage(err)))\n .then(() => dispatch(getOnboardingState())),\n [dispatch, retrieveAppData, interpretAppData]\n );\n\n useEffect(() => {\n if (!userId || coreInitRunning.current) {\n return;\n }\n coreInitRunning.current = true;\n retrieveCoreData().then(() => setCoreInitDone(true));\n }, [userId, retrieveCoreData]);\n\n useEffect(() => {\n if (fullInitRunning.current || !coreInitDone) {\n return;\n }\n fullInitRunning.current = true;\n initializeAppData();\n }, [initializeAppData, coreInitDone]);\n\n return { coreInitDone };\n};\n"],"mappings":"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","names":["getUserSettings","getGlobalSettings","getDevicesByStatus","getOnboardingState"]}
package/dist/thunks.cjs CHANGED
@@ -114,6 +114,7 @@ __export(thunks_exports, {
114
114
  getLatestReleaseInfo: () => getLatestReleaseInfo,
115
115
  getOnboardingState: () => getOnboardingState2,
116
116
  getPermissionSets: () => getPermissionSets,
117
+ getProducts: () => getProducts,
117
118
  getRelease: () => getRelease,
118
119
  getReleases: () => getReleases,
119
120
  getReportDataWithoutBackendSupport: () => getReportDataWithoutBackendSupport,
@@ -189,6 +190,7 @@ __export(thunks_exports, {
189
190
  submitUserFeedback: () => submitUserFeedback,
190
191
  switchUserOrganization: () => switchUserOrganization,
191
192
  tenantDataDivergedMessage: () => tenantDataDivergedMessage,
193
+ transformProductResponse: () => transformProductResponse,
192
194
  triggerDeviceUpdate: () => triggerDeviceUpdate,
193
195
  updateDeploymentControlMap: () => updateDeploymentControlMap,
194
196
  updateDeviceAuth: () => updateDeviceAuth,
@@ -217,10 +219,6 @@ var import_constants5 = require("@northern.tech/utils/constants");
217
219
  // src/appSlice/constants.ts
218
220
  var import_icons_material = require("@mui/icons-material");
219
221
  var import_utils = require("@northern.tech/utils");
220
- var startingDeviceCount = {
221
- os: "for first 50 devices",
222
- professional: "for first 250 devices"
223
- };
224
222
  var chartTypes = {
225
223
  bar: { key: "bar", Icon: import_icons_material.BarChart },
226
224
  pie: { key: "pie", Icon: import_icons_material.PieChartOutline }
@@ -237,31 +235,17 @@ var PLANS = {
237
235
  os: {
238
236
  id: "os",
239
237
  name: "Basic",
240
- minimalDeviceCount: { standard: 50, micro: 100 },
241
- offer: true,
242
- price: "$34 / month",
243
- deviceCount: startingDeviceCount.os,
244
- description: "The core features of Mender. To continue using Enterprise Trial features\u2014like Delta updates, scheduled deployments, phased rollouts, device filtering, dynamic groups, RBAC, audit logs, and more\u2014please upgrade to a higher plan.",
245
- features: ["Access to core features of Mender", "Basic support"]
238
+ description: "The core features of Mender. To continue using Enterprise Trial features\u2014like Delta updates, scheduled deployments, phased rollouts, device filtering, dynamic groups, RBAC, audit logs, and more\u2014please upgrade to a higher plan."
246
239
  },
247
240
  professional: {
248
241
  id: "professional",
249
242
  name: "Professional",
250
- minimalDeviceCount: { standard: 250, micro: 500 },
251
- offer: true,
252
- price: "$291 / month",
253
- deviceCount: startingDeviceCount.professional,
254
- description: "Everything in Basic, plus enhanced update management and automation features.",
255
- features: ["Advanced OTA features", "Higher priority support"]
243
+ description: "Everything in Basic, plus enhanced update management and automation features."
256
244
  },
257
245
  enterprise: {
258
246
  id: "enterprise",
259
247
  name: "Enterprise",
260
- minimalDeviceCount: { standard: 1e3, micro: 2e3 },
261
- price: "Custom pricing",
262
- deviceCount: "Unlimited devices",
263
- description: "Every advanced feature of Mender, tailored for complex and large-scale deployments. Not available as a monthly subscription \u2014 ask us for a quote.",
264
- features: ["All Mender features", "Advanced security features", "SLA-backed support"]
248
+ description: "Every advanced feature of Mender, tailored for complex and large-scale deployments. Not available as a monthly subscription \u2014 ask us for a quote."
265
249
  }
266
250
  };
267
251
  var ADDONS = {
@@ -270,14 +254,6 @@ var ADDONS = {
270
254
  title: "Configure",
271
255
  description: "Seamlessly configure applications and devices remotely \u2013 configure each device to its environment.",
272
256
  needs: ["hasDeviceConfig"],
273
- os: {
274
- price: "$11/month",
275
- deviceCount: startingDeviceCount.os
276
- },
277
- professional: {
278
- price: "$65/month",
279
- deviceCount: startingDeviceCount.professional
280
- },
281
257
  eligible: ["os", "professional", "enterprise"]
282
258
  },
283
259
  monitor: {
@@ -285,14 +261,6 @@ var ADDONS = {
285
261
  title: "Monitor",
286
262
  description: "Detect and analyze health issues of devices, services and applications. Set up alerts so you can act quickly.",
287
263
  needs: ["hasMonitor"],
288
- os: {
289
- price: "-",
290
- deviceCount: "-"
291
- },
292
- professional: {
293
- price: "$86/month",
294
- deviceCount: startingDeviceCount.professional
295
- },
296
264
  eligible: ["professional", "enterprise"]
297
265
  },
298
266
  troubleshoot: {
@@ -300,14 +268,6 @@ var ADDONS = {
300
268
  title: "Troubleshoot",
301
269
  description: "Secure, remote access to your devices \u2013 quickly diagnose and fix issues in real time.",
302
270
  needs: ["hasDeviceConnect"],
303
- os: {
304
- price: "$27/month",
305
- deviceCount: startingDeviceCount.os
306
- },
307
- professional: {
308
- price: "$72/month",
309
- deviceCount: startingDeviceCount.professional
310
- },
311
271
  eligible: ["os", "professional", "enterprise"]
312
272
  }
313
273
  };
@@ -1331,17 +1291,14 @@ var getAttributesList = (0, import_toolkit4.createSelector)(
1331
1291
  [getFilteringAttributes, getFilteringAttributesFromConfig],
1332
1292
  ({ identityAttributes = [], inventoryAttributes = [] }, { identity = [], inventory = [] }) => [...identityAttributes, ...inventoryAttributes, ...identity, ...inventory].filter(import_helpers2.duplicateFilter)
1333
1293
  );
1334
- var getDeviceLimitStats = (0, import_toolkit4.createSelector)(
1335
- [getDeviceLimits, getAcceptedDevices],
1336
- (limits, accepted) => {
1337
- const { counts } = accepted;
1338
- return Object.entries(limits).filter(([, limit]) => limit !== 0).map(([type, limit]) => ({
1339
- type,
1340
- limit,
1341
- total: counts[type] || 0
1342
- }));
1343
- }
1344
- );
1294
+ var getDeviceLimitStats = (0, import_toolkit4.createSelector)([getDeviceLimits, getAcceptedDevices], (limits, accepted) => {
1295
+ const { counts } = accepted;
1296
+ return Object.entries(limits).filter(([, limit]) => limit !== 0).map(([type, limit]) => ({
1297
+ type,
1298
+ limit,
1299
+ total: counts[type] || 0
1300
+ }));
1301
+ });
1345
1302
  var getDeviceTypes = (0, import_toolkit4.createSelector)(
1346
1303
  [getAcceptedDevices, getDevicesById],
1347
1304
  ({ deviceIds = [] }, devicesById) => Object.keys(
@@ -1515,18 +1472,21 @@ var mapDeviceAttributes = (attributes = []) => attributes.reduce(
1515
1472
  { inventory: { device_type: [], artifact_name: "" }, identity: {}, monitor: {}, system: {}, tags: {} }
1516
1473
  );
1517
1474
  var isDarkMode = (mode) => mode === DARK_MODE;
1518
- var parseSubscriptionPreview = (lines) => lines.reduce(
1519
- (acc, { addon, amount, product }) => {
1520
- const planId = product.slice("mender_".length);
1521
- if (!addon) {
1522
- acc[planId] = (acc[planId] ?? 0) + amount;
1523
- } else {
1524
- acc.addons[addon] = (acc.addons[addon] ?? 0) + amount;
1525
- }
1526
- return acc;
1527
- },
1528
- { addons: {} }
1529
- );
1475
+ var parseSubscriptionPreview = (lines) => lines.reduce((acc, { addon, amount, product }) => {
1476
+ const tier = product.replace("mender_", "");
1477
+ if (!acc[tier]) {
1478
+ acc[tier] = {
1479
+ amount: 0,
1480
+ addons: {}
1481
+ };
1482
+ }
1483
+ if (!addon) {
1484
+ acc[tier].amount += amount;
1485
+ } else {
1486
+ acc[tier].addons[addon] = (acc[tier].addons[addon] ?? 0) + amount;
1487
+ }
1488
+ return acc;
1489
+ }, {});
1530
1490
 
1531
1491
  // src/releasesSlice/selectors.ts
1532
1492
  var getSelectedReleaseId = (state) => state.releases.selectedRelease;
@@ -2306,6 +2266,9 @@ var organizationSlice = (0, import_toolkit13.createSlice)({
2306
2266
  setSubscription: (state, action) => {
2307
2267
  state.organization.subscription = { ...state.organization.subscription, ...action.payload };
2308
2268
  },
2269
+ setProducts: (state, action) => {
2270
+ state.products = action.payload;
2271
+ },
2309
2272
  setBillingProfile: (state, action) => {
2310
2273
  state.organization.billing_profile = action.payload;
2311
2274
  },
@@ -4262,6 +4225,63 @@ var cancelRequest = createAppAsyncThunk(`${sliceName6}/cancelRequest`, (reason,
4262
4225
  () => Promise.resolve(dispatch(setSnackbar4({ message: "Deactivation request was sent successfully", autoHideDuration: TIMEOUTS.fiveSeconds })))
4263
4226
  );
4264
4227
  });
4228
+ var getTierId = (tierName) => tierName.replace("mender_", "");
4229
+ var getProductPlans = (products) => products.reduce(
4230
+ (plansById, product) => {
4231
+ const { name, prices } = product;
4232
+ const tierId = getTierId(name);
4233
+ prices.forEach((price) => {
4234
+ const existing = plansById[price.plan] ?? { ...PLANS[price.plan], tierLimitsConstrains: {} };
4235
+ const tierConstraints = price.constraints ? { [tierId]: { min: price.constraints.min, max: price.constraints.max, div: price.constraints.div } } : {};
4236
+ plansById[price.plan] = {
4237
+ ...existing,
4238
+ tierLimitsConstrains: {
4239
+ ...existing.tierLimitsConstrains,
4240
+ ...tierConstraints
4241
+ }
4242
+ };
4243
+ });
4244
+ return plansById;
4245
+ },
4246
+ { enterprise: { ...PLANS.enterprise } }
4247
+ );
4248
+ var getProductAddons = (products) => products.reduce((accu, product) => {
4249
+ const { addons = [] } = product;
4250
+ addons.forEach((addon) => {
4251
+ const { name: addonName = "", prices: addonPrices = [] } = addon;
4252
+ const existingEligible = accu[addonName]?.eligible ?? [];
4253
+ const newEligible = addonPrices.map((p) => p.plan);
4254
+ accu[addonName] = {
4255
+ ...ADDONS[addonName],
4256
+ eligible: [.../* @__PURE__ */ new Set([...existingEligible, ...newEligible, PLANS.enterprise.id])]
4257
+ };
4258
+ });
4259
+ return accu;
4260
+ }, {});
4261
+ var transformProductResponse = (products) => {
4262
+ const tiers = [];
4263
+ const sortedProducts = products.sort((a, b) => a.name.localeCompare(b.name));
4264
+ sortedProducts.forEach((tier) => {
4265
+ const addonsSupported = Object.fromEntries((tier.addons || []).map((addon) => [addon.name, addon.prices?.map((p) => p.plan)]));
4266
+ const allPlans = tier.prices.map((price) => price.plan);
4267
+ const addonsTransposed = allPlans.reduce((acc, plan) => {
4268
+ acc[plan] = Object.entries(addonsSupported).filter(([, addonSupportedPlans]) => addonSupportedPlans.includes(plan)).map(([addon]) => addon);
4269
+ return acc;
4270
+ }, {});
4271
+ const tierId = getTierId(tier.name);
4272
+ tiers.push({
4273
+ id: tierId,
4274
+ title: tierId,
4275
+ stripeProductName: tier.name,
4276
+ limitConstrains: Object.fromEntries(tier.prices.map((p) => [p.plan, p.constraints])),
4277
+ addons: addonsSupported,
4278
+ addonsByPlan: addonsTransposed
4279
+ });
4280
+ });
4281
+ const plans = getProductPlans(products);
4282
+ const addons = getProductAddons(products);
4283
+ return { plans, tiers, addons };
4284
+ };
4265
4285
  var getTargetLocation = (key) => {
4266
4286
  if (devLocations.includes(window.location.hostname)) {
4267
4287
  return "";
@@ -4476,7 +4496,7 @@ var getUserSubscription = createAppAsyncThunk(`${sliceName6}/getUserSubscription
4476
4496
  });
4477
4497
  var getBillingPreview = createAppAsyncThunk(
4478
4498
  `${sliceName6}/getBillingPreview`,
4479
- (order, { dispatch }) => general_api_default.post(`${import_constants5.tenantadmApiUrlv2}/billing/subscription/invoices/preview`, order).catch((err) => commonErrorHandler(err, "There was an error getting your billing information:", dispatch, commonErrorFallback)).then(({ data }) => order.preview_mode === "recurring" ? { ...parseSubscriptionPreview(data.lines), total: data.total } : data)
4499
+ (order, { dispatch }) => general_api_default.post(`${import_constants5.tenantadmApiUrlv2}/billing/subscription/invoices/preview`, order).catch((err) => commonErrorHandler(err, "There was an error getting your billing information:", dispatch, commonErrorFallback)).then(({ data }) => order.preview_mode === "recurring" ? { items: parseSubscriptionPreview(data.lines), total: data.total } : data)
4480
4500
  );
4481
4501
  var getCurrentSubscription = createAppAsyncThunk(
4482
4502
  `${sliceName6}/getCurrentSubscription`,
@@ -4487,6 +4507,10 @@ var getCurrentSubscription = createAppAsyncThunk(
4487
4507
  return commonErrorHandler(err, "There was an error retrieving your current subscription", dispatch, commonErrorFallback);
4488
4508
  })
4489
4509
  );
4510
+ var getProducts = createAppAsyncThunk(
4511
+ `${sliceName6}/getEnabledTiers`,
4512
+ (_, { dispatch }) => general_api_default.get(`${import_constants5.tenantadmApiUrlv2}/billing/products`).catch((err) => commonErrorHandler(err, "There was an error getting Mender products:", dispatch, commonErrorFallback)).then((res) => dispatch(actions6.setProducts(transformProductResponse(res.data))))
4513
+ );
4490
4514
  var requestPlanUpgrade = createAppAsyncThunk(
4491
4515
  `${sliceName6}/requestPlanUpgrade`,
4492
4516
  (order, { dispatch }) => general_api_default.post(`${import_constants5.tenantadmApiUrlv2}/billing/subscription`, order).catch((err) => commonErrorHandler(err, "There was an error sending your request", dispatch, commonErrorFallback)).then(() => Promise.all([setTimeout(() => dispatch(getDeviceLimits2()), TIMEOUTS.threeSeconds), dispatch(getUserOrganization())]))
@@ -5739,6 +5763,7 @@ var submitUserFeedback = createAppAsyncThunk(
5739
5763
  getLatestReleaseInfo,
5740
5764
  getOnboardingState,
5741
5765
  getPermissionSets,
5766
+ getProducts,
5742
5767
  getRelease,
5743
5768
  getReleases,
5744
5769
  getReportDataWithoutBackendSupport,
@@ -5814,6 +5839,7 @@ var submitUserFeedback = createAppAsyncThunk(
5814
5839
  submitUserFeedback,
5815
5840
  switchUserOrganization,
5816
5841
  tenantDataDivergedMessage,
5842
+ transformProductResponse,
5817
5843
  triggerDeviceUpdate,
5818
5844
  updateDeploymentControlMap,
5819
5845
  updateDeviceAuth,