@northern.tech/store 0.5.2 → 0.5.3

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 (216) hide show
  1. package/dist/actions.cjs +47 -0
  2. package/dist/actions.cjs.map +1 -1
  3. package/dist/actions.d.cts +6 -2
  4. package/dist/actions.d.ts +6 -2
  5. package/dist/actions.js +10 -10
  6. package/dist/api/general-api.cjs +1 -1
  7. package/dist/api/general-api.cjs.map +1 -1
  8. package/dist/api/general-api.d.cts +8 -8
  9. package/dist/api/general-api.d.ts +8 -8
  10. package/dist/api/general-api.js +4 -4
  11. package/dist/api/users-api.cjs +1 -1
  12. package/dist/api/users-api.cjs.map +1 -1
  13. package/dist/api/users-api.d.cts +1 -1
  14. package/dist/api/users-api.d.ts +1 -1
  15. package/dist/api/users-api.js +5 -5
  16. package/dist/appSlice/constants.cjs +1 -0
  17. package/dist/appSlice/constants.cjs.map +1 -1
  18. package/dist/appSlice/constants.d.cts +5 -0
  19. package/dist/appSlice/constants.d.ts +5 -0
  20. package/dist/appSlice/constants.js +1 -1
  21. package/dist/appSlice/index.cjs +1 -0
  22. package/dist/appSlice/index.cjs.map +1 -1
  23. package/dist/appSlice/index.js +3 -3
  24. package/dist/appSlice/mocks.cjs +1 -0
  25. package/dist/appSlice/mocks.cjs.map +1 -1
  26. package/dist/appSlice/mocks.js +3 -3
  27. package/dist/appSlice/thunks.cjs +76 -20
  28. package/dist/appSlice/thunks.cjs.map +1 -1
  29. package/dist/appSlice/thunks.js +25 -25
  30. package/dist/auth.cjs.map +1 -1
  31. package/dist/auth.js +3 -3
  32. package/dist/{chunk-MZNANSS2.js → chunk-4DOSYAJY.js} +2 -2
  33. package/dist/{chunk-R6KRH2IY.js → chunk-4UJXT6RF.js} +3 -3
  34. package/dist/{chunk-VUFRP6P3.js → chunk-5HYHE4HO.js} +2 -2
  35. package/dist/chunk-5HYHE4HO.js.map +1 -0
  36. package/dist/{chunk-ZJW3QIPM.js → chunk-66NK2ZV2.js} +2 -2
  37. package/dist/{chunk-PGFVHKP5.js → chunk-AVCIWAZB.js} +2 -2
  38. package/dist/{chunk-RS37Y2PQ.js → chunk-BNSSPYCA.js} +4 -4
  39. package/dist/chunk-BNSSPYCA.js.map +1 -0
  40. package/dist/{chunk-UE5N5VO3.js → chunk-CEEXZF5E.js} +3 -3
  41. package/dist/{chunk-UGSLGUS6.js → chunk-CWZKWW74.js} +2 -2
  42. package/dist/{chunk-3P3IE42O.js → chunk-DE25YP6N.js} +62 -54
  43. package/dist/chunk-DE25YP6N.js.map +1 -0
  44. package/dist/{chunk-QYLGIR4W.js → chunk-DXJ2WS3N.js} +3 -2
  45. package/dist/chunk-DXJ2WS3N.js.map +1 -0
  46. package/dist/{chunk-H5FAPMJJ.js → chunk-DYN7AU7R.js} +9 -9
  47. package/dist/{chunk-JXQUFKID.js → chunk-GRVTVLIZ.js} +7 -2
  48. package/dist/chunk-GRVTVLIZ.js.map +1 -0
  49. package/dist/{chunk-KC7SKI3U.js → chunk-HLTP624H.js} +8 -5
  50. package/dist/{chunk-KC7SKI3U.js.map → chunk-HLTP624H.js.map} +1 -1
  51. package/dist/{chunk-F26IKSML.js → chunk-I6JE3OLT.js} +8 -8
  52. package/dist/{chunk-ABJLRDCO.js → chunk-IY76MO6R.js} +2 -2
  53. package/dist/{chunk-V3QEONX7.js → chunk-J74LNK6P.js} +11 -11
  54. package/dist/{chunk-QKPV5RRN.js → chunk-JOK26PI7.js} +51 -18
  55. package/dist/chunk-JOK26PI7.js.map +1 -0
  56. package/dist/{chunk-KJNNEDRV.js → chunk-JZXNRDO2.js} +2 -2
  57. package/dist/{chunk-MSOXMRF7.js → chunk-KGSJ7CSA.js} +12 -3
  58. package/dist/{chunk-MSOXMRF7.js.map → chunk-KGSJ7CSA.js.map} +1 -1
  59. package/dist/{chunk-OOICURFL.js → chunk-KJJ47UIO.js} +48 -2
  60. package/dist/chunk-KJJ47UIO.js.map +1 -0
  61. package/dist/{chunk-7C4SQBEE.js → chunk-MRXTMI6O.js} +1 -1
  62. package/dist/chunk-MRXTMI6O.js.map +1 -0
  63. package/dist/{chunk-HFOTAPIJ.js → chunk-PY6ID7TL.js} +2 -1
  64. package/dist/chunk-PY6ID7TL.js.map +1 -0
  65. package/dist/{chunk-SCZLNFB5.js → chunk-VCTZ25Q5.js} +9 -9
  66. package/dist/{chunk-YY6SKZDF.js → chunk-W37ETKI6.js} +3 -12
  67. package/dist/chunk-W37ETKI6.js.map +1 -0
  68. package/dist/{chunk-QHK7GGV4.js → chunk-ZZ3YDCYZ.js} +3 -3
  69. package/dist/commonConstants.cjs.map +1 -1
  70. package/dist/commonConstants.d.cts +6 -5
  71. package/dist/commonConstants.d.ts +6 -5
  72. package/dist/commonConstants.js +2 -2
  73. package/dist/commonSelectors.cjs +8 -18
  74. package/dist/commonSelectors.cjs.map +1 -1
  75. package/dist/commonSelectors.js +9 -9
  76. package/dist/constants.cjs +1 -0
  77. package/dist/constants.cjs.map +1 -1
  78. package/dist/constants.d.cts +1 -1
  79. package/dist/constants.d.ts +1 -1
  80. package/dist/constants.js +2 -2
  81. package/dist/deploymentsSlice/constants.js +2 -2
  82. package/dist/deploymentsSlice/index.cjs.map +1 -1
  83. package/dist/deploymentsSlice/index.d.cts +2 -2
  84. package/dist/deploymentsSlice/index.d.ts +2 -2
  85. package/dist/deploymentsSlice/index.js +3 -3
  86. package/dist/deploymentsSlice/mocks.cjs.map +1 -1
  87. package/dist/deploymentsSlice/mocks.js +3 -3
  88. package/dist/deploymentsSlice/selectors.cjs +6 -0
  89. package/dist/deploymentsSlice/selectors.cjs.map +1 -1
  90. package/dist/deploymentsSlice/selectors.d.cts +22 -1
  91. package/dist/deploymentsSlice/selectors.d.ts +22 -1
  92. package/dist/deploymentsSlice/selectors.js +5 -3
  93. package/dist/deploymentsSlice/thunks.cjs +78 -20
  94. package/dist/deploymentsSlice/thunks.cjs.map +1 -1
  95. package/dist/deploymentsSlice/thunks.d.cts +14 -1
  96. package/dist/deploymentsSlice/thunks.d.ts +14 -1
  97. package/dist/deploymentsSlice/thunks.js +27 -25
  98. package/dist/devicesSlice/constants.js +2 -2
  99. package/dist/devicesSlice/index.js +3 -3
  100. package/dist/devicesSlice/mocks.js +3 -3
  101. package/dist/devicesSlice/selectors.cjs.map +1 -1
  102. package/dist/devicesSlice/selectors.js +3 -3
  103. package/dist/devicesSlice/thunks.cjs +76 -20
  104. package/dist/devicesSlice/thunks.cjs.map +1 -1
  105. package/dist/devicesSlice/thunks.js +25 -25
  106. package/dist/liststatehook.cjs +6 -3
  107. package/dist/liststatehook.cjs.map +1 -1
  108. package/dist/liststatehook.d.cts +4 -2
  109. package/dist/liststatehook.d.ts +4 -2
  110. package/dist/liststatehook.js +3 -3
  111. package/dist/locationutils.cjs +6 -3
  112. package/dist/locationutils.cjs.map +1 -1
  113. package/dist/locationutils.d.cts +3 -1
  114. package/dist/locationutils.d.ts +3 -1
  115. package/dist/locationutils.js +3 -3
  116. package/dist/monitorSlice/index.js +3 -3
  117. package/dist/monitorSlice/mocks.js +3 -3
  118. package/dist/monitorSlice/thunks.cjs +56 -9
  119. package/dist/monitorSlice/thunks.cjs.map +1 -1
  120. package/dist/monitorSlice/thunks.js +21 -21
  121. package/dist/onboardingSlice/thunks.cjs +76 -20
  122. package/dist/onboardingSlice/thunks.cjs.map +1 -1
  123. package/dist/onboardingSlice/thunks.js +25 -25
  124. package/dist/organizationSlice/constants.js +2 -2
  125. package/dist/organizationSlice/index.js +3 -3
  126. package/dist/organizationSlice/mocks.js +3 -3
  127. package/dist/organizationSlice/selectors.cjs +0 -20
  128. package/dist/organizationSlice/selectors.cjs.map +1 -1
  129. package/dist/organizationSlice/selectors.d.cts +1 -155
  130. package/dist/organizationSlice/selectors.d.ts +1 -155
  131. package/dist/organizationSlice/selectors.js +3 -5
  132. package/dist/organizationSlice/thunks.cjs +99 -43
  133. package/dist/organizationSlice/thunks.cjs.map +1 -1
  134. package/dist/organizationSlice/thunks.d.cts +5 -5
  135. package/dist/organizationSlice/thunks.d.ts +5 -5
  136. package/dist/organizationSlice/thunks.js +25 -25
  137. package/dist/releasesSlice/index.cjs +46 -0
  138. package/dist/releasesSlice/index.cjs.map +1 -1
  139. package/dist/releasesSlice/index.d.cts +51 -3
  140. package/dist/releasesSlice/index.d.ts +51 -3
  141. package/dist/releasesSlice/index.js +3 -3
  142. package/dist/releasesSlice/mocks.cjs +46 -0
  143. package/dist/releasesSlice/mocks.cjs.map +1 -1
  144. package/dist/releasesSlice/mocks.d.cts +13 -0
  145. package/dist/releasesSlice/mocks.d.ts +13 -0
  146. package/dist/releasesSlice/mocks.js +3 -3
  147. package/dist/releasesSlice/selectors.cjs +13 -0
  148. package/dist/releasesSlice/selectors.cjs.map +1 -1
  149. package/dist/releasesSlice/selectors.d.cts +186 -1
  150. package/dist/releasesSlice/selectors.d.ts +186 -1
  151. package/dist/releasesSlice/selectors.js +12 -4
  152. package/dist/releasesSlice/thunks.cjs +99 -17
  153. package/dist/releasesSlice/thunks.cjs.map +1 -1
  154. package/dist/releasesSlice/thunks.d.cts +68 -3
  155. package/dist/releasesSlice/thunks.d.ts +68 -3
  156. package/dist/releasesSlice/thunks.js +26 -22
  157. package/dist/selectors.cjs +19 -20
  158. package/dist/selectors.cjs.map +1 -1
  159. package/dist/selectors.d.cts +5 -3
  160. package/dist/selectors.d.ts +5 -3
  161. package/dist/selectors.js +19 -11
  162. package/dist/sockethook.cjs.map +1 -1
  163. package/dist/sockethook.js +2 -2
  164. package/dist/store.cjs +47 -0
  165. package/dist/store.cjs.map +1 -1
  166. package/dist/store.d.cts +11 -110
  167. package/dist/store.d.ts +11 -110
  168. package/dist/store.js +12 -12
  169. package/dist/storehooks.cjs +142 -54
  170. package/dist/storehooks.cjs.map +1 -1
  171. package/dist/storehooks.js +26 -25
  172. package/dist/storehooks.js.map +1 -1
  173. package/dist/thunks.cjs +146 -53
  174. package/dist/thunks.cjs.map +1 -1
  175. package/dist/thunks.d.cts +3 -3
  176. package/dist/thunks.d.ts +3 -3
  177. package/dist/thunks.js +33 -27
  178. package/dist/useDeploymentDevice.cjs +76 -20
  179. package/dist/useDeploymentDevice.cjs.map +1 -1
  180. package/dist/useDeploymentDevice.js +25 -25
  181. package/dist/usersSlice/constants.js +2 -2
  182. package/dist/usersSlice/index.js +3 -3
  183. package/dist/usersSlice/mocks.js +3 -3
  184. package/dist/usersSlice/selectors.cjs.map +1 -1
  185. package/dist/usersSlice/selectors.js +4 -4
  186. package/dist/usersSlice/thunks.cjs +78 -22
  187. package/dist/usersSlice/thunks.cjs.map +1 -1
  188. package/dist/usersSlice/thunks.d.cts +18 -10
  189. package/dist/usersSlice/thunks.d.ts +18 -10
  190. package/dist/usersSlice/thunks.js +27 -27
  191. package/dist/utils.cjs.map +1 -1
  192. package/dist/utils.js +3 -3
  193. package/package.json +5 -5
  194. package/dist/chunk-3P3IE42O.js.map +0 -1
  195. package/dist/chunk-7C4SQBEE.js.map +0 -1
  196. package/dist/chunk-HFOTAPIJ.js.map +0 -1
  197. package/dist/chunk-JXQUFKID.js.map +0 -1
  198. package/dist/chunk-OOICURFL.js.map +0 -1
  199. package/dist/chunk-QKPV5RRN.js.map +0 -1
  200. package/dist/chunk-QYLGIR4W.js.map +0 -1
  201. package/dist/chunk-RS37Y2PQ.js.map +0 -1
  202. package/dist/chunk-VUFRP6P3.js.map +0 -1
  203. package/dist/chunk-YY6SKZDF.js.map +0 -1
  204. /package/dist/{chunk-MZNANSS2.js.map → chunk-4DOSYAJY.js.map} +0 -0
  205. /package/dist/{chunk-R6KRH2IY.js.map → chunk-4UJXT6RF.js.map} +0 -0
  206. /package/dist/{chunk-ZJW3QIPM.js.map → chunk-66NK2ZV2.js.map} +0 -0
  207. /package/dist/{chunk-PGFVHKP5.js.map → chunk-AVCIWAZB.js.map} +0 -0
  208. /package/dist/{chunk-UE5N5VO3.js.map → chunk-CEEXZF5E.js.map} +0 -0
  209. /package/dist/{chunk-UGSLGUS6.js.map → chunk-CWZKWW74.js.map} +0 -0
  210. /package/dist/{chunk-H5FAPMJJ.js.map → chunk-DYN7AU7R.js.map} +0 -0
  211. /package/dist/{chunk-F26IKSML.js.map → chunk-I6JE3OLT.js.map} +0 -0
  212. /package/dist/{chunk-ABJLRDCO.js.map → chunk-IY76MO6R.js.map} +0 -0
  213. /package/dist/{chunk-V3QEONX7.js.map → chunk-J74LNK6P.js.map} +0 -0
  214. /package/dist/{chunk-KJNNEDRV.js.map → chunk-JZXNRDO2.js.map} +0 -0
  215. /package/dist/{chunk-SCZLNFB5.js.map → chunk-VCTZ25Q5.js.map} +0 -0
  216. /package/dist/{chunk-QHK7GGV4.js.map → chunk-ZZ3YDCYZ.js.map} +0 -0
@@ -15,68 +15,68 @@ import {
15
15
  getUserSettings as getUserSettings2,
16
16
  saveGlobalSettings,
17
17
  saveUserSettings
18
- } from "./chunk-3P3IE42O.js";
18
+ } from "./chunk-DE25YP6N.js";
19
19
  import {
20
20
  getReleases
21
- } from "./chunk-QKPV5RRN.js";
22
- import "./chunk-H5FAPMJJ.js";
23
- import "./chunk-V3QEONX7.js";
24
- import "./chunk-QHK7GGV4.js";
25
- import "./chunk-RS37Y2PQ.js";
21
+ } from "./chunk-JOK26PI7.js";
22
+ import "./chunk-DYN7AU7R.js";
23
+ import "./chunk-J74LNK6P.js";
24
+ import "./chunk-ZZ3YDCYZ.js";
25
+ import "./chunk-BNSSPYCA.js";
26
26
  import {
27
27
  actions_default
28
- } from "./chunk-F26IKSML.js";
29
- import "./chunk-OOICURFL.js";
30
- import "./chunk-UGSLGUS6.js";
31
- import "./chunk-MZNANSS2.js";
32
- import "./chunk-PGFVHKP5.js";
28
+ } from "./chunk-I6JE3OLT.js";
29
+ import "./chunk-KJJ47UIO.js";
30
+ import "./chunk-CWZKWW74.js";
31
+ import "./chunk-4DOSYAJY.js";
32
+ import "./chunk-AVCIWAZB.js";
33
33
  import "./chunk-VANBSJS5.js";
34
- import "./chunk-VUFRP6P3.js";
35
- import "./chunk-QYLGIR4W.js";
36
- import "./chunk-ABJLRDCO.js";
34
+ import "./chunk-5HYHE4HO.js";
35
+ import "./chunk-DXJ2WS3N.js";
36
+ import "./chunk-IY76MO6R.js";
37
37
  import {
38
38
  getSessionInfo
39
- } from "./chunk-ZJW3QIPM.js";
40
- import "./chunk-KC7SKI3U.js";
39
+ } from "./chunk-66NK2ZV2.js";
40
+ import "./chunk-HLTP624H.js";
41
41
  import "./chunk-NMAXZ3ZY.js";
42
42
  import {
43
43
  getIsEnterprise,
44
44
  getOnboardingState,
45
45
  getUserCapabilities
46
- } from "./chunk-SCZLNFB5.js";
47
- import "./chunk-MSOXMRF7.js";
46
+ } from "./chunk-VCTZ25Q5.js";
47
+ import "./chunk-KGSJ7CSA.js";
48
48
  import {
49
49
  getGlobalSettings,
50
50
  getOfflineThresholdSettings,
51
51
  getUserSettings
52
- } from "./chunk-R6KRH2IY.js";
52
+ } from "./chunk-4UJXT6RF.js";
53
53
  import {
54
54
  getIsServiceProvider
55
- } from "./chunk-YY6SKZDF.js";
55
+ } from "./chunk-W37ETKI6.js";
56
56
  import "./chunk-YO22XLHI.js";
57
57
  import "./chunk-JIS4PA3R.js";
58
58
  import {
59
59
  getDevicesByStatus,
60
60
  getSortedFilteringAttributes
61
- } from "./chunk-KJNNEDRV.js";
62
- import "./chunk-JXQUFKID.js";
61
+ } from "./chunk-JZXNRDO2.js";
62
+ import "./chunk-GRVTVLIZ.js";
63
63
  import {
64
64
  getFeatures
65
65
  } from "./chunk-BYUPW7RA.js";
66
66
  import {
67
67
  getComparisonCompatibleVersion,
68
68
  stringToBoolean
69
- } from "./chunk-UE5N5VO3.js";
69
+ } from "./chunk-CEEXZF5E.js";
70
70
  import {
71
71
  DEPLOYMENT_STATES,
72
72
  DEVICE_STATES,
73
73
  TIMEOUTS,
74
74
  timeUnits
75
- } from "./chunk-7C4SQBEE.js";
75
+ } from "./chunk-MRXTMI6O.js";
76
76
  import "./chunk-2DYA3X77.js";
77
77
  import "./chunk-FAJ3I2UQ.js";
78
78
  import "./chunk-ZKAH3APE.js";
79
- import "./chunk-HFOTAPIJ.js";
79
+ import "./chunk-PY6ID7TL.js";
80
80
 
81
81
  // src/storehooks.ts
82
82
  import { useCallback, useEffect, useRef, useState } from "react";
@@ -89,6 +89,7 @@ var cookies = new Cookies();
89
89
  dayjs.extend(durationDayJs);
90
90
  var { setDeviceListState, setFirstLoginAfterSignup, setTooltipsState, setShowStartupNotification } = actions_default;
91
91
  var featureFlags = [
92
+ "hasAiEnabled",
92
93
  "hasAuditlogs",
93
94
  "hasMultitenancy",
94
95
  "hasDeltaProgress",
@@ -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 getDeploymentsByStatus,\n getDeviceAttributes,\n getDeviceById,\n getDeviceLimit,\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 'hasAuditlogs',\n 'hasMultitenancy',\n 'hasDeltaProgress',\n 'hasDeviceConfig',\n 'hasDeviceConnect',\n 'hasFeedbackEnabled',\n 'hasReporting',\n 'hasMonitor',\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 return Promise.all([\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(getDeviceLimit()),\n dispatch(getRoles())\n ]);\n }, [dispatch, 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 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 getDeploymentsByStatus,\n getDeviceAttributes,\n getDeviceById,\n getDeviceLimit,\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 'hasReporting',\n 'hasMonitor',\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 return Promise.all([\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(getDeviceLimit()),\n dispatch(getRoles())\n ]);\n }, [dispatch, 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 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
@@ -68,6 +68,7 @@ __export(thunks_exports, {
68
68
  editTenantDeviceLimit: () => editTenantDeviceLimit,
69
69
  editUser: () => editUser,
70
70
  enableUser2fa: () => enableUser2fa,
71
+ generateDeploymentLogAnalysis: () => generateDeploymentLogAnalysis,
71
72
  generateToken: () => generateToken,
72
73
  get2FAQRCode: () => get2FAQRCode,
73
74
  getAllDeviceCounts: () => getAllDeviceCounts,
@@ -81,6 +82,8 @@ __export(thunks_exports, {
81
82
  getBillingPreview: () => getBillingPreview,
82
83
  getCurrentCard: () => getCurrentCard,
83
84
  getCurrentSubscription: () => getCurrentSubscription,
85
+ getDeltaGenerationJobDetails: () => getDeltaGenerationJobDetails,
86
+ getDeltaGenerationJobs: () => getDeltaGenerationJobs,
84
87
  getDeploymentDevices: () => getDeploymentDevices,
85
88
  getDeploymentsByStatus: () => getDeploymentsByStatus2,
86
89
  getDeploymentsConfig: () => getDeploymentsConfig,
@@ -183,7 +186,7 @@ __export(thunks_exports, {
183
186
  startCardUpdate: () => startCardUpdate,
184
187
  startUpgrade: () => startUpgrade,
185
188
  storeSsoConfig: () => storeSsoConfig,
186
- submitFeedback: () => submitFeedback,
189
+ submitUserFeedback: () => submitUserFeedback,
187
190
  switchUserOrganization: () => switchUserOrganization,
188
191
  tenantDataDivergedMessage: () => tenantDataDivergedMessage,
189
192
  triggerDeviceUpdate: () => triggerDeviceUpdate,
@@ -225,6 +228,7 @@ var emptyChartSelection = { software: "", group: "", chartType: chartTypes.bar.k
225
228
  var defaultReportType = "distribution";
226
229
  var defaultReports = [{ ...emptyChartSelection, group: null, attribute: "artifact_name", type: defaultReportType }];
227
230
  var locations = {
231
+ cn: { key: "cn", title: "China", location: "cn.hosted.mender.io" },
228
232
  eu: { key: "eu", title: "EU", location: "eu.hosted.mender.io" },
229
233
  us: { key: "us", title: "US", location: "hosted.mender.io" }
230
234
  };
@@ -947,6 +951,7 @@ var initialState = {
947
951
  },
948
952
  // return boolean rather than organization details
949
953
  features: {
954
+ hasAiEnabled: false,
950
955
  hasAuditlogs: false,
951
956
  hasDeltaProgress: false,
952
957
  hasMultitenancy: false,
@@ -1110,7 +1115,7 @@ var cleanUp = () => {
1110
1115
 
1111
1116
  // src/api/general-api.ts
1112
1117
  var unauthorizedRedirect = (error) => {
1113
- if (!(0, import_axios.isCancel)(error) && error.response?.status === 401 && getToken()) {
1118
+ if (!(0, import_axios.isCancel)(error) && error.response?.status === 401 && getToken() && !window.location.pathname.endsWith("/subscription")) {
1114
1119
  cleanUp();
1115
1120
  window.location.replace("/ui/");
1116
1121
  }
@@ -1170,6 +1175,10 @@ var getDeploymentsById = (state) => state.deployments.byId;
1170
1175
  var getDeploymentsByStatus = (state) => state.deployments.byStatus;
1171
1176
  var getSelectedDeploymentDeviceIds = (state) => state.deployments.selectedDeviceIds;
1172
1177
  var getDeploymentsSelectionState = (state) => state.deployments.selectionState;
1178
+ var getDeploymentById = (0, import_toolkit3.createSelector)(
1179
+ [getDeploymentsById, (_, deploymentId) => deploymentId],
1180
+ (deploymentsById, deploymentId = "") => deploymentsById[deploymentId]
1181
+ );
1173
1182
  var getMappedDeploymentSelection = (0, import_toolkit3.createSelector)(
1174
1183
  [getDeploymentsSelectionState, (_, deploymentsState) => deploymentsState, getDeploymentsById],
1175
1184
  (selectionState, deploymentsState, deploymentsById) => {
@@ -1319,8 +1328,6 @@ var getOnboarding = (state) => state.onboarding;
1319
1328
 
1320
1329
  // src/organizationSlice/selectors.ts
1321
1330
  var import_toolkit5 = require("@reduxjs/toolkit");
1322
- var import_dayjs = __toESM(require("dayjs"), 1);
1323
- var import_relativeTime = __toESM(require("dayjs/plugin/relativeTime.js"), 1);
1324
1331
  var getOrganization = (state) => state.organization.organization;
1325
1332
  var getExternalIntegrations = (state) => state.organization.externalDeviceIntegrations;
1326
1333
  var getAuditlogState = (state) => state.organization.auditlog.selectionState;
@@ -1349,12 +1356,6 @@ var getAuditLogEntry = (0, import_toolkit5.createSelector)([getAuditLog, getAudi
1349
1356
  const [eventAction, eventTime] = atob(selectedId).split("|");
1350
1357
  return events.find((item) => item.action === eventAction && item.time === eventTime);
1351
1358
  });
1352
- import_dayjs.default.extend(import_relativeTime.default);
1353
- var newPricingIntroduction = (0, import_dayjs.default)("2025-06-03T00:00");
1354
- var getHasCurrentPricing = (0, import_toolkit5.createSelector)(
1355
- [getOrganization],
1356
- ({ id }) => !!id && (0, import_dayjs.default)(parseInt(id.substring(0, 8), 16) * 1e3) >= newPricingIntroduction
1357
- );
1358
1359
 
1359
1360
  // src/releasesSlice/selectors.ts
1360
1361
  var import_toolkit6 = require("@reduxjs/toolkit");
@@ -1505,6 +1506,10 @@ var getHasReleases = (0, import_toolkit6.createSelector)(
1505
1506
  );
1506
1507
  var getSelectedRelease = (0, import_toolkit6.createSelector)([getReleasesById, getSelectedReleaseId], (byId, id) => byId[id || ""] ?? {});
1507
1508
  var getSelectedReleases = (0, import_toolkit6.createSelector)([getReleaseListState, getReleasesList], ({ selection }, releases) => selection.map((index) => releases[index]));
1509
+ var getDeltaJobsById = (state) => state.releases.deltaJobs;
1510
+ var getDeltaJobById = (0, import_toolkit6.createSelector)([getDeltaJobsById, (_, jobId) => jobId], (byId, jobId) => byId[jobId]);
1511
+ var getSelectedJobId = (state) => state.releases.selectedJob;
1512
+ var getSelectedJob = (0, import_toolkit6.createSelector)([getDeltaJobsById, getSelectedJobId], (byId, jobId) => byId[jobId || ""]);
1508
1513
 
1509
1514
  // src/usersSlice/selectors.ts
1510
1515
  var import_toolkit7 = require("@reduxjs/toolkit");
@@ -2301,6 +2306,23 @@ var initialState7 = {
2301
2306
  }
2302
2307
  */
2303
2308
  },
2309
+ deltaJobs: {
2310
+ /*
2311
+ [jobId]: {
2312
+ id: '',
2313
+ ...
2314
+ }
2315
+ */
2316
+ },
2317
+ deltaJobsList: {
2318
+ ...import_constants5.DEVICE_LIST_DEFAULTS,
2319
+ jobIds: [],
2320
+ total: 0,
2321
+ sort: {
2322
+ direction: import_constants5.SORTING_OPTIONS.desc,
2323
+ key: "started"
2324
+ }
2325
+ },
2304
2326
  releasesList: {
2305
2327
  ...import_constants5.DEVICE_LIST_DEFAULTS,
2306
2328
  searchedIds: [],
@@ -2319,6 +2341,7 @@ var initialState7 = {
2319
2341
  },
2320
2342
  tags: [],
2321
2343
  updateTypes: [],
2344
+ selectedJob: null,
2322
2345
  /*
2323
2346
  * Return single release with corresponding Artifacts
2324
2347
  */
@@ -2351,6 +2374,34 @@ var releaseSlice = (0, import_toolkit14.createSlice)({
2351
2374
  },
2352
2375
  setReleaseListState: (state, action) => {
2353
2376
  state.releasesList = action.payload;
2377
+ },
2378
+ receivedDeltaJobs: (state, action) => {
2379
+ const { jobs, total } = action.payload;
2380
+ state.deltaJobs = jobs.reduce(
2381
+ (accu, job) => {
2382
+ accu[job.id] = {
2383
+ ...accu[job.id],
2384
+ ...job
2385
+ };
2386
+ return accu;
2387
+ },
2388
+ { ...state.deltaJobs }
2389
+ );
2390
+ state.deltaJobsList.jobIds = jobs.map((job) => job.id);
2391
+ state.deltaJobsList.total = total;
2392
+ },
2393
+ receivedDeltaJobDetails: (state, action) => {
2394
+ const job = action.payload;
2395
+ state.deltaJobs[job.id] = {
2396
+ ...state.deltaJobs[job.id],
2397
+ ...job
2398
+ };
2399
+ },
2400
+ setDeltaJobsListState: (state, action) => {
2401
+ state.deltaJobsList = { ...state.deltaJobsList, ...action.payload };
2402
+ },
2403
+ setSelectedJob: (state, action) => {
2404
+ state.selectedJob = action.payload;
2354
2405
  }
2355
2406
  }
2356
2407
  });
@@ -3052,6 +3103,15 @@ var saveDeltaDeploymentsConfig = createAppAsyncThunk(
3052
3103
  });
3053
3104
  }
3054
3105
  );
3106
+ var generateDeploymentLogAnalysis = createAppAsyncThunk(
3107
+ `${sliceName2}/generateDeploymentLogAnalysis`,
3108
+ ({ deploymentId, deviceId }, { dispatch, rejectWithValue }) => general_api_default.get(`${import_constants5.apiRoot}/v1alpha1/deployments/deployments/${deploymentId}/devices/${deviceId}/log/explain`).then(({ data: result }) => Promise.resolve(result)).catch((err) => {
3109
+ if (err.response.status === 429) {
3110
+ return rejectWithValue(err.response);
3111
+ }
3112
+ commonErrorHandler(err, "There was an error analysing the deployment log:", dispatch);
3113
+ })
3114
+ );
3055
3115
 
3056
3116
  // src/devicesSlice/thunks.tsx
3057
3117
  var import_react_router_dom = require("react-router-dom");
@@ -3131,15 +3191,15 @@ var removeDevicesFromGroup = createAppAsyncThunk(
3131
3191
  )
3132
3192
  );
3133
3193
  var getGroupNotification = (newGroup, selectedGroup) => {
3134
- const successMessage2 = "The group was updated successfully";
3194
+ const successMessage = "The group was updated successfully";
3135
3195
  if (newGroup === selectedGroup) {
3136
- return { message: successMessage2, autoHideDuration: TIMEOUTS.fiveSeconds };
3196
+ return { message: successMessage, autoHideDuration: TIMEOUTS.fiveSeconds };
3137
3197
  }
3138
3198
  return {
3139
3199
  action: "",
3140
3200
  autoHideDuration: TIMEOUTS.fiveSeconds,
3141
3201
  message: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_jsx_runtime2.Fragment, { children: [
3142
- successMessage2,
3202
+ successMessage,
3143
3203
  " - ",
3144
3204
  /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_react_router_dom.Link, { to: `/devices?inventory=group:eq:${newGroup}`, children: "click here" }),
3145
3205
  " to see it."
@@ -3671,9 +3731,10 @@ var getDeviceConnect = createAppAsyncThunk(
3671
3731
  var updateTypeMap = { deploymentUpdate: "check-update", inventoryUpdate: "send-inventory" };
3672
3732
  var triggerDeviceUpdate = createAppAsyncThunk(
3673
3733
  `${sliceName3}/triggerDeviceUpdate`,
3674
- ({ id, type }, { dispatch }) => general_api_default.post(`${import_constants5.deviceConnect}/devices/${id}/${updateTypeMap[type] ?? updateTypeMap.deploymentUpdate}`).then(
3675
- () => new Promise((resolve) => setTimeout(() => resolve(dispatch(getDeviceById2(id))), TIMEOUTS.threeSeconds))
3676
- )
3734
+ ({ id, type }, { dispatch }) => general_api_default.post(`${import_constants5.deviceConnect}/devices/${id}/${updateTypeMap[type] ?? updateTypeMap.deploymentUpdate}`).catch((err) => commonErrorHandler(err, `The request couldn\u2019t be sent.`, dispatch)).then(() => {
3735
+ dispatch(setSnackbar3("Request has been sent."));
3736
+ return new Promise((resolve) => setTimeout(() => resolve(dispatch(getDeviceById2(id))), TIMEOUTS.threeSeconds));
3737
+ })
3677
3738
  );
3678
3739
  var getSessionDetails = createAppAsyncThunk(
3679
3740
  `${sliceName3}/getSessionDetails`,
@@ -4109,13 +4170,13 @@ var advanceOnboarding = createAppAsyncThunk(`${sliceName5}/advanceOnboarding`, (
4109
4170
  // src/organizationSlice/thunks.ts
4110
4171
  var import_MenderTypes2 = require("@northern.tech/types/MenderTypes");
4111
4172
  var import_helpers11 = require("@northern.tech/utils/helpers");
4112
- var import_dayjs2 = __toESM(require("dayjs"), 1);
4173
+ var import_dayjs = __toESM(require("dayjs"), 1);
4113
4174
  var import_utc = __toESM(require("dayjs/plugin/utc.js"), 1);
4114
4175
  var import_jwt_decode = require("jwt-decode");
4115
4176
  var import_md5 = __toESM(require("md5"), 1);
4116
4177
  var import_universal_cookie4 = __toESM(require("universal-cookie"), 1);
4117
4178
  var cookies4 = new import_universal_cookie4.default();
4118
- import_dayjs2.default.extend(import_utc.default);
4179
+ import_dayjs.default.extend(import_utc.default);
4119
4180
  var { setAnnouncement, setSnackbar: setSnackbar4 } = actions_default;
4120
4181
  var { page: defaultPage4, perPage: defaultPerPage4 } = import_constants5.DEVICE_LIST_DEFAULTS;
4121
4182
  var cancelRequest = createAppAsyncThunk(`${sliceName6}/cancelRequest`, (reason, { dispatch, getState }) => {
@@ -4142,10 +4203,12 @@ var createOrganizationTrial = createAppAsyncThunk(`${sliceName6}/createOrganizat
4142
4203
  const targetLocation = getTargetLocation(key);
4143
4204
  const target = `${targetLocation}${import_constants5.tenantadmApiUrlv2}/tenants/trial`;
4144
4205
  return general_api_default.postUnauthorized(target, data).catch((err) => {
4145
- if (err.response.status >= 400 && err.response.status < 500) {
4206
+ if (err.response?.status >= 400 && err.response?.status < 500) {
4146
4207
  dispatch(setSnackbar4({ message: err.response.data.error, autoHideDuration: TIMEOUTS.fiveSeconds }));
4147
- return Promise.reject(err);
4208
+ } else {
4209
+ dispatch(setSnackbar4({ message: "There was an error creating your account", autoHideDuration: TIMEOUTS.fiveSeconds }));
4148
4210
  }
4211
+ return Promise.reject(err);
4149
4212
  }).then(({ headers }) => {
4150
4213
  cookies4.remove("oauth");
4151
4214
  cookies4.remove("externalID");
@@ -4327,32 +4390,29 @@ var getUserOrganization = createAppAsyncThunk(
4327
4390
  );
4328
4391
  var getUserBilling = createAppAsyncThunk(
4329
4392
  `${sliceName6}/getUserBilling`,
4330
- (_, { dispatch }) => general_api_default.get(`${import_constants5.tenantadmApiUrlv2}/billing/profile`).then((res) => dispatch(actions6.setBillingProfile(res.data)))
4393
+ (_, { dispatch }) => general_api_default.get(`${import_constants5.tenantadmApiUrlv2}/billing/profile`).catch((err) => commonErrorHandler(err, "There was an error getting your billing profile:", dispatch, commonErrorFallback)).then((res) => dispatch(actions6.setBillingProfile(res.data)))
4331
4394
  );
4332
- var getUserSubscription = createAppAsyncThunk(`${sliceName6}/getUserSubscription`, (_, { dispatch }) => {
4333
- const tasks = [dispatch(getBillingPreview({ preview_mode: import_MenderTypes2.PreviewRequest.preview_mode.NEXT })).unwrap(), dispatch(getCurrentSubscription()).unwrap()];
4334
- Promise.all(tasks).then(([currentPreview, currentSubscription]) => dispatch(actions6.setSubscription({ ...currentPreview, ...currentSubscription })));
4395
+ var getUserSubscription = createAppAsyncThunk(`${sliceName6}/getUserSubscription`, async (_, { dispatch }) => {
4396
+ const currentSubscription = await dispatch(getCurrentSubscription()).unwrap();
4397
+ const currentPreview = await dispatch(getBillingPreview({ preview_mode: import_MenderTypes2.PreviewRequest.preview_mode.NEXT })).unwrap();
4398
+ return dispatch(actions6.setSubscription({ ...currentPreview, ...currentSubscription }));
4335
4399
  });
4336
4400
  var getBillingPreview = createAppAsyncThunk(
4337
4401
  `${sliceName6}/getBillingPreview`,
4338
- (order) => general_api_default.post(`${import_constants5.tenantadmApiUrlv2}/billing/subscription/invoices/preview`, order).then(
4339
- ({ data }) => order.preview_mode === "recurring" ? { ...parseSubscriptionPreview(data.lines), total: data.total } : data
4340
- )
4402
+ (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)
4341
4403
  );
4342
4404
  var getCurrentSubscription = createAppAsyncThunk(
4343
4405
  `${sliceName6}/getCurrentSubscription`,
4344
- () => general_api_default.get(`${import_constants5.tenantadmApiUrlv2}/billing/subscription`).then((res) => res.data)
4406
+ (_, { dispatch }) => general_api_default.get(`${import_constants5.tenantadmApiUrlv2}/billing/subscription`).then((res) => res.data).catch((err) => {
4407
+ if (err.response && err.response.status === 404) {
4408
+ throw new Error("Request failed with status code 404");
4409
+ }
4410
+ return commonErrorHandler(err, "There was an error retrieving your current subscription", dispatch, commonErrorFallback);
4411
+ })
4345
4412
  );
4346
- var successMessage = (planId) => `Thank you! You have successfully subscribed to the ${PLANS[planId].name} plan. You can view and edit your billing details on the Organization and billing page.`;
4347
4413
  var requestPlanUpgrade = createAppAsyncThunk(
4348
4414
  `${sliceName6}/requestPlanUpgrade`,
4349
- (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(
4350
- () => Promise.all([
4351
- dispatch(setSnackbar4(successMessage(order.plan))),
4352
- setTimeout(() => dispatch(getDeviceLimit2()), TIMEOUTS.threeSeconds),
4353
- dispatch(getUserOrganization())
4354
- ])
4355
- )
4415
+ (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(getDeviceLimit2()), TIMEOUTS.threeSeconds), dispatch(getUserOrganization())]))
4356
4416
  );
4357
4417
  var sendSupportMessage = createAppAsyncThunk(
4358
4418
  `${sliceName6}/sendSupportMessage`,
@@ -4469,7 +4529,7 @@ var commonFields = {
4469
4529
  issues: { parse: void 0, select: defaultSelector, target: "selectedIssues" },
4470
4530
  open: { parse: Boolean, select: defaultSelector, target: "open" }
4471
4531
  };
4472
- var formatReleases = ({ pageState: { searchTerm, selectedTags = [], tab, type } }) => Object.entries({ name: searchTerm, tab, type }).reduce(
4532
+ var formatReleases = ({ pageState: { id, searchTerm, selectedTags = [], tab, type } }) => Object.entries({ name: searchTerm, tab, type, id }).reduce(
4473
4533
  (accu, [key, value]) => value ? [...accu, `${key}=${value}`] : accu,
4474
4534
  selectedTags.map((tag) => `tag=${tag}`)
4475
4535
  ).join("&");
@@ -4565,6 +4625,18 @@ var getArtifactUrl = createAppAsyncThunk(
4565
4625
  return dispatch(actions7.receiveRelease(release));
4566
4626
  })
4567
4627
  );
4628
+ var pollLocation = async (location, attempt = 1, maxAttempts = 5, delay = TIMEOUTS.oneSecond) => {
4629
+ try {
4630
+ await general_api_default.get(location);
4631
+ return Promise.resolve();
4632
+ } catch {
4633
+ if (attempt >= maxAttempts) {
4634
+ throw new Error(`Couldn't get ${location} after ${maxAttempts} attempts`);
4635
+ }
4636
+ await new Promise((resolve) => setTimeout(resolve, delay));
4637
+ return pollLocation(location, attempt + 1, maxAttempts, delay);
4638
+ }
4639
+ };
4568
4640
  var createArtifact = createAppAsyncThunk(`${sliceName7}/createArtifact`, ({ file, meta }, { dispatch }) => {
4569
4641
  const formData = Object.entries(meta).reduce((accu, [key, value]) => {
4570
4642
  if (Array.isArray(value)) {
@@ -4589,13 +4661,18 @@ var createArtifact = createAppAsyncThunk(`${sliceName7}/createArtifact`, ({ file
4589
4661
  (e) => dispatch(uploadProgress3({ id: uploadId, progress: progress(e) })),
4590
4662
  cancelSource.signal
4591
4663
  )
4592
- ]).then(() => {
4593
- setTimeout(() => {
4594
- dispatch(getReleases());
4595
- dispatch(selectRelease(file.name));
4596
- }, TIMEOUTS.oneSecond);
4597
- return Promise.resolve(dispatch(setSnackbar5({ message: "Upload successful", autoHideDuration: TIMEOUTS.fiveSeconds })));
4598
- }).catch((err) => {
4664
+ ]).then((tasks) => {
4665
+ const generateResponse = tasks[tasks.length - 1];
4666
+ const generateLocation = generateResponse.headers[import_constants5.headerNames.location];
4667
+ const location = generateLocation.replace("/generate", "");
4668
+ return pollLocation(location);
4669
+ }).then(
4670
+ () => Promise.all([
4671
+ dispatch(getReleases()),
4672
+ dispatch(selectRelease(meta.name)),
4673
+ dispatch(setSnackbar5({ message: "Upload successful", autoHideDuration: TIMEOUTS.fiveSeconds }))
4674
+ ])
4675
+ ).catch((err) => {
4599
4676
  if ((0, import_axios3.isCancel)(err)) {
4600
4677
  return dispatch(setSnackbar5({ message: "The artifact generation has been cancelled", autoHideDuration: TIMEOUTS.fiveSeconds }));
4601
4678
  }
@@ -4818,6 +4895,20 @@ var getUpdateTypes = createAppAsyncThunk(
4818
4895
  `${sliceName7}/getReleaseTypes`,
4819
4896
  (_, { dispatch }) => general_api_default.get(`${import_constants5.deploymentsApiUrlV2}/releases/all/types`).catch((err) => commonErrorHandler(err, `Existing update types couldn't be retrieved.`, dispatch)).then(({ data: types }) => Promise.resolve(dispatch(actions7.receiveReleaseTypes(types))))
4820
4897
  );
4898
+ var getDeltaGenerationJobs = createAppAsyncThunk(`${sliceName7}/getDeltaGenerationJobs`, (options = {}, { dispatch }) => {
4899
+ const { page = defaultPage5, perPage = defaultPerPage5, sort = {} } = options;
4900
+ const { key: sortKey, direction: sortDirection } = sort;
4901
+ const sortParam = sortKey && sortDirection ? `&sort=${sortKey}:${sortDirection}` : "";
4902
+ return general_api_default.get(`${import_constants5.deploymentsApiUrlV2}/deployments/releases/delta/jobs?page=${page}&per_page=${perPage}${sortParam}`).then(({ data, headers }) => {
4903
+ const total = Number(headers[import_constants5.headerNames.total]) || data.length;
4904
+ const result = { jobs: data, total };
4905
+ return Promise.all([dispatch(actions7.receivedDeltaJobs(result)), result]);
4906
+ }).catch((err) => commonErrorHandler(err, "There was an error retrieving delta generation jobs:", dispatch));
4907
+ });
4908
+ var getDeltaGenerationJobDetails = createAppAsyncThunk(
4909
+ `${sliceName7}/getDeltaGenerationJobDetails`,
4910
+ (jobId, { dispatch }) => general_api_default.get(`${import_constants5.deploymentsApiUrlV2}/deployments/releases/delta/jobs/${jobId}`).then(({ data }) => dispatch(actions7.receivedDeltaJobDetails(data))).catch((err) => commonErrorHandler(err, "There was an error retrieving delta generation job details:", dispatch))
4911
+ );
4821
4912
 
4822
4913
  // src/usersSlice/thunks.ts
4823
4914
  var import_helpers14 = require("@northern.tech/utils/helpers");
@@ -5472,15 +5563,14 @@ var setAllTooltipsReadState = createAppAsyncThunk(
5472
5563
  return Promise.resolve(dispatch(actions8.setTooltipsState(updatedTips))).then(() => dispatch(saveUserSettings()));
5473
5564
  }
5474
5565
  );
5475
- var submitFeedback = createAppAsyncThunk(
5566
+ var submitUserFeedback = createAppAsyncThunk(
5476
5567
  `${sliceName8}/submitFeedback`,
5477
- ({ satisfaction, feedback, ...meta }, { dispatch }) => general_api_default.post(`${import_constants5.tenantadmApiUrlv2}/contact/support`, {
5478
- subject: "feedback submission",
5479
- body: JSON.stringify({ feedback, satisfaction, meta })
5480
- }).then(() => {
5481
- const today = /* @__PURE__ */ new Date();
5482
- dispatch(saveUserSettings({ feedbackCollectedAt: today.toISOString().split("T")[0] }));
5483
- setTimeout(() => dispatch(actions8.setShowFeedbackDialog(false)), TIMEOUTS.threeSeconds);
5568
+ ({ formId, feedback }, { dispatch }) => general_api_default.post(`${import_constants5.useradmApiUrlv2}/support/feedback/${formId}`, feedback).then(() => {
5569
+ if (formId === "product") {
5570
+ const today = /* @__PURE__ */ new Date();
5571
+ dispatch(saveUserSettings({ feedbackCollectedAt: today.toISOString().split("T")[0] }));
5572
+ setTimeout(() => dispatch(actions8.setShowFeedbackDialog(false)), TIMEOUTS.threeSeconds);
5573
+ }
5484
5574
  })
5485
5575
  );
5486
5576
  // Annotate the CommonJS export names for ESM import in node:
@@ -5523,6 +5613,7 @@ var submitFeedback = createAppAsyncThunk(
5523
5613
  editTenantDeviceLimit,
5524
5614
  editUser,
5525
5615
  enableUser2fa,
5616
+ generateDeploymentLogAnalysis,
5526
5617
  generateToken,
5527
5618
  get2FAQRCode,
5528
5619
  getAllDeviceCounts,
@@ -5536,6 +5627,8 @@ var submitFeedback = createAppAsyncThunk(
5536
5627
  getBillingPreview,
5537
5628
  getCurrentCard,
5538
5629
  getCurrentSubscription,
5630
+ getDeltaGenerationJobDetails,
5631
+ getDeltaGenerationJobs,
5539
5632
  getDeploymentDevices,
5540
5633
  getDeploymentsByStatus,
5541
5634
  getDeploymentsConfig,
@@ -5638,7 +5731,7 @@ var submitFeedback = createAppAsyncThunk(
5638
5731
  startCardUpdate,
5639
5732
  startUpgrade,
5640
5733
  storeSsoConfig,
5641
- submitFeedback,
5734
+ submitUserFeedback,
5642
5735
  switchUserOrganization,
5643
5736
  tenantDataDivergedMessage,
5644
5737
  triggerDeviceUpdate,