@northern.tech/store 0.2.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (190) hide show
  1. package/dist/actions.js +183 -129
  2. package/dist/actions.js.map +1 -1
  3. package/dist/actions.mjs +13 -13
  4. package/dist/api/general-api.js +42 -55
  5. package/dist/api/general-api.js.map +1 -1
  6. package/dist/api/general-api.mjs +6 -6
  7. package/dist/api/users-api.js +44 -70
  8. package/dist/api/users-api.js.map +1 -1
  9. package/dist/api/users-api.mjs +7 -7
  10. package/dist/appSlice/constants.js +1 -39
  11. package/dist/appSlice/constants.js.map +1 -1
  12. package/dist/appSlice/constants.mjs +2 -2
  13. package/dist/appSlice/index.js +51 -68
  14. package/dist/appSlice/index.js.map +1 -1
  15. package/dist/appSlice/index.mjs +5 -5
  16. package/dist/appSlice/selectors.js +1 -43
  17. package/dist/appSlice/selectors.js.map +1 -1
  18. package/dist/appSlice/selectors.mjs +2 -2
  19. package/dist/appSlice/thunks.js +563 -544
  20. package/dist/appSlice/thunks.js.map +1 -1
  21. package/dist/appSlice/thunks.mjs +28 -28
  22. package/dist/auth.js +39 -55
  23. package/dist/auth.js.map +1 -1
  24. package/dist/auth.mjs +5 -5
  25. package/dist/{chunk-C2YZYTJ6.mjs → chunk-2Z3RFYW4.mjs} +2 -11
  26. package/dist/{chunk-C2YZYTJ6.mjs.map → chunk-2Z3RFYW4.mjs.map} +1 -1
  27. package/dist/{chunk-OWHFMKTA.mjs → chunk-3ORTTLIB.mjs} +19 -16
  28. package/dist/{chunk-OWHFMKTA.mjs.map → chunk-3ORTTLIB.mjs.map} +1 -1
  29. package/dist/{chunk-NCI6JV5R.mjs → chunk-4SDUITD4.mjs} +6 -12
  30. package/dist/{chunk-NCI6JV5R.mjs.map → chunk-4SDUITD4.mjs.map} +1 -1
  31. package/dist/{chunk-BOSBROA3.mjs → chunk-5VNQCCAQ.mjs} +2 -7
  32. package/dist/{chunk-BOSBROA3.mjs.map → chunk-5VNQCCAQ.mjs.map} +1 -1
  33. package/dist/{chunk-2P4VECEE.mjs → chunk-65YIOCCD.mjs} +6 -11
  34. package/dist/{chunk-2P4VECEE.mjs.map → chunk-65YIOCCD.mjs.map} +1 -1
  35. package/dist/{chunk-QG4PT5WK.mjs → chunk-6CSGHZ3E.mjs} +9 -21
  36. package/dist/{chunk-QG4PT5WK.mjs.map → chunk-6CSGHZ3E.mjs.map} +1 -1
  37. package/dist/{chunk-X65NMDPS.mjs → chunk-AZRVRNXT.mjs} +40 -30
  38. package/dist/{chunk-X65NMDPS.mjs.map → chunk-AZRVRNXT.mjs.map} +1 -1
  39. package/dist/{chunk-M4U5R7A4.mjs → chunk-B42NUKMZ.mjs} +2 -6
  40. package/dist/{chunk-M4U5R7A4.mjs.map → chunk-B42NUKMZ.mjs.map} +1 -1
  41. package/dist/{chunk-BWFTQHNM.mjs → chunk-CHUCIHMY.mjs} +3 -4
  42. package/dist/{chunk-BWFTQHNM.mjs.map → chunk-CHUCIHMY.mjs.map} +1 -1
  43. package/dist/{chunk-UPMSYTWW.mjs → chunk-DIZJVB6M.mjs} +306 -291
  44. package/dist/{chunk-UPMSYTWW.mjs.map → chunk-DIZJVB6M.mjs.map} +1 -1
  45. package/dist/chunk-H5UCKQWK.mjs +41 -0
  46. package/dist/{chunk-ENLZPHTQ.mjs.map → chunk-H5UCKQWK.mjs.map} +1 -1
  47. package/dist/{chunk-MQIKQKSW.mjs → chunk-IFWKT27G.mjs} +37 -33
  48. package/dist/{chunk-MQIKQKSW.mjs.map → chunk-IFWKT27G.mjs.map} +1 -1
  49. package/dist/{chunk-EM2HUGUY.mjs → chunk-JA27QXVB.mjs} +37 -28
  50. package/dist/{chunk-EM2HUGUY.mjs.map → chunk-JA27QXVB.mjs.map} +1 -1
  51. package/dist/{chunk-2HCZYULZ.mjs → chunk-K2NZL5V4.mjs} +3 -6
  52. package/dist/{chunk-2HCZYULZ.mjs.map → chunk-K2NZL5V4.mjs.map} +1 -1
  53. package/dist/{chunk-Y47SYXII.mjs → chunk-KJAZNKV2.mjs} +43 -52
  54. package/dist/{chunk-Y47SYXII.mjs.map → chunk-KJAZNKV2.mjs.map} +1 -1
  55. package/dist/{chunk-U6YTBIDT.mjs → chunk-KPPU6OWF.mjs} +27 -39
  56. package/dist/{chunk-U6YTBIDT.mjs.map → chunk-KPPU6OWF.mjs.map} +1 -1
  57. package/dist/{chunk-EFHEROXZ.mjs → chunk-KZSTW27Q.mjs} +30 -18
  58. package/dist/{chunk-EFHEROXZ.mjs.map → chunk-KZSTW27Q.mjs.map} +1 -1
  59. package/dist/chunk-LZOMFHX3.mjs +38 -0
  60. package/dist/{chunk-RWYS5MKN.mjs → chunk-NJNSCJEY.mjs} +22 -26
  61. package/dist/{chunk-RWYS5MKN.mjs.map → chunk-NJNSCJEY.mjs.map} +1 -1
  62. package/dist/{chunk-ZLRZO4EY.mjs → chunk-O6TYYKSD.mjs} +62 -60
  63. package/dist/chunk-O6TYYKSD.mjs.map +1 -0
  64. package/dist/{chunk-OGAMVFPS.mjs → chunk-QQBUNZHA.mjs} +2 -6
  65. package/dist/{chunk-OGAMVFPS.mjs.map → chunk-QQBUNZHA.mjs.map} +1 -1
  66. package/dist/{chunk-WS3YYLTJ.mjs → chunk-R7LXL3KJ.mjs} +14 -13
  67. package/dist/{chunk-WS3YYLTJ.mjs.map → chunk-R7LXL3KJ.mjs.map} +1 -1
  68. package/dist/{chunk-MJW4632R.mjs → chunk-WCUGLHYM.mjs} +16 -20
  69. package/dist/{chunk-MJW4632R.mjs.map → chunk-WCUGLHYM.mjs.map} +1 -1
  70. package/dist/chunk-WYHJFSMQ.mjs +25 -0
  71. package/dist/{chunk-L4HIW3KB.mjs.map → chunk-WYHJFSMQ.mjs.map} +1 -1
  72. package/dist/{chunk-XJNI62IP.mjs → chunk-XC5UXEIB.mjs} +4 -11
  73. package/dist/{chunk-XJNI62IP.mjs.map → chunk-XC5UXEIB.mjs.map} +1 -1
  74. package/dist/{chunk-4U4X4KAC.mjs → chunk-XD7INCM4.mjs} +11 -17
  75. package/dist/{chunk-4U4X4KAC.mjs.map → chunk-XD7INCM4.mjs.map} +1 -1
  76. package/dist/{chunk-ZZ6VIQ3U.mjs → chunk-ZE7R2XXE.mjs} +10 -12
  77. package/dist/{chunk-ZZ6VIQ3U.mjs.map → chunk-ZE7R2XXE.mjs.map} +1 -1
  78. package/dist/{chunk-4C6IY46N.mjs → chunk-ZK4W5T53.mjs} +7 -11
  79. package/dist/{chunk-4C6IY46N.mjs.map → chunk-ZK4W5T53.mjs.map} +1 -1
  80. package/dist/commonConstants.js +1 -35
  81. package/dist/commonConstants.js.map +1 -1
  82. package/dist/commonConstants.mjs +2 -2
  83. package/dist/commonSelectors.js +73 -135
  84. package/dist/commonSelectors.js.map +1 -1
  85. package/dist/commonSelectors.mjs +12 -12
  86. package/dist/constants.js +36 -153
  87. package/dist/constants.js.map +1 -1
  88. package/dist/constants.mjs +14 -14
  89. package/dist/deploymentsSlice/constants.js +34 -59
  90. package/dist/deploymentsSlice/constants.js.map +1 -1
  91. package/dist/deploymentsSlice/constants.mjs +4 -4
  92. package/dist/deploymentsSlice/index.js +68 -79
  93. package/dist/deploymentsSlice/index.js.map +1 -1
  94. package/dist/deploymentsSlice/index.mjs +5 -5
  95. package/dist/deploymentsSlice/selectors.js +35 -52
  96. package/dist/deploymentsSlice/selectors.js.map +1 -1
  97. package/dist/deploymentsSlice/selectors.mjs +5 -5
  98. package/dist/deploymentsSlice/thunks.js +563 -553
  99. package/dist/deploymentsSlice/thunks.js.map +1 -1
  100. package/dist/deploymentsSlice/thunks.mjs +28 -28
  101. package/dist/devicesSlice/constants.js +34 -58
  102. package/dist/devicesSlice/constants.js.map +1 -1
  103. package/dist/devicesSlice/constants.mjs +4 -4
  104. package/dist/devicesSlice/index.js +71 -81
  105. package/dist/devicesSlice/index.js.map +1 -1
  106. package/dist/devicesSlice/index.mjs +5 -5
  107. package/dist/devicesSlice/selectors.js +40 -89
  108. package/dist/devicesSlice/selectors.js.map +1 -1
  109. package/dist/devicesSlice/selectors.mjs +5 -5
  110. package/dist/devicesSlice/thunks.js +563 -589
  111. package/dist/devicesSlice/thunks.js.map +1 -1
  112. package/dist/devicesSlice/thunks.mjs +28 -28
  113. package/dist/monitorSlice/constants.js +34 -45
  114. package/dist/monitorSlice/constants.js.map +1 -1
  115. package/dist/monitorSlice/constants.mjs +4 -4
  116. package/dist/monitorSlice/index.js +41 -52
  117. package/dist/monitorSlice/index.js.map +1 -1
  118. package/dist/monitorSlice/index.mjs +5 -5
  119. package/dist/monitorSlice/selectors.js +0 -4
  120. package/dist/monitorSlice/selectors.mjs +1 -1
  121. package/dist/monitorSlice/thunks.js +249 -232
  122. package/dist/monitorSlice/thunks.js.map +1 -1
  123. package/dist/monitorSlice/thunks.mjs +25 -25
  124. package/dist/onboardingSlice/constants.js +0 -5
  125. package/dist/onboardingSlice/constants.mjs +1 -1
  126. package/dist/onboardingSlice/index.js +1 -22
  127. package/dist/onboardingSlice/index.js.map +1 -1
  128. package/dist/onboardingSlice/index.mjs +2 -2
  129. package/dist/onboardingSlice/selectors.js +0 -4
  130. package/dist/onboardingSlice/selectors.mjs +1 -1
  131. package/dist/onboardingSlice/thunks.js +563 -547
  132. package/dist/onboardingSlice/thunks.js.map +1 -1
  133. package/dist/onboardingSlice/thunks.mjs +28 -28
  134. package/dist/organizationSlice/constants.js +34 -56
  135. package/dist/organizationSlice/constants.js.map +1 -1
  136. package/dist/organizationSlice/constants.mjs +4 -4
  137. package/dist/organizationSlice/index.js +45 -53
  138. package/dist/organizationSlice/index.js.map +1 -1
  139. package/dist/organizationSlice/index.mjs +5 -5
  140. package/dist/organizationSlice/selectors.js +35 -61
  141. package/dist/organizationSlice/selectors.js.map +1 -1
  142. package/dist/organizationSlice/selectors.mjs +5 -5
  143. package/dist/organizationSlice/thunks.js +563 -572
  144. package/dist/organizationSlice/thunks.js.map +1 -1
  145. package/dist/organizationSlice/thunks.mjs +28 -28
  146. package/dist/releasesSlice/constants.js +0 -7
  147. package/dist/releasesSlice/constants.mjs +1 -1
  148. package/dist/releasesSlice/index.js +38 -64
  149. package/dist/releasesSlice/index.js.map +1 -1
  150. package/dist/releasesSlice/index.mjs +5 -5
  151. package/dist/releasesSlice/selectors.js +37 -57
  152. package/dist/releasesSlice/selectors.js.map +1 -1
  153. package/dist/releasesSlice/selectors.mjs +6 -6
  154. package/dist/releasesSlice/thunks.js +293 -281
  155. package/dist/releasesSlice/thunks.js.map +1 -1
  156. package/dist/releasesSlice/thunks.mjs +25 -25
  157. package/dist/selectors.js +73 -207
  158. package/dist/selectors.js.map +1 -1
  159. package/dist/selectors.mjs +43 -43
  160. package/dist/store.js +194 -151
  161. package/dist/store.js.map +1 -1
  162. package/dist/store.mjs +16 -16
  163. package/dist/storehooks.js +568 -547
  164. package/dist/storehooks.js.map +1 -1
  165. package/dist/storehooks.mjs +38 -41
  166. package/dist/storehooks.mjs.map +1 -1
  167. package/dist/thunks.js +563 -702
  168. package/dist/thunks.js.map +1 -1
  169. package/dist/thunks.mjs +28 -28
  170. package/dist/usersSlice/constants.js +36 -66
  171. package/dist/usersSlice/constants.js.map +1 -1
  172. package/dist/usersSlice/constants.mjs +4 -4
  173. package/dist/usersSlice/index.js +62 -71
  174. package/dist/usersSlice/index.js.map +1 -1
  175. package/dist/usersSlice/index.mjs +5 -5
  176. package/dist/usersSlice/selectors.js +41 -66
  177. package/dist/usersSlice/selectors.js.map +1 -1
  178. package/dist/usersSlice/selectors.mjs +6 -6
  179. package/dist/usersSlice/thunks.js +563 -576
  180. package/dist/usersSlice/thunks.js.map +1 -1
  181. package/dist/usersSlice/thunks.mjs +28 -28
  182. package/dist/utils.js +57 -93
  183. package/dist/utils.js.map +1 -1
  184. package/dist/utils.mjs +5 -5
  185. package/package.json +66 -1
  186. package/dist/chunk-ENLZPHTQ.mjs +0 -35
  187. package/dist/chunk-L4HIW3KB.mjs +0 -36
  188. package/dist/chunk-XWBD7VOK.mjs +0 -93
  189. package/dist/chunk-ZLRZO4EY.mjs.map +0 -1
  190. /package/dist/{chunk-XWBD7VOK.mjs.map → chunk-LZOMFHX3.mjs.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../node_modules/pluralize/pluralize.js","../src/deploymentsSlice/thunks.ts","../src/devicesSlice/thunks.tsx","../src/onboardingSlice/thunks.ts","../src/organizationSlice/thunks.ts","../src/usersSlice/thunks.ts","../src/appSlice/thunks.ts"],"sourcesContent":["/* global define */\n\n(function (root, pluralize) {\n /* istanbul ignore else */\n if (typeof require === 'function' && typeof exports === 'object' && typeof module === 'object') {\n // Node.\n module.exports = pluralize();\n } else if (typeof define === 'function' && define.amd) {\n // AMD, registers as an anonymous module.\n define(function () {\n return pluralize();\n });\n } else {\n // Browser global.\n root.pluralize = pluralize();\n }\n})(this, function () {\n // Rule storage - pluralize and singularize need to be run sequentially,\n // while other rules can be optimized using an object for instant lookups.\n var pluralRules = [];\n var singularRules = [];\n var uncountables = {};\n var irregularPlurals = {};\n var irregularSingles = {};\n\n /**\n * Sanitize a pluralization rule to a usable regular expression.\n *\n * @param {(RegExp|string)} rule\n * @return {RegExp}\n */\n function sanitizeRule (rule) {\n if (typeof rule === 'string') {\n return new RegExp('^' + rule + '$', 'i');\n }\n\n return rule;\n }\n\n /**\n * Pass in a word token to produce a function that can replicate the case on\n * another word.\n *\n * @param {string} word\n * @param {string} token\n * @return {Function}\n */\n function restoreCase (word, token) {\n // Tokens are an exact match.\n if (word === token) return token;\n\n // Lower cased words. E.g. \"hello\".\n if (word === word.toLowerCase()) return token.toLowerCase();\n\n // Upper cased words. E.g. \"WHISKY\".\n if (word === word.toUpperCase()) return token.toUpperCase();\n\n // Title cased words. E.g. \"Title\".\n if (word[0] === word[0].toUpperCase()) {\n return token.charAt(0).toUpperCase() + token.substr(1).toLowerCase();\n }\n\n // Lower cased words. E.g. \"test\".\n return token.toLowerCase();\n }\n\n /**\n * Interpolate a regexp string.\n *\n * @param {string} str\n * @param {Array} args\n * @return {string}\n */\n function interpolate (str, args) {\n return str.replace(/\\$(\\d{1,2})/g, function (match, index) {\n return args[index] || '';\n });\n }\n\n /**\n * Replace a word using a rule.\n *\n * @param {string} word\n * @param {Array} rule\n * @return {string}\n */\n function replace (word, rule) {\n return word.replace(rule[0], function (match, index) {\n var result = interpolate(rule[1], arguments);\n\n if (match === '') {\n return restoreCase(word[index - 1], result);\n }\n\n return restoreCase(match, result);\n });\n }\n\n /**\n * Sanitize a word by passing in the word and sanitization rules.\n *\n * @param {string} token\n * @param {string} word\n * @param {Array} rules\n * @return {string}\n */\n function sanitizeWord (token, word, rules) {\n // Empty string or doesn't need fixing.\n if (!token.length || uncountables.hasOwnProperty(token)) {\n return word;\n }\n\n var len = rules.length;\n\n // Iterate over the sanitization rules and use the first one to match.\n while (len--) {\n var rule = rules[len];\n\n if (rule[0].test(word)) return replace(word, rule);\n }\n\n return word;\n }\n\n /**\n * Replace a word with the updated word.\n *\n * @param {Object} replaceMap\n * @param {Object} keepMap\n * @param {Array} rules\n * @return {Function}\n */\n function replaceWord (replaceMap, keepMap, rules) {\n return function (word) {\n // Get the correct token and case restoration functions.\n var token = word.toLowerCase();\n\n // Check against the keep object map.\n if (keepMap.hasOwnProperty(token)) {\n return restoreCase(word, token);\n }\n\n // Check against the replacement map for a direct word replacement.\n if (replaceMap.hasOwnProperty(token)) {\n return restoreCase(word, replaceMap[token]);\n }\n\n // Run all the rules against the word.\n return sanitizeWord(token, word, rules);\n };\n }\n\n /**\n * Check if a word is part of the map.\n */\n function checkWord (replaceMap, keepMap, rules, bool) {\n return function (word) {\n var token = word.toLowerCase();\n\n if (keepMap.hasOwnProperty(token)) return true;\n if (replaceMap.hasOwnProperty(token)) return false;\n\n return sanitizeWord(token, token, rules) === token;\n };\n }\n\n /**\n * Pluralize or singularize a word based on the passed in count.\n *\n * @param {string} word The word to pluralize\n * @param {number} count How many of the word exist\n * @param {boolean} inclusive Whether to prefix with the number (e.g. 3 ducks)\n * @return {string}\n */\n function pluralize (word, count, inclusive) {\n var pluralized = count === 1\n ? pluralize.singular(word) : pluralize.plural(word);\n\n return (inclusive ? count + ' ' : '') + pluralized;\n }\n\n /**\n * Pluralize a word.\n *\n * @type {Function}\n */\n pluralize.plural = replaceWord(\n irregularSingles, irregularPlurals, pluralRules\n );\n\n /**\n * Check if a word is plural.\n *\n * @type {Function}\n */\n pluralize.isPlural = checkWord(\n irregularSingles, irregularPlurals, pluralRules\n );\n\n /**\n * Singularize a word.\n *\n * @type {Function}\n */\n pluralize.singular = replaceWord(\n irregularPlurals, irregularSingles, singularRules\n );\n\n /**\n * Check if a word is singular.\n *\n * @type {Function}\n */\n pluralize.isSingular = checkWord(\n irregularPlurals, irregularSingles, singularRules\n );\n\n /**\n * Add a pluralization rule to the collection.\n *\n * @param {(string|RegExp)} rule\n * @param {string} replacement\n */\n pluralize.addPluralRule = function (rule, replacement) {\n pluralRules.push([sanitizeRule(rule), replacement]);\n };\n\n /**\n * Add a singularization rule to the collection.\n *\n * @param {(string|RegExp)} rule\n * @param {string} replacement\n */\n pluralize.addSingularRule = function (rule, replacement) {\n singularRules.push([sanitizeRule(rule), replacement]);\n };\n\n /**\n * Add an uncountable word rule.\n *\n * @param {(string|RegExp)} word\n */\n pluralize.addUncountableRule = function (word) {\n if (typeof word === 'string') {\n uncountables[word.toLowerCase()] = true;\n return;\n }\n\n // Set singular and plural references for the word.\n pluralize.addPluralRule(word, '$0');\n pluralize.addSingularRule(word, '$0');\n };\n\n /**\n * Add an irregular word definition.\n *\n * @param {string} single\n * @param {string} plural\n */\n pluralize.addIrregularRule = function (single, plural) {\n plural = plural.toLowerCase();\n single = single.toLowerCase();\n\n irregularSingles[single] = plural;\n irregularPlurals[plural] = single;\n };\n\n /**\n * Irregular rules.\n */\n [\n // Pronouns.\n ['I', 'we'],\n ['me', 'us'],\n ['he', 'they'],\n ['she', 'they'],\n ['them', 'them'],\n ['myself', 'ourselves'],\n ['yourself', 'yourselves'],\n ['itself', 'themselves'],\n ['herself', 'themselves'],\n ['himself', 'themselves'],\n ['themself', 'themselves'],\n ['is', 'are'],\n ['was', 'were'],\n ['has', 'have'],\n ['this', 'these'],\n ['that', 'those'],\n // Words ending in with a consonant and `o`.\n ['echo', 'echoes'],\n ['dingo', 'dingoes'],\n ['volcano', 'volcanoes'],\n ['tornado', 'tornadoes'],\n ['torpedo', 'torpedoes'],\n // Ends with `us`.\n ['genus', 'genera'],\n ['viscus', 'viscera'],\n // Ends with `ma`.\n ['stigma', 'stigmata'],\n ['stoma', 'stomata'],\n ['dogma', 'dogmata'],\n ['lemma', 'lemmata'],\n ['schema', 'schemata'],\n ['anathema', 'anathemata'],\n // Other irregular rules.\n ['ox', 'oxen'],\n ['axe', 'axes'],\n ['die', 'dice'],\n ['yes', 'yeses'],\n ['foot', 'feet'],\n ['eave', 'eaves'],\n ['goose', 'geese'],\n ['tooth', 'teeth'],\n ['quiz', 'quizzes'],\n ['human', 'humans'],\n ['proof', 'proofs'],\n ['carve', 'carves'],\n ['valve', 'valves'],\n ['looey', 'looies'],\n ['thief', 'thieves'],\n ['groove', 'grooves'],\n ['pickaxe', 'pickaxes'],\n ['passerby', 'passersby']\n ].forEach(function (rule) {\n return pluralize.addIrregularRule(rule[0], rule[1]);\n });\n\n /**\n * Pluralization rules.\n */\n [\n [/s?$/i, 's'],\n [/[^\\u0000-\\u007F]$/i, '$0'],\n [/([^aeiou]ese)$/i, '$1'],\n [/(ax|test)is$/i, '$1es'],\n [/(alias|[^aou]us|t[lm]as|gas|ris)$/i, '$1es'],\n [/(e[mn]u)s?$/i, '$1s'],\n [/([^l]ias|[aeiou]las|[ejzr]as|[iu]am)$/i, '$1'],\n [/(alumn|syllab|vir|radi|nucle|fung|cact|stimul|termin|bacill|foc|uter|loc|strat)(?:us|i)$/i, '$1i'],\n [/(alumn|alg|vertebr)(?:a|ae)$/i, '$1ae'],\n [/(seraph|cherub)(?:im)?$/i, '$1im'],\n [/(her|at|gr)o$/i, '$1oes'],\n [/(agend|addend|millenni|dat|extrem|bacteri|desiderat|strat|candelabr|errat|ov|symposi|curricul|automat|quor)(?:a|um)$/i, '$1a'],\n [/(apheli|hyperbat|periheli|asyndet|noumen|phenomen|criteri|organ|prolegomen|hedr|automat)(?:a|on)$/i, '$1a'],\n [/sis$/i, 'ses'],\n [/(?:(kni|wi|li)fe|(ar|l|ea|eo|oa|hoo)f)$/i, '$1$2ves'],\n [/([^aeiouy]|qu)y$/i, '$1ies'],\n [/([^ch][ieo][ln])ey$/i, '$1ies'],\n [/(x|ch|ss|sh|zz)$/i, '$1es'],\n [/(matr|cod|mur|sil|vert|ind|append)(?:ix|ex)$/i, '$1ices'],\n [/\\b((?:tit)?m|l)(?:ice|ouse)$/i, '$1ice'],\n [/(pe)(?:rson|ople)$/i, '$1ople'],\n [/(child)(?:ren)?$/i, '$1ren'],\n [/eaux$/i, '$0'],\n [/m[ae]n$/i, 'men'],\n ['thou', 'you']\n ].forEach(function (rule) {\n return pluralize.addPluralRule(rule[0], rule[1]);\n });\n\n /**\n * Singularization rules.\n */\n [\n [/s$/i, ''],\n [/(ss)$/i, '$1'],\n [/(wi|kni|(?:after|half|high|low|mid|non|night|[^\\w]|^)li)ves$/i, '$1fe'],\n [/(ar|(?:wo|[ae])l|[eo][ao])ves$/i, '$1f'],\n [/ies$/i, 'y'],\n [/\\b([pl]|zomb|(?:neck|cross)?t|coll|faer|food|gen|goon|group|lass|talk|goal|cut)ies$/i, '$1ie'],\n [/\\b(mon|smil)ies$/i, '$1ey'],\n [/\\b((?:tit)?m|l)ice$/i, '$1ouse'],\n [/(seraph|cherub)im$/i, '$1'],\n [/(x|ch|ss|sh|zz|tto|go|cho|alias|[^aou]us|t[lm]as|gas|(?:her|at|gr)o|[aeiou]ris)(?:es)?$/i, '$1'],\n [/(analy|diagno|parenthe|progno|synop|the|empha|cri|ne)(?:sis|ses)$/i, '$1sis'],\n [/(movie|twelve|abuse|e[mn]u)s$/i, '$1'],\n [/(test)(?:is|es)$/i, '$1is'],\n [/(alumn|syllab|vir|radi|nucle|fung|cact|stimul|termin|bacill|foc|uter|loc|strat)(?:us|i)$/i, '$1us'],\n [/(agend|addend|millenni|dat|extrem|bacteri|desiderat|strat|candelabr|errat|ov|symposi|curricul|quor)a$/i, '$1um'],\n [/(apheli|hyperbat|periheli|asyndet|noumen|phenomen|criteri|organ|prolegomen|hedr|automat)a$/i, '$1on'],\n [/(alumn|alg|vertebr)ae$/i, '$1a'],\n [/(cod|mur|sil|vert|ind)ices$/i, '$1ex'],\n [/(matr|append)ices$/i, '$1ix'],\n [/(pe)(rson|ople)$/i, '$1rson'],\n [/(child)ren$/i, '$1'],\n [/(eau)x?$/i, '$1'],\n [/men$/i, 'man']\n ].forEach(function (rule) {\n return pluralize.addSingularRule(rule[0], rule[1]);\n });\n\n /**\n * Uncountable rules.\n */\n [\n // Singular words with no plurals.\n 'adulthood',\n 'advice',\n 'agenda',\n 'aid',\n 'aircraft',\n 'alcohol',\n 'ammo',\n 'analytics',\n 'anime',\n 'athletics',\n 'audio',\n 'bison',\n 'blood',\n 'bream',\n 'buffalo',\n 'butter',\n 'carp',\n 'cash',\n 'chassis',\n 'chess',\n 'clothing',\n 'cod',\n 'commerce',\n 'cooperation',\n 'corps',\n 'debris',\n 'diabetes',\n 'digestion',\n 'elk',\n 'energy',\n 'equipment',\n 'excretion',\n 'expertise',\n 'firmware',\n 'flounder',\n 'fun',\n 'gallows',\n 'garbage',\n 'graffiti',\n 'hardware',\n 'headquarters',\n 'health',\n 'herpes',\n 'highjinks',\n 'homework',\n 'housework',\n 'information',\n 'jeans',\n 'justice',\n 'kudos',\n 'labour',\n 'literature',\n 'machinery',\n 'mackerel',\n 'mail',\n 'media',\n 'mews',\n 'moose',\n 'music',\n 'mud',\n 'manga',\n 'news',\n 'only',\n 'personnel',\n 'pike',\n 'plankton',\n 'pliers',\n 'police',\n 'pollution',\n 'premises',\n 'rain',\n 'research',\n 'rice',\n 'salmon',\n 'scissors',\n 'series',\n 'sewage',\n 'shambles',\n 'shrimp',\n 'software',\n 'species',\n 'staff',\n 'swine',\n 'tennis',\n 'traffic',\n 'transportation',\n 'trout',\n 'tuna',\n 'wealth',\n 'welfare',\n 'whiting',\n 'wildebeest',\n 'wildlife',\n 'you',\n /pok[eé]mon$/i,\n // Regexes.\n /[^aeiou]ese$/i, // \"chinese\", \"japanese\"\n /deer$/i, // \"deer\", \"reindeer\"\n /fish$/i, // \"fish\", \"blowfish\", \"angelfish\"\n /measles$/i,\n /o[iu]s$/i, // \"carnivorous\"\n /pox$/i, // \"chickpox\", \"smallpox\"\n /sheep$/i\n ].forEach(pluralize.addUncountableRule);\n\n return pluralize;\n});\n","// 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\n\n/*eslint import/namespace: ['error', { allowComputed: true }]*/\nimport storeActions from '@northern.tech/store/actions';\nimport GeneralApi from '@northern.tech/store/api/general-api';\nimport { DEVICE_LIST_DEFAULTS, SORTING_OPTIONS, TIMEOUTS, headerNames } from '@northern.tech/store/constants';\nimport { getDevicesById, getGlobalSettings, getUserCapabilities } from '@northern.tech/store/selectors';\nimport { commonErrorHandler } from '@northern.tech/store/store';\nimport { getDeviceAuth, getDeviceById, saveGlobalSettings } from '@northern.tech/store/thunks';\nimport { mapTermsToFilters } from '@northern.tech/store/utils';\nimport { deepCompare, isEmpty, standardizePhases, startTimeSort } from '@northern.tech/utils/helpers';\nimport { createAsyncThunk } from '@reduxjs/toolkit';\nimport isUUID from 'validator/lib/isUUID';\n\nimport { actions, sliceName } from '.';\nimport { DEPLOYMENT_ROUTES, DEPLOYMENT_STATES, DEPLOYMENT_TYPES, deploymentPrototype, deploymentsApiUrl, deploymentsApiUrlV2 } from './constants';\nimport { getDeploymentsById, getDeploymentsByStatus as getDeploymentsByStatusSelector } from './selectors';\n\nconst { receivedDevice, setSnackbar } = storeActions;\n\n// default per page until pagination and counting integrated\nconst { page: defaultPage, perPage: defaultPerPage } = DEVICE_LIST_DEFAULTS;\n\nexport const deriveDeploymentGroup = ({ filter = {}, group, groups = [], name }) => (group || (groups.length === 1 && !isUUID(name)) ? groups[0] : filter.name);\n\nconst transformDeployments = (deployments, deploymentsById) =>\n deployments.sort(startTimeSort).reduce(\n (accu, item) => {\n const filter = item.filter ?? {};\n let deployment = {\n ...deploymentPrototype,\n ...deploymentsById[item.id],\n ...item,\n filter: item.filter ? { ...filter, name: filter.name ?? filter.id, filters: mapTermsToFilters(filter.terms) } : undefined,\n name: decodeURIComponent(item.name)\n };\n // deriving the group in a second step to potentially make use of the merged data from the existing group state + the decoded name\n deployment = { ...deployment, group: deriveDeploymentGroup(deployment) };\n accu.deployments[item.id] = deployment;\n accu.deploymentIds.push(item.id);\n return accu;\n },\n { deployments: {}, deploymentIds: [] }\n );\n\n/*Deployments */\nexport const getDeploymentsByStatus = createAsyncThunk(`${sliceName}/getDeploymentsByStatus`, (options = {}, { dispatch, getState }) => {\n const { status, page = defaultPage, per_page = defaultPerPage, startDate, endDate, group, type, shouldSelect = true, sort = SORTING_OPTIONS.desc } = options;\n const created_after = startDate ? `&created_after=${startDate}` : '';\n const created_before = endDate ? `&created_before=${endDate}` : '';\n const search = group ? `&search=${group}` : '';\n const typeFilter = type ? `&type=${type}` : '';\n return GeneralApi.get(\n `${deploymentsApiUrl}/deployments?status=${status}&per_page=${per_page}&page=${page}${created_after}${created_before}${search}${typeFilter}&sort=${sort}`\n ).then(res => {\n const { deployments, deploymentIds } = transformDeployments(res.data, getState().deployments.byId);\n const total = Number(res.headers[headerNames.total]);\n let tasks = [\n dispatch(actions.receivedDeployments(deployments)),\n dispatch(\n actions.receivedDeploymentsForStatus({\n deploymentIds,\n status,\n total: !(startDate || endDate || group || type) ? total : getState().deployments.byStatus[status].total\n })\n )\n ];\n tasks = deploymentIds.reduce((accu, deploymentId) => {\n if (deployments[deploymentId].type === DEPLOYMENT_TYPES.configuration) {\n accu.push(dispatch(getSingleDeployment(deploymentId)));\n }\n return accu;\n }, tasks);\n if (shouldSelect) {\n tasks.push(dispatch(actions.selectDeploymentsForStatus({ deploymentIds, status, total })));\n }\n tasks.push({ deploymentIds, total });\n return Promise.all(tasks);\n });\n});\n\nconst MAX_PREVIOUS_PHASES_COUNT = 5;\nexport const createDeployment = createAsyncThunk(`${sliceName}/createDeployment`, ({ newDeployment, hasNewRetryDefault = false }, { dispatch, getState }) => {\n let request;\n if (newDeployment.filter_id) {\n request = GeneralApi.post(`${deploymentsApiUrlV2}/deployments`, newDeployment);\n } else if (newDeployment.group) {\n request = GeneralApi.post(`${deploymentsApiUrl}/deployments/group/${newDeployment.group}`, newDeployment);\n } else {\n request = GeneralApi.post(`${deploymentsApiUrl}/deployments`, newDeployment);\n }\n return request\n .catch(err => commonErrorHandler(err, 'Error creating deployment.', dispatch))\n .then(data => {\n const lastslashindex = data.headers.location.lastIndexOf('/');\n const deploymentId = data.headers.location.substring(lastslashindex + 1);\n const deployment = {\n ...newDeployment,\n id: deploymentId,\n devices: newDeployment.devices ? newDeployment.devices.map(id => ({ id, status: 'pending' })) : [],\n statistics: { status: {} }\n };\n let tasks = [\n dispatch(actions.createdDeployment(deployment)),\n dispatch(getSingleDeployment(deploymentId)),\n dispatch(setSnackbar('Deployment created successfully', TIMEOUTS.fiveSeconds))\n ];\n const { canManageUsers } = getUserCapabilities(getState());\n if (canManageUsers) {\n const { phases, retries } = newDeployment;\n const { previousPhases = [], retries: previousRetries = 0 } = getGlobalSettings(getState());\n let newSettings = { retries: hasNewRetryDefault ? retries : previousRetries, hasDeployments: true };\n if (phases) {\n const standardPhases = standardizePhases(phases);\n let prevPhases = previousPhases.map(standardizePhases);\n if (!prevPhases.find(previousPhaseList => previousPhaseList.every(oldPhase => standardPhases.find(phase => deepCompare(phase, oldPhase))))) {\n prevPhases.push(standardPhases);\n }\n newSettings.previousPhases = prevPhases.slice(-1 * MAX_PREVIOUS_PHASES_COUNT);\n }\n tasks.push(dispatch(saveGlobalSettings(newSettings)));\n }\n return Promise.all(tasks);\n });\n});\n\nexport const getDeploymentDevices = createAsyncThunk(`${sliceName}/getDeploymentDevices`, (options, { dispatch, getState }) => {\n const { id, page = defaultPage, perPage = defaultPerPage } = options;\n return GeneralApi.get(`${deploymentsApiUrl}/deployments/${id}/devices/list?&page=${page}&per_page=${perPage}`).then(response => {\n const { devices: deploymentDevices = {} } = getState().deployments.byId[id] || {};\n const devices = response.data.reduce((accu, item) => {\n accu[item.id] = item;\n const log = (deploymentDevices[item.id] || {}).log;\n if (log) {\n accu[item.id].log = log;\n }\n return accu;\n }, {});\n const selectedDeviceIds = Object.keys(devices);\n let tasks = [\n dispatch(\n actions.receivedDeploymentDevices({\n id,\n devices,\n selectedDeviceIds,\n totalDeviceCount: Number(response.headers[headerNames.total])\n })\n )\n ];\n const devicesById = getDevicesById(getState());\n // only update those that have changed & lack data\n const lackingData = selectedDeviceIds.reduce((accu, deviceId) => {\n const device = devicesById[deviceId];\n if (!device || !device.identity_data || !device.attributes || Object.keys(device.attributes).length === 0) {\n accu.push(deviceId);\n }\n return accu;\n }, []);\n // get device artifact, inventory and identity details not listed in schedule data\n tasks = lackingData.reduce((accu, deviceId) => [...accu, dispatch(getDeviceById(deviceId)), dispatch(getDeviceAuth(deviceId))], tasks);\n return Promise.all(tasks);\n });\n});\n\nconst parseDeviceDeployment = ({\n deployment: { id, artifact_name: release, status: deploymentStatus },\n device: { created, deleted, id: deviceId, finished, status, log }\n}) => ({\n id,\n release,\n created,\n deleted,\n deviceId,\n finished,\n status,\n log,\n route: Object.values(DEPLOYMENT_ROUTES).reduce((accu, { key, states }) => {\n if (!accu) {\n return states.includes(deploymentStatus) ? key : accu;\n }\n return accu;\n }, '')\n});\n\nexport const getDeviceDeployments = createAsyncThunk(`${sliceName}/getDeviceDeployments`, (options, { dispatch }) => {\n const { deviceId, filterSelection = [], page = defaultPage, perPage = defaultPerPage } = options;\n const filters = filterSelection.map(item => `&status=${item}`).join('');\n return GeneralApi.get(`${deploymentsApiUrl}/deployments/devices/${deviceId}?page=${page}&per_page=${perPage}${filters}`)\n .then(({ data, headers }) =>\n Promise.resolve(\n dispatch(\n receivedDevice({\n id: deviceId,\n deviceDeployments: data.map(parseDeviceDeployment),\n deploymentsCount: Number(headers[headerNames.total])\n })\n )\n )\n )\n .catch(err => commonErrorHandler(err, 'There was an error retrieving the device deployment history:', dispatch));\n});\n\nexport const resetDeviceDeployments = createAsyncThunk(`${sliceName}/resetDeviceDeployments`, (deviceId, { dispatch }) =>\n GeneralApi.delete(`${deploymentsApiUrl}/deployments/devices/${deviceId}/history`)\n .then(() => Promise.resolve(dispatch(getDeviceDeployments({ deviceId }))))\n .catch(err => commonErrorHandler(err, 'There was an error resetting the device deployment history:', dispatch))\n);\n\nexport const getSingleDeployment = createAsyncThunk(`${sliceName}/getSingleDeployment`, (id, { dispatch, getState }) =>\n GeneralApi.get(`${deploymentsApiUrl}/deployments/${id}`).then(({ data }) => {\n const { deployments } = transformDeployments([data], getState().deployments.byId);\n return Promise.resolve(dispatch(actions.receivedDeployment(deployments[id])));\n })\n);\n\nexport const getDeviceLog = createAsyncThunk(`${sliceName}/getDeviceLog`, ({ deploymentId, deviceId }, { dispatch }) =>\n GeneralApi.get(`${deploymentsApiUrl}/deployments/${deploymentId}/devices/${deviceId}/log`)\n .catch(e => {\n console.log('no log here', e);\n return Promise.reject();\n })\n .then(({ data: log }) =>\n Promise.all([Promise.resolve(dispatch(actions.receivedDeploymentDeviceLog({ id: deploymentId, deviceId, log }))), Promise.resolve(log)])\n )\n);\n\nexport const abortDeployment = createAsyncThunk(`${sliceName}/abortDeployment`, (deploymentId, { dispatch, getState }) =>\n GeneralApi.put(`${deploymentsApiUrl}/deployments/${deploymentId}/status`, { status: 'aborted' })\n .then(() => {\n const deploymentsByStatus = getDeploymentsByStatusSelector(getState());\n let status = DEPLOYMENT_STATES.pending;\n let index = deploymentsByStatus.pending.deploymentIds.findIndex(id => id === deploymentId);\n if (index < 0) {\n status = DEPLOYMENT_STATES.inprogress;\n index = deploymentsByStatus.inprogress.deploymentIds.findIndex(id => id === deploymentId);\n }\n const deploymentIds = [...deploymentsByStatus[status].deploymentIds.slice(0, index), ...deploymentsByStatus[status].deploymentIds.slice(index + 1)];\n const deploymentsById = getDeploymentsById(getState());\n const deployments = deploymentIds.reduce((accu, id) => {\n accu[id] = deploymentsById[id];\n return accu;\n }, {});\n const total = Math.max(deploymentsByStatus[status].total - 1, 0);\n return Promise.all([\n dispatch(actions.receivedDeployments(deployments)),\n dispatch(actions.receivedDeploymentsForStatus({ deploymentIds, status, total })),\n dispatch(actions.removedDeployment(deploymentId)),\n dispatch(setSnackbar('The deployment was successfully aborted'))\n ]);\n })\n .catch(err => commonErrorHandler(err, 'There was an error while aborting the deployment:', dispatch))\n);\n\nexport const updateDeploymentControlMap = createAsyncThunk(`${sliceName}/updateDeploymentControlMap`, ({ deploymentId, updateControlMap }, { dispatch }) =>\n GeneralApi.patch(`${deploymentsApiUrl}/deployments/${deploymentId}`, { update_control_map: updateControlMap })\n .catch(err => commonErrorHandler(err, 'There was an error while updating the deployment status:', dispatch))\n .then(() => Promise.resolve(dispatch(getSingleDeployment(deploymentId))))\n);\n\nexport const setDeploymentsState = createAsyncThunk(`${sliceName}/setDeploymentsState`, (selection, { dispatch, getState }) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { page, perPage, ...selectionState } = selection;\n const currentState = getState().deployments.selectionState;\n let nextState = {\n ...currentState,\n ...selectionState,\n ...Object.keys(DEPLOYMENT_STATES).reduce((accu, item) => {\n accu[item] = {\n ...currentState[item],\n ...selectionState[item]\n };\n return accu;\n }, {}),\n general: {\n ...currentState.general,\n ...selectionState.general\n }\n };\n let tasks = [dispatch(actions.setDeploymentsState(nextState))];\n if (nextState.selectedId && currentState.selectedId !== nextState.selectedId) {\n tasks.push(dispatch(getSingleDeployment(nextState.selectedId)));\n }\n return Promise.all(tasks);\n});\n\nconst deltaAttributeMappings = [\n { here: 'compressionLevel', there: 'compression_level' },\n { here: 'disableChecksum', there: 'disable_checksum' },\n { here: 'disableDecompression', there: 'disable_external_decompression' },\n { here: 'sourceWindow', there: 'source_window_size' },\n { here: 'inputWindow', there: 'input_window_size' },\n { here: 'duplicatesWindow', there: 'compression_duplicates_window' },\n { here: 'instructionBuffer', there: 'instruction_buffer_size' }\n];\n\nconst mapExternalDeltaConfig = (config = {}) =>\n deltaAttributeMappings.reduce((accu, { here, there }) => {\n if (config[there] !== undefined) {\n accu[here] = config[there];\n }\n return accu;\n }, {});\n\nexport const getDeploymentsConfig = createAsyncThunk(`${sliceName}/getDeploymentsConfig`, (_, { dispatch, getState }) =>\n GeneralApi.get(`${deploymentsApiUrl}/config`).then(({ data }) => {\n const oldConfig = getState().deployments.config;\n const { delta = {} } = data;\n const { binary_delta = {}, binary_delta_limits = {} } = delta;\n const { xdelta_args = {}, timeout: timeoutConfig = oldConfig.binaryDelta.timeout } = binary_delta;\n const { xdelta_args_limits = {}, timeout: timeoutLimit = oldConfig.binaryDeltaLimits.timeout } = binary_delta_limits;\n const config = {\n ...oldConfig,\n hasDelta: Boolean(delta.enabled),\n binaryDelta: {\n ...oldConfig.binaryDelta,\n timeout: timeoutConfig,\n ...mapExternalDeltaConfig(xdelta_args)\n },\n binaryDeltaLimits: {\n ...oldConfig.binaryDeltaLimits,\n timeout: timeoutLimit,\n ...mapExternalDeltaConfig(xdelta_args_limits)\n }\n };\n return Promise.resolve(dispatch(actions.setDeploymentsConfig(config)));\n })\n);\n\n// traverse a source object and remove undefined & empty object properties to only return an attribute if there really is content worth sending\nconst deepClean = source =>\n Object.entries(source).reduce((accu, [key, value]) => {\n if (value !== undefined) {\n let cleanedValue = typeof value === 'object' ? deepClean(value) : value;\n if (cleanedValue === undefined || (typeof cleanedValue === 'object' && isEmpty(cleanedValue))) {\n return accu;\n }\n accu = { ...(accu ?? {}), [key]: cleanedValue };\n }\n return accu;\n }, undefined);\n\nexport const saveDeltaDeploymentsConfig = createAsyncThunk(`${sliceName}/saveDeltaDeploymentsConfig`, (config, { dispatch, getState }) => {\n const configChange = {\n timeout: config.timeout,\n xdelta_args: deltaAttributeMappings.reduce((accu, { here, there }) => {\n if (config[here] !== undefined) {\n accu[there] = config[here];\n }\n return accu;\n }, {})\n };\n const result = deepClean(configChange);\n if (!result) {\n return Promise.resolve();\n }\n return GeneralApi.put(`${deploymentsApiUrl}/config/binary_delta`, result)\n .catch(err => commonErrorHandler(err, 'There was a problem storing your delta artifact generation configuration.', dispatch))\n .then(() => {\n const oldConfig = getState().deployments.config;\n const newConfig = {\n ...oldConfig,\n binaryDelta: {\n ...oldConfig.binaryDelta,\n ...config\n }\n };\n return Promise.all([dispatch(actions.setDeploymentsConfig(newConfig)), dispatch(setSnackbar('Settings saved successfully'))]);\n });\n});\n","// 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\n\n/*eslint import/namespace: ['error', { allowComputed: true }]*/\nimport React from 'react';\nimport { Link } from 'react-router-dom';\n\nimport storeActions from '@northern.tech/store/actions';\nimport GeneralApi from '@northern.tech/store/api/general-api';\nimport {\n ALL_DEVICES,\n DEVICE_FILTERING_OPTIONS,\n DEVICE_LIST_DEFAULTS,\n EXTERNAL_PROVIDER,\n MAX_PAGE_SIZE,\n SORTING_OPTIONS,\n TIMEOUTS,\n UNGROUPED_GROUP,\n auditLogsApiUrl,\n defaultReports,\n headerNames,\n rootfsImageVersion\n} from '@northern.tech/store/constants';\nimport {\n getAttrsEndpoint,\n getCurrentUser,\n getDeviceTwinIntegrations,\n getGlobalSettings,\n getIdAttribute,\n getSearchEndpoint,\n getTenantCapabilities,\n getUserCapabilities,\n getUserSettings\n} from '@northern.tech/store/selectors';\nimport { commonErrorFallback, commonErrorHandler } from '@northern.tech/store/store';\nimport { getDeviceMonitorConfig, getLatestDeviceAlerts, getSingleDeployment, saveGlobalSettings } from '@northern.tech/store/thunks';\nimport {\n convertDeviceListStateToFilters,\n extractErrorMessage,\n filtersFilter,\n mapDeviceAttributes,\n mapFiltersToTerms,\n mapTermsToFilters,\n progress\n} from '@northern.tech/store/utils';\nimport { attributeDuplicateFilter, deepCompare, getSnackbarMessage } from '@northern.tech/utils/helpers';\nimport { createAsyncThunk } from '@reduxjs/toolkit';\nimport { isCancel } from 'axios';\nimport pluralize from 'pluralize';\nimport { v4 as uuid } from 'uuid';\n\nimport { actions, sliceName } from '.';\nimport {\n ALL_DEVICE_STATES,\n DEVICE_STATES,\n deviceAuthV2,\n deviceConfig,\n deviceConnect,\n emptyFilter,\n geoAttributes,\n inventoryApiUrl,\n inventoryApiUrlV2,\n iotManagerBaseURL,\n reportingApiUrl\n} from './constants';\nimport {\n getDeviceById as getDeviceByIdSelector,\n getDeviceFilters,\n getDeviceListState,\n getDevicesById,\n getGroupsById,\n getGroups as getGroupsSelector,\n getSelectedGroup\n} from './selectors';\n\nconst { cleanUpUpload, initUpload, setSnackbar, uploadProgress } = storeActions;\nconst { page: defaultPage, perPage: defaultPerPage } = DEVICE_LIST_DEFAULTS;\n\nconst defaultAttributes = [\n { scope: 'identity', attribute: 'status' },\n { scope: 'inventory', attribute: 'artifact_name' },\n { scope: 'inventory', attribute: 'device_type' },\n { scope: 'inventory', attribute: 'mender_is_gateway' },\n { scope: 'inventory', attribute: 'mender_gateway_system_id' },\n { scope: 'inventory', attribute: rootfsImageVersion },\n { scope: 'monitor', attribute: 'alerts' },\n { scope: 'system', attribute: 'created_ts' },\n { scope: 'system', attribute: 'updated_ts' },\n { scope: 'system', attribute: 'check_in_time' },\n { scope: 'system', attribute: 'group' },\n { scope: 'tags', attribute: 'name' }\n];\n\nexport const getGroups = createAsyncThunk(`${sliceName}/getGroups`, (_, { dispatch, getState }) =>\n GeneralApi.get(`${inventoryApiUrl}/groups`).then(res => {\n const state = getGroupsById(getState());\n const dynamicGroups = Object.entries(state).reduce((accu, [id, group]) => {\n if (group.id || (group.filters?.length && id !== UNGROUPED_GROUP.id)) {\n accu[id] = group;\n }\n return accu;\n }, {});\n const groups = res.data.reduce((accu, group) => {\n accu[group] = { deviceIds: [], filters: [], total: 0, ...state[group] };\n return accu;\n }, dynamicGroups);\n const filters = [{ key: 'group', value: res.data, operator: DEVICE_FILTERING_OPTIONS.$nin.key, scope: 'system' }];\n return Promise.all([\n dispatch(actions.receivedGroups(groups)),\n dispatch(getDevicesByStatus({ filterSelection: filters, group: 0, page: 1, perPage: 1, status: undefined }))\n ]).then(promises => {\n const devicesRetrieval = promises[promises.length - 1] || [];\n const { payload } = devicesRetrieval || {};\n const result = payload[payload.length - 1] || {};\n if (!result.total) {\n return Promise.resolve();\n }\n return Promise.resolve(\n dispatch(\n actions.addGroup({\n groupName: UNGROUPED_GROUP.id,\n group: { filters: [{ key: 'group', value: res.data, operator: DEVICE_FILTERING_OPTIONS.$nin.key, scope: 'system' }] }\n })\n )\n );\n });\n })\n);\n\nexport const addDevicesToGroup = createAsyncThunk(`${sliceName}/addDevicesToGroup`, ({ group, deviceIds, isCreation }, { dispatch }) =>\n GeneralApi.patch(`${inventoryApiUrl}/groups/${group}/devices`, deviceIds)\n .then(() => dispatch(actions.addToGroup({ group, deviceIds })))\n .finally(() => (isCreation ? Promise.resolve(dispatch(getGroups())) : {}))\n);\n\nexport const removeDevicesFromGroup = createAsyncThunk(`${sliceName}/removeDevicesFromGroup`, ({ group, deviceIds }, { dispatch }) =>\n GeneralApi.delete(`${inventoryApiUrl}/groups/${group}/devices`, deviceIds).then(() =>\n Promise.all([\n dispatch(actions.removeFromGroup({ group, deviceIds })),\n dispatch(setSnackbar(`The ${pluralize('devices', deviceIds.length)} ${pluralize('were', deviceIds.length)} removed from the group`, TIMEOUTS.fiveSeconds))\n ])\n )\n);\n\nconst getGroupNotification = (newGroup, selectedGroup) => {\n const successMessage = 'The group was updated successfully';\n if (newGroup === selectedGroup) {\n return [successMessage, TIMEOUTS.fiveSeconds];\n }\n return [\n <>\n {successMessage} - <Link to={`/devices?inventory=group:eq:${newGroup}`}>click here</Link> to see it.\n </>,\n 5000,\n undefined,\n undefined,\n () => {}\n ];\n};\n\nexport const addStaticGroup = createAsyncThunk(`${sliceName}/addStaticGroup`, ({ group, devices }, { dispatch, getState }) =>\n Promise.resolve(dispatch(addDevicesToGroup({ group, deviceIds: devices.map(({ id }) => id), isCreation: true })))\n .then(() =>\n Promise.resolve(\n dispatch(\n actions.addGroup({\n group: { deviceIds: [], total: 0, filters: [], ...getState().devices.groups.byId[group] },\n groupName: group\n })\n )\n ).then(() =>\n Promise.all([\n dispatch(setDeviceListState({ setOnly: true })),\n dispatch(getGroups()),\n dispatch(setSnackbar(...getGroupNotification(group, getState().devices.groups.selectedGroup)))\n ])\n )\n )\n .catch(err => commonErrorHandler(err, `Group could not be updated:`, dispatch))\n);\n\nexport const removeStaticGroup = createAsyncThunk(`${sliceName}/removeStaticGroup`, (groupName, { dispatch }) =>\n GeneralApi.delete(`${inventoryApiUrl}/groups/${groupName}`).then(() =>\n Promise.all([\n dispatch(actions.removeGroup(groupName)),\n dispatch(getGroups()),\n dispatch(setSnackbar('Group was removed successfully', TIMEOUTS.fiveSeconds))\n ])\n )\n);\n\nexport const getDynamicGroups = createAsyncThunk(`${sliceName}/getDynamicGroups`, (_, { dispatch, getState }) =>\n GeneralApi.get(`${inventoryApiUrlV2}/filters?per_page=${MAX_PAGE_SIZE}`)\n .then(({ data: filters }) => {\n const state = getGroupsById(getState());\n const staticGroups = Object.entries(state).reduce((accu, [id, group]) => {\n if (!(group.id || group.filters?.length)) {\n accu[id] = group;\n }\n return accu;\n }, {});\n const groups = (filters || []).reduce((accu, filter) => {\n accu[filter.name] = {\n deviceIds: [],\n total: 0,\n ...state[filter.name],\n id: filter.id,\n filters: mapTermsToFilters(filter.terms)\n };\n return accu;\n }, staticGroups);\n return Promise.resolve(dispatch(actions.receivedGroups(groups)));\n })\n .catch(() => console.log('Dynamic group retrieval failed - likely accessing a non-enterprise backend'))\n);\n\nexport const addDynamicGroup = createAsyncThunk(`${sliceName}/addDynamicGroup`, ({ groupName, filterPredicates }, { dispatch, getState }) =>\n GeneralApi.post(`${inventoryApiUrlV2}/filters`, { name: groupName, terms: mapFiltersToTerms(filterPredicates) })\n .then(res =>\n Promise.resolve(\n dispatch(\n actions.addGroup({\n groupName,\n group: {\n id: res.headers[headerNames.location].substring(res.headers[headerNames.location].lastIndexOf('/') + 1),\n filters: filterPredicates\n }\n })\n )\n ).then(() => {\n const { cleanedFilters } = getGroupFilters(groupName, getState().devices.groups);\n return Promise.all([\n dispatch(actions.setDeviceFilters(cleanedFilters)),\n dispatch(setSnackbar(...getGroupNotification(groupName, getState().devices.groups.selectedGroup))),\n dispatch(getDynamicGroups())\n ]);\n })\n )\n .catch(err => commonErrorHandler(err, `Group could not be updated:`, dispatch))\n);\n\nexport const updateDynamicGroup = createAsyncThunk(`${sliceName}/updateDynamicGroup`, ({ groupName, filterPredicates }, { dispatch, getState }) => {\n const filterId = getState().devices.groups.byId[groupName].id;\n return GeneralApi.delete(`${inventoryApiUrlV2}/filters/${filterId}`).then(() => Promise.resolve(dispatch(addDynamicGroup({ groupName, filterPredicates }))));\n});\n\nexport const removeDynamicGroup = createAsyncThunk(`${sliceName}/removeDynamicGroup`, (groupName, { dispatch, getState }) => {\n const filterId = getState().devices.groups.byId[groupName].id;\n return GeneralApi.delete(`${inventoryApiUrlV2}/filters/${filterId}`).then(() =>\n Promise.all([dispatch(actions.removeGroup(groupName)), dispatch(setSnackbar('Group was removed successfully', TIMEOUTS.fiveSeconds))])\n );\n});\n\n/*\n * Device inventory functions\n */\nconst getGroupFilters = (group, groupsState, filters = []) => {\n const groupName = group === UNGROUPED_GROUP.id || group === UNGROUPED_GROUP.name ? UNGROUPED_GROUP.id : group;\n const selectedGroup = groupsState.byId[groupName];\n const groupFilterLength = selectedGroup?.filters?.length || 0;\n const cleanedFilters = groupFilterLength ? [...filters, ...selectedGroup.filters].filter(filtersFilter) : filters;\n return { cleanedFilters, groupName, selectedGroup, groupFilterLength };\n};\n\nexport const selectGroup = createAsyncThunk(`${sliceName}/selectGroup`, ({ group, filters = [] }, { dispatch, getState }) => {\n const { cleanedFilters, groupName, selectedGroup, groupFilterLength } = getGroupFilters(group, getState().devices.groups, filters);\n if (getSelectedGroup(getState()) === groupName && ((filters.length === 0 && !groupFilterLength) || filters.length === cleanedFilters.length)) {\n return Promise.resolve();\n }\n let tasks = [];\n if (groupFilterLength) {\n tasks.push(dispatch(actions.setDeviceFilters(cleanedFilters)));\n } else {\n tasks.push(dispatch(actions.setDeviceFilters(filters)));\n tasks.push(dispatch(getGroupDevices({ group: groupName, perPage: 1, shouldIncludeAllStates: true })));\n }\n const selectedGroupName = selectedGroup || !Object.keys(getGroupsById(getState())).length ? groupName : undefined;\n tasks.push(dispatch(actions.selectGroup(selectedGroupName)));\n return Promise.all(tasks);\n});\n\nconst getEarliestTs = (dateA = '', dateB = '') => (!dateA || !dateB ? dateA || dateB : dateA < dateB ? dateA : dateB);\n\nconst reduceReceivedDevices = (devices, ids, state, status) =>\n devices.reduce(\n (accu, device) => {\n const stateDevice = getDeviceByIdSelector(state, device.id);\n const {\n attributes: storedAttributes = {},\n identity_data: storedIdentity = {},\n monitor: storedMonitor = {},\n tags: storedTags = {},\n group: storedGroup\n } = stateDevice;\n const { identity, inventory, monitor, system = {}, tags } = mapDeviceAttributes(device.attributes);\n device.tags = { ...storedTags, ...tags };\n device.group = system.group ?? storedGroup;\n device.monitor = { ...storedMonitor, ...monitor };\n device.identity_data = { ...storedIdentity, ...identity, ...(device.identity_data ? device.identity_data : {}) };\n device.status = status ? status : device.status || identity.status;\n device.check_in_time_rounded = system.check_in_time ?? stateDevice.check_in_time_rounded;\n device.check_in_time_exact = device.check_in_time ?? stateDevice.check_in_time_exact;\n device.created_ts = getEarliestTs(getEarliestTs(system.created_ts, device.created_ts), stateDevice.created_ts);\n device.updated_ts = device.attributes ? device.updated_ts : stateDevice.updated_ts;\n device.isNew = new Date(device.created_ts) > new Date(state.app.newThreshold);\n device.isOffline = new Date(device.check_in_time_rounded) < new Date(state.app.offlineThreshold) || device.check_in_time_rounded === undefined;\n // all the other mapped attributes return as empty objects if there are no attributes to map, but identity will be initialized with an empty state\n // for device_type and artifact_name, potentially overwriting existing info, so rely on stored information instead if there are no attributes\n device.attributes = device.attributes ? { ...storedAttributes, ...inventory } : storedAttributes;\n accu.devicesById[device.id] = { ...stateDevice, ...device };\n accu.ids.push(device.id);\n return accu;\n },\n { ids, devicesById: {} }\n );\n\nexport const getGroupDevices = createAsyncThunk(`${sliceName}/getGroupDevices`, (options, { dispatch, getState }) => {\n const { group, shouldIncludeAllStates, ...remainder } = options;\n const { cleanedFilters: filterSelection } = getGroupFilters(group, getState().devices.groups);\n return Promise.resolve(\n dispatch(getDevicesByStatus({ ...remainder, filterSelection, group, status: shouldIncludeAllStates ? undefined : DEVICE_STATES.accepted }))\n )\n .unwrap()\n .then(results => {\n if (!group) {\n return Promise.resolve();\n }\n const { deviceAccu, total } = results[results.length - 1];\n const stateGroup = getState().devices.groups.byId[group];\n if (!stateGroup && !total && !deviceAccu.ids.length) {\n return Promise.resolve();\n }\n return Promise.resolve(\n dispatch(\n actions.addGroup({\n group: {\n deviceIds: deviceAccu.ids.length === total || deviceAccu.ids.length > stateGroup?.deviceIds ? deviceAccu.ids : stateGroup.deviceIds,\n total\n },\n groupName: group\n })\n )\n );\n });\n});\n\nexport const getAllGroupDevices = createAsyncThunk(`${sliceName}/getAllGroupDevices`, (group, { dispatch, getState }) => {\n if (!group || (!!group && (!getGroupsById(getState())[group] || getGroupsById(getState())[group].filters.length))) {\n return Promise.resolve();\n }\n const { attributes, filterTerms } = prepareSearchArguments({\n filters: [],\n group,\n state: getState(),\n status: DEVICE_STATES.accepted\n });\n const getAllDevices = (perPage = MAX_PAGE_SIZE, page = defaultPage, devices = []) =>\n GeneralApi.post(getSearchEndpoint(getState()), {\n page,\n per_page: perPage,\n filters: filterTerms,\n attributes\n }).then(res => {\n const state = getState();\n const deviceAccu = reduceReceivedDevices(res.data, devices, state);\n dispatch(actions.receivedDevices(deviceAccu.devicesById));\n const total = Number(res.headers[headerNames.total]);\n if (total > perPage * page) {\n return getAllDevices(perPage, page + 1, deviceAccu.ids);\n }\n return Promise.resolve(dispatch(actions.addGroup({ group: { deviceIds: deviceAccu.ids, total: deviceAccu.ids.length }, groupName: group })));\n });\n return getAllDevices();\n});\n\nexport const getAllDynamicGroupDevices = createAsyncThunk(`${sliceName}/getAllDynamicGroupDevices`, (group, { dispatch, getState }) => {\n if (!!group && (!getGroupsById(getState())[group] || !getGroupsById(getState())[group].filters.length)) {\n return Promise.resolve();\n }\n const { attributes, filterTerms: filters } = prepareSearchArguments({\n filters: getState().devices.groups.byId[group].filters,\n state: getState(),\n status: DEVICE_STATES.accepted\n });\n const getAllDevices = (perPage = MAX_PAGE_SIZE, page = defaultPage, devices = []) =>\n GeneralApi.post(getSearchEndpoint(getState()), { page, per_page: perPage, filters, attributes }).then(res => {\n const state = getState();\n const deviceAccu = reduceReceivedDevices(res.data, devices, state);\n dispatch(actions.receivedDevices(deviceAccu.devicesById));\n const total = Number(res.headers[headerNames.total]);\n if (total > deviceAccu.ids.length) {\n return getAllDevices(perPage, page + 1, deviceAccu.ids);\n }\n return Promise.resolve(dispatch(actions.addGroup({ group: { deviceIds: deviceAccu.ids, total }, groupName: group })));\n });\n return getAllDevices();\n});\n\nexport const getDeviceById = createAsyncThunk(`${sliceName}/getDeviceById`, (id, { dispatch, getState }) =>\n GeneralApi.get(`${inventoryApiUrl}/devices/${id}`)\n .then(res => {\n const device = reduceReceivedDevices([res.data], [], getState()).devicesById[id];\n device.etag = res.headers.etag;\n dispatch(actions.receivedDevice(device));\n return Promise.resolve(device);\n })\n .catch(err => {\n const errMsg = extractErrorMessage(err);\n if (errMsg.includes('Not Found')) {\n console.log(`${id} does not have any inventory information`);\n const device = reduceReceivedDevices(\n [\n {\n id,\n attributes: [\n { name: 'status', value: 'decomissioned', scope: 'identity' },\n { name: 'decomissioned', value: 'true', scope: 'inventory' }\n ]\n }\n ],\n [],\n getState()\n ).devicesById[id];\n dispatch(actions.receivedDevice(device));\n }\n })\n);\n\nexport const getDeviceInfo = createAsyncThunk(`${sliceName}/getDeviceInfo`, (deviceId, { dispatch, getState }) => {\n const device = getDeviceByIdSelector(getState(), deviceId);\n const { hasDeviceConfig, hasDeviceConnect, hasMonitor } = getTenantCapabilities(getState());\n const { canConfigure } = getUserCapabilities(getState());\n const integrations = getDeviceTwinIntegrations(getState());\n let tasks = [dispatch(getDeviceAuth(deviceId)), ...integrations.map(integration => dispatch(getDeviceTwin({ deviceId, integration })))];\n if (hasDeviceConfig && canConfigure && [DEVICE_STATES.accepted, DEVICE_STATES.preauth].includes(device.status)) {\n tasks.push(dispatch(getDeviceConfig(deviceId)));\n }\n if (device.status === DEVICE_STATES.accepted) {\n // Get full device identity details for single selected device\n tasks.push(dispatch(getDeviceById(deviceId)));\n if (hasDeviceConnect) {\n tasks.push(dispatch(getDeviceConnect(deviceId)));\n }\n if (hasMonitor) {\n tasks.push(dispatch(getLatestDeviceAlerts({ id: deviceId })));\n tasks.push(dispatch(getDeviceMonitorConfig(deviceId)));\n }\n }\n return Promise.all(tasks);\n});\n\nexport const deriveInactiveDevices = createAsyncThunk(`${sliceName}/deriveInactiveDevices`, (deviceIds, { dispatch, getState }) => {\n const yesterday = new Date();\n yesterday.setDate(yesterday.getDate() - 1);\n const yesterdaysIsoString = yesterday.toISOString();\n // now boil the list down to the ones that were not updated since yesterday\n const devices = deviceIds.reduce(\n (accu, id) => {\n const device = getDeviceByIdSelector(getState(), id);\n if (device && device.updated_ts > yesterdaysIsoString) {\n accu.active.push(id);\n } else {\n accu.inactive.push(id);\n }\n return accu;\n },\n { active: [], inactive: [] }\n );\n return dispatch(actions.setInactiveDevices({ activeDeviceTotal: devices.active.length, inactiveDeviceTotal: devices.inactive.length }));\n});\n\n/*\n Device Auth + admission\n */\nexport const getDeviceCount = createAsyncThunk(`${sliceName}/getDeviceCount`, (status, { dispatch, getState }) =>\n GeneralApi.post(getSearchEndpoint(getState()), {\n page: 1,\n per_page: 1,\n filters: mapFiltersToTerms([{ key: 'status', value: status, operator: DEVICE_FILTERING_OPTIONS.$eq.key, scope: 'identity' }]),\n attributes: defaultAttributes\n }).then(response => {\n const count = Number(response.headers[headerNames.total]);\n if (status) {\n return dispatch(actions.setDevicesCountByStatus({ count, status }));\n }\n return dispatch(actions.setTotalDevices(count));\n })\n);\n\nexport const getAllDeviceCounts = createAsyncThunk(`${sliceName}/getAllDeviceCounts`, (_, { dispatch }) =>\n Promise.all([DEVICE_STATES.accepted, DEVICE_STATES.pending].map(status => dispatch(getDeviceCount(status))))\n);\n\nexport const getDeviceLimit = createAsyncThunk(`${sliceName}/getDeviceLimit`, (_, { dispatch }) =>\n GeneralApi.get(`${deviceAuthV2}/limits/max_devices`).then(res => dispatch(actions.setDeviceLimit(res.data.limit)))\n);\n\nexport const setDeviceListState = createAsyncThunk(\n `${sliceName}/setDeviceListState`,\n ({ shouldSelectDevices = true, forceRefresh, fetchAuth = true, ...selectionState }, { dispatch, getState }) => {\n const currentState = getDeviceListState(getState());\n const refreshTrigger = forceRefresh ? !currentState.refreshTrigger : selectionState.refreshTrigger;\n let nextState = {\n ...currentState,\n setOnly: false,\n refreshTrigger,\n ...selectionState,\n sort: { ...currentState.sort, ...selectionState.sort }\n };\n let tasks = [];\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { isLoading: currentLoading, deviceIds: currentDevices, selection: currentSelection, ...currentRequestState } = currentState;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { isLoading: nextLoading, deviceIds: nextDevices, selection: nextSelection, ...nextRequestState } = nextState;\n if (!nextState.setOnly && !deepCompare(currentRequestState, nextRequestState)) {\n const { direction: sortDown = SORTING_OPTIONS.desc, key: sortCol, scope: sortScope } = nextState.sort ?? {};\n const sortBy = sortCol ? [{ attribute: sortCol, order: sortDown, scope: sortScope }] : undefined;\n const applicableSelectedState = nextState.state === ALL_DEVICE_STATES ? undefined : nextState.state;\n nextState.isLoading = true;\n tasks.push(\n dispatch(getDevicesByStatus({ ...nextState, status: applicableSelectedState, sortOptions: sortBy, fetchAuth }))\n .unwrap()\n .then(results => {\n const { deviceAccu, total } = results[results.length - 1];\n const devicesState = shouldSelectDevices ? { deviceIds: deviceAccu.ids, total, isLoading: false } : { isLoading: false };\n return Promise.resolve(dispatch(actions.setDeviceListState(devicesState)));\n })\n // whatever happens, change \"loading\" back to null\n .catch(() => Promise.resolve({ isLoading: false }))\n );\n }\n tasks.push(dispatch(actions.setDeviceListState(nextState)));\n return Promise.all(tasks);\n }\n);\n\n// get devices from inventory\nexport const getDevicesByStatus = createAsyncThunk(`${sliceName}/getDevicesByStatus`, (options, { dispatch, getState }) => {\n const {\n status,\n fetchAuth = true,\n filterSelection,\n group,\n selectedIssues = [],\n page = defaultPage,\n perPage = defaultPerPage,\n sortOptions = [],\n selectedAttributes = []\n } = options;\n const state = getState();\n const { applicableFilters, filterTerms } = convertDeviceListStateToFilters({\n filters: filterSelection ?? getDeviceFilters(state),\n group: group ?? getSelectedGroup(state),\n groups: state.devices.groups,\n offlineThreshold: state.app.offlineThreshold,\n selectedIssues,\n status\n });\n const attributes = [...defaultAttributes, getIdAttribute(getState()), ...selectedAttributes];\n return GeneralApi.post(getSearchEndpoint(getState()), {\n page,\n per_page: perPage,\n filters: filterTerms,\n sort: sortOptions,\n attributes\n })\n .then(response => {\n const state = getState();\n const deviceAccu = reduceReceivedDevices(response.data, [], state, status);\n let total = !applicableFilters.length ? Number(response.headers[headerNames.total]) : null;\n if (status && state.devices.byStatus[status].total === deviceAccu.ids.length) {\n total = deviceAccu.ids.length;\n }\n let tasks = [dispatch(actions.receivedDevices(deviceAccu.devicesById))];\n if (status) {\n tasks.push(dispatch(actions.setDevicesByStatus({ deviceIds: deviceAccu.ids, status, total })));\n }\n // for each device, get device identity info\n const receivedDevices = Object.values(deviceAccu.devicesById);\n if (receivedDevices.length && fetchAuth) {\n tasks.push(dispatch(getDevicesWithAuth(receivedDevices)));\n }\n tasks.push(Promise.resolve({ deviceAccu, total: Number(response.headers[headerNames.total]) }));\n return Promise.all(tasks);\n })\n .catch(err => commonErrorHandler(err, `${status} devices couldn't be loaded.`, dispatch, commonErrorFallback));\n});\n\nexport const getAllDevicesByStatus = createAsyncThunk(`${sliceName}/getAllDevicesByStatus`, (status, { dispatch, getState }) => {\n const attributes = [...defaultAttributes, getIdAttribute(getState())];\n const getAllDevices = (perPage = MAX_PAGE_SIZE, page = 1, devices = []) =>\n GeneralApi.post(getSearchEndpoint(getState()), {\n page,\n per_page: perPage,\n filters: mapFiltersToTerms([{ key: 'status', value: status, operator: DEVICE_FILTERING_OPTIONS.$eq.key, scope: 'identity' }]),\n attributes\n }).then(res => {\n const state = getState();\n const deviceAccu = reduceReceivedDevices(res.data, devices, state, status);\n dispatch(actions.receivedDevices(deviceAccu.devicesById));\n const total = Number(res.headers[headerNames.total]);\n if (total > state.deployments.deploymentDeviceLimit) {\n return Promise.resolve();\n }\n if (total > perPage * page) {\n return getAllDevices(perPage, page + 1, deviceAccu.ids);\n }\n let tasks = [dispatch(actions.setDevicesByStatus({ deviceIds: deviceAccu.ids, forceUpdate: true, status, total: deviceAccu.ids.length }))];\n if (status === DEVICE_STATES.accepted && deviceAccu.ids.length === total) {\n tasks.push(dispatch(deriveInactiveDevices(deviceAccu.ids)));\n tasks.push(dispatch(deriveReportsData()));\n }\n return Promise.all(tasks);\n });\n return getAllDevices();\n});\n\nexport const searchDevices = createAsyncThunk(`${sliceName}/searchDevices`, (passedOptions = {}, { dispatch, getState }) => {\n const state = getState();\n let options = { ...state.app.searchState, ...passedOptions };\n const { page = defaultPage, searchTerm, sortOptions = [] } = options;\n const { columnSelection = [] } = getUserSettings(state);\n const selectedAttributes = columnSelection.map(column => ({ attribute: column.key, scope: column.scope }));\n const attributes = attributeDuplicateFilter([...defaultAttributes, getIdAttribute(state), ...selectedAttributes], 'attribute');\n return GeneralApi.post(getSearchEndpoint(getState()), {\n page,\n per_page: 10,\n filters: [],\n sort: sortOptions,\n text: searchTerm,\n attributes\n })\n .then(response => {\n const deviceAccu = reduceReceivedDevices(response.data, [], getState());\n return Promise.all([\n dispatch(actions.receivedDevices(deviceAccu.devicesById)),\n Promise.resolve({ deviceIds: deviceAccu.ids, searchTotal: Number(response.headers[headerNames.total]) })\n ]);\n })\n .catch(err => commonErrorHandler(err, `devices couldn't be searched.`, dispatch, commonErrorFallback));\n});\n\nconst ATTRIBUTE_LIST_CUTOFF = 100;\nconst attributeReducer = (attributes = []) =>\n attributes.slice(0, ATTRIBUTE_LIST_CUTOFF).reduce(\n (accu, { name, scope }) => {\n if (!accu[scope]) {\n accu[scope] = [];\n }\n accu[scope].push(name);\n return accu;\n },\n { identity: [], inventory: [], system: [], tags: [] }\n );\n\nexport const getDeviceAttributes = createAsyncThunk(`${sliceName}/getDeviceAttributes`, (_, { dispatch, getState }) =>\n GeneralApi.get(getAttrsEndpoint(getState())).then(({ data }) => {\n // TODO: remove the array fallback once the inventory attributes endpoint is fixed\n const { identity: identityAttributes, inventory: inventoryAttributes, system: systemAttributes, tags: tagAttributes } = attributeReducer(data || []);\n return dispatch(actions.setFilterAttributes({ identityAttributes, inventoryAttributes, systemAttributes, tagAttributes }));\n })\n);\n\nexport const getReportingLimits = createAsyncThunk(`${sliceName}/getReportingLimits`, (_, { dispatch }) =>\n GeneralApi.get(`${reportingApiUrl}/devices/attributes`)\n .catch(err => commonErrorHandler(err, `filterable attributes limit & usage could not be retrieved.`, dispatch, commonErrorFallback))\n .then(({ data }) => {\n const { attributes, count, limit } = data;\n const groupedAttributes = attributeReducer(attributes);\n return Promise.resolve(dispatch(actions.setFilterablesConfig({ count, limit, attributes: groupedAttributes })));\n })\n);\n\nexport const ensureVersionString = (software, fallback) =>\n software.length && software !== 'artifact_name' ? (software.endsWith('.version') ? software : `${software}.version`) : fallback;\n\nconst REPORT_CHART_SIZE_LIMIT = 6;\nconst getSingleReportData = (reportConfig, groups) => {\n const { attribute, group, software = '' } = reportConfig;\n const filters = [{ key: 'status', scope: 'identity', operator: DEVICE_FILTERING_OPTIONS.$eq.key, value: 'accepted' }];\n if (group) {\n const staticGroupFilter = { key: 'group', scope: 'system', operator: DEVICE_FILTERING_OPTIONS.$eq.key, value: group };\n const { cleanedFilters: groupFilters } = getGroupFilters(group, groups);\n filters.push(...(groupFilters.length ? groupFilters : [staticGroupFilter]));\n }\n const aggregationAttribute = ensureVersionString(software, attribute);\n return GeneralApi.post(`${reportingApiUrl}/devices/aggregate`, {\n aggregations: [{ attribute: aggregationAttribute, name: '*', scope: 'inventory', size: REPORT_CHART_SIZE_LIMIT }],\n filters: mapFiltersToTerms(filters)\n }).then(({ data }) => ({ data, reportConfig }));\n};\n\nexport const getReportsData = createAsyncThunk(`${sliceName}/getReportsData`, (_, { dispatch, getState }) => {\n const state = getState();\n const currentUserId = getCurrentUser(state).id;\n const reports =\n getUserSettings(state).reports || getGlobalSettings(state)[`${currentUserId}-reports`] || (Object.keys(getDevicesById(state)).length ? defaultReports : []);\n return Promise.all(reports.map(report => getSingleReportData(report, getState().devices.groups))).then(results => {\n const devicesState = getState().devices;\n const totalDeviceCount = devicesState.byStatus.accepted.total;\n const newReports = results.map(({ data, reportConfig }) => {\n let { items, other_count } = data[0];\n const { attribute, group, software = '' } = reportConfig;\n const dataCount = items.reduce((accu, item) => accu + item.count, 0);\n // the following is needed to show reports including both old (artifact_name) & current style (rootfs-image.version) device software\n const otherCount = !group && (software === rootfsImageVersion || attribute === 'artifact_name') ? totalDeviceCount - dataCount : other_count;\n return { items, otherCount, total: otherCount + dataCount };\n });\n return Promise.resolve(dispatch(actions.setDeviceReports(newReports)));\n });\n});\n\nconst initializeDistributionData = (report, groups, devices, totalDeviceCount) => {\n const { attribute, group = '', software = '' } = report;\n const effectiveAttribute = software ? software : attribute;\n const { deviceIds, total = 0 } = groups[group] || {};\n const relevantDevices = groups[group] ? deviceIds.map(id => devices[id]) : Object.values(devices);\n const distributionByAttribute = relevantDevices.reduce((accu, item) => {\n if (!item.attributes || item.status !== DEVICE_STATES.accepted) return accu;\n if (!accu[item.attributes[effectiveAttribute]]) {\n accu[item.attributes[effectiveAttribute]] = 0;\n }\n accu[item.attributes[effectiveAttribute]] = accu[item.attributes[effectiveAttribute]] + 1;\n return accu;\n }, {});\n const distributionByAttributeSorted = Object.entries(distributionByAttribute).sort((pairA, pairB) => pairB[1] - pairA[1]);\n const items = distributionByAttributeSorted.map(([key, count]) => ({ key, count }));\n const dataCount = items.reduce((accu, item) => accu + item.count, 0);\n // the following is needed to show reports including both old (artifact_name) & current style (rootfs-image.version) device software\n const otherCount = (groups[group] ? total : totalDeviceCount) - dataCount;\n return { items, otherCount, total: otherCount + dataCount };\n};\n\nexport const deriveReportsData = createAsyncThunk(`${sliceName}/deriveReportsData`, (_, { dispatch, getState }) => {\n const state = getState();\n const {\n groups: { byId: groupsById },\n byId,\n byStatus: {\n accepted: { total }\n }\n } = state.devices;\n const reports =\n getUserSettings(state).reports || state.users.globalSettings[`${state.users.currentUser}-reports`] || (Object.keys(byId).length ? defaultReports : []);\n const newReports = reports.map(report => initializeDistributionData(report, groupsById, byId, total));\n return Promise.resolve(dispatch(actions.setDeviceReports(newReports)));\n});\n\nexport const getReportsDataWithoutBackendSupport = createAsyncThunk(`${sliceName}/getReportsDataWithoutBackendSupport`, (_, { dispatch, getState }) =>\n Promise.all([dispatch(getAllDevicesByStatus(DEVICE_STATES.accepted)), dispatch(getGroups()), dispatch(getDynamicGroups())]).then(() => {\n const { dynamic: dynamicGroups, static: staticGroups } = getGroupsSelector(getState());\n return Promise.all([\n ...staticGroups.map(({ groupId }) => dispatch(getAllGroupDevices(groupId))),\n ...dynamicGroups.map(({ groupId }) => dispatch(getAllDynamicGroupDevices(groupId)))\n ]).then(() => dispatch(deriveReportsData()));\n })\n);\n\nexport const getDeviceConnect = createAsyncThunk(`${sliceName}/getDeviceConnect`, (id, { dispatch }) =>\n GeneralApi.get(`${deviceConnect}/devices/${id}`).then(({ data }) =>\n Promise.all([dispatch(actions.receivedDevice({ connect_status: data.status, connect_updated_ts: data.updated_ts, id })), Promise.resolve(data)])\n )\n);\n\nexport const getSessionDetails = createAsyncThunk(`${sliceName}/getSessionDetails`, ({ sessionId, deviceId, userId, startDate, endDate }) => {\n const createdAfter = startDate ? `&created_after=${Math.round(Date.parse(startDate) / 1000)}` : '';\n const createdBefore = endDate ? `&created_before=${Math.round(Date.parse(endDate) / 1000)}` : '';\n const objectSearch = `&object_id=${deviceId}`;\n return GeneralApi.get(`${auditLogsApiUrl}/logs?per_page=500${createdAfter}${createdBefore}&actor_id=${userId}${objectSearch}`).then(\n ({ data: auditLogEntries }) => {\n const { start, end } = auditLogEntries.reduce(\n (accu, item) => {\n if (item.meta?.session_id?.includes(sessionId)) {\n accu.start = new Date(item.action.startsWith('open') ? item.time : accu.start);\n accu.end = new Date(item.action.startsWith('close') ? item.time : accu.end);\n }\n return accu;\n },\n { start: startDate || endDate, end: endDate || startDate }\n );\n return Promise.resolve({ start, end });\n }\n );\n});\n\nexport const getDeviceFileDownloadLink = createAsyncThunk(`${sliceName}/getDeviceFileDownloadLink`, ({ deviceId, path }) =>\n Promise.resolve(`${window.location.origin}${deviceConnect}/devices/${deviceId}/download?path=${encodeURIComponent(path)}`)\n);\n\nexport const deviceFileUpload = createAsyncThunk(`${sliceName}/deviceFileUpload`, ({ deviceId, path, file }, { dispatch }) => {\n let formData = new FormData();\n formData.append('path', path);\n formData.append('file', file);\n const uploadId = uuid();\n const cancelSource = new AbortController();\n return Promise.all([\n dispatch(setSnackbar('Uploading file')),\n dispatch(initUpload({ id: uploadId, upload: { inprogress: true, uploadProgress: 0, cancelSource } })),\n GeneralApi.uploadPut(\n `${deviceConnect}/devices/${deviceId}/upload`,\n formData,\n e => dispatch(uploadProgress({ id: uploadId, progress: progress(e) })),\n cancelSource.signal\n )\n ])\n .then(() => Promise.resolve(dispatch(setSnackbar('Upload successful', TIMEOUTS.fiveSeconds))))\n .catch(err => {\n if (isCancel(err)) {\n return dispatch(setSnackbar('The upload has been cancelled', TIMEOUTS.fiveSeconds));\n }\n return commonErrorHandler(err, `Error uploading file to device.`, dispatch);\n })\n .finally(() => dispatch(cleanUpUpload(uploadId)));\n});\n\nexport const getDeviceAuth = createAsyncThunk(`${sliceName}/getDeviceAuth`, (id, { dispatch }) =>\n dispatch(getDevicesWithAuth([{ id }]))\n .unwrap()\n .then(results => {\n if (results[results.length - 1]) {\n return Promise.resolve(results[results.length - 1][0]);\n }\n return Promise.resolve();\n })\n);\n\nexport const getDevicesWithAuth = createAsyncThunk(`${sliceName}/getDevicesWithAuth`, (devices, { dispatch, getState }) =>\n devices.length\n ? GeneralApi.get(`${deviceAuthV2}/devices?id=${devices.map(device => device.id).join('&id=')}`)\n .then(({ data: receivedDevices }) => {\n const { devicesById } = reduceReceivedDevices(receivedDevices, [], getState());\n return Promise.all([dispatch(actions.receivedDevices(devicesById)), Promise.resolve(receivedDevices)]);\n })\n .catch(err => commonErrorHandler(err, `Error: ${err}`, dispatch))\n : Promise.resolve([[], []])\n);\n\nexport const updateDeviceAuth = createAsyncThunk(`${sliceName}/updateDeviceAuth`, ({ deviceId, authId, status }, { dispatch, getState }) =>\n GeneralApi.put(`${deviceAuthV2}/devices/${deviceId}/auth/${authId}/status`, { status })\n .then(() => Promise.all([dispatch(getDeviceAuth(deviceId)), dispatch(setSnackbar('Device authorization status was updated successfully'))]))\n .catch(err => commonErrorHandler(err, 'There was a problem updating the device authorization status:', dispatch))\n .then(() => Promise.resolve(dispatch(actions.maybeUpdateDevicesByStatus({ deviceId, authId }))))\n .finally(() => dispatch(setDeviceListState({ refreshTrigger: !getDeviceListState(getState()).refreshTrigger })))\n);\n\nexport const updateDevicesAuth = createAsyncThunk(`${sliceName}/updateDevicesAuth`, ({ deviceIds, status }, { dispatch, getState }) => {\n let devices = getDevicesById(getState());\n const deviceIdsWithoutAuth = deviceIds.reduce((accu, id) => (devices[id].auth_sets ? accu : [...accu, { id }]), []);\n return dispatch(getDevicesWithAuth(deviceIdsWithoutAuth)).then(() => {\n devices = getDevicesById(getState());\n // for each device, get id and id of authset & make api call to accept\n // if >1 authset, skip instead\n const deviceAuthUpdates = deviceIds.map(id => {\n const device = devices[id];\n if (device.auth_sets.length !== 1) {\n return Promise.reject();\n }\n // api call device.id and device.authsets[0].id\n return dispatch(updateDeviceAuth({ authId: device.auth_sets[0].id, deviceId: device.id, status }))\n .unwrap()\n .catch(err => commonErrorHandler(err, 'The action was stopped as there was a problem updating a device authorization status: ', dispatch, '', false));\n });\n return Promise.allSettled(deviceAuthUpdates).then(results => {\n const { skipped, count } = results.reduce(\n (accu, item) => {\n if (item.status === 'rejected') {\n accu.skipped = accu.skipped + 1;\n } else {\n accu.count = accu.count + 1;\n }\n return accu;\n },\n { skipped: 0, count: 0 }\n );\n const message = getSnackbarMessage(skipped, count);\n // break if an error occurs, display status up til this point before error message\n return dispatch(setSnackbar(message));\n });\n });\n});\n\nexport const deleteAuthset = createAsyncThunk(`${sliceName}/deleteAuthset`, ({ deviceId, authId }, { dispatch, getState }) =>\n GeneralApi.delete(`${deviceAuthV2}/devices/${deviceId}/auth/${authId}`)\n .then(() => Promise.all([dispatch(setSnackbar('Device authorization status was updated successfully'))]))\n .catch(err => commonErrorHandler(err, 'There was a problem updating the device authorization status:', dispatch))\n .then(() => Promise.resolve(dispatch(actions.maybeUpdateDevicesByStatus({ deviceId, authId }))))\n .finally(() => dispatch(setDeviceListState({ refreshTrigger: !getState().devices.deviceList.refreshTrigger })))\n);\n\nexport const preauthDevice = createAsyncThunk(`${sliceName}/preauthDevice`, (authset, { dispatch }) =>\n GeneralApi.post(`${deviceAuthV2}/devices`, authset)\n .catch(err => {\n if (err.response.status === 409) {\n return Promise.reject('A device with a matching identity data set already exists');\n }\n return commonErrorHandler(err, 'The device could not be added:', dispatch);\n })\n .then(() => Promise.resolve(dispatch(setSnackbar('Device was successfully added to the preauthorization list', TIMEOUTS.fiveSeconds))))\n);\n\nexport const decommissionDevice = createAsyncThunk(`${sliceName}/decommissionDevice`, ({ deviceId, authId }, { dispatch, getState }) =>\n GeneralApi.delete(`${deviceAuthV2}/devices/${deviceId}`)\n .then(() => Promise.resolve(dispatch(setSnackbar('Device was decommissioned successfully'))))\n .catch(err => commonErrorHandler(err, 'There was a problem decommissioning the device:', dispatch))\n .then(() => Promise.resolve(dispatch(actions.maybeUpdateDevicesByStatus({ deviceId, authId }))))\n // trigger reset of device list list!\n .finally(() => dispatch(setDeviceListState({ refreshTrigger: !getState().devices.deviceList.refreshTrigger })))\n);\n\nexport const getDeviceConfig = createAsyncThunk(`${sliceName}/getDeviceConfig`, (deviceId, { dispatch }) =>\n GeneralApi.get(`${deviceConfig}/${deviceId}`)\n .then(({ data }) => Promise.all([dispatch(actions.receivedDevice({ id: deviceId, config: data })), Promise.resolve(data)]))\n .catch(err => {\n // if we get a proper error response we most likely queried a device without an existing config check-in and we can just ignore the call\n if (err.response?.data?.error.status_code !== 404) {\n return commonErrorHandler(err, `There was an error retrieving the configuration for device ${deviceId}.`, dispatch, commonErrorFallback);\n }\n })\n);\n\nexport const setDeviceConfig = createAsyncThunk(`${sliceName}/setDeviceConfig`, ({ deviceId, config }, { dispatch }) =>\n GeneralApi.put(`${deviceConfig}/${deviceId}`, config)\n .catch(err => commonErrorHandler(err, `There was an error setting the configuration for device ${deviceId}.`, dispatch, commonErrorFallback))\n .then(() => Promise.resolve(dispatch(getDeviceConfig(deviceId))))\n);\n\nexport const applyDeviceConfig = createAsyncThunk(\n `${sliceName}/applyDeviceConfig`,\n ({ deviceId, configDeploymentConfiguration, isDefault, config }, { dispatch, getState }) =>\n GeneralApi.post(`${deviceConfig}/${deviceId}/deploy`, configDeploymentConfiguration)\n .catch(err => commonErrorHandler(err, `There was an error deploying the configuration to device ${deviceId}.`, dispatch, commonErrorFallback))\n .then(({ data }) => {\n const device = getDeviceByIdSelector(getState(), deviceId);\n const { canManageUsers } = getUserCapabilities(getState());\n let tasks = [\n dispatch(actions.receivedDevice({ ...device, config: { ...device.config, deployment_id: data.deployment_id } })),\n new Promise(resolve => setTimeout(() => resolve(dispatch(getSingleDeployment(data.deployment_id))), TIMEOUTS.oneSecond))\n ];\n if (isDefault && canManageUsers) {\n const { previous } = getGlobalSettings(getState()).defaultDeviceConfig ?? {};\n tasks.push(dispatch(saveGlobalSettings({ defaultDeviceConfig: { current: config, previous } })));\n }\n return Promise.all(tasks);\n })\n);\n\nexport const setDeviceTags = createAsyncThunk(`${sliceName}/setDeviceTags`, ({ deviceId, tags }, { dispatch }) =>\n // to prevent tag set failures, retrieve the device & use the freshest etag we can get\n Promise.resolve(dispatch(getDeviceById(deviceId))).then(device => {\n const headers = device.etag ? { 'If-Match': device.etag } : {};\n return GeneralApi.put(\n `${inventoryApiUrl}/devices/${deviceId}/tags`,\n Object.entries(tags).map(([name, value]) => ({ name, value })),\n { headers }\n )\n .catch(err => commonErrorHandler(err, `There was an error setting tags for device ${deviceId}.`, dispatch, 'Please check your connection.'))\n .then(() => Promise.all([dispatch(actions.receivedDevice({ ...device, id: deviceId, tags })), dispatch(setSnackbar('Device name changed'))]));\n })\n);\n\nexport const getDeviceTwin = createAsyncThunk(`${sliceName}/getDeviceTwin`, ({ deviceId, integration }, { dispatch, getState }) => {\n let providerResult = {};\n return GeneralApi.get(`${iotManagerBaseURL}/devices/${deviceId}/state`)\n .then(({ data }) => {\n providerResult = { ...data, twinError: '' };\n })\n .catch(err => {\n providerResult = {\n twinError: `There was an error getting the ${EXTERNAL_PROVIDER[integration.provider].twinTitle.toLowerCase()} for device ${deviceId}. ${err}`\n };\n })\n .finally(() => {\n const device = getDeviceByIdSelector(getState(), deviceId);\n Promise.resolve(dispatch(actions.receivedDevice({ ...device, twinsByIntegration: { ...device.twinsByIntegration, ...providerResult } })));\n });\n});\n\nexport const setDeviceTwin = createAsyncThunk(`${sliceName}/setDeviceTwin`, ({ deviceId, integration, settings }, { dispatch, getState }) =>\n GeneralApi.put(`${iotManagerBaseURL}/devices/${deviceId}/state/${integration.id}`, { desired: settings })\n .catch(err =>\n commonErrorHandler(\n err,\n `There was an error updating the ${EXTERNAL_PROVIDER[integration.provider].twinTitle.toLowerCase()} for device ${deviceId}.`,\n dispatch\n )\n )\n .then(() => {\n const device = getDeviceByIdSelector(getState(), deviceId);\n const { twinsByIntegration = {} } = device;\n const { [integration.id]: currentState = {} } = twinsByIntegration;\n return Promise.resolve(\n dispatch(actions.receivedDevice({ ...device, twinsByIntegration: { ...twinsByIntegration, [integration.id]: { ...currentState, desired: settings } } }))\n );\n })\n);\n\nconst prepareSearchArguments = ({ filters, group, state, status }) => {\n const { filterTerms } = convertDeviceListStateToFilters({ filters, group, offlineThreshold: state.app.offlineThreshold, selectedIssues: [], status });\n const { columnSelection = [] } = getUserSettings(state);\n const selectedAttributes = columnSelection.map(column => ({ attribute: column.key, scope: column.scope }));\n const attributes = [...defaultAttributes, getIdAttribute(state), ...selectedAttributes];\n return { attributes, filterTerms };\n};\n\nexport const getSystemDevices = createAsyncThunk(`${sliceName}/getSystemDevices`, (options, { dispatch, getState }) => {\n const { id, page = defaultPage, perPage = defaultPerPage, sortOptions = [] } = options;\n const state = getState();\n const { hasFullFiltering } = getTenantCapabilities(state);\n if (!hasFullFiltering) {\n return Promise.resolve();\n }\n const { attributes: deviceAttributes = {} } = getDeviceByIdSelector(state, id);\n const { mender_gateway_system_id = '' } = deviceAttributes;\n const filters = [\n { ...emptyFilter, key: 'mender_is_gateway', operator: DEVICE_FILTERING_OPTIONS.$ne.key, value: 'true', scope: 'inventory' },\n { ...emptyFilter, key: 'mender_gateway_system_id', value: mender_gateway_system_id, scope: 'inventory' }\n ];\n const { attributes, filterTerms } = prepareSearchArguments({ filters, state });\n return GeneralApi.post(getSearchEndpoint(getState()), {\n page,\n per_page: perPage,\n filters: filterTerms,\n sort: sortOptions,\n attributes\n })\n .catch(err => commonErrorHandler(err, `There was an error getting system devices device ${id}.`, dispatch, 'Please check your connection.'))\n .then(({ data, headers }) => {\n const state = getState();\n const { devicesById, ids } = reduceReceivedDevices(data, [], state);\n const device = {\n ...getDeviceByIdSelector(state, id),\n systemDeviceIds: ids,\n systemDeviceTotal: Number(headers[headerNames.total])\n };\n return Promise.resolve(dispatch(actions.receivedDevices({ ...devicesById, [id]: device })));\n });\n});\n\nexport const getGatewayDevices = createAsyncThunk(`${sliceName}/getGatewayDevices`, (deviceId, { dispatch, getState }) => {\n const state = getState();\n const { attributes = {} } = getDeviceByIdSelector(state, deviceId);\n const { mender_gateway_system_id = '' } = attributes;\n const filters = [\n { ...emptyFilter, key: 'id', operator: DEVICE_FILTERING_OPTIONS.$ne.key, value: deviceId, scope: 'identity' },\n { ...emptyFilter, key: 'mender_is_gateway', value: 'true', scope: 'inventory' },\n { ...emptyFilter, key: 'mender_gateway_system_id', value: mender_gateway_system_id, scope: 'inventory' }\n ];\n const { attributes: attributeSelection, filterTerms } = prepareSearchArguments({ filters, state });\n return GeneralApi.post(getSearchEndpoint(getState()), {\n page: 1,\n per_page: MAX_PAGE_SIZE,\n filters: filterTerms,\n attributes: attributeSelection\n }).then(({ data }) => {\n const { ids } = reduceReceivedDevices(data, [], getState());\n let tasks = ids.map(deviceId => dispatch(getDeviceInfo(deviceId)));\n tasks.push(dispatch(actions.receivedDevice({ id: deviceId, gatewayIds: ids })));\n return Promise.all(tasks);\n });\n});\n\nexport const getDevicesInBounds = createAsyncThunk(`${sliceName}/getDevicesInBounds`, ({ bounds, group }, { dispatch, getState }) => {\n const state = getState();\n const { filterTerms } = convertDeviceListStateToFilters({\n group: group === ALL_DEVICES ? undefined : group,\n groups: state.devices.groups,\n status: DEVICE_STATES.accepted\n });\n return GeneralApi.post(getSearchEndpoint(getState()), {\n page: 1,\n per_page: MAX_PAGE_SIZE,\n filters: filterTerms,\n attributes: geoAttributes,\n geo_bounding_box_filter: {\n geo_bounding_box: {\n location: {\n top_left: { lat: bounds._northEast.lat, lon: bounds._southWest.lng },\n bottom_right: { lat: bounds._southWest.lat, lon: bounds._northEast.lng }\n }\n }\n }\n }).then(({ data }) => {\n const { devicesById } = reduceReceivedDevices(data, [], getState());\n return Promise.resolve(dispatch(actions.receivedDevices(devicesById)));\n });\n});\n","// Copyright 2020 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 { DEVICE_STATES, onboardingSteps as onboardingStepNames, orderedOnboardingSteps as onboardingSteps } from '@northern.tech/store/constants';\nimport { getOnboardingState as getCurrentOnboardingState, getUserCapabilities } from '@northern.tech/store/selectors';\nimport { saveUserSettings } from '@northern.tech/store/thunks';\nimport { getDemoDeviceAddress } from '@northern.tech/utils/helpers';\nimport { createAsyncThunk } from '@reduxjs/toolkit';\nimport Cookies from 'universal-cookie';\n\nimport { actions, sliceName } from '.';\n\nconst cookies = new Cookies();\n\nexport const applyOnboardingFallbacks = progress => {\n const step = onboardingSteps[progress];\n if (step && step.fallbackStep) {\n return step.fallbackStep;\n }\n return progress;\n};\n\nconst determineProgress = (acceptedDevices, pendingDevices, releases, pastDeployments) => {\n const steps = onboardingSteps;\n let progress = -1;\n progress = pendingDevices.length > 1 ? steps.findIndex(step => step === onboardingStepNames.DEVICES_PENDING_ACCEPTING_ONBOARDING) : progress;\n progress = acceptedDevices.length >= 1 ? steps.findIndex(step => step === onboardingStepNames.DEVICES_ACCEPTED_ONBOARDING) : progress;\n progress =\n acceptedDevices.length > 1 && releases.length > 1 && pastDeployments.length > 1\n ? steps.findIndex(step => step === onboardingStepNames.DEPLOYMENTS_PAST_COMPLETED)\n : progress;\n return steps[progress];\n};\n\nconst deductOnboardingState = ({ devicesById, devicesByStatus, onboardingState, pastDeployments, releases, userCapabilities, userId }) => {\n const { canDeploy, canManageDevices, canReadDeployments, canReadDevices, canReadReleases, canUploadReleases } = userCapabilities;\n const userCookie = cookies.get(`${userId}-onboarded`);\n const acceptedDevices = devicesByStatus[DEVICE_STATES.accepted].deviceIds;\n const pendingDevices = devicesByStatus[DEVICE_STATES.pending].deviceIds;\n let deviceType = onboardingState.deviceType ?? [];\n deviceType =\n !deviceType.length && acceptedDevices.length && devicesById[acceptedDevices[0]].hasOwnProperty('attributes')\n ? devicesById[acceptedDevices[0]].attributes.device_type\n : deviceType;\n const progress = applyOnboardingFallbacks(onboardingState.progress || determineProgress(acceptedDevices, pendingDevices, releases, pastDeployments));\n return {\n ...onboardingState,\n complete: !!(\n Boolean(userCookie) ||\n onboardingState.complete ||\n (acceptedDevices.length > 1 && pendingDevices.length > 0 && releases.length > 1 && pastDeployments.length > 1) ||\n (acceptedDevices.length >= 1 && releases.length >= 2 && pastDeployments.length > 2) ||\n (acceptedDevices.length >= 1 && pendingDevices.length > 0 && releases.length >= 2 && pastDeployments.length >= 2) ||\n onboardingSteps.findIndex(step => step === progress) >= onboardingSteps.length - 1 ||\n onboardingState.disable ||\n ![canDeploy, canManageDevices, canReadDeployments, canReadDevices, canReadReleases, canUploadReleases].every(i => i)\n ),\n showTips: onboardingState.showTips != null ? onboardingState.showTips : true,\n deviceType,\n approach: onboardingState.approach || (deviceType.some(type => type.startsWith('qemu')) ? 'virtual' : 'physical'),\n progress\n };\n};\n\nexport const getOnboardingState = createAsyncThunk(`${sliceName}/getOnboardingState`, (_, { dispatch, getState }) => {\n const state = getState();\n let onboardingState = getCurrentOnboardingState(state);\n if (!onboardingState.complete) {\n const userId = state.users.currentUser;\n onboardingState = deductOnboardingState({\n devicesById: state.devices.byId,\n devicesByStatus: state.devices.byStatus,\n onboardingState,\n pastDeployments: state.deployments.byStatus.finished.deploymentIds,\n releases: Object.values(state.releases.byId),\n userCapabilities: getUserCapabilities(state),\n userId\n });\n }\n onboardingState.progress = onboardingState.progress || onboardingStepNames.DASHBOARD_ONBOARDING_START;\n const demoDeviceAddress = `http://${getDemoDeviceAddress(Object.values(state.devices.byId), onboardingState.approach)}`;\n onboardingState.address = state.onboarding.demoArtifactPort ? `${demoDeviceAddress}:${state.onboarding.demoArtifactPort}` : demoDeviceAddress;\n return Promise.all([\n dispatch(actions.setOnboardingComplete(onboardingState.complete)),\n dispatch(actions.setOnboardingState(onboardingState)),\n dispatch(saveUserSettings({ onboarding: onboardingState }))\n ]);\n});\n\nexport const setOnboardingDeviceType = createAsyncThunk(`${sliceName}/setOnboardingDeviceType`, (value, { dispatch }) =>\n Promise.all([dispatch(actions.setOnboardingDeviceType(value)), dispatch(saveUserSettings({ onboarding: { deviceType: value } }))])\n);\n\nexport const setOnboardingApproach = createAsyncThunk(`${sliceName}/setOnboardingApproach`, (value, { dispatch }) =>\n Promise.all([dispatch(actions.setOnboardingApproach(value)), dispatch(saveUserSettings({ onboarding: { approach: value } }))])\n);\n\nexport const setOnboardingComplete = createAsyncThunk(`${sliceName}/setOnboardingComplete`, (value, { dispatch }) => {\n let tasks = [Promise.resolve(dispatch(actions.setOnboardingComplete(value)))];\n if (value) {\n tasks.push(Promise.resolve(dispatch(actions.setShowOnboardingHelp(false))));\n tasks.push(Promise.resolve(dispatch(advanceOnboarding(onboardingStepNames.DEPLOYMENTS_PAST_COMPLETED))));\n }\n return Promise.all(tasks);\n});\n\nexport const setOnboardingCanceled = createAsyncThunk(`${sliceName}/setOnboardingCanceled`, (_, { dispatch }) =>\n Promise.all([\n Promise.resolve(dispatch(actions.setShowOnboardingHelp(false))),\n Promise.resolve(dispatch(actions.setShowDismissOnboardingTipsDialog(false))),\n Promise.resolve(dispatch(actions.setOnboardingComplete(true)))\n ])\n // using DEPLOYMENTS_PAST_COMPLETED to ensure we get the intended onboarding state set after\n // _advancing_ the onboarding progress\n .then(() => dispatch(advanceOnboarding(onboardingStepNames.DEPLOYMENTS_PAST_COMPLETED_FAILURE)))\n);\n\nexport const advanceOnboarding = createAsyncThunk(`${sliceName}/advanceOnboarding`, (stepId, { dispatch, getState }) => {\n const steps = onboardingSteps;\n const progress = steps.findIndex(step => step === getState().onboarding.progress);\n const stepIndex = steps.findIndex(step => step === stepId);\n // if there is no progress set yet, the onboarding state deduction hasn't happened\n // and the subsequent settings persistence would overwrite what we stored\n if (progress > stepIndex || getState().onboarding.progress === null) {\n return;\n }\n const madeProgress = steps[stepIndex + 1];\n const state = { ...getCurrentOnboardingState(getState()), progress: madeProgress };\n state.complete = stepIndex + 1 >= steps.findIndex(step => step === onboardingStepNames.DEPLOYMENTS_PAST_COMPLETED_FAILURE) ? true : state.complete;\n return Promise.all([dispatch(actions.setOnboardingProgress(madeProgress)), dispatch(saveUserSettings({ onboarding: state }))]);\n});\n","// Copyright 2020 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 storeActions from '@northern.tech/store/actions';\nimport Api from '@northern.tech/store/api/general-api';\nimport { Tenant } from '@northern.tech/store/api/types/MenderTypes';\nimport {\n DEVICE_LIST_DEFAULTS,\n SORTING_OPTIONS,\n TENANT_LIST_DEFAULT,\n TIMEOUTS,\n deviceAuthV2,\n headerNames,\n iotManagerBaseURL,\n locations\n} from '@northern.tech/store/constants';\nimport { getCurrentSession, getTenantCapabilities, getTenantsList } from '@northern.tech/store/selectors';\nimport { commonErrorFallback, commonErrorHandler } from '@northern.tech/store/store';\nimport { setFirstLoginAfterSignup } from '@northern.tech/store/thunks';\nimport { deepCompare } from '@northern.tech/utils/helpers';\nimport { createAsyncThunk } from '@reduxjs/toolkit';\nimport { jwtDecode } from 'jwt-decode';\nimport hashString from 'md5';\nimport Cookies from 'universal-cookie';\n\nimport { actions, sliceName } from '.';\nimport { SSO_TYPES, auditLogsApiUrl, ssoIdpApiUrlv1, tenantadmApiUrlv1, tenantadmApiUrlv2 } from './constants';\nimport { getAuditlogState, getOrganization } from './selectors';\n\nconst cookies = new Cookies();\n\nconst { setAnnouncement, setSnackbar } = storeActions;\nconst { page: defaultPage, perPage: defaultPerPage } = DEVICE_LIST_DEFAULTS;\n\nexport const cancelRequest = createAsyncThunk(`${sliceName}/cancelRequest`, (reason, { dispatch, getState }) => {\n const { id: tenantId } = getOrganization(getState());\n return Api.post(`${tenantadmApiUrlv2}/tenants/${tenantId}/cancel`, { reason }).then(() =>\n Promise.resolve(dispatch(setSnackbar({ message: 'Deactivation request was sent successfully', autoHideDuration: TIMEOUTS.fiveSeconds })))\n );\n});\n\nexport const getTargetLocation = key => {\n if (devLocations.includes(window.location.hostname)) {\n return '';\n }\n let subdomainSections = window.location.hostname.substring(0, window.location.hostname.indexOf(locations.us.location)).split('.');\n subdomainSections = subdomainSections.splice(0, subdomainSections.length - 1);\n if (!subdomainSections.find(section => section === key)) {\n subdomainSections = key === locations.us.key ? subdomainSections.filter(section => !locations[section]) : [...subdomainSections, key];\n return `https://${[...subdomainSections, ...locations.us.location.split('.')].join('.')}`;\n }\n return `https://${window.location.hostname}`;\n};\n\nconst devLocations = ['localhost', 'docker.mender.io'];\nexport const createOrganizationTrial = createAsyncThunk(`${sliceName}/createOrganizationTrial`, (data, { dispatch }) => {\n const { key } = locations[data.location];\n const targetLocation = getTargetLocation(key);\n const target = `${targetLocation}${tenantadmApiUrlv2}/tenants/trial`;\n return Api.postUnauthorized(target, data)\n .catch(err => {\n if (err.response.status >= 400 && err.response.status < 500) {\n dispatch(setSnackbar({ message: err.response.data.error, autoHideDuration: TIMEOUTS.fiveSeconds }));\n return Promise.reject(err);\n }\n })\n .then(({ headers }) => {\n cookies.remove('oauth');\n cookies.remove('externalID');\n cookies.remove('email');\n dispatch(setFirstLoginAfterSignup(true));\n return new Promise(resolve =>\n setTimeout(() => {\n window.location.assign(`${targetLocation}${headers.location || ''}`);\n return resolve();\n }, TIMEOUTS.fiveSeconds)\n );\n });\n});\n\nexport const startCardUpdate = createAsyncThunk(`${sliceName}/startCardUpdate`, (_, { dispatch }) =>\n Api.post(`${tenantadmApiUrlv2}/billing/card`)\n .then(({ data }) => {\n dispatch(actions.receiveSetupIntent(data.intent_id));\n return Promise.resolve(data.secret);\n })\n .catch(err => commonErrorHandler(err, `Updating the card failed:`, dispatch))\n);\n\nexport const confirmCardUpdate = createAsyncThunk(`${sliceName}/confirmCardUpdate`, (_, { dispatch, getState }) =>\n Api.post(`${tenantadmApiUrlv2}/billing/card/${getState().organization.intentId}/confirm`)\n .then(() => Promise.all([dispatch(setSnackbar('Payment card was updated successfully')), dispatch(actions.receiveSetupIntent(null))]))\n .catch(err => commonErrorHandler(err, `Updating the card failed:`, dispatch))\n);\n\nexport const getCurrentCard = createAsyncThunk(`${sliceName}/getCurrentCard`, (_, { dispatch }) =>\n Api.get(`${tenantadmApiUrlv2}/billing`).then(res => {\n const { last4, exp_month, exp_year, brand } = res.data.card || {};\n return Promise.resolve(dispatch(actions.receiveCurrentCard({ brand, last4, expiration: { month: exp_month, year: exp_year } })));\n })\n);\n\nexport const startUpgrade = createAsyncThunk(`${sliceName}/startUpgrade`, (tenantId, { dispatch }) =>\n Api.post(`${tenantadmApiUrlv2}/tenants/${tenantId}/upgrade/start`)\n .then(({ data }) => Promise.resolve(data.secret))\n .catch(err => commonErrorHandler(err, `There was an error upgrading your account:`, dispatch))\n);\n\nexport const cancelUpgrade = createAsyncThunk(`${sliceName}/cancelUpgrade`, tenantId => Api.post(`${tenantadmApiUrlv2}/tenants/${tenantId}/upgrade/cancel`));\n\nexport const completeUpgrade = createAsyncThunk(`${sliceName}/completeUpgrade`, ({ tenantId, plan }, { dispatch }) =>\n Api.post(`${tenantadmApiUrlv2}/tenants/${tenantId}/upgrade/complete`, { plan })\n .catch(err => commonErrorHandler(err, `There was an error upgrading your account:`, dispatch))\n .then(() => Promise.resolve(dispatch(getUserOrganization())))\n);\n\nconst prepareAuditlogQuery = ({ startDate, endDate, user: userFilter, type, detail: detailFilter, sort = {} }) => {\n const userId = userFilter?.id || userFilter;\n const detail = detailFilter?.id || detailFilter;\n const createdAfter = startDate ? `&created_after=${Math.round(Date.parse(startDate) / 1000)}` : '';\n const createdBefore = endDate ? `&created_before=${Math.round(Date.parse(endDate) / 1000)}` : '';\n const typeSearch = type ? `&object_type=${type.value}`.toLowerCase() : '';\n const userSearch = userId ? `&actor_id=${userId}` : '';\n const objectSearch = type && detail ? `&${type.queryParameter}=${encodeURIComponent(detail)}` : '';\n const { direction = SORTING_OPTIONS.desc } = sort;\n return `${createdAfter}${createdBefore}${userSearch}${typeSearch}${objectSearch}&sort=${direction}`;\n};\n\nexport const getAuditLogs = createAsyncThunk(`${sliceName}/getAuditLogs`, (selectionState, { dispatch, getState }) => {\n const { page, perPage } = selectionState;\n const { hasAuditlogs } = getTenantCapabilities(getState());\n if (!hasAuditlogs) {\n return Promise.resolve();\n }\n return Api.get(`${auditLogsApiUrl}/logs?page=${page}&per_page=${perPage}${prepareAuditlogQuery(selectionState)}`)\n .then(({ data, headers }) => {\n let total = headers[headerNames.total];\n total = Number(total || data.length);\n return Promise.resolve(dispatch(actions.receiveAuditLogs({ events: data, total })));\n })\n .catch(err => commonErrorHandler(err, `There was an error retrieving audit logs:`, dispatch));\n});\n\nexport const getAuditLogsCsvLink = createAsyncThunk(`${sliceName}/getAuditLogsCsvLink`, (_, { getState }) =>\n Promise.resolve(`${window.location.origin}${auditLogsApiUrl}/logs/export?limit=20000${prepareAuditlogQuery(getAuditlogState(getState()))}`)\n);\n\nexport const setAuditlogsState = createAsyncThunk(`${sliceName}/setAuditlogsState`, (selectionState, { dispatch, getState }) => {\n const currentState = getAuditlogState(getState());\n let nextState = {\n ...currentState,\n ...selectionState,\n sort: { ...currentState.sort, ...selectionState.sort }\n };\n let tasks = [];\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { isLoading: currentLoading, selectedIssue: currentIssue, ...currentRequestState } = currentState;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { isLoading: selectionLoading, selectedIssue: selectionIssue, ...selectionRequestState } = nextState;\n if (!deepCompare(currentRequestState, selectionRequestState)) {\n nextState.isLoading = true;\n tasks.push(dispatch(getAuditLogs(nextState)).finally(() => dispatch(actions.setAuditLogState({ isLoading: false }))));\n }\n tasks.push(dispatch(actions.setAuditLogState(nextState)));\n return Promise.all(tasks);\n});\n\n/*\n Tenant management + Hosted Mender\n*/\nexport const tenantDataDivergedMessage = 'The system detected there is a change in your plan or purchased add-ons. Please log out and log in again';\n\nexport const addTenant = createAsyncThunk(`${sliceName}/createTenant`, (selectionState, { dispatch }) => {\n return Api.post(`${tenantadmApiUrlv2}/tenants`, selectionState)\n .then(() => Promise.all([dispatch(getTenants()), dispatch(setSnackbar('Tenant was created successfully.'))]))\n .catch(err => commonErrorHandler(err, 'There was an error creating tenant', dispatch, commonErrorFallback));\n});\n\nconst tenantListRetrieval = async (config): Promise<[Tenant[], number]> => {\n const { page, perPage } = config;\n const params = new URLSearchParams({ page, per_page: perPage }).toString();\n const tenantList = await Api.get(`${tenantadmApiUrlv2}/tenants?${params}`);\n const totalCount = tenantList.headers[headerNames.total] || TENANT_LIST_DEFAULT.perPage;\n return [tenantList.data, Number(totalCount)];\n};\nexport const getTenants = createAsyncThunk(`${sliceName}/getTenants`, async (_, { dispatch, getState }) => {\n const currentState = getTenantsList(getState());\n const [tenants, pageCount] = await tenantListRetrieval(currentState);\n dispatch(actions.setTenantListState({ ...currentState, total: pageCount, tenants }));\n});\n\nexport const setTenantsListState = createAsyncThunk(`${sliceName}/setTenantsListState`, async (selectionState: any, { dispatch, getState }) => {\n const currentState = getTenantsList(getState());\n const nextState = {\n ...currentState,\n ...selectionState\n };\n if (!deepCompare(currentState, selectionState)) {\n const [tenants, pageCount] = await tenantListRetrieval(nextState);\n return dispatch(actions.setTenantListState({ ...nextState, tenants, total: pageCount }));\n }\n return dispatch(actions.setTenantListState({ ...nextState }));\n});\n\ninterface editTenantBody {\n name: string;\n newLimit: number;\n id: string;\n}\nexport const editTenantDeviceLimit = createAsyncThunk(`${sliceName}/editDeviceLimit`, ({ newLimit, id, name }: editTenantBody, { dispatch }) => {\n return Api.put(`${tenantadmApiUrlv2}/tenants/${id}/child`, { device_limit: newLimit, name })\n .catch(err => commonErrorHandler(err, `Device Limit cannot be changed`, dispatch))\n .then(() => {\n const tasks = [Promise.resolve(dispatch(setSnackbar('Device Limit was changed successfully')))];\n tasks.push(dispatch(getTenants()));\n tasks.push(dispatch(getUserOrganization()));\n return Promise.all(tasks);\n });\n});\nexport const removeTenant = createAsyncThunk(`${sliceName}/editDeviceLimit`, ({ id }: { id: string }, { dispatch }) => {\n return Api.post(`${tenantadmApiUrlv2}/tenants/${id}/remove/start`)\n .catch(err => commonErrorHandler(err, `There was an error removing the tenant`, dispatch))\n .then(() =>\n Promise.all([Promise.resolve(dispatch(setSnackbar('Device Limit was changed successfully'))), dispatch(getTenants()), dispatch(getUserOrganization())])\n );\n});\nexport const getUserOrganization = createAsyncThunk(`${sliceName}/getUserOrganization`, (_, { dispatch, getState }) => {\n return Api.get(`${tenantadmApiUrlv1}/user/tenant`).then(res => {\n let tasks = [dispatch(actions.setOrganization(res.data))];\n const { addons, plan, trial } = res.data;\n const { token } = getCurrentSession(getState());\n const jwt = jwtDecode(token);\n const jwtData = { addons: jwt['mender.addons'], plan: jwt['mender.plan'], trial: jwt['mender.trial'] };\n if (!deepCompare({ addons, plan, trial }, jwtData)) {\n const hash = hashString(tenantDataDivergedMessage);\n cookies.remove(`${jwt.sub}${hash}`);\n tasks.push(dispatch(setAnnouncement(tenantDataDivergedMessage)));\n }\n return Promise.all(tasks);\n });\n});\n\nexport const sendSupportMessage = createAsyncThunk(`${sliceName}/sendSupportMessage`, (content, { dispatch }) =>\n Api.post(`${tenantadmApiUrlv2}/contact/support`, content)\n .catch(err => commonErrorHandler(err, 'There was an error sending your request', dispatch, commonErrorFallback))\n .then(() => Promise.resolve(dispatch(setSnackbar({ message: 'Your request was sent successfully', autoHideDuration: TIMEOUTS.fiveSeconds }))))\n);\n\nexport const requestPlanChange = createAsyncThunk(`${sliceName}/requestPlanChange`, ({ content, tenantId }, { dispatch }) =>\n Api.post(`${tenantadmApiUrlv2}/tenants/${tenantId}/plan`, content)\n .catch(err => commonErrorHandler(err, 'There was an error sending your request', dispatch, commonErrorFallback))\n .then(() => Promise.resolve(dispatch(setSnackbar({ message: 'Your request was sent successfully', autoHideDuration: TIMEOUTS.fiveSeconds }))))\n);\n\nexport const downloadLicenseReport = createAsyncThunk(`${sliceName}/downloadLicenseReport`, (_, { dispatch }) =>\n Api.get(`${deviceAuthV2}/reports/devices`)\n .catch(err => commonErrorHandler(err, 'There was an error downloading the report', dispatch, commonErrorFallback))\n .then(res => res.data)\n);\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport const createIntegration = createAsyncThunk(`${sliceName}/createIntegration`, ({ id, ...integration }, { dispatch }) =>\n Api.post(`${iotManagerBaseURL}/integrations`, integration)\n .catch(err => commonErrorHandler(err, 'There was an error creating the integration', dispatch, commonErrorFallback))\n .then(() => Promise.all([dispatch(setSnackbar('The integration was set up successfully')), dispatch(getIntegrations())]))\n);\n\nexport const changeIntegration = createAsyncThunk(`${sliceName}/changeIntegration`, ({ id, credentials }, { dispatch }) =>\n Api.put(`${iotManagerBaseURL}/integrations/${id}/credentials`, credentials)\n .catch(err => commonErrorHandler(err, 'There was an error updating the integration', dispatch, commonErrorFallback))\n .then(() => Promise.all([dispatch(setSnackbar('The integration was updated successfully')), dispatch(getIntegrations())]))\n);\n\nexport const deleteIntegration = createAsyncThunk(`${sliceName}/deleteIntegration`, ({ id, provider }, { dispatch, getState }) =>\n Api.delete(`${iotManagerBaseURL}/integrations/${id}`, {})\n .catch(err => commonErrorHandler(err, 'There was an error removing the integration', dispatch, commonErrorFallback))\n .then(() => {\n const integrations = getState().organization.externalDeviceIntegrations.filter(item => provider !== item.provider);\n return Promise.all([\n dispatch(setSnackbar('The integration was removed successfully')),\n dispatch(actions.receiveExternalDeviceIntegrations(integrations))\n ]);\n })\n);\n\nexport const getIntegrations = createAsyncThunk(`${sliceName}/getIntegrations`, (_, { dispatch, getState }) =>\n Api.get(`${iotManagerBaseURL}/integrations`)\n .catch(err => commonErrorHandler(err, 'There was an error retrieving the integration', dispatch, commonErrorFallback))\n .then(({ data }) => {\n const existingIntegrations = getState().organization.externalDeviceIntegrations;\n const integrations = data.reduce((accu, item) => {\n const existingIntegration = existingIntegrations.find(integration => item.id === integration.id) ?? {};\n const integration = { ...existingIntegration, ...item };\n accu.push(integration);\n return accu;\n }, []);\n return Promise.resolve(dispatch(actions.receiveExternalDeviceIntegrations(integrations)));\n })\n);\n\nexport const getWebhookEvents = createAsyncThunk(`${sliceName}/getWebhookEvents`, (config = {}, { dispatch, getState }) => {\n const { isFollowUp, page = defaultPage, perPage = defaultPerPage } = config;\n return Api.get(`${iotManagerBaseURL}/events?page=${page}&per_page=${perPage}`)\n .catch(err => commonErrorHandler(err, 'There was an error retrieving activity for this integration', dispatch, commonErrorFallback))\n .then(({ data }) => {\n let tasks = [\n dispatch(\n actions.receiveWebhookEvents({\n value: isFollowUp ? getState().organization.webhooks.events : data,\n total: (page - 1) * perPage + data.length\n })\n )\n ];\n if (data.length >= perPage && !isFollowUp) {\n tasks.push(dispatch(getWebhookEvents({ isFollowUp: true, page: page + 1, perPage: 1 })));\n }\n return Promise.all(tasks);\n });\n});\n\nconst ssoConfigActions = {\n create: { success: 'stored', error: 'storing' },\n edit: { success: 'updated', error: 'updating' },\n read: { success: '', error: 'retrieving' },\n remove: { success: 'removed', error: 'removing' },\n readMultiple: { success: '', error: 'retrieving' }\n};\n\nconst ssoConfigActionErrorHandler = (err, type) => dispatch =>\n commonErrorHandler(err, `There was an error ${ssoConfigActions[type].error} the SSO configuration.`, dispatch, commonErrorFallback);\n\nconst ssoConfigActionSuccessHandler = type => dispatch => dispatch(setSnackbar(`The SSO configuration was ${ssoConfigActions[type].success} successfully`));\n\nexport const storeSsoConfig = createAsyncThunk(`${sliceName}/storeSsoConfig`, ({ config, contentType }, { dispatch }) =>\n Api.post(ssoIdpApiUrlv1, config, { headers: { 'Content-Type': contentType, Accept: 'application/json' } })\n .catch(err => dispatch(ssoConfigActionErrorHandler(err, 'create')))\n .then(() => Promise.all([dispatch(ssoConfigActionSuccessHandler('create')), dispatch(getSsoConfigs())]))\n);\n\nexport const changeSsoConfig = createAsyncThunk(`${sliceName}/changeSsoConfig`, ({ config, contentType }, { dispatch }) =>\n Api.put(`${ssoIdpApiUrlv1}/${config.id}`, config, { headers: { 'Content-Type': contentType, Accept: 'application/json' } })\n .catch(err => dispatch(ssoConfigActionErrorHandler(err, 'edit')))\n .then(() => Promise.all([dispatch(ssoConfigActionSuccessHandler('edit')), dispatch(getSsoConfigs())]))\n);\n\nexport const deleteSsoConfig = createAsyncThunk(`${sliceName}/deleteSsoConfig`, ({ id }, { dispatch, getState }) =>\n Api.delete(`${ssoIdpApiUrlv1}/${id}`)\n .catch(err => dispatch(ssoConfigActionErrorHandler(err, 'remove')))\n .then(() => {\n const configs = getState().organization.ssoConfigs.filter(item => id !== item.id);\n return Promise.all([dispatch(ssoConfigActionSuccessHandler('remove')), dispatch(actions.receiveSsoConfigs(configs))]);\n })\n);\n\nexport const getSsoConfigById = createAsyncThunk(`${sliceName}/getSsoConfigById`, (config, { dispatch }) =>\n Api.get(`${ssoIdpApiUrlv1}/${config.id}`)\n .catch(err => dispatch(ssoConfigActionErrorHandler(err, 'read')))\n .then(({ data, headers }) => {\n const sso = Object.values(SSO_TYPES).find(({ contentType }) => contentType === headers['content-type']);\n return sso ? Promise.resolve({ ...config, config: data, type: sso.id }) : Promise.reject('Unsupported SSO config content type.');\n })\n);\n\nexport const getSsoConfigs = createAsyncThunk(`${sliceName}/getSsoConfigs`, (_, { dispatch }) =>\n Api.get(ssoIdpApiUrlv1)\n .catch(err => dispatch(ssoConfigActionErrorHandler(err, 'readMultiple')))\n .then(({ data }) =>\n Promise.all(data.map(config => dispatch(getSsoConfigById(config)).unwrap()))\n .then(configs => dispatch(actions.receiveSsoConfigs(configs)))\n .catch(err => commonErrorHandler(err, err, dispatch, ''))\n )\n);\n","'use strict';\n\n// Copyright 2019 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 storeActions from '@northern.tech/store/actions';\nimport GeneralApi from '@northern.tech/store/api/general-api';\nimport UsersApi from '@northern.tech/store/api/users-api';\nimport { cleanUp, getSessionInfo, maxSessionAge, setSessionInfo } from '@northern.tech/store/auth';\nimport {\n ALL_RELEASES,\n APPLICATION_JSON_CONTENT_TYPE,\n APPLICATION_JWT_CONTENT_TYPE,\n SSO_TYPES,\n TIMEOUTS,\n apiRoot,\n emptyRole,\n emptyUiPermissions,\n tenantadmApiUrlv2\n} from '@northern.tech/store/constants';\nimport { getOnboardingState, getOrganization, getTooltipsState, getUserSettings as getUserSettingsSelector } from '@northern.tech/store/selectors';\nimport { commonErrorFallback, commonErrorHandler } from '@northern.tech/store/store';\nimport { setOfflineThreshold } from '@northern.tech/store/thunks';\nimport { extractErrorMessage, mergePermissions, preformatWithRequestID } from '@northern.tech/store/utils';\nimport { duplicateFilter, isEmpty } from '@northern.tech/utils/helpers';\nimport { clearAllRetryTimers } from '@northern.tech/utils/retrytimer';\nimport { createAsyncThunk } from '@reduxjs/toolkit';\nimport hashString from 'md5';\nimport Cookies from 'universal-cookie';\n\nimport { actions, sliceName } from '.';\nimport {\n OWN_USER_ID,\n PermissionTypes,\n READ_STATES,\n USER_LOGOUT,\n defaultPermissionSets,\n rolesById as defaultRolesById,\n itemUiPermissionsReducer,\n scopedPermissionAreas,\n settingsKeys,\n twoFAStates,\n uiPermissionsByArea,\n uiPermissionsById,\n useradmApiUrl,\n useradmApiUrlv2\n} from './constants';\nimport { getCurrentUser, getRolesById } from './selectors';\n\nconst cookies = new Cookies();\n\nconst { setAnnouncement, setSnackbar } = storeActions;\n\nconst handleLoginError =\n (err, { token2fa: has2FA, password }, rejectWithValue) =>\n dispatch => {\n const errorText = extractErrorMessage(err);\n const is2FABackend = errorText.includes('2fa');\n if (is2FABackend && !has2FA) {\n return rejectWithValue({ error: '2fa code missing' });\n }\n if (password === undefined) {\n // Enterprise supports two-steps login. On the first step you can enter only email\n // and in case of SSO set up you will receive a redirect URL\n // otherwise you will receive 401 status code and password field will be shown.\n return Promise.reject();\n }\n const twoFAError = is2FABackend ? ' and verification code' : '';\n const errorMessage = `There was a problem logging in. Please check your email${\n twoFAError ? ',' : ' and'\n } password${twoFAError}. If you still have problems, contact an administrator.`;\n // @ts-ignore\n return Promise.reject(dispatch(setSnackbar(preformatWithRequestID(err.response, errorMessage), null, 'Copy to clipboard')));\n };\n\n/*\n User management\n*/\n// @ts-ignore\nexport const loginUser = createAsyncThunk(`${sliceName}/loginUser`, ({ stayLoggedIn, ...userData }, { dispatch, rejectWithValue }) =>\n UsersApi.postLogin(`${useradmApiUrl}/auth/login`, { ...userData, no_expiry: stayLoggedIn })\n .catch(err => {\n cleanUp();\n return Promise.reject(dispatch(handleLoginError(err, userData, rejectWithValue)));\n })\n .then(({ text: response, contentType }) => {\n // If the content type is application/json then backend returned SSO configuration.\n // user should be redirected to the start sso url to finish login process.\n if (contentType.includes(APPLICATION_JSON_CONTENT_TYPE)) {\n const { id, kind } = response;\n const type = kind.split('/')[1];\n const ssoLoginUrl = SSO_TYPES[type].getStartUrl(id);\n window.location.replace(ssoLoginUrl);\n return;\n }\n\n const token = response;\n if (contentType !== APPLICATION_JWT_CONTENT_TYPE || !token) {\n return;\n }\n // save token to local storage & set maxAge if noexpiry checkbox not checked\n let now = new Date();\n now.setSeconds(now.getSeconds() + maxSessionAge);\n const expiresAt = stayLoggedIn ? undefined : now.toISOString();\n setSessionInfo({ token, expiresAt });\n cookies.remove('JWT', { path: '/' });\n // @ts-ignore\n return (\n // @ts-ignore\n Promise.resolve(dispatch(getUser(OWN_USER_ID)))\n // @ts-ignore\n .unwrap()\n .catch(e => {\n cleanUp();\n return Promise.reject(dispatch(setSnackbar(extractErrorMessage(e))));\n })\n .then(() => {\n window.sessionStorage.removeItem('pendings-redirect');\n if (window.location.pathname !== '/ui/') {\n window.location.replace('/ui/');\n }\n return Promise.resolve(dispatch(actions.successfullyLoggedIn({ expiresAt, token })));\n })\n );\n })\n);\n\nexport const logoutUser = createAsyncThunk(`${sliceName}/logoutUser`, (_, { dispatch, getState }) => {\n // @ts-ignore\n if (Object.keys(getState().app.uploadsById).length) {\n return Promise.reject();\n }\n return GeneralApi.post(`${useradmApiUrl}/auth/logout`).finally(() => {\n cleanUp();\n clearAllRetryTimers(setSnackbar);\n return Promise.resolve(dispatch({ type: USER_LOGOUT }));\n });\n});\n\nexport const switchUserOrganization = createAsyncThunk(`${sliceName}/switchUserOrganization`, (tenantId, { getState }) => {\n // @ts-ignore\n if (Object.keys(getState().app.uploadsById).length) {\n return Promise.reject();\n }\n return GeneralApi.get(`${useradmApiUrl}/users/tenants/${tenantId}/token`).then(({ data: token }) => {\n // @ts-ignore\n setSessionInfo({ ...getSessionInfo(), token });\n window.location.reload();\n });\n});\n\nexport const passwordResetStart = createAsyncThunk(`${sliceName}/passwordResetStart`, (email, { dispatch }) =>\n GeneralApi.post(`${useradmApiUrl}/auth/password-reset/start`, { email }).catch(err =>\n commonErrorHandler(err, `The password reset request cannot be processed:`, dispatch, undefined, true)\n )\n);\n// @ts-ignore\nexport const passwordResetComplete = createAsyncThunk(`${sliceName}/passwordResetComplete`, ({ secretHash, newPassword }, { dispatch }) =>\n GeneralApi.post(`${useradmApiUrl}/auth/password-reset/complete`, { secret_hash: secretHash, password: newPassword }).catch((err = {}) => {\n const { error, response = {} } = err;\n let errorMsg = '';\n if (response.status == 400) {\n errorMsg = 'the link you are using expired or the request is not valid, please try again.';\n } else {\n errorMsg = error;\n }\n dispatch(setSnackbar('The password reset request cannot be processed: ' + errorMsg));\n return Promise.reject(err);\n })\n);\n\nexport const verifyEmailStart = createAsyncThunk(`${sliceName}/verifyEmailStart`, (_, { dispatch, getState }) =>\n GeneralApi.post(`${useradmApiUrl}/auth/verify-email/start`, { email: getCurrentUser(getState()).email })\n // @ts-ignore\n .catch(err => commonErrorHandler(err, 'An error occured starting the email verification process:', dispatch))\n // @ts-ignore\n .finally(() => Promise.resolve(dispatch(getUser(OWN_USER_ID))))\n);\n\nexport const verifyEmailComplete = createAsyncThunk(`${sliceName}/verifyEmailComplete`, (secret_hash, { dispatch }) =>\n GeneralApi.post(`${useradmApiUrl}/auth/verify-email/complete`, { secret_hash })\n // @ts-ignore\n .catch(err => commonErrorHandler(err, 'An error occured completing the email verification process:', dispatch))\n // @ts-ignore\n .finally(() => Promise.resolve(dispatch(getUser(OWN_USER_ID))))\n);\n\nexport const verify2FA = createAsyncThunk(`${sliceName}/verify2FA`, (tfaData, { dispatch }) =>\n UsersApi.putVerifyTFA(`${useradmApiUrl}/2faverify`, tfaData)\n // @ts-ignore\n .then(() => Promise.resolve(dispatch(getUser(OWN_USER_ID))))\n .catch(err =>\n commonErrorHandler(err, 'An error occured validating the verification code: failed to verify token, please try again.', dispatch, undefined, true)\n )\n);\n\nexport const getUserList = createAsyncThunk(`${sliceName}/getUserList`, (_, { dispatch }) =>\n GeneralApi.get(`${useradmApiUrl}/users`)\n .then(res => {\n const users = res.data.reduce((accu, item) => {\n accu[item.id] = item;\n return accu;\n }, {});\n return dispatch(actions.receivedUserList(users));\n })\n .catch(err => commonErrorHandler(err, `Users couldn't be loaded.`, dispatch, commonErrorFallback))\n);\n\nexport const getUser = createAsyncThunk(`${sliceName}/getUser`, (id, { dispatch, rejectWithValue }) =>\n GeneralApi.get(`${useradmApiUrl}/users/${id}`)\n .then(({ data: user }) =>\n Promise.all([\n dispatch(actions.receivedUser(user)),\n // @ts-ignore\n dispatch(setHideAnnouncement({ shouldHide: false, userId: user.id })),\n // @ts-ignore\n dispatch(updateUserColumnSettings({ currentUserId: user.id })),\n user\n ])\n )\n .catch(e => rejectWithValue(e))\n);\n// @ts-ignore\nexport const initializeSelf = createAsyncThunk(`${sliceName}/initializeSelf`, (_, { dispatch }) => dispatch(getUser(OWN_USER_ID)));\n// @ts-ignore\nexport const updateUserColumnSettings = createAsyncThunk(`${sliceName}/updateUserColumnSettings`, ({ columns, currentUserId }, { dispatch, getState }) => {\n const userId = currentUserId ?? getCurrentUser(getState()).id;\n const storageKey = `${userId}-column-widths`;\n let customColumns = [];\n if (!columns) {\n try {\n // @ts-ignore\n customColumns = JSON.parse(window.localStorage.getItem(storageKey)) || customColumns;\n } catch {\n // most likely the column info doesn't exist yet or is lost - continue\n }\n } else {\n customColumns = columns;\n }\n window.localStorage.setItem(storageKey, JSON.stringify(customColumns));\n return Promise.resolve(dispatch(actions.setCustomColumns(customColumns)));\n});\n\nconst userActions = {\n add: {\n successMessage: 'The user was added successfully.',\n errorMessage: 'adding'\n },\n create: {\n successMessage: 'The user was created successfully.',\n errorMessage: 'creating'\n },\n edit: {\n successMessage: 'The user has been updated.',\n errorMessage: 'editing'\n },\n remove: {\n successMessage: 'The user was removed from the system.',\n errorMessage: 'removing'\n }\n};\n// @ts-ignore\nconst userActionErrorHandler = (err, type, dispatch) => commonErrorHandler(err, `There was an error ${userActions[type].errorMessage} the user.`, dispatch);\n// @ts-ignore\nexport const createUser = createAsyncThunk(`${sliceName}/createUser`, ({ shouldResetPassword, ...userData }, { dispatch }) =>\n GeneralApi.post(`${useradmApiUrl}/users`, { ...userData, send_reset_password: shouldResetPassword })\n .then(() => Promise.all([dispatch(actions.createdUser(userData)), dispatch(getUserList()), dispatch(setSnackbar(userActions.create.successMessage))]))\n .catch(err => userActionErrorHandler(err, 'create', dispatch))\n);\n\nexport const removeUser = createAsyncThunk(`${sliceName}/removeUser`, (userId, { dispatch }) =>\n // @ts-ignore\n GeneralApi.delete(`${useradmApiUrl}/users/${userId}`)\n .then(() => Promise.all([dispatch(actions.removedUser(userId)), dispatch(getUserList()), dispatch(setSnackbar(userActions.remove.successMessage))]))\n .catch(err => userActionErrorHandler(err, 'remove', dispatch))\n);\n// @ts-ignore\nexport const editUser = createAsyncThunk(`${sliceName}/editUser`, ({ id, ...userData }, { dispatch, getState }) =>\n GeneralApi.put(`${useradmApiUrl}/users/${id}`, userData).then(() =>\n Promise.all([\n dispatch(actions.updatedUser({ ...userData, id: id === OWN_USER_ID ? getCurrentUser(getState()).id : id })),\n dispatch(setSnackbar(userActions.edit.successMessage))\n ])\n )\n);\n\nexport const addUserToCurrentTenant = createAsyncThunk(`${sliceName}/addUserToTenant`, (userId, { dispatch, getState }) => {\n const { id } = getOrganization(getState());\n return (\n GeneralApi.post(`${useradmApiUrl}/users/${userId}/assign`, { tenant_ids: [id] })\n // @ts-ignore\n .catch(err => commonErrorHandler(err, `There was an error adding the user to your organization:`, dispatch))\n .then(() => Promise.all([dispatch(setSnackbar(userActions.add.successMessage)), dispatch(getUserList())]))\n );\n});\n// @ts-ignore\nexport const enableUser2fa = createAsyncThunk(`${sliceName}/enableUser2fa`, (userId = OWN_USER_ID, { dispatch }) =>\n GeneralApi.post(`${useradmApiUrl}/users/${userId}/2fa/enable`)\n // @ts-ignore\n .catch(err => commonErrorHandler(err, `There was an error enabling Two Factor authentication for the user.`, dispatch))\n // @ts-ignore\n .then(() => Promise.resolve(dispatch(getUser(userId))))\n);\n// @ts-ignore\nexport const disableUser2fa = createAsyncThunk(`${sliceName}/disableUser2fa`, (userId = OWN_USER_ID, { dispatch }) =>\n GeneralApi.post(`${useradmApiUrl}/users/${userId}/2fa/disable`)\n // @ts-ignore\n .catch(err => commonErrorHandler(err, `There was an error disabling Two Factor authentication for the user.`, dispatch))\n // @ts-ignore\n .then(() => Promise.resolve(dispatch(getUser(userId))))\n);\n\n/* RBAC related things follow: */\nconst mapHttpPermission = permission =>\n Object.entries(uiPermissionsByArea).reduce(\n (accu, [area, definition]) => {\n const endpointMatches = definition.endpoints.filter(\n endpoint => endpoint.path.test(permission.value) && (endpoint.types.includes(permission.type) || permission.type === PermissionTypes.Any)\n );\n if (permission.value === PermissionTypes.Any || (permission.value.includes(apiRoot) && endpointMatches.length)) {\n // @ts-ignore\n const endpointUiPermission = endpointMatches.reduce((endpointAccu, endpoint) => [...endpointAccu, ...endpoint.uiPermissions], []);\n const collector = (endpointUiPermission || definition.uiPermissions)\n // @ts-ignore\n .reduce((permissionsAccu, uiPermission) => {\n if (permission.type === PermissionTypes.Any || (!endpointMatches.length && uiPermission.verbs.some(verb => verb === permission.type))) {\n permissionsAccu.push(uiPermission.value);\n }\n return permissionsAccu;\n }, [])\n .filter(duplicateFilter);\n if (Array.isArray(accu[area])) {\n accu[area] = [...accu[area], ...collector].filter(duplicateFilter);\n } else {\n accu[area] = mergePermissions(accu[area], { [scopedPermissionAreas[area].excessiveAccessSelector]: collector });\n }\n }\n return accu;\n },\n { ...emptyUiPermissions }\n );\n\nconst permissionActionTypes = {\n any: mapHttpPermission,\n CREATE_DEPLOYMENT: permission =>\n permission.type === PermissionTypes.DeviceGroup\n ? {\n deployments: [uiPermissionsById.deploy.value],\n groups: { [permission.value]: [uiPermissionsById.deploy.value] }\n }\n : {},\n http: mapHttpPermission,\n REMOTE_TERMINAL: permission =>\n permission.type === PermissionTypes.DeviceGroup\n ? {\n groups: { [permission.value]: [uiPermissionsById.connect.value] }\n }\n : {},\n VIEW_DEVICE: permission =>\n permission.type === PermissionTypes.DeviceGroup\n ? {\n groups: { [permission.value]: [uiPermissionsById.read.value] }\n }\n : {}\n};\n\nconst combinePermissions = (existingPermissions, additionalPermissions = {}) =>\n Object.entries(additionalPermissions).reduce((accu, [name, permissions]) => {\n let maybeExistingPermissions = accu[name] || [];\n // @ts-ignore\n accu[name] = [...permissions, ...maybeExistingPermissions].filter(duplicateFilter);\n return accu;\n }, existingPermissions);\n\nconst tryParseCustomPermission = permission => {\n const uiPermissions = permissionActionTypes[permission.action](permission.object);\n const result = mergePermissions({ ...emptyUiPermissions }, uiPermissions);\n return { isCustom: true, permission, result };\n};\n\nconst customPermissionHandler = (accu, permission) => {\n let processor = tryParseCustomPermission(permission);\n return {\n ...accu,\n isCustom: accu.isCustom || processor.isCustom,\n uiPermissions: mergePermissions(accu.uiPermissions, processor.result)\n };\n};\n\nconst mapPermissionSet = (permissionSetName, names, scope, existingGroupsPermissions = {}) => {\n // @ts-ignore\n const permission = Object.values(uiPermissionsById).find(permission => permission.permissionSets[scope] === permissionSetName).value;\n const scopedPermissions = names.reduce((accu, name) => combinePermissions(accu, { [name]: [permission] }), existingGroupsPermissions);\n return Object.entries(scopedPermissions).reduce((accu, [key, permissions]) => ({ ...accu, [key]: deriveImpliedAreaPermissions(scope, permissions) }), {});\n};\n\nconst isEmptyPermissionSet = permissionSet =>\n !Object.values(permissionSet).reduce((accu, permissions) => {\n if (Array.isArray(permissions)) {\n return accu || !!permissions.length;\n }\n return accu || !isEmpty(permissions);\n }, false);\n\nconst parseRolePermissions = ({ permission_sets_with_scope = [], permissions = [] }, permissionSets) => {\n const preliminaryResult = permission_sets_with_scope.reduce(\n (accu, permissionSet) => {\n // @ts-ignore\n let processor = permissionSets[permissionSet.name];\n if (!processor) {\n return accu;\n }\n // @ts-ignore\n const scope = Object.keys(scopedPermissionAreas).find(scope => uiPermissionsByArea[scope].scope === permissionSet.scope?.type);\n if (scope) {\n // @ts-ignore\n const result = mapPermissionSet(permissionSet.name, permissionSet.scope.value, scope, accu.uiPermissions[scope]);\n return { ...accu, uiPermissions: { ...accu.uiPermissions, [scope]: result } };\n } else if (isEmptyPermissionSet(processor.result)) {\n return processor.permissions.reduce(customPermissionHandler, accu);\n }\n return {\n ...accu,\n isCustom: accu.isCustom || processor.isCustom,\n uiPermissions: mergePermissions(accu.uiPermissions, processor.result)\n };\n },\n { isCustom: false, uiPermissions: { ...emptyUiPermissions, groups: {}, releases: {} } }\n );\n return permissions.reduce(customPermissionHandler, preliminaryResult);\n};\n\nexport const normalizeRbacRoles = (roles, rolesById, permissionSets) =>\n roles.reduce(\n (accu, role) => {\n let normalizedPermissions;\n let isCustom = false;\n if (rolesById[role.name]) {\n normalizedPermissions = {\n ...rolesById[role.name].uiPermissions,\n groups: { ...rolesById[role.name].uiPermissions.groups },\n releases: { ...rolesById[role.name].uiPermissions.releases }\n };\n } else {\n const result = parseRolePermissions(role, permissionSets);\n normalizedPermissions = result.uiPermissions;\n isCustom = result.isCustom;\n }\n\n const roleState = accu[role.name] ?? { ...emptyRole };\n accu[role.name] = {\n ...roleState,\n ...role,\n description: roleState.description ? roleState.description : role.description,\n editable: !defaultRolesById[role.name] && !isCustom && (typeof roleState.editable !== 'undefined' ? roleState.editable : true),\n isCustom,\n name: roleState.name ? roleState.name : role.name,\n uiPermissions: normalizedPermissions\n };\n return accu;\n },\n { ...rolesById }\n );\n\nexport const getPermissionSets = createAsyncThunk(`${sliceName}/getPermissionSets`, (_, { dispatch, getState }) =>\n GeneralApi.get(`${useradmApiUrlv2}/permission_sets?per_page=500`)\n .then(({ data }) => {\n const permissionSets = data.reduce(\n (accu, permissionSet) => {\n const permissionSetState = accu[permissionSet.name] ?? {};\n let permissionSetObject = { ...permissionSetState, ...permissionSet };\n permissionSetObject.result = Object.values(uiPermissionsById).reduce(\n (accu, item) =>\n Object.entries(item.permissionSets).reduce((collector, [area, permissionSet]) => {\n if (scopedPermissionAreas[area]) {\n return collector;\n }\n if (permissionSet === permissionSetObject.name) {\n collector[area] = [...collector[area], item.value].filter(duplicateFilter);\n }\n return collector;\n }, accu),\n { ...emptyUiPermissions, ...(permissionSetObject.result ?? {}) }\n );\n const scopes = Object.values(scopedPermissionAreas).reduce((accu, { key, scopeType }) => {\n if (permissionSetObject.supported_scope_types?.includes(key) || permissionSetObject.supported_scope_types?.includes(scopeType)) {\n // @ts-ignore\n accu.push(key);\n }\n return accu;\n }, []);\n permissionSetObject = scopes.reduce((accu, scope) => {\n // @ts-ignore\n accu.result[scope] = mapPermissionSet(permissionSetObject.name, [scopedPermissionAreas[scope].excessiveAccessSelector], scope);\n return accu;\n }, permissionSetObject);\n accu[permissionSet.name] = permissionSetObject;\n return accu;\n },\n // @ts-ignore\n { ...getState().users.permissionSetsById }\n );\n return Promise.all([dispatch(actions.receivedPermissionSets(permissionSets)), permissionSets]);\n })\n .catch(() => console.log('Permission set retrieval failed - likely accessing a non-RBAC backend'))\n);\n\nexport const getRoles = createAsyncThunk(`${sliceName}/getRoles`, (_, { dispatch, getState }) =>\n Promise.all([GeneralApi.get(`${useradmApiUrlv2}/roles?per_page=500`), dispatch(getPermissionSets())])\n // @ts-ignore\n .then(results => {\n if (!results) {\n return Promise.resolve();\n }\n const [{ data: roles }, { payload: permissionSetTasks }] = results;\n // @ts-ignore\n const rolesById = normalizeRbacRoles(roles, getRolesById(getState()), permissionSetTasks[permissionSetTasks.length - 1]);\n return Promise.resolve(dispatch(actions.receivedRoles(rolesById)));\n })\n .catch(() => console.log('Role retrieval failed - likely accessing a non-RBAC backend'))\n);\n\nconst deriveImpliedAreaPermissions = (area, areaPermissions, skipPermissions = []) => {\n const highestAreaPermissionLevelSelected = areaPermissions.reduce(\n (highest, current) => (uiPermissionsById[current].permissionLevel > highest ? uiPermissionsById[current].permissionLevel : highest),\n 1\n );\n return uiPermissionsByArea[area].uiPermissions.reduce((permissions, current) => {\n // @ts-ignore\n if ((current.permissionLevel < highestAreaPermissionLevelSelected || areaPermissions.includes(current.value)) && !skipPermissions.includes(current.value)) {\n permissions.push(current.value);\n }\n return permissions;\n }, []);\n};\n\n/**\n * transforms [{ group: \"groupName\", uiPermissions: [\"read\", \"manage\", \"connect\"] }, ...] to\n * [{ name: \"ReadDevices\", scope: { type: \"DeviceGroups\", value: [\"groupName\", ...] } }, ...]\n */\nconst transformAreaRoleDataToScopedPermissionsSets = (area, areaPermissions, excessiveAccessSelector) => {\n const permissionSetObject = areaPermissions.reduce((accu, { item, uiPermissions }) => {\n // if permission area is release and item is release tag (not all releases) then exclude upload permission as it cannot be applied to tags\n const skipPermissions = scopedPermissionAreas.releases.key === area && item !== ALL_RELEASES ? [uiPermissionsById.upload.value] : [];\n // @ts-ignore\n const impliedPermissions = deriveImpliedAreaPermissions(area, uiPermissions, skipPermissions);\n accu = impliedPermissions.reduce((itemPermissionAccu, impliedPermission) => {\n const permissionSetState = itemPermissionAccu[uiPermissionsById[impliedPermission].permissionSets[area]] ?? {\n type: uiPermissionsByArea[area].scope,\n value: []\n };\n itemPermissionAccu[uiPermissionsById[impliedPermission].permissionSets[area]] = {\n ...permissionSetState,\n value: [...permissionSetState.value, item]\n };\n return itemPermissionAccu;\n }, accu);\n return accu;\n }, {});\n // @ts-ignore\n return Object.entries(permissionSetObject).map(([name, { value, ...scope }]) => {\n if (value.includes(excessiveAccessSelector)) {\n return { name };\n }\n return { name, scope: { ...scope, value: value.filter(duplicateFilter) } };\n });\n};\n\nconst transformRoleDataToRole = (roleData, roleState = {}) => {\n const role = { ...roleState, ...roleData };\n const { description = '', name, uiPermissions = emptyUiPermissions } = role;\n const { maybeUiPermissions, remainderKeys } = Object.entries(emptyUiPermissions).reduce(\n (accu, [key, emptyPermissions]) => {\n if (!scopedPermissionAreas[key]) {\n // @ts-ignore\n accu.remainderKeys.push(key);\n } else if (uiPermissions[key]) {\n accu.maybeUiPermissions[key] = uiPermissions[key].reduce(itemUiPermissionsReducer, emptyPermissions);\n }\n return accu;\n },\n { maybeUiPermissions: {}, remainderKeys: [] }\n );\n const { permissionSetsWithScope, roleUiPermissions } = remainderKeys.reduce(\n (accu, area) => {\n const areaPermissions = role.uiPermissions[area];\n if (!Array.isArray(areaPermissions)) {\n return accu;\n }\n const impliedPermissions = deriveImpliedAreaPermissions(area, areaPermissions);\n // @ts-ignore\n accu.roleUiPermissions[area] = impliedPermissions;\n const mappedPermissions = impliedPermissions.map(uiPermission => ({ name: uiPermissionsById[uiPermission].permissionSets[area] }));\n accu.permissionSetsWithScope.push(...mappedPermissions);\n return accu;\n },\n { permissionSetsWithScope: [{ name: defaultPermissionSets.Basic.name }], roleUiPermissions: {} }\n );\n const scopedPermissionSets = Object.values(scopedPermissionAreas).reduce((accu, { key, excessiveAccessSelector }) => {\n if (!uiPermissions[key]) {\n return accu;\n }\n // @ts-ignore\n accu.push(...transformAreaRoleDataToScopedPermissionsSets(key, uiPermissions[key], excessiveAccessSelector));\n return accu;\n }, []);\n return {\n permissionSetsWithScope: [...permissionSetsWithScope, ...scopedPermissionSets],\n role: {\n ...emptyRole,\n name,\n // @ts-ignore\n description: description ? description : roleState.description,\n uiPermissions: {\n ...emptyUiPermissions,\n ...roleUiPermissions,\n ...maybeUiPermissions\n }\n }\n };\n};\n\nconst roleActions = {\n create: {\n successMessage: 'The role was created successfully.',\n errorMessage: 'creating'\n },\n edit: {\n successMessage: 'The role has been updated.',\n errorMessage: 'editing'\n },\n remove: {\n successMessage: 'The role was deleted successfully.',\n errorMessage: 'removing'\n }\n};\n// @ts-ignore\nconst roleActionErrorHandler = (err, type, dispatch) => commonErrorHandler(err, `There was an error ${roleActions[type].errorMessage} the role.`, dispatch);\n\nexport const createRole = createAsyncThunk(`${sliceName}/createRole`, (roleData, { dispatch }) => {\n const { permissionSetsWithScope, role } = transformRoleDataToRole(roleData);\n return GeneralApi.post(`${useradmApiUrlv2}/roles`, {\n name: role.name,\n description: role.description,\n permission_sets_with_scope: permissionSetsWithScope\n })\n .then(() => Promise.all([dispatch(actions.createdRole(role)), dispatch(getRoles()), dispatch(setSnackbar(roleActions.create.successMessage))]))\n .catch(err => roleActionErrorHandler(err, 'create', dispatch));\n});\n\nexport const editRole = createAsyncThunk(`${sliceName}/editRole`, (roleData, { dispatch, getState }) => {\n // @ts-ignore\n const { permissionSetsWithScope, role } = transformRoleDataToRole(roleData, getRolesById(getState())[roleData.name]);\n return GeneralApi.put(`${useradmApiUrlv2}/roles/${role.name}`, {\n description: role.description,\n name: role.name,\n permission_sets_with_scope: permissionSetsWithScope\n })\n .then(() => Promise.all([dispatch(actions.createdRole(role)), dispatch(getRoles()), dispatch(setSnackbar(roleActions.edit.successMessage))]))\n .catch(err => roleActionErrorHandler(err, 'edit', dispatch));\n});\n\nexport const removeRole = createAsyncThunk(`${sliceName}/removeRole`, (roleId, { dispatch }) =>\n // @ts-ignore\n GeneralApi.delete(`${useradmApiUrlv2}/roles/${roleId}`)\n .then(() => Promise.all([dispatch(actions.removedRole(roleId)), dispatch(getRoles()), dispatch(setSnackbar(roleActions.remove.successMessage))]))\n .catch(err => roleActionErrorHandler(err, 'remove', dispatch))\n);\n\n/*\n Global settings\n*/\nexport const getGlobalSettings = createAsyncThunk(`${sliceName}/getGlobalSettings`, (_, { dispatch }) =>\n GeneralApi.get(`${useradmApiUrl}/settings`).then(({ data: settings, headers: { etag } }) => {\n // @ts-ignore\n window.sessionStorage.setItem(settingsKeys.initialized, true);\n return Promise.all([dispatch(actions.setGlobalSettings(settings)), dispatch(setOfflineThreshold()), etag]);\n })\n);\n\nexport const saveGlobalSettings = createAsyncThunk(\n `${sliceName}/saveGlobalSettings`,\n // @ts-ignore\n ({ beOptimistic = false, notify = false, ...settings }, { dispatch, getState }) => {\n if (!window.sessionStorage.getItem(settingsKeys.initialized) && !beOptimistic) {\n return;\n }\n return dispatch(getGlobalSettings())\n .unwrap()\n .then(result => {\n // @ts-ignore\n let updatedSettings = { ...getState().users.globalSettings, ...settings };\n if (getCurrentUser(getState()).verified) {\n updatedSettings['2fa'] = twoFAStates.enabled;\n } else {\n delete updatedSettings['2fa'];\n }\n let tasks = [dispatch(actions.setGlobalSettings(updatedSettings))];\n const headers = result[result.length - 1] ? { 'If-Match': result[result.length - 1] } : {};\n return GeneralApi.post(`${useradmApiUrl}/settings`, updatedSettings, { headers })\n .then(() => {\n if (notify) {\n // @ts-ignore\n tasks.push(dispatch(setSnackbar('Settings saved successfully')));\n }\n return Promise.all(tasks);\n })\n .catch(err => {\n if (beOptimistic) {\n return Promise.all([tasks]);\n }\n console.log(err);\n // @ts-ignore\n return commonErrorHandler(err, `The settings couldn't be saved.`, dispatch);\n });\n });\n }\n);\n\nexport const getUserSettings = createAsyncThunk(`${sliceName}/getUserSettings`, (_, { dispatch }) =>\n GeneralApi.get(`${useradmApiUrl}/settings/me`).then(({ data: settings, headers: { etag } }) => {\n // @ts-ignore\n window.sessionStorage.setItem(settingsKeys.initialized, true);\n return Promise.all([dispatch(actions.setUserSettings(settings)), etag]);\n })\n);\n// @ts-ignore\nexport const saveUserSettings = createAsyncThunk(`${sliceName}/saveUserSettings`, (settings = { onboarding: {} }, { dispatch, getState }) => {\n if (!getCurrentUser(getState()).id) {\n return Promise.resolve();\n }\n return dispatch(getUserSettings())\n .unwrap()\n .then(result => {\n const userSettings = getUserSettingsSelector(getState());\n const onboardingState = getOnboardingState(getState());\n const tooltipState = getTooltipsState(getState());\n const updatedSettings = {\n ...userSettings,\n // @ts-ignore\n ...settings,\n onboarding: {\n ...onboardingState,\n // @ts-ignore\n ...settings.onboarding\n },\n tooltips: tooltipState\n };\n const headers = result[result.length - 1] ? { 'If-Match': result[result.length - 1] } : {};\n return Promise.all([\n Promise.resolve(dispatch(actions.setUserSettings(updatedSettings))),\n GeneralApi.post(`${useradmApiUrl}/settings/me`, updatedSettings, { headers })\n ]).catch(() => dispatch(actions.setUserSettings(userSettings)));\n });\n});\n\nexport const get2FAQRCode = createAsyncThunk(`${sliceName}/get2FAQRCode`, (_, { dispatch }) =>\n GeneralApi.get(`${useradmApiUrl}/2faqr`).then(res => dispatch(actions.receivedQrCode(res.data.qr)))\n);\n// @ts-ignore\nexport const setHideAnnouncement = createAsyncThunk(`${sliceName}/setHideAnnouncement`, ({ shouldHide, userId }, { dispatch, getState }) => {\n const currentUserId = userId || getCurrentUser(getState()).id;\n // @ts-ignore\n const hash = getState().app.hostedAnnouncement ? hashString(getState().app.hostedAnnouncement) : '';\n const announceCookie = cookies.get(`${currentUserId}${hash}`);\n if (shouldHide || (hash.length && typeof announceCookie !== 'undefined')) {\n cookies.set(`${currentUserId}${hash}`, true, { maxAge: 604800 });\n // @ts-ignore\n return Promise.resolve(dispatch(setAnnouncement()));\n }\n return Promise.resolve();\n});\n\nexport const getTokens = createAsyncThunk(`${sliceName}/getTokens`, (_, { dispatch, getState }) =>\n GeneralApi.get(`${useradmApiUrl}/settings/tokens`).then(({ data: tokens }) => {\n const user = getCurrentUser(getState());\n const updatedUser = {\n ...user,\n tokens\n };\n return Promise.resolve(dispatch(actions.updatedUser(updatedUser)));\n })\n);\n\nconst ONE_YEAR = 31536000;\n// @ts-ignore\nexport const generateToken = createAsyncThunk(`${sliceName}/generateToken`, ({ expiresIn = ONE_YEAR, name }, { dispatch }) =>\n GeneralApi.post(`${useradmApiUrl}/settings/tokens`, { name, expires_in: expiresIn })\n .then(({ data: token }) => Promise.all([dispatch(getTokens()), token]))\n // @ts-ignore\n .catch(err => commonErrorHandler(err, 'There was an error creating the token:', dispatch))\n);\n\nexport const revokeToken = createAsyncThunk(`${sliceName}/revokeToken`, (token, { dispatch }) =>\n // @ts-ignore\n GeneralApi.delete(`${useradmApiUrl}/settings/tokens/${token.id}`).then(() => Promise.resolve(dispatch(getTokens())))\n);\n// @ts-ignore\nexport const setTooltipReadState = createAsyncThunk(`${sliceName}/setTooltipReadState`, ({ persist, ...remainder }, { dispatch }) => {\n let tasks = [dispatch(actions.setTooltipState(remainder))];\n if (persist) {\n // @ts-ignore\n tasks.push(dispatch(saveUserSettings()));\n }\n return Promise.all(tasks);\n});\n// @ts-ignore\nexport const setAllTooltipsReadState = createAsyncThunk(`${sliceName}/toggleHelptips`, ({ readState = READ_STATES.read, tooltips }, { dispatch }) => {\n const updatedTips = tooltips.reduce((accu, id) => ({ ...accu, [id]: { readState } }), {});\n return Promise.resolve(dispatch(actions.setTooltipsState(updatedTips))).then(() => dispatch(saveUserSettings()));\n});\n\ninterface SubmitFeedbackPayload {\n satisfaction: string;\n feedback: string;\n meta?: Record<string, unknown>;\n}\n\nexport const submitFeedback = createAsyncThunk<SubmitFeedbackPayload, SubmitFeedbackPayload>(\n `${sliceName}/submitFeedback`,\n // @ts-ignore\n ({ satisfaction, feedback, ...meta }, { dispatch }) => {\n return GeneralApi.post(`${tenantadmApiUrlv2}/contact/support`, {\n subject: 'feedback submission',\n body: JSON.stringify({ feedback, satisfaction, meta })\n }).then(() => {\n const today = new Date();\n // @ts-ignore\n dispatch(saveUserSettings({ feedbackCollectedAt: today.toISOString().split('T')[0] }));\n setTimeout(() => dispatch(actions.setShowFeedbackDialog(false)), TIMEOUTS.threeSeconds);\n });\n }\n);\n","// Copyright 2019 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 GeneralApi from '@northern.tech/store/api/general-api';\nimport { getOfflineThresholdSettings } from '@northern.tech/store/selectors';\nimport { searchDevices } from '@northern.tech/store/thunks';\nimport { extractErrorMessage, getComparisonCompatibleVersion } from '@northern.tech/store/utils';\nimport { deepCompare } from '@northern.tech/utils/helpers';\nimport { createAsyncThunk } from '@reduxjs/toolkit';\nimport Cookies from 'universal-cookie';\n\nimport { actions, sliceName } from '.';\nimport { getFeatures, getSearchState } from './selectors';\n\nconst cookies = new Cookies();\n\n/*\n General\n*/\nexport const setFirstLoginAfterSignup = createAsyncThunk(`${sliceName}/setFirstLoginAfterSignup`, (firstLoginAfterSignup, { dispatch }) => {\n cookies.set('firstLoginAfterSignup', !!firstLoginAfterSignup, { maxAge: 60, path: '/', domain: '.mender.io', sameSite: false });\n dispatch(actions.setFirstLoginAfterSignup(!!firstLoginAfterSignup));\n});\n\nconst dateFunctionMap = {\n getDays: 'getDate',\n setDays: 'setDate'\n};\nexport const setOfflineThreshold = createAsyncThunk(`${sliceName}/setOfflineThreshold`, (_, { dispatch, getState }) => {\n const { interval, intervalUnit } = getOfflineThresholdSettings(getState());\n const today = new Date();\n const intervalName = `${intervalUnit.charAt(0).toUpperCase()}${intervalUnit.substring(1)}`;\n const setter = dateFunctionMap[`set${intervalName}`] ?? `set${intervalName}`;\n const getter = dateFunctionMap[`get${intervalName}`] ?? `get${intervalName}`;\n today[setter](today[getter]() - interval);\n let value;\n try {\n value = today.toISOString();\n } catch {\n return Promise.resolve(dispatch(actions.setSnackbar('There was an error saving the offline threshold, please check your settings.')));\n }\n return Promise.resolve(dispatch(actions.setOfflineThreshold(value)));\n});\n\nconst versionRegex = new RegExp(/\\d+\\.\\d+/);\nconst getLatestRelease = thing => {\n const latestKey = Object.keys(thing)\n .filter(key => versionRegex.test(key))\n .sort()\n .reverse()[0];\n return thing[latestKey];\n};\n\nconst repoKeyMap = {\n integration: 'Integration',\n mender: 'Mender-Client',\n 'mender-artifact': 'Mender-Artifact'\n};\n\nconst deductSaasState = (latestRelease, guiTags, saasReleases) => {\n const latestGuiTag = guiTags.length ? guiTags[0].name : '';\n const latestSaasRelease = latestGuiTag.startsWith('saas-v') ? { date: latestGuiTag.split('-v')[1].replaceAll('.', '-'), tag: latestGuiTag } : saasReleases[0];\n return latestSaasRelease.date > latestRelease.release_date ? latestSaasRelease.tag : latestRelease.release;\n};\n\nexport const getLatestReleaseInfo = createAsyncThunk(`${sliceName}/getLatestReleaseInfo`, (_, { dispatch, getState }) => {\n if (!getFeatures(getState()).isHosted) {\n return Promise.resolve();\n }\n return Promise.all([GeneralApi.get('/versions.json'), GeneralApi.get('/tags.json')])\n .catch(err => {\n console.log('init error:', extractErrorMessage(err));\n return Promise.resolve([{ data: {} }, { data: [] }]);\n })\n .then(([{ data }, { data: guiTags }]) => {\n if (!guiTags.length) {\n return Promise.resolve();\n }\n const { releases, saas } = data;\n const latestRelease = getLatestRelease(getLatestRelease(releases));\n const { latestRepos, latestVersions } = latestRelease.repos.reduce(\n (accu, item) => {\n if (repoKeyMap[item.name]) {\n accu.latestVersions[repoKeyMap[item.name]] = getComparisonCompatibleVersion(item.version);\n }\n accu.latestRepos[item.name] = getComparisonCompatibleVersion(item.version);\n return accu;\n },\n { latestVersions: { ...getState().app.versionInformation }, latestRepos: {} }\n );\n const info = deductSaasState(latestRelease, guiTags, saas);\n return Promise.resolve(\n dispatch(\n actions.setVersionInformation({\n ...latestVersions,\n backend: info,\n GUI: info,\n latestRelease: {\n releaseDate: latestRelease.release_date,\n repos: latestRepos\n }\n })\n )\n );\n });\n});\n\nexport const setSearchState = createAsyncThunk(`${sliceName}/setSearchState`, (searchState, { dispatch, getState }) => {\n const currentState = getSearchState(getState());\n let nextState = {\n ...currentState,\n ...searchState,\n sort: {\n ...currentState.sort,\n ...searchState.sort\n }\n };\n let tasks = [];\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { isSearching: currentSearching, deviceIds: currentDevices, searchTotal: currentTotal, ...currentRequestState } = currentState;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { isSearching: nextSearching, deviceIds: nextDevices, searchTotal: nextTotal, ...nextRequestState } = nextState;\n if (nextRequestState.searchTerm && !deepCompare(currentRequestState, nextRequestState)) {\n nextState.isSearching = true;\n tasks.push(\n dispatch(searchDevices(nextState))\n .unwrap()\n .then(results => {\n const searchResult = results[results.length - 1];\n return dispatch(actions.setSearchState({ ...searchResult, isSearching: false }));\n })\n .catch(() => dispatch(actions.setSearchState({ isSearching: false, searchTotal: 0 })))\n );\n }\n tasks.push(dispatch(actions.setSearchState(nextState)));\n return Promise.all(tasks);\n});\n"],"mappings":"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","names":["pluralize","getDeploymentsByStatus","sliceName","actions","getDeviceById","deepCompare","createAsyncThunk","setSnackbar","defaultPage","defaultPerPage","getGroups","createAsyncThunk","sliceName","actions","pluralize","getDeviceById","_a","_b","deepCompare","state","deviceId","createAsyncThunk","progress","getOnboardingState","createAsyncThunk","sliceName","actions","deepCompare","createAsyncThunk","Cookies","cookies","Cookies","setSnackbar","defaultPage","defaultPerPage","createAsyncThunk","sliceName","actions","deepCompare","integration","isEmpty","createAsyncThunk","hashString","Cookies","cookies","Cookies","setAnnouncement","setSnackbar","createAsyncThunk","sliceName","actions","permission","isEmpty","scope","rolesById","accu","permissionSet","_a","_b","getGlobalSettings","getUserSettings","hashString","deepCompare","createAsyncThunk","Cookies","cookies","Cookies","createAsyncThunk","deepCompare"]}
1
+ {"version":3,"sources":["../../../node_modules/pluralize/pluralize.js","../src/deploymentsSlice/thunks.ts","../src/devicesSlice/thunks.tsx","../src/onboardingSlice/thunks.ts","../src/organizationSlice/thunks.ts","../src/usersSlice/thunks.ts","../src/appSlice/thunks.ts"],"sourcesContent":["/* global define */\n\n(function (root, pluralize) {\n /* istanbul ignore else */\n if (typeof require === 'function' && typeof exports === 'object' && typeof module === 'object') {\n // Node.\n module.exports = pluralize();\n } else if (typeof define === 'function' && define.amd) {\n // AMD, registers as an anonymous module.\n define(function () {\n return pluralize();\n });\n } else {\n // Browser global.\n root.pluralize = pluralize();\n }\n})(this, function () {\n // Rule storage - pluralize and singularize need to be run sequentially,\n // while other rules can be optimized using an object for instant lookups.\n var pluralRules = [];\n var singularRules = [];\n var uncountables = {};\n var irregularPlurals = {};\n var irregularSingles = {};\n\n /**\n * Sanitize a pluralization rule to a usable regular expression.\n *\n * @param {(RegExp|string)} rule\n * @return {RegExp}\n */\n function sanitizeRule (rule) {\n if (typeof rule === 'string') {\n return new RegExp('^' + rule + '$', 'i');\n }\n\n return rule;\n }\n\n /**\n * Pass in a word token to produce a function that can replicate the case on\n * another word.\n *\n * @param {string} word\n * @param {string} token\n * @return {Function}\n */\n function restoreCase (word, token) {\n // Tokens are an exact match.\n if (word === token) return token;\n\n // Lower cased words. E.g. \"hello\".\n if (word === word.toLowerCase()) return token.toLowerCase();\n\n // Upper cased words. E.g. \"WHISKY\".\n if (word === word.toUpperCase()) return token.toUpperCase();\n\n // Title cased words. E.g. \"Title\".\n if (word[0] === word[0].toUpperCase()) {\n return token.charAt(0).toUpperCase() + token.substr(1).toLowerCase();\n }\n\n // Lower cased words. E.g. \"test\".\n return token.toLowerCase();\n }\n\n /**\n * Interpolate a regexp string.\n *\n * @param {string} str\n * @param {Array} args\n * @return {string}\n */\n function interpolate (str, args) {\n return str.replace(/\\$(\\d{1,2})/g, function (match, index) {\n return args[index] || '';\n });\n }\n\n /**\n * Replace a word using a rule.\n *\n * @param {string} word\n * @param {Array} rule\n * @return {string}\n */\n function replace (word, rule) {\n return word.replace(rule[0], function (match, index) {\n var result = interpolate(rule[1], arguments);\n\n if (match === '') {\n return restoreCase(word[index - 1], result);\n }\n\n return restoreCase(match, result);\n });\n }\n\n /**\n * Sanitize a word by passing in the word and sanitization rules.\n *\n * @param {string} token\n * @param {string} word\n * @param {Array} rules\n * @return {string}\n */\n function sanitizeWord (token, word, rules) {\n // Empty string or doesn't need fixing.\n if (!token.length || uncountables.hasOwnProperty(token)) {\n return word;\n }\n\n var len = rules.length;\n\n // Iterate over the sanitization rules and use the first one to match.\n while (len--) {\n var rule = rules[len];\n\n if (rule[0].test(word)) return replace(word, rule);\n }\n\n return word;\n }\n\n /**\n * Replace a word with the updated word.\n *\n * @param {Object} replaceMap\n * @param {Object} keepMap\n * @param {Array} rules\n * @return {Function}\n */\n function replaceWord (replaceMap, keepMap, rules) {\n return function (word) {\n // Get the correct token and case restoration functions.\n var token = word.toLowerCase();\n\n // Check against the keep object map.\n if (keepMap.hasOwnProperty(token)) {\n return restoreCase(word, token);\n }\n\n // Check against the replacement map for a direct word replacement.\n if (replaceMap.hasOwnProperty(token)) {\n return restoreCase(word, replaceMap[token]);\n }\n\n // Run all the rules against the word.\n return sanitizeWord(token, word, rules);\n };\n }\n\n /**\n * Check if a word is part of the map.\n */\n function checkWord (replaceMap, keepMap, rules, bool) {\n return function (word) {\n var token = word.toLowerCase();\n\n if (keepMap.hasOwnProperty(token)) return true;\n if (replaceMap.hasOwnProperty(token)) return false;\n\n return sanitizeWord(token, token, rules) === token;\n };\n }\n\n /**\n * Pluralize or singularize a word based on the passed in count.\n *\n * @param {string} word The word to pluralize\n * @param {number} count How many of the word exist\n * @param {boolean} inclusive Whether to prefix with the number (e.g. 3 ducks)\n * @return {string}\n */\n function pluralize (word, count, inclusive) {\n var pluralized = count === 1\n ? pluralize.singular(word) : pluralize.plural(word);\n\n return (inclusive ? count + ' ' : '') + pluralized;\n }\n\n /**\n * Pluralize a word.\n *\n * @type {Function}\n */\n pluralize.plural = replaceWord(\n irregularSingles, irregularPlurals, pluralRules\n );\n\n /**\n * Check if a word is plural.\n *\n * @type {Function}\n */\n pluralize.isPlural = checkWord(\n irregularSingles, irregularPlurals, pluralRules\n );\n\n /**\n * Singularize a word.\n *\n * @type {Function}\n */\n pluralize.singular = replaceWord(\n irregularPlurals, irregularSingles, singularRules\n );\n\n /**\n * Check if a word is singular.\n *\n * @type {Function}\n */\n pluralize.isSingular = checkWord(\n irregularPlurals, irregularSingles, singularRules\n );\n\n /**\n * Add a pluralization rule to the collection.\n *\n * @param {(string|RegExp)} rule\n * @param {string} replacement\n */\n pluralize.addPluralRule = function (rule, replacement) {\n pluralRules.push([sanitizeRule(rule), replacement]);\n };\n\n /**\n * Add a singularization rule to the collection.\n *\n * @param {(string|RegExp)} rule\n * @param {string} replacement\n */\n pluralize.addSingularRule = function (rule, replacement) {\n singularRules.push([sanitizeRule(rule), replacement]);\n };\n\n /**\n * Add an uncountable word rule.\n *\n * @param {(string|RegExp)} word\n */\n pluralize.addUncountableRule = function (word) {\n if (typeof word === 'string') {\n uncountables[word.toLowerCase()] = true;\n return;\n }\n\n // Set singular and plural references for the word.\n pluralize.addPluralRule(word, '$0');\n pluralize.addSingularRule(word, '$0');\n };\n\n /**\n * Add an irregular word definition.\n *\n * @param {string} single\n * @param {string} plural\n */\n pluralize.addIrregularRule = function (single, plural) {\n plural = plural.toLowerCase();\n single = single.toLowerCase();\n\n irregularSingles[single] = plural;\n irregularPlurals[plural] = single;\n };\n\n /**\n * Irregular rules.\n */\n [\n // Pronouns.\n ['I', 'we'],\n ['me', 'us'],\n ['he', 'they'],\n ['she', 'they'],\n ['them', 'them'],\n ['myself', 'ourselves'],\n ['yourself', 'yourselves'],\n ['itself', 'themselves'],\n ['herself', 'themselves'],\n ['himself', 'themselves'],\n ['themself', 'themselves'],\n ['is', 'are'],\n ['was', 'were'],\n ['has', 'have'],\n ['this', 'these'],\n ['that', 'those'],\n // Words ending in with a consonant and `o`.\n ['echo', 'echoes'],\n ['dingo', 'dingoes'],\n ['volcano', 'volcanoes'],\n ['tornado', 'tornadoes'],\n ['torpedo', 'torpedoes'],\n // Ends with `us`.\n ['genus', 'genera'],\n ['viscus', 'viscera'],\n // Ends with `ma`.\n ['stigma', 'stigmata'],\n ['stoma', 'stomata'],\n ['dogma', 'dogmata'],\n ['lemma', 'lemmata'],\n ['schema', 'schemata'],\n ['anathema', 'anathemata'],\n // Other irregular rules.\n ['ox', 'oxen'],\n ['axe', 'axes'],\n ['die', 'dice'],\n ['yes', 'yeses'],\n ['foot', 'feet'],\n ['eave', 'eaves'],\n ['goose', 'geese'],\n ['tooth', 'teeth'],\n ['quiz', 'quizzes'],\n ['human', 'humans'],\n ['proof', 'proofs'],\n ['carve', 'carves'],\n ['valve', 'valves'],\n ['looey', 'looies'],\n ['thief', 'thieves'],\n ['groove', 'grooves'],\n ['pickaxe', 'pickaxes'],\n ['passerby', 'passersby']\n ].forEach(function (rule) {\n return pluralize.addIrregularRule(rule[0], rule[1]);\n });\n\n /**\n * Pluralization rules.\n */\n [\n [/s?$/i, 's'],\n [/[^\\u0000-\\u007F]$/i, '$0'],\n [/([^aeiou]ese)$/i, '$1'],\n [/(ax|test)is$/i, '$1es'],\n [/(alias|[^aou]us|t[lm]as|gas|ris)$/i, '$1es'],\n [/(e[mn]u)s?$/i, '$1s'],\n [/([^l]ias|[aeiou]las|[ejzr]as|[iu]am)$/i, '$1'],\n [/(alumn|syllab|vir|radi|nucle|fung|cact|stimul|termin|bacill|foc|uter|loc|strat)(?:us|i)$/i, '$1i'],\n [/(alumn|alg|vertebr)(?:a|ae)$/i, '$1ae'],\n [/(seraph|cherub)(?:im)?$/i, '$1im'],\n [/(her|at|gr)o$/i, '$1oes'],\n [/(agend|addend|millenni|dat|extrem|bacteri|desiderat|strat|candelabr|errat|ov|symposi|curricul|automat|quor)(?:a|um)$/i, '$1a'],\n [/(apheli|hyperbat|periheli|asyndet|noumen|phenomen|criteri|organ|prolegomen|hedr|automat)(?:a|on)$/i, '$1a'],\n [/sis$/i, 'ses'],\n [/(?:(kni|wi|li)fe|(ar|l|ea|eo|oa|hoo)f)$/i, '$1$2ves'],\n [/([^aeiouy]|qu)y$/i, '$1ies'],\n [/([^ch][ieo][ln])ey$/i, '$1ies'],\n [/(x|ch|ss|sh|zz)$/i, '$1es'],\n [/(matr|cod|mur|sil|vert|ind|append)(?:ix|ex)$/i, '$1ices'],\n [/\\b((?:tit)?m|l)(?:ice|ouse)$/i, '$1ice'],\n [/(pe)(?:rson|ople)$/i, '$1ople'],\n [/(child)(?:ren)?$/i, '$1ren'],\n [/eaux$/i, '$0'],\n [/m[ae]n$/i, 'men'],\n ['thou', 'you']\n ].forEach(function (rule) {\n return pluralize.addPluralRule(rule[0], rule[1]);\n });\n\n /**\n * Singularization rules.\n */\n [\n [/s$/i, ''],\n [/(ss)$/i, '$1'],\n [/(wi|kni|(?:after|half|high|low|mid|non|night|[^\\w]|^)li)ves$/i, '$1fe'],\n [/(ar|(?:wo|[ae])l|[eo][ao])ves$/i, '$1f'],\n [/ies$/i, 'y'],\n [/\\b([pl]|zomb|(?:neck|cross)?t|coll|faer|food|gen|goon|group|lass|talk|goal|cut)ies$/i, '$1ie'],\n [/\\b(mon|smil)ies$/i, '$1ey'],\n [/\\b((?:tit)?m|l)ice$/i, '$1ouse'],\n [/(seraph|cherub)im$/i, '$1'],\n [/(x|ch|ss|sh|zz|tto|go|cho|alias|[^aou]us|t[lm]as|gas|(?:her|at|gr)o|[aeiou]ris)(?:es)?$/i, '$1'],\n [/(analy|diagno|parenthe|progno|synop|the|empha|cri|ne)(?:sis|ses)$/i, '$1sis'],\n [/(movie|twelve|abuse|e[mn]u)s$/i, '$1'],\n [/(test)(?:is|es)$/i, '$1is'],\n [/(alumn|syllab|vir|radi|nucle|fung|cact|stimul|termin|bacill|foc|uter|loc|strat)(?:us|i)$/i, '$1us'],\n [/(agend|addend|millenni|dat|extrem|bacteri|desiderat|strat|candelabr|errat|ov|symposi|curricul|quor)a$/i, '$1um'],\n [/(apheli|hyperbat|periheli|asyndet|noumen|phenomen|criteri|organ|prolegomen|hedr|automat)a$/i, '$1on'],\n [/(alumn|alg|vertebr)ae$/i, '$1a'],\n [/(cod|mur|sil|vert|ind)ices$/i, '$1ex'],\n [/(matr|append)ices$/i, '$1ix'],\n [/(pe)(rson|ople)$/i, '$1rson'],\n [/(child)ren$/i, '$1'],\n [/(eau)x?$/i, '$1'],\n [/men$/i, 'man']\n ].forEach(function (rule) {\n return pluralize.addSingularRule(rule[0], rule[1]);\n });\n\n /**\n * Uncountable rules.\n */\n [\n // Singular words with no plurals.\n 'adulthood',\n 'advice',\n 'agenda',\n 'aid',\n 'aircraft',\n 'alcohol',\n 'ammo',\n 'analytics',\n 'anime',\n 'athletics',\n 'audio',\n 'bison',\n 'blood',\n 'bream',\n 'buffalo',\n 'butter',\n 'carp',\n 'cash',\n 'chassis',\n 'chess',\n 'clothing',\n 'cod',\n 'commerce',\n 'cooperation',\n 'corps',\n 'debris',\n 'diabetes',\n 'digestion',\n 'elk',\n 'energy',\n 'equipment',\n 'excretion',\n 'expertise',\n 'firmware',\n 'flounder',\n 'fun',\n 'gallows',\n 'garbage',\n 'graffiti',\n 'hardware',\n 'headquarters',\n 'health',\n 'herpes',\n 'highjinks',\n 'homework',\n 'housework',\n 'information',\n 'jeans',\n 'justice',\n 'kudos',\n 'labour',\n 'literature',\n 'machinery',\n 'mackerel',\n 'mail',\n 'media',\n 'mews',\n 'moose',\n 'music',\n 'mud',\n 'manga',\n 'news',\n 'only',\n 'personnel',\n 'pike',\n 'plankton',\n 'pliers',\n 'police',\n 'pollution',\n 'premises',\n 'rain',\n 'research',\n 'rice',\n 'salmon',\n 'scissors',\n 'series',\n 'sewage',\n 'shambles',\n 'shrimp',\n 'software',\n 'species',\n 'staff',\n 'swine',\n 'tennis',\n 'traffic',\n 'transportation',\n 'trout',\n 'tuna',\n 'wealth',\n 'welfare',\n 'whiting',\n 'wildebeest',\n 'wildlife',\n 'you',\n /pok[eé]mon$/i,\n // Regexes.\n /[^aeiou]ese$/i, // \"chinese\", \"japanese\"\n /deer$/i, // \"deer\", \"reindeer\"\n /fish$/i, // \"fish\", \"blowfish\", \"angelfish\"\n /measles$/i,\n /o[iu]s$/i, // \"carnivorous\"\n /pox$/i, // \"chickpox\", \"smallpox\"\n /sheep$/i\n ].forEach(pluralize.addUncountableRule);\n\n return pluralize;\n});\n","// 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\n\n/*eslint import/namespace: ['error', { allowComputed: true }]*/\nimport storeActions from '@northern.tech/store/actions';\nimport GeneralApi from '@northern.tech/store/api/general-api';\nimport { DEVICE_LIST_DEFAULTS, SORTING_OPTIONS, TIMEOUTS, headerNames } from '@northern.tech/store/constants';\nimport { getDevicesById, getGlobalSettings, getUserCapabilities } from '@northern.tech/store/selectors';\nimport { commonErrorHandler } from '@northern.tech/store/store';\nimport { getDeviceAuth, getDeviceById, saveGlobalSettings } from '@northern.tech/store/thunks';\nimport { mapTermsToFilters } from '@northern.tech/store/utils';\nimport { deepCompare, isEmpty, standardizePhases, startTimeSort } from '@northern.tech/utils/helpers';\nimport { createAsyncThunk } from '@reduxjs/toolkit';\nimport isUUID from 'validator/lib/isUUID';\n\nimport { actions, sliceName } from '.';\nimport { DEPLOYMENT_ROUTES, DEPLOYMENT_STATES, DEPLOYMENT_TYPES, deploymentPrototype, deploymentsApiUrl, deploymentsApiUrlV2 } from './constants';\nimport { getDeploymentsById, getDeploymentsByStatus as getDeploymentsByStatusSelector } from './selectors';\n\nconst { receivedDevice, setSnackbar } = storeActions;\n\n// default per page until pagination and counting integrated\nconst { page: defaultPage, perPage: defaultPerPage } = DEVICE_LIST_DEFAULTS;\n\nexport const deriveDeploymentGroup = ({ filter = {}, group, groups = [], name }) => (group || (groups.length === 1 && !isUUID(name)) ? groups[0] : filter.name);\n\nconst transformDeployments = (deployments, deploymentsById) =>\n deployments.sort(startTimeSort).reduce(\n (accu, item) => {\n const filter = item.filter ?? {};\n let deployment = {\n ...deploymentPrototype,\n ...deploymentsById[item.id],\n ...item,\n filter: item.filter ? { ...filter, name: filter.name ?? filter.id, filters: mapTermsToFilters(filter.terms) } : undefined,\n name: decodeURIComponent(item.name)\n };\n // deriving the group in a second step to potentially make use of the merged data from the existing group state + the decoded name\n deployment = { ...deployment, group: deriveDeploymentGroup(deployment) };\n accu.deployments[item.id] = deployment;\n accu.deploymentIds.push(item.id);\n return accu;\n },\n { deployments: {}, deploymentIds: [] }\n );\n\n/*Deployments */\nexport const getDeploymentsByStatus = createAsyncThunk(`${sliceName}/getDeploymentsByStatus`, (options = {}, { dispatch, getState }) => {\n const { status, page = defaultPage, per_page = defaultPerPage, startDate, endDate, group, type, shouldSelect = true, sort = SORTING_OPTIONS.desc } = options;\n const created_after = startDate ? `&created_after=${startDate}` : '';\n const created_before = endDate ? `&created_before=${endDate}` : '';\n const search = group ? `&search=${group}` : '';\n const typeFilter = type ? `&type=${type}` : '';\n return GeneralApi.get(\n `${deploymentsApiUrl}/deployments?status=${status}&per_page=${per_page}&page=${page}${created_after}${created_before}${search}${typeFilter}&sort=${sort}`\n ).then(res => {\n const { deployments, deploymentIds } = transformDeployments(res.data, getState().deployments.byId);\n const total = Number(res.headers[headerNames.total]);\n let tasks = [\n dispatch(actions.receivedDeployments(deployments)),\n dispatch(\n actions.receivedDeploymentsForStatus({\n deploymentIds,\n status,\n total: !(startDate || endDate || group || type) ? total : getState().deployments.byStatus[status].total\n })\n )\n ];\n tasks = deploymentIds.reduce((accu, deploymentId) => {\n if (deployments[deploymentId].type === DEPLOYMENT_TYPES.configuration) {\n accu.push(dispatch(getSingleDeployment(deploymentId)));\n }\n return accu;\n }, tasks);\n if (shouldSelect) {\n tasks.push(dispatch(actions.selectDeploymentsForStatus({ deploymentIds, status, total })));\n }\n tasks.push({ deploymentIds, total });\n return Promise.all(tasks);\n });\n});\n\nconst MAX_PREVIOUS_PHASES_COUNT = 5;\nexport const createDeployment = createAsyncThunk(`${sliceName}/createDeployment`, ({ newDeployment, hasNewRetryDefault = false }, { dispatch, getState }) => {\n let request;\n if (newDeployment.filter_id) {\n request = GeneralApi.post(`${deploymentsApiUrlV2}/deployments`, newDeployment);\n } else if (newDeployment.group) {\n request = GeneralApi.post(`${deploymentsApiUrl}/deployments/group/${newDeployment.group}`, newDeployment);\n } else {\n request = GeneralApi.post(`${deploymentsApiUrl}/deployments`, newDeployment);\n }\n return request\n .catch(err => commonErrorHandler(err, 'Error creating deployment.', dispatch))\n .then(data => {\n const lastslashindex = data.headers.location.lastIndexOf('/');\n const deploymentId = data.headers.location.substring(lastslashindex + 1);\n const deployment = {\n ...newDeployment,\n id: deploymentId,\n devices: newDeployment.devices ? newDeployment.devices.map(id => ({ id, status: 'pending' })) : [],\n statistics: { status: {} }\n };\n let tasks = [\n dispatch(actions.createdDeployment(deployment)),\n dispatch(getSingleDeployment(deploymentId)),\n dispatch(setSnackbar('Deployment created successfully', TIMEOUTS.fiveSeconds))\n ];\n const { canManageUsers } = getUserCapabilities(getState());\n if (canManageUsers) {\n const { phases, retries } = newDeployment;\n const { previousPhases = [], retries: previousRetries = 0 } = getGlobalSettings(getState());\n let newSettings = { retries: hasNewRetryDefault ? retries : previousRetries, hasDeployments: true };\n if (phases) {\n const standardPhases = standardizePhases(phases);\n let prevPhases = previousPhases.map(standardizePhases);\n if (!prevPhases.find(previousPhaseList => previousPhaseList.every(oldPhase => standardPhases.find(phase => deepCompare(phase, oldPhase))))) {\n prevPhases.push(standardPhases);\n }\n newSettings.previousPhases = prevPhases.slice(-1 * MAX_PREVIOUS_PHASES_COUNT);\n }\n tasks.push(dispatch(saveGlobalSettings(newSettings)));\n }\n return Promise.all(tasks);\n });\n});\n\nexport const getDeploymentDevices = createAsyncThunk(`${sliceName}/getDeploymentDevices`, (options, { dispatch, getState }) => {\n const { id, page = defaultPage, perPage = defaultPerPage } = options;\n return GeneralApi.get(`${deploymentsApiUrl}/deployments/${id}/devices/list?&page=${page}&per_page=${perPage}`).then(response => {\n const { devices: deploymentDevices = {} } = getState().deployments.byId[id] || {};\n const devices = response.data.reduce((accu, item) => {\n accu[item.id] = item;\n const log = (deploymentDevices[item.id] || {}).log;\n if (log) {\n accu[item.id].log = log;\n }\n return accu;\n }, {});\n const selectedDeviceIds = Object.keys(devices);\n let tasks = [\n dispatch(\n actions.receivedDeploymentDevices({\n id,\n devices,\n selectedDeviceIds,\n totalDeviceCount: Number(response.headers[headerNames.total])\n })\n )\n ];\n const devicesById = getDevicesById(getState());\n // only update those that have changed & lack data\n const lackingData = selectedDeviceIds.reduce((accu, deviceId) => {\n const device = devicesById[deviceId];\n if (!device || !device.identity_data || !device.attributes || Object.keys(device.attributes).length === 0) {\n accu.push(deviceId);\n }\n return accu;\n }, []);\n // get device artifact, inventory and identity details not listed in schedule data\n tasks = lackingData.reduce((accu, deviceId) => [...accu, dispatch(getDeviceById(deviceId)), dispatch(getDeviceAuth(deviceId))], tasks);\n return Promise.all(tasks);\n });\n});\n\nconst parseDeviceDeployment = ({\n deployment: { id, artifact_name: release, status: deploymentStatus },\n device: { created, deleted, id: deviceId, finished, status, log }\n}) => ({\n id,\n release,\n created,\n deleted,\n deviceId,\n finished,\n status,\n log,\n route: Object.values(DEPLOYMENT_ROUTES).reduce((accu, { key, states }) => {\n if (!accu) {\n return states.includes(deploymentStatus) ? key : accu;\n }\n return accu;\n }, '')\n});\n\nexport const getDeviceDeployments = createAsyncThunk(`${sliceName}/getDeviceDeployments`, (options, { dispatch }) => {\n const { deviceId, filterSelection = [], page = defaultPage, perPage = defaultPerPage } = options;\n const filters = filterSelection.map(item => `&status=${item}`).join('');\n return GeneralApi.get(`${deploymentsApiUrl}/deployments/devices/${deviceId}?page=${page}&per_page=${perPage}${filters}`)\n .then(({ data, headers }) =>\n Promise.resolve(\n dispatch(\n receivedDevice({\n id: deviceId,\n deviceDeployments: data.map(parseDeviceDeployment),\n deploymentsCount: Number(headers[headerNames.total])\n })\n )\n )\n )\n .catch(err => commonErrorHandler(err, 'There was an error retrieving the device deployment history:', dispatch));\n});\n\nexport const resetDeviceDeployments = createAsyncThunk(`${sliceName}/resetDeviceDeployments`, (deviceId, { dispatch }) =>\n GeneralApi.delete(`${deploymentsApiUrl}/deployments/devices/${deviceId}/history`)\n .then(() => Promise.resolve(dispatch(getDeviceDeployments({ deviceId }))))\n .catch(err => commonErrorHandler(err, 'There was an error resetting the device deployment history:', dispatch))\n);\n\nexport const getSingleDeployment = createAsyncThunk(`${sliceName}/getSingleDeployment`, (id, { dispatch, getState }) =>\n GeneralApi.get(`${deploymentsApiUrl}/deployments/${id}`).then(({ data }) => {\n const { deployments } = transformDeployments([data], getState().deployments.byId);\n return Promise.resolve(dispatch(actions.receivedDeployment(deployments[id])));\n })\n);\n\nexport const getDeviceLog = createAsyncThunk(`${sliceName}/getDeviceLog`, ({ deploymentId, deviceId }, { dispatch }) =>\n GeneralApi.get(`${deploymentsApiUrl}/deployments/${deploymentId}/devices/${deviceId}/log`)\n .catch(e => {\n console.log('no log here', e);\n return Promise.reject();\n })\n .then(({ data: log }) =>\n Promise.all([Promise.resolve(dispatch(actions.receivedDeploymentDeviceLog({ id: deploymentId, deviceId, log }))), Promise.resolve(log)])\n )\n);\n\nexport const abortDeployment = createAsyncThunk(`${sliceName}/abortDeployment`, (deploymentId, { dispatch, getState }) =>\n GeneralApi.put(`${deploymentsApiUrl}/deployments/${deploymentId}/status`, { status: 'aborted' })\n .then(() => {\n const deploymentsByStatus = getDeploymentsByStatusSelector(getState());\n let status = DEPLOYMENT_STATES.pending;\n let index = deploymentsByStatus.pending.deploymentIds.findIndex(id => id === deploymentId);\n if (index < 0) {\n status = DEPLOYMENT_STATES.inprogress;\n index = deploymentsByStatus.inprogress.deploymentIds.findIndex(id => id === deploymentId);\n }\n const deploymentIds = [...deploymentsByStatus[status].deploymentIds.slice(0, index), ...deploymentsByStatus[status].deploymentIds.slice(index + 1)];\n const deploymentsById = getDeploymentsById(getState());\n const deployments = deploymentIds.reduce((accu, id) => {\n accu[id] = deploymentsById[id];\n return accu;\n }, {});\n const total = Math.max(deploymentsByStatus[status].total - 1, 0);\n return Promise.all([\n dispatch(actions.receivedDeployments(deployments)),\n dispatch(actions.receivedDeploymentsForStatus({ deploymentIds, status, total })),\n dispatch(actions.removedDeployment(deploymentId)),\n dispatch(setSnackbar('The deployment was successfully aborted'))\n ]);\n })\n .catch(err => commonErrorHandler(err, 'There was an error while aborting the deployment:', dispatch))\n);\n\nexport const updateDeploymentControlMap = createAsyncThunk(`${sliceName}/updateDeploymentControlMap`, ({ deploymentId, updateControlMap }, { dispatch }) =>\n GeneralApi.patch(`${deploymentsApiUrl}/deployments/${deploymentId}`, { update_control_map: updateControlMap })\n .catch(err => commonErrorHandler(err, 'There was an error while updating the deployment status:', dispatch))\n .then(() => Promise.resolve(dispatch(getSingleDeployment(deploymentId))))\n);\n\nexport const setDeploymentsState = createAsyncThunk(`${sliceName}/setDeploymentsState`, (selection, { dispatch, getState }) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { page, perPage, ...selectionState } = selection;\n const currentState = getState().deployments.selectionState;\n let nextState = {\n ...currentState,\n ...selectionState,\n ...Object.keys(DEPLOYMENT_STATES).reduce((accu, item) => {\n accu[item] = {\n ...currentState[item],\n ...selectionState[item]\n };\n return accu;\n }, {}),\n general: {\n ...currentState.general,\n ...selectionState.general\n }\n };\n let tasks = [dispatch(actions.setDeploymentsState(nextState))];\n if (nextState.selectedId && currentState.selectedId !== nextState.selectedId) {\n tasks.push(dispatch(getSingleDeployment(nextState.selectedId)));\n }\n return Promise.all(tasks);\n});\n\nconst deltaAttributeMappings = [\n { here: 'compressionLevel', there: 'compression_level' },\n { here: 'disableChecksum', there: 'disable_checksum' },\n { here: 'disableDecompression', there: 'disable_external_decompression' },\n { here: 'sourceWindow', there: 'source_window_size' },\n { here: 'inputWindow', there: 'input_window_size' },\n { here: 'duplicatesWindow', there: 'compression_duplicates_window' },\n { here: 'instructionBuffer', there: 'instruction_buffer_size' }\n];\n\nconst mapExternalDeltaConfig = (config = {}) =>\n deltaAttributeMappings.reduce((accu, { here, there }) => {\n if (config[there] !== undefined) {\n accu[here] = config[there];\n }\n return accu;\n }, {});\n\nexport const getDeploymentsConfig = createAsyncThunk(`${sliceName}/getDeploymentsConfig`, (_, { dispatch, getState }) =>\n GeneralApi.get(`${deploymentsApiUrl}/config`).then(({ data }) => {\n const oldConfig = getState().deployments.config;\n const { delta = {} } = data;\n const { binary_delta = {}, binary_delta_limits = {} } = delta;\n const { xdelta_args = {}, timeout: timeoutConfig = oldConfig.binaryDelta.timeout } = binary_delta;\n const { xdelta_args_limits = {}, timeout: timeoutLimit = oldConfig.binaryDeltaLimits.timeout } = binary_delta_limits;\n const config = {\n ...oldConfig,\n hasDelta: Boolean(delta.enabled),\n binaryDelta: {\n ...oldConfig.binaryDelta,\n timeout: timeoutConfig,\n ...mapExternalDeltaConfig(xdelta_args)\n },\n binaryDeltaLimits: {\n ...oldConfig.binaryDeltaLimits,\n timeout: timeoutLimit,\n ...mapExternalDeltaConfig(xdelta_args_limits)\n }\n };\n return Promise.resolve(dispatch(actions.setDeploymentsConfig(config)));\n })\n);\n\n// traverse a source object and remove undefined & empty object properties to only return an attribute if there really is content worth sending\nconst deepClean = source =>\n Object.entries(source).reduce((accu, [key, value]) => {\n if (value !== undefined) {\n let cleanedValue = typeof value === 'object' ? deepClean(value) : value;\n if (cleanedValue === undefined || (typeof cleanedValue === 'object' && isEmpty(cleanedValue))) {\n return accu;\n }\n accu = { ...(accu ?? {}), [key]: cleanedValue };\n }\n return accu;\n }, undefined);\n\nexport const saveDeltaDeploymentsConfig = createAsyncThunk(`${sliceName}/saveDeltaDeploymentsConfig`, (config, { dispatch, getState }) => {\n const configChange = {\n timeout: config.timeout,\n xdelta_args: deltaAttributeMappings.reduce((accu, { here, there }) => {\n if (config[here] !== undefined) {\n accu[there] = config[here];\n }\n return accu;\n }, {})\n };\n const result = deepClean(configChange);\n if (!result) {\n return Promise.resolve();\n }\n return GeneralApi.put(`${deploymentsApiUrl}/config/binary_delta`, result)\n .catch(err => commonErrorHandler(err, 'There was a problem storing your delta artifact generation configuration.', dispatch))\n .then(() => {\n const oldConfig = getState().deployments.config;\n const newConfig = {\n ...oldConfig,\n binaryDelta: {\n ...oldConfig.binaryDelta,\n ...config\n }\n };\n return Promise.all([dispatch(actions.setDeploymentsConfig(newConfig)), dispatch(setSnackbar('Settings saved successfully'))]);\n });\n});\n","// 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\n\n/*eslint import/namespace: ['error', { allowComputed: true }]*/\nimport React from 'react';\nimport { Link } from 'react-router-dom';\n\nimport storeActions from '@northern.tech/store/actions';\nimport GeneralApi from '@northern.tech/store/api/general-api';\nimport {\n ALL_DEVICES,\n DEVICE_FILTERING_OPTIONS,\n DEVICE_LIST_DEFAULTS,\n EXTERNAL_PROVIDER,\n MAX_PAGE_SIZE,\n SORTING_OPTIONS,\n TIMEOUTS,\n UNGROUPED_GROUP,\n auditLogsApiUrl,\n defaultReports,\n headerNames,\n rootfsImageVersion\n} from '@northern.tech/store/constants';\nimport {\n getAttrsEndpoint,\n getCurrentUser,\n getDeviceTwinIntegrations,\n getGlobalSettings,\n getIdAttribute,\n getSearchEndpoint,\n getTenantCapabilities,\n getUserCapabilities,\n getUserSettings\n} from '@northern.tech/store/selectors';\nimport { commonErrorFallback, commonErrorHandler } from '@northern.tech/store/store';\nimport { getDeviceMonitorConfig, getLatestDeviceAlerts, getSingleDeployment, saveGlobalSettings } from '@northern.tech/store/thunks';\nimport {\n convertDeviceListStateToFilters,\n extractErrorMessage,\n filtersFilter,\n mapDeviceAttributes,\n mapFiltersToTerms,\n mapTermsToFilters,\n progress\n} from '@northern.tech/store/utils';\nimport { attributeDuplicateFilter, deepCompare, getSnackbarMessage } from '@northern.tech/utils/helpers';\nimport { createAsyncThunk } from '@reduxjs/toolkit';\nimport { isCancel } from 'axios';\nimport pluralize from 'pluralize';\nimport { v4 as uuid } from 'uuid';\n\nimport { actions, sliceName } from '.';\nimport {\n ALL_DEVICE_STATES,\n DEVICE_STATES,\n deviceAuthV2,\n deviceConfig,\n deviceConnect,\n emptyFilter,\n geoAttributes,\n inventoryApiUrl,\n inventoryApiUrlV2,\n iotManagerBaseURL,\n reportingApiUrl\n} from './constants';\nimport {\n getDeviceById as getDeviceByIdSelector,\n getDeviceFilters,\n getDeviceListState,\n getDevicesById,\n getGroupsById,\n getGroups as getGroupsSelector,\n getSelectedGroup\n} from './selectors';\n\nconst { cleanUpUpload, initUpload, setSnackbar, uploadProgress } = storeActions;\nconst { page: defaultPage, perPage: defaultPerPage } = DEVICE_LIST_DEFAULTS;\n\nconst defaultAttributes = [\n { scope: 'identity', attribute: 'status' },\n { scope: 'inventory', attribute: 'artifact_name' },\n { scope: 'inventory', attribute: 'device_type' },\n { scope: 'inventory', attribute: 'mender_is_gateway' },\n { scope: 'inventory', attribute: 'mender_gateway_system_id' },\n { scope: 'inventory', attribute: rootfsImageVersion },\n { scope: 'monitor', attribute: 'alerts' },\n { scope: 'system', attribute: 'created_ts' },\n { scope: 'system', attribute: 'updated_ts' },\n { scope: 'system', attribute: 'check_in_time' },\n { scope: 'system', attribute: 'group' },\n { scope: 'tags', attribute: 'name' }\n];\n\nexport const getGroups = createAsyncThunk(`${sliceName}/getGroups`, (_, { dispatch, getState }) =>\n GeneralApi.get(`${inventoryApiUrl}/groups`).then(res => {\n const state = getGroupsById(getState());\n const dynamicGroups = Object.entries(state).reduce((accu, [id, group]) => {\n if (group.id || (group.filters?.length && id !== UNGROUPED_GROUP.id)) {\n accu[id] = group;\n }\n return accu;\n }, {});\n const groups = res.data.reduce((accu, group) => {\n accu[group] = { deviceIds: [], filters: [], total: 0, ...state[group] };\n return accu;\n }, dynamicGroups);\n const filters = [{ key: 'group', value: res.data, operator: DEVICE_FILTERING_OPTIONS.$nin.key, scope: 'system' }];\n return Promise.all([\n dispatch(actions.receivedGroups(groups)),\n dispatch(getDevicesByStatus({ filterSelection: filters, group: 0, page: 1, perPage: 1, status: undefined }))\n ]).then(promises => {\n const devicesRetrieval = promises[promises.length - 1] || [];\n const { payload } = devicesRetrieval || {};\n const result = payload[payload.length - 1] || {};\n if (!result.total) {\n return Promise.resolve();\n }\n return Promise.resolve(\n dispatch(\n actions.addGroup({\n groupName: UNGROUPED_GROUP.id,\n group: { filters: [{ key: 'group', value: res.data, operator: DEVICE_FILTERING_OPTIONS.$nin.key, scope: 'system' }] }\n })\n )\n );\n });\n })\n);\n\nexport const addDevicesToGroup = createAsyncThunk(`${sliceName}/addDevicesToGroup`, ({ group, deviceIds, isCreation }, { dispatch }) =>\n GeneralApi.patch(`${inventoryApiUrl}/groups/${group}/devices`, deviceIds)\n .then(() => dispatch(actions.addToGroup({ group, deviceIds })))\n .finally(() => (isCreation ? Promise.resolve(dispatch(getGroups())) : {}))\n);\n\nexport const removeDevicesFromGroup = createAsyncThunk(`${sliceName}/removeDevicesFromGroup`, ({ group, deviceIds }, { dispatch }) =>\n GeneralApi.delete(`${inventoryApiUrl}/groups/${group}/devices`, deviceIds).then(() =>\n Promise.all([\n dispatch(actions.removeFromGroup({ group, deviceIds })),\n dispatch(setSnackbar(`The ${pluralize('devices', deviceIds.length)} ${pluralize('were', deviceIds.length)} removed from the group`, TIMEOUTS.fiveSeconds))\n ])\n )\n);\n\nconst getGroupNotification = (newGroup, selectedGroup) => {\n const successMessage = 'The group was updated successfully';\n if (newGroup === selectedGroup) {\n return [successMessage, TIMEOUTS.fiveSeconds];\n }\n return [\n <>\n {successMessage} - <Link to={`/devices?inventory=group:eq:${newGroup}`}>click here</Link> to see it.\n </>,\n 5000,\n undefined,\n undefined,\n () => {}\n ];\n};\n\nexport const addStaticGroup = createAsyncThunk(`${sliceName}/addStaticGroup`, ({ group, devices }, { dispatch, getState }) =>\n Promise.resolve(dispatch(addDevicesToGroup({ group, deviceIds: devices.map(({ id }) => id), isCreation: true })))\n .then(() =>\n Promise.resolve(\n dispatch(\n actions.addGroup({\n group: { deviceIds: [], total: 0, filters: [], ...getState().devices.groups.byId[group] },\n groupName: group\n })\n )\n ).then(() =>\n Promise.all([\n dispatch(setDeviceListState({ setOnly: true })),\n dispatch(getGroups()),\n dispatch(setSnackbar(...getGroupNotification(group, getState().devices.groups.selectedGroup)))\n ])\n )\n )\n .catch(err => commonErrorHandler(err, `Group could not be updated:`, dispatch))\n);\n\nexport const removeStaticGroup = createAsyncThunk(`${sliceName}/removeStaticGroup`, (groupName, { dispatch }) =>\n GeneralApi.delete(`${inventoryApiUrl}/groups/${groupName}`).then(() =>\n Promise.all([\n dispatch(actions.removeGroup(groupName)),\n dispatch(getGroups()),\n dispatch(setSnackbar('Group was removed successfully', TIMEOUTS.fiveSeconds))\n ])\n )\n);\n\nexport const getDynamicGroups = createAsyncThunk(`${sliceName}/getDynamicGroups`, (_, { dispatch, getState }) =>\n GeneralApi.get(`${inventoryApiUrlV2}/filters?per_page=${MAX_PAGE_SIZE}`)\n .then(({ data: filters }) => {\n const state = getGroupsById(getState());\n const staticGroups = Object.entries(state).reduce((accu, [id, group]) => {\n if (!(group.id || group.filters?.length)) {\n accu[id] = group;\n }\n return accu;\n }, {});\n const groups = (filters || []).reduce((accu, filter) => {\n accu[filter.name] = {\n deviceIds: [],\n total: 0,\n ...state[filter.name],\n id: filter.id,\n filters: mapTermsToFilters(filter.terms)\n };\n return accu;\n }, staticGroups);\n return Promise.resolve(dispatch(actions.receivedGroups(groups)));\n })\n .catch(() => console.log('Dynamic group retrieval failed - likely accessing a non-enterprise backend'))\n);\n\nexport const addDynamicGroup = createAsyncThunk(`${sliceName}/addDynamicGroup`, ({ groupName, filterPredicates }, { dispatch, getState }) =>\n GeneralApi.post(`${inventoryApiUrlV2}/filters`, { name: groupName, terms: mapFiltersToTerms(filterPredicates) })\n .then(res =>\n Promise.resolve(\n dispatch(\n actions.addGroup({\n groupName,\n group: {\n id: res.headers[headerNames.location].substring(res.headers[headerNames.location].lastIndexOf('/') + 1),\n filters: filterPredicates\n }\n })\n )\n ).then(() => {\n const { cleanedFilters } = getGroupFilters(groupName, getState().devices.groups);\n return Promise.all([\n dispatch(actions.setDeviceFilters(cleanedFilters)),\n dispatch(setSnackbar(...getGroupNotification(groupName, getState().devices.groups.selectedGroup))),\n dispatch(getDynamicGroups())\n ]);\n })\n )\n .catch(err => commonErrorHandler(err, `Group could not be updated:`, dispatch))\n);\n\nexport const updateDynamicGroup = createAsyncThunk(`${sliceName}/updateDynamicGroup`, ({ groupName, filterPredicates }, { dispatch, getState }) => {\n const filterId = getState().devices.groups.byId[groupName].id;\n return GeneralApi.delete(`${inventoryApiUrlV2}/filters/${filterId}`).then(() => Promise.resolve(dispatch(addDynamicGroup({ groupName, filterPredicates }))));\n});\n\nexport const removeDynamicGroup = createAsyncThunk(`${sliceName}/removeDynamicGroup`, (groupName, { dispatch, getState }) => {\n const filterId = getState().devices.groups.byId[groupName].id;\n return GeneralApi.delete(`${inventoryApiUrlV2}/filters/${filterId}`).then(() =>\n Promise.all([dispatch(actions.removeGroup(groupName)), dispatch(setSnackbar('Group was removed successfully', TIMEOUTS.fiveSeconds))])\n );\n});\n\n/*\n * Device inventory functions\n */\nconst getGroupFilters = (group, groupsState, filters = []) => {\n const groupName = group === UNGROUPED_GROUP.id || group === UNGROUPED_GROUP.name ? UNGROUPED_GROUP.id : group;\n const selectedGroup = groupsState.byId[groupName];\n const groupFilterLength = selectedGroup?.filters?.length || 0;\n const cleanedFilters = groupFilterLength ? [...filters, ...selectedGroup.filters].filter(filtersFilter) : filters;\n return { cleanedFilters, groupName, selectedGroup, groupFilterLength };\n};\n\nexport const selectGroup = createAsyncThunk(`${sliceName}/selectGroup`, ({ group, filters = [] }, { dispatch, getState }) => {\n const { cleanedFilters, groupName, selectedGroup, groupFilterLength } = getGroupFilters(group, getState().devices.groups, filters);\n if (getSelectedGroup(getState()) === groupName && ((filters.length === 0 && !groupFilterLength) || filters.length === cleanedFilters.length)) {\n return Promise.resolve();\n }\n let tasks = [];\n if (groupFilterLength) {\n tasks.push(dispatch(actions.setDeviceFilters(cleanedFilters)));\n } else {\n tasks.push(dispatch(actions.setDeviceFilters(filters)));\n tasks.push(dispatch(getGroupDevices({ group: groupName, perPage: 1, shouldIncludeAllStates: true })));\n }\n const selectedGroupName = selectedGroup || !Object.keys(getGroupsById(getState())).length ? groupName : undefined;\n tasks.push(dispatch(actions.selectGroup(selectedGroupName)));\n return Promise.all(tasks);\n});\n\nconst getEarliestTs = (dateA = '', dateB = '') => (!dateA || !dateB ? dateA || dateB : dateA < dateB ? dateA : dateB);\n\nconst reduceReceivedDevices = (devices, ids, state, status) =>\n devices.reduce(\n (accu, device) => {\n const stateDevice = getDeviceByIdSelector(state, device.id);\n const {\n attributes: storedAttributes = {},\n identity_data: storedIdentity = {},\n monitor: storedMonitor = {},\n tags: storedTags = {},\n group: storedGroup\n } = stateDevice;\n const { identity, inventory, monitor, system = {}, tags } = mapDeviceAttributes(device.attributes);\n device.tags = { ...storedTags, ...tags };\n device.group = system.group ?? storedGroup;\n device.monitor = { ...storedMonitor, ...monitor };\n device.identity_data = { ...storedIdentity, ...identity, ...(device.identity_data ? device.identity_data : {}) };\n device.status = status ? status : device.status || identity.status;\n device.check_in_time_rounded = system.check_in_time ?? stateDevice.check_in_time_rounded;\n device.check_in_time_exact = device.check_in_time ?? stateDevice.check_in_time_exact;\n device.created_ts = getEarliestTs(getEarliestTs(system.created_ts, device.created_ts), stateDevice.created_ts);\n device.updated_ts = device.attributes ? device.updated_ts : stateDevice.updated_ts;\n device.isNew = new Date(device.created_ts) > new Date(state.app.newThreshold);\n device.isOffline = new Date(device.check_in_time_rounded) < new Date(state.app.offlineThreshold) || device.check_in_time_rounded === undefined;\n // all the other mapped attributes return as empty objects if there are no attributes to map, but identity will be initialized with an empty state\n // for device_type and artifact_name, potentially overwriting existing info, so rely on stored information instead if there are no attributes\n device.attributes = device.attributes ? { ...storedAttributes, ...inventory } : storedAttributes;\n accu.devicesById[device.id] = { ...stateDevice, ...device };\n accu.ids.push(device.id);\n return accu;\n },\n { ids, devicesById: {} }\n );\n\nexport const getGroupDevices = createAsyncThunk(`${sliceName}/getGroupDevices`, (options, { dispatch, getState }) => {\n const { group, shouldIncludeAllStates, ...remainder } = options;\n const { cleanedFilters: filterSelection } = getGroupFilters(group, getState().devices.groups);\n return Promise.resolve(\n dispatch(getDevicesByStatus({ ...remainder, filterSelection, group, status: shouldIncludeAllStates ? undefined : DEVICE_STATES.accepted }))\n )\n .unwrap()\n .then(results => {\n if (!group) {\n return Promise.resolve();\n }\n const { deviceAccu, total } = results[results.length - 1];\n const stateGroup = getState().devices.groups.byId[group];\n if (!stateGroup && !total && !deviceAccu.ids.length) {\n return Promise.resolve();\n }\n return Promise.resolve(\n dispatch(\n actions.addGroup({\n group: {\n deviceIds: deviceAccu.ids.length === total || deviceAccu.ids.length > stateGroup?.deviceIds ? deviceAccu.ids : stateGroup.deviceIds,\n total\n },\n groupName: group\n })\n )\n );\n });\n});\n\nexport const getAllGroupDevices = createAsyncThunk(`${sliceName}/getAllGroupDevices`, (group, { dispatch, getState }) => {\n if (!group || (!!group && (!getGroupsById(getState())[group] || getGroupsById(getState())[group].filters.length))) {\n return Promise.resolve();\n }\n const { attributes, filterTerms } = prepareSearchArguments({\n filters: [],\n group,\n state: getState(),\n status: DEVICE_STATES.accepted\n });\n const getAllDevices = (perPage = MAX_PAGE_SIZE, page = defaultPage, devices = []) =>\n GeneralApi.post(getSearchEndpoint(getState()), {\n page,\n per_page: perPage,\n filters: filterTerms,\n attributes\n }).then(res => {\n const state = getState();\n const deviceAccu = reduceReceivedDevices(res.data, devices, state);\n dispatch(actions.receivedDevices(deviceAccu.devicesById));\n const total = Number(res.headers[headerNames.total]);\n if (total > perPage * page) {\n return getAllDevices(perPage, page + 1, deviceAccu.ids);\n }\n return Promise.resolve(dispatch(actions.addGroup({ group: { deviceIds: deviceAccu.ids, total: deviceAccu.ids.length }, groupName: group })));\n });\n return getAllDevices();\n});\n\nexport const getAllDynamicGroupDevices = createAsyncThunk(`${sliceName}/getAllDynamicGroupDevices`, (group, { dispatch, getState }) => {\n if (!!group && (!getGroupsById(getState())[group] || !getGroupsById(getState())[group].filters.length)) {\n return Promise.resolve();\n }\n const { attributes, filterTerms: filters } = prepareSearchArguments({\n filters: getState().devices.groups.byId[group].filters,\n state: getState(),\n status: DEVICE_STATES.accepted\n });\n const getAllDevices = (perPage = MAX_PAGE_SIZE, page = defaultPage, devices = []) =>\n GeneralApi.post(getSearchEndpoint(getState()), { page, per_page: perPage, filters, attributes }).then(res => {\n const state = getState();\n const deviceAccu = reduceReceivedDevices(res.data, devices, state);\n dispatch(actions.receivedDevices(deviceAccu.devicesById));\n const total = Number(res.headers[headerNames.total]);\n if (total > deviceAccu.ids.length) {\n return getAllDevices(perPage, page + 1, deviceAccu.ids);\n }\n return Promise.resolve(dispatch(actions.addGroup({ group: { deviceIds: deviceAccu.ids, total }, groupName: group })));\n });\n return getAllDevices();\n});\n\nexport const getDeviceById = createAsyncThunk(`${sliceName}/getDeviceById`, (id, { dispatch, getState }) =>\n GeneralApi.get(`${inventoryApiUrl}/devices/${id}`)\n .then(res => {\n const device = reduceReceivedDevices([res.data], [], getState()).devicesById[id];\n device.etag = res.headers.etag;\n dispatch(actions.receivedDevice(device));\n return Promise.resolve(device);\n })\n .catch(err => {\n const errMsg = extractErrorMessage(err);\n if (errMsg.includes('Not Found')) {\n console.log(`${id} does not have any inventory information`);\n const device = reduceReceivedDevices(\n [\n {\n id,\n attributes: [\n { name: 'status', value: 'decomissioned', scope: 'identity' },\n { name: 'decomissioned', value: 'true', scope: 'inventory' }\n ]\n }\n ],\n [],\n getState()\n ).devicesById[id];\n dispatch(actions.receivedDevice(device));\n }\n })\n);\n\nexport const getDeviceInfo = createAsyncThunk(`${sliceName}/getDeviceInfo`, (deviceId, { dispatch, getState }) => {\n const device = getDeviceByIdSelector(getState(), deviceId);\n const { hasDeviceConfig, hasDeviceConnect, hasMonitor } = getTenantCapabilities(getState());\n const { canConfigure } = getUserCapabilities(getState());\n const integrations = getDeviceTwinIntegrations(getState());\n let tasks = [dispatch(getDeviceAuth(deviceId)), ...integrations.map(integration => dispatch(getDeviceTwin({ deviceId, integration })))];\n if (hasDeviceConfig && canConfigure && [DEVICE_STATES.accepted, DEVICE_STATES.preauth].includes(device.status)) {\n tasks.push(dispatch(getDeviceConfig(deviceId)));\n }\n if (device.status === DEVICE_STATES.accepted) {\n // Get full device identity details for single selected device\n tasks.push(dispatch(getDeviceById(deviceId)));\n if (hasDeviceConnect) {\n tasks.push(dispatch(getDeviceConnect(deviceId)));\n }\n if (hasMonitor) {\n tasks.push(dispatch(getLatestDeviceAlerts({ id: deviceId })));\n tasks.push(dispatch(getDeviceMonitorConfig(deviceId)));\n }\n }\n return Promise.all(tasks);\n});\n\nexport const deriveInactiveDevices = createAsyncThunk(`${sliceName}/deriveInactiveDevices`, (deviceIds, { dispatch, getState }) => {\n const yesterday = new Date();\n yesterday.setDate(yesterday.getDate() - 1);\n const yesterdaysIsoString = yesterday.toISOString();\n // now boil the list down to the ones that were not updated since yesterday\n const devices = deviceIds.reduce(\n (accu, id) => {\n const device = getDeviceByIdSelector(getState(), id);\n if (device && device.updated_ts > yesterdaysIsoString) {\n accu.active.push(id);\n } else {\n accu.inactive.push(id);\n }\n return accu;\n },\n { active: [], inactive: [] }\n );\n return dispatch(actions.setInactiveDevices({ activeDeviceTotal: devices.active.length, inactiveDeviceTotal: devices.inactive.length }));\n});\n\n/*\n Device Auth + admission\n */\nexport const getDeviceCount = createAsyncThunk(`${sliceName}/getDeviceCount`, (status, { dispatch, getState }) =>\n GeneralApi.post(getSearchEndpoint(getState()), {\n page: 1,\n per_page: 1,\n filters: mapFiltersToTerms([{ key: 'status', value: status, operator: DEVICE_FILTERING_OPTIONS.$eq.key, scope: 'identity' }]),\n attributes: defaultAttributes\n }).then(response => {\n const count = Number(response.headers[headerNames.total]);\n if (status) {\n return dispatch(actions.setDevicesCountByStatus({ count, status }));\n }\n return dispatch(actions.setTotalDevices(count));\n })\n);\n\nexport const getAllDeviceCounts = createAsyncThunk(`${sliceName}/getAllDeviceCounts`, (_, { dispatch }) =>\n Promise.all([DEVICE_STATES.accepted, DEVICE_STATES.pending].map(status => dispatch(getDeviceCount(status))))\n);\n\nexport const getDeviceLimit = createAsyncThunk(`${sliceName}/getDeviceLimit`, (_, { dispatch }) =>\n GeneralApi.get(`${deviceAuthV2}/limits/max_devices`).then(res => dispatch(actions.setDeviceLimit(res.data.limit)))\n);\n\nexport const setDeviceListState = createAsyncThunk(\n `${sliceName}/setDeviceListState`,\n ({ shouldSelectDevices = true, forceRefresh, fetchAuth = true, ...selectionState }, { dispatch, getState }) => {\n const currentState = getDeviceListState(getState());\n const refreshTrigger = forceRefresh ? !currentState.refreshTrigger : selectionState.refreshTrigger;\n let nextState = {\n ...currentState,\n setOnly: false,\n refreshTrigger,\n ...selectionState,\n sort: { ...currentState.sort, ...selectionState.sort }\n };\n let tasks = [];\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { isLoading: currentLoading, deviceIds: currentDevices, selection: currentSelection, ...currentRequestState } = currentState;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { isLoading: nextLoading, deviceIds: nextDevices, selection: nextSelection, ...nextRequestState } = nextState;\n if (!nextState.setOnly && !deepCompare(currentRequestState, nextRequestState)) {\n const { direction: sortDown = SORTING_OPTIONS.desc, key: sortCol, scope: sortScope } = nextState.sort ?? {};\n const sortBy = sortCol ? [{ attribute: sortCol, order: sortDown, scope: sortScope }] : undefined;\n const applicableSelectedState = nextState.state === ALL_DEVICE_STATES ? undefined : nextState.state;\n nextState.isLoading = true;\n tasks.push(\n dispatch(getDevicesByStatus({ ...nextState, status: applicableSelectedState, sortOptions: sortBy, fetchAuth }))\n .unwrap()\n .then(results => {\n const { deviceAccu, total } = results[results.length - 1];\n const devicesState = shouldSelectDevices ? { deviceIds: deviceAccu.ids, total, isLoading: false } : { isLoading: false };\n return Promise.resolve(dispatch(actions.setDeviceListState(devicesState)));\n })\n // whatever happens, change \"loading\" back to null\n .catch(() => Promise.resolve({ isLoading: false }))\n );\n }\n tasks.push(dispatch(actions.setDeviceListState(nextState)));\n return Promise.all(tasks);\n }\n);\n\n// get devices from inventory\nexport const getDevicesByStatus = createAsyncThunk(`${sliceName}/getDevicesByStatus`, (options, { dispatch, getState }) => {\n const {\n status,\n fetchAuth = true,\n filterSelection,\n group,\n selectedIssues = [],\n page = defaultPage,\n perPage = defaultPerPage,\n sortOptions = [],\n selectedAttributes = []\n } = options;\n const state = getState();\n const { applicableFilters, filterTerms } = convertDeviceListStateToFilters({\n filters: filterSelection ?? getDeviceFilters(state),\n group: group ?? getSelectedGroup(state),\n groups: state.devices.groups,\n offlineThreshold: state.app.offlineThreshold,\n selectedIssues,\n status\n });\n const attributes = [...defaultAttributes, getIdAttribute(getState()), ...selectedAttributes];\n return GeneralApi.post(getSearchEndpoint(getState()), {\n page,\n per_page: perPage,\n filters: filterTerms,\n sort: sortOptions,\n attributes\n })\n .then(response => {\n const state = getState();\n const deviceAccu = reduceReceivedDevices(response.data, [], state, status);\n let total = !applicableFilters.length ? Number(response.headers[headerNames.total]) : null;\n if (status && state.devices.byStatus[status].total === deviceAccu.ids.length) {\n total = deviceAccu.ids.length;\n }\n let tasks = [dispatch(actions.receivedDevices(deviceAccu.devicesById))];\n if (status) {\n tasks.push(dispatch(actions.setDevicesByStatus({ deviceIds: deviceAccu.ids, status, total })));\n }\n // for each device, get device identity info\n const receivedDevices = Object.values(deviceAccu.devicesById);\n if (receivedDevices.length && fetchAuth) {\n tasks.push(dispatch(getDevicesWithAuth(receivedDevices)));\n }\n tasks.push(Promise.resolve({ deviceAccu, total: Number(response.headers[headerNames.total]) }));\n return Promise.all(tasks);\n })\n .catch(err => commonErrorHandler(err, `${status} devices couldn't be loaded.`, dispatch, commonErrorFallback));\n});\n\nexport const getAllDevicesByStatus = createAsyncThunk(`${sliceName}/getAllDevicesByStatus`, (status, { dispatch, getState }) => {\n const attributes = [...defaultAttributes, getIdAttribute(getState())];\n const getAllDevices = (perPage = MAX_PAGE_SIZE, page = 1, devices = []) =>\n GeneralApi.post(getSearchEndpoint(getState()), {\n page,\n per_page: perPage,\n filters: mapFiltersToTerms([{ key: 'status', value: status, operator: DEVICE_FILTERING_OPTIONS.$eq.key, scope: 'identity' }]),\n attributes\n }).then(res => {\n const state = getState();\n const deviceAccu = reduceReceivedDevices(res.data, devices, state, status);\n dispatch(actions.receivedDevices(deviceAccu.devicesById));\n const total = Number(res.headers[headerNames.total]);\n if (total > state.deployments.deploymentDeviceLimit) {\n return Promise.resolve();\n }\n if (total > perPage * page) {\n return getAllDevices(perPage, page + 1, deviceAccu.ids);\n }\n let tasks = [dispatch(actions.setDevicesByStatus({ deviceIds: deviceAccu.ids, forceUpdate: true, status, total: deviceAccu.ids.length }))];\n if (status === DEVICE_STATES.accepted && deviceAccu.ids.length === total) {\n tasks.push(dispatch(deriveInactiveDevices(deviceAccu.ids)));\n tasks.push(dispatch(deriveReportsData()));\n }\n return Promise.all(tasks);\n });\n return getAllDevices();\n});\n\nexport const searchDevices = createAsyncThunk(`${sliceName}/searchDevices`, (passedOptions = {}, { dispatch, getState }) => {\n const state = getState();\n let options = { ...state.app.searchState, ...passedOptions };\n const { page = defaultPage, searchTerm, sortOptions = [] } = options;\n const { columnSelection = [] } = getUserSettings(state);\n const selectedAttributes = columnSelection.map(column => ({ attribute: column.key, scope: column.scope }));\n const attributes = attributeDuplicateFilter([...defaultAttributes, getIdAttribute(state), ...selectedAttributes], 'attribute');\n return GeneralApi.post(getSearchEndpoint(getState()), {\n page,\n per_page: 10,\n filters: [],\n sort: sortOptions,\n text: searchTerm,\n attributes\n })\n .then(response => {\n const deviceAccu = reduceReceivedDevices(response.data, [], getState());\n return Promise.all([\n dispatch(actions.receivedDevices(deviceAccu.devicesById)),\n Promise.resolve({ deviceIds: deviceAccu.ids, searchTotal: Number(response.headers[headerNames.total]) })\n ]);\n })\n .catch(err => commonErrorHandler(err, `devices couldn't be searched.`, dispatch, commonErrorFallback));\n});\n\nconst ATTRIBUTE_LIST_CUTOFF = 100;\nconst attributeReducer = (attributes = []) =>\n attributes.slice(0, ATTRIBUTE_LIST_CUTOFF).reduce(\n (accu, { name, scope }) => {\n if (!accu[scope]) {\n accu[scope] = [];\n }\n accu[scope].push(name);\n return accu;\n },\n { identity: [], inventory: [], system: [], tags: [] }\n );\n\nexport const getDeviceAttributes = createAsyncThunk(`${sliceName}/getDeviceAttributes`, (_, { dispatch, getState }) =>\n GeneralApi.get(getAttrsEndpoint(getState())).then(({ data }) => {\n // TODO: remove the array fallback once the inventory attributes endpoint is fixed\n const { identity: identityAttributes, inventory: inventoryAttributes, system: systemAttributes, tags: tagAttributes } = attributeReducer(data || []);\n return dispatch(actions.setFilterAttributes({ identityAttributes, inventoryAttributes, systemAttributes, tagAttributes }));\n })\n);\n\nexport const getReportingLimits = createAsyncThunk(`${sliceName}/getReportingLimits`, (_, { dispatch }) =>\n GeneralApi.get(`${reportingApiUrl}/devices/attributes`)\n .catch(err => commonErrorHandler(err, `filterable attributes limit & usage could not be retrieved.`, dispatch, commonErrorFallback))\n .then(({ data }) => {\n const { attributes, count, limit } = data;\n const groupedAttributes = attributeReducer(attributes);\n return Promise.resolve(dispatch(actions.setFilterablesConfig({ count, limit, attributes: groupedAttributes })));\n })\n);\n\nexport const ensureVersionString = (software, fallback) =>\n software.length && software !== 'artifact_name' ? (software.endsWith('.version') ? software : `${software}.version`) : fallback;\n\nconst REPORT_CHART_SIZE_LIMIT = 6;\nconst getSingleReportData = (reportConfig, groups) => {\n const { attribute, group, software = '' } = reportConfig;\n const filters = [{ key: 'status', scope: 'identity', operator: DEVICE_FILTERING_OPTIONS.$eq.key, value: 'accepted' }];\n if (group) {\n const staticGroupFilter = { key: 'group', scope: 'system', operator: DEVICE_FILTERING_OPTIONS.$eq.key, value: group };\n const { cleanedFilters: groupFilters } = getGroupFilters(group, groups);\n filters.push(...(groupFilters.length ? groupFilters : [staticGroupFilter]));\n }\n const aggregationAttribute = ensureVersionString(software, attribute);\n return GeneralApi.post(`${reportingApiUrl}/devices/aggregate`, {\n aggregations: [{ attribute: aggregationAttribute, name: '*', scope: 'inventory', size: REPORT_CHART_SIZE_LIMIT }],\n filters: mapFiltersToTerms(filters)\n }).then(({ data }) => ({ data, reportConfig }));\n};\n\nexport const getReportsData = createAsyncThunk(`${sliceName}/getReportsData`, (_, { dispatch, getState }) => {\n const state = getState();\n const currentUserId = getCurrentUser(state).id;\n const reports =\n getUserSettings(state).reports || getGlobalSettings(state)[`${currentUserId}-reports`] || (Object.keys(getDevicesById(state)).length ? defaultReports : []);\n return Promise.all(reports.map(report => getSingleReportData(report, getState().devices.groups))).then(results => {\n const devicesState = getState().devices;\n const totalDeviceCount = devicesState.byStatus.accepted.total;\n const newReports = results.map(({ data, reportConfig }) => {\n let { items, other_count } = data[0];\n const { attribute, group, software = '' } = reportConfig;\n const dataCount = items.reduce((accu, item) => accu + item.count, 0);\n // the following is needed to show reports including both old (artifact_name) & current style (rootfs-image.version) device software\n const otherCount = !group && (software === rootfsImageVersion || attribute === 'artifact_name') ? totalDeviceCount - dataCount : other_count;\n return { items, otherCount, total: otherCount + dataCount };\n });\n return Promise.resolve(dispatch(actions.setDeviceReports(newReports)));\n });\n});\n\nconst initializeDistributionData = (report, groups, devices, totalDeviceCount) => {\n const { attribute, group = '', software = '' } = report;\n const effectiveAttribute = software ? software : attribute;\n const { deviceIds, total = 0 } = groups[group] || {};\n const relevantDevices = groups[group] ? deviceIds.map(id => devices[id]) : Object.values(devices);\n const distributionByAttribute = relevantDevices.reduce((accu, item) => {\n if (!item.attributes || item.status !== DEVICE_STATES.accepted) return accu;\n if (!accu[item.attributes[effectiveAttribute]]) {\n accu[item.attributes[effectiveAttribute]] = 0;\n }\n accu[item.attributes[effectiveAttribute]] = accu[item.attributes[effectiveAttribute]] + 1;\n return accu;\n }, {});\n const distributionByAttributeSorted = Object.entries(distributionByAttribute).sort((pairA, pairB) => pairB[1] - pairA[1]);\n const items = distributionByAttributeSorted.map(([key, count]) => ({ key, count }));\n const dataCount = items.reduce((accu, item) => accu + item.count, 0);\n // the following is needed to show reports including both old (artifact_name) & current style (rootfs-image.version) device software\n const otherCount = (groups[group] ? total : totalDeviceCount) - dataCount;\n return { items, otherCount, total: otherCount + dataCount };\n};\n\nexport const deriveReportsData = createAsyncThunk(`${sliceName}/deriveReportsData`, (_, { dispatch, getState }) => {\n const state = getState();\n const {\n groups: { byId: groupsById },\n byId,\n byStatus: {\n accepted: { total }\n }\n } = state.devices;\n const reports =\n getUserSettings(state).reports || state.users.globalSettings[`${state.users.currentUser}-reports`] || (Object.keys(byId).length ? defaultReports : []);\n const newReports = reports.map(report => initializeDistributionData(report, groupsById, byId, total));\n return Promise.resolve(dispatch(actions.setDeviceReports(newReports)));\n});\n\nexport const getReportsDataWithoutBackendSupport = createAsyncThunk(`${sliceName}/getReportsDataWithoutBackendSupport`, (_, { dispatch, getState }) =>\n Promise.all([dispatch(getAllDevicesByStatus(DEVICE_STATES.accepted)), dispatch(getGroups()), dispatch(getDynamicGroups())]).then(() => {\n const { dynamic: dynamicGroups, static: staticGroups } = getGroupsSelector(getState());\n return Promise.all([\n ...staticGroups.map(({ groupId }) => dispatch(getAllGroupDevices(groupId))),\n ...dynamicGroups.map(({ groupId }) => dispatch(getAllDynamicGroupDevices(groupId)))\n ]).then(() => dispatch(deriveReportsData()));\n })\n);\n\nexport const getDeviceConnect = createAsyncThunk(`${sliceName}/getDeviceConnect`, (id, { dispatch }) =>\n GeneralApi.get(`${deviceConnect}/devices/${id}`).then(({ data }) =>\n Promise.all([dispatch(actions.receivedDevice({ connect_status: data.status, connect_updated_ts: data.updated_ts, id })), Promise.resolve(data)])\n )\n);\n\nexport const getSessionDetails = createAsyncThunk(`${sliceName}/getSessionDetails`, ({ sessionId, deviceId, userId, startDate, endDate }) => {\n const createdAfter = startDate ? `&created_after=${Math.round(Date.parse(startDate) / 1000)}` : '';\n const createdBefore = endDate ? `&created_before=${Math.round(Date.parse(endDate) / 1000)}` : '';\n const objectSearch = `&object_id=${deviceId}`;\n return GeneralApi.get(`${auditLogsApiUrl}/logs?per_page=500${createdAfter}${createdBefore}&actor_id=${userId}${objectSearch}`).then(\n ({ data: auditLogEntries }) => {\n const { start, end } = auditLogEntries.reduce(\n (accu, item) => {\n if (item.meta?.session_id?.includes(sessionId)) {\n accu.start = new Date(item.action.startsWith('open') ? item.time : accu.start);\n accu.end = new Date(item.action.startsWith('close') ? item.time : accu.end);\n }\n return accu;\n },\n { start: startDate || endDate, end: endDate || startDate }\n );\n return Promise.resolve({ start, end });\n }\n );\n});\n\nexport const getDeviceFileDownloadLink = createAsyncThunk(`${sliceName}/getDeviceFileDownloadLink`, ({ deviceId, path }) =>\n Promise.resolve(`${window.location.origin}${deviceConnect}/devices/${deviceId}/download?path=${encodeURIComponent(path)}`)\n);\n\nexport const deviceFileUpload = createAsyncThunk(`${sliceName}/deviceFileUpload`, ({ deviceId, path, file }, { dispatch }) => {\n let formData = new FormData();\n formData.append('path', path);\n formData.append('file', file);\n const uploadId = uuid();\n const cancelSource = new AbortController();\n return Promise.all([\n dispatch(setSnackbar('Uploading file')),\n dispatch(initUpload({ id: uploadId, upload: { inprogress: true, uploadProgress: 0, cancelSource } })),\n GeneralApi.uploadPut(\n `${deviceConnect}/devices/${deviceId}/upload`,\n formData,\n e => dispatch(uploadProgress({ id: uploadId, progress: progress(e) })),\n cancelSource.signal\n )\n ])\n .then(() => Promise.resolve(dispatch(setSnackbar('Upload successful', TIMEOUTS.fiveSeconds))))\n .catch(err => {\n if (isCancel(err)) {\n return dispatch(setSnackbar('The upload has been cancelled', TIMEOUTS.fiveSeconds));\n }\n return commonErrorHandler(err, `Error uploading file to device.`, dispatch);\n })\n .finally(() => dispatch(cleanUpUpload(uploadId)));\n});\n\nexport const getDeviceAuth = createAsyncThunk(`${sliceName}/getDeviceAuth`, (id, { dispatch }) =>\n dispatch(getDevicesWithAuth([{ id }]))\n .unwrap()\n .then(results => {\n if (results[results.length - 1]) {\n return Promise.resolve(results[results.length - 1][0]);\n }\n return Promise.resolve();\n })\n);\n\nexport const getDevicesWithAuth = createAsyncThunk(`${sliceName}/getDevicesWithAuth`, (devices, { dispatch, getState }) =>\n devices.length\n ? GeneralApi.get(`${deviceAuthV2}/devices?id=${devices.map(device => device.id).join('&id=')}`)\n .then(({ data: receivedDevices }) => {\n const { devicesById } = reduceReceivedDevices(receivedDevices, [], getState());\n return Promise.all([dispatch(actions.receivedDevices(devicesById)), Promise.resolve(receivedDevices)]);\n })\n .catch(err => commonErrorHandler(err, `Error: ${err}`, dispatch))\n : Promise.resolve([[], []])\n);\n\nexport const updateDeviceAuth = createAsyncThunk(`${sliceName}/updateDeviceAuth`, ({ deviceId, authId, status }, { dispatch, getState }) =>\n GeneralApi.put(`${deviceAuthV2}/devices/${deviceId}/auth/${authId}/status`, { status })\n .then(() => Promise.all([dispatch(getDeviceAuth(deviceId)), dispatch(setSnackbar('Device authorization status was updated successfully'))]))\n .catch(err => commonErrorHandler(err, 'There was a problem updating the device authorization status:', dispatch))\n .then(() => Promise.resolve(dispatch(actions.maybeUpdateDevicesByStatus({ deviceId, authId }))))\n .finally(() => dispatch(setDeviceListState({ refreshTrigger: !getDeviceListState(getState()).refreshTrigger })))\n);\n\nexport const updateDevicesAuth = createAsyncThunk(`${sliceName}/updateDevicesAuth`, ({ deviceIds, status }, { dispatch, getState }) => {\n let devices = getDevicesById(getState());\n const deviceIdsWithoutAuth = deviceIds.reduce((accu, id) => (devices[id].auth_sets ? accu : [...accu, { id }]), []);\n return dispatch(getDevicesWithAuth(deviceIdsWithoutAuth)).then(() => {\n devices = getDevicesById(getState());\n // for each device, get id and id of authset & make api call to accept\n // if >1 authset, skip instead\n const deviceAuthUpdates = deviceIds.map(id => {\n const device = devices[id];\n if (device.auth_sets.length !== 1) {\n return Promise.reject();\n }\n // api call device.id and device.authsets[0].id\n return dispatch(updateDeviceAuth({ authId: device.auth_sets[0].id, deviceId: device.id, status }))\n .unwrap()\n .catch(err => commonErrorHandler(err, 'The action was stopped as there was a problem updating a device authorization status: ', dispatch, '', false));\n });\n return Promise.allSettled(deviceAuthUpdates).then(results => {\n const { skipped, count } = results.reduce(\n (accu, item) => {\n if (item.status === 'rejected') {\n accu.skipped = accu.skipped + 1;\n } else {\n accu.count = accu.count + 1;\n }\n return accu;\n },\n { skipped: 0, count: 0 }\n );\n const message = getSnackbarMessage(skipped, count);\n // break if an error occurs, display status up til this point before error message\n return dispatch(setSnackbar(message));\n });\n });\n});\n\nexport const deleteAuthset = createAsyncThunk(`${sliceName}/deleteAuthset`, ({ deviceId, authId }, { dispatch, getState }) =>\n GeneralApi.delete(`${deviceAuthV2}/devices/${deviceId}/auth/${authId}`)\n .then(() => Promise.all([dispatch(setSnackbar('Device authorization status was updated successfully'))]))\n .catch(err => commonErrorHandler(err, 'There was a problem updating the device authorization status:', dispatch))\n .then(() => Promise.resolve(dispatch(actions.maybeUpdateDevicesByStatus({ deviceId, authId }))))\n .finally(() => dispatch(setDeviceListState({ refreshTrigger: !getState().devices.deviceList.refreshTrigger })))\n);\n\nexport const preauthDevice = createAsyncThunk(`${sliceName}/preauthDevice`, (authset, { dispatch }) =>\n GeneralApi.post(`${deviceAuthV2}/devices`, authset)\n .catch(err => {\n if (err.response.status === 409) {\n return Promise.reject('A device with a matching identity data set already exists');\n }\n return commonErrorHandler(err, 'The device could not be added:', dispatch);\n })\n .then(() => Promise.resolve(dispatch(setSnackbar('Device was successfully added to the preauthorization list', TIMEOUTS.fiveSeconds))))\n);\n\nexport const decommissionDevice = createAsyncThunk(`${sliceName}/decommissionDevice`, ({ deviceId, authId }, { dispatch, getState }) =>\n GeneralApi.delete(`${deviceAuthV2}/devices/${deviceId}`)\n .then(() => Promise.resolve(dispatch(setSnackbar('Device was decommissioned successfully'))))\n .catch(err => commonErrorHandler(err, 'There was a problem decommissioning the device:', dispatch))\n .then(() => Promise.resolve(dispatch(actions.maybeUpdateDevicesByStatus({ deviceId, authId }))))\n // trigger reset of device list list!\n .finally(() => dispatch(setDeviceListState({ refreshTrigger: !getState().devices.deviceList.refreshTrigger })))\n);\n\nexport const getDeviceConfig = createAsyncThunk(`${sliceName}/getDeviceConfig`, (deviceId, { dispatch }) =>\n GeneralApi.get(`${deviceConfig}/${deviceId}`)\n .then(({ data }) => Promise.all([dispatch(actions.receivedDevice({ id: deviceId, config: data })), Promise.resolve(data)]))\n .catch(err => {\n // if we get a proper error response we most likely queried a device without an existing config check-in and we can just ignore the call\n if (err.response?.data?.error.status_code !== 404) {\n return commonErrorHandler(err, `There was an error retrieving the configuration for device ${deviceId}.`, dispatch, commonErrorFallback);\n }\n })\n);\n\nexport const setDeviceConfig = createAsyncThunk(`${sliceName}/setDeviceConfig`, ({ deviceId, config }, { dispatch }) =>\n GeneralApi.put(`${deviceConfig}/${deviceId}`, config)\n .catch(err => commonErrorHandler(err, `There was an error setting the configuration for device ${deviceId}.`, dispatch, commonErrorFallback))\n .then(() => Promise.resolve(dispatch(getDeviceConfig(deviceId))))\n);\n\nexport const applyDeviceConfig = createAsyncThunk(\n `${sliceName}/applyDeviceConfig`,\n ({ deviceId, configDeploymentConfiguration, isDefault, config }, { dispatch, getState }) =>\n GeneralApi.post(`${deviceConfig}/${deviceId}/deploy`, configDeploymentConfiguration)\n .catch(err => commonErrorHandler(err, `There was an error deploying the configuration to device ${deviceId}.`, dispatch, commonErrorFallback))\n .then(({ data }) => {\n const device = getDeviceByIdSelector(getState(), deviceId);\n const { canManageUsers } = getUserCapabilities(getState());\n let tasks = [\n dispatch(actions.receivedDevice({ ...device, config: { ...device.config, deployment_id: data.deployment_id } })),\n new Promise(resolve => setTimeout(() => resolve(dispatch(getSingleDeployment(data.deployment_id))), TIMEOUTS.oneSecond))\n ];\n if (isDefault && canManageUsers) {\n const { previous } = getGlobalSettings(getState()).defaultDeviceConfig ?? {};\n tasks.push(dispatch(saveGlobalSettings({ defaultDeviceConfig: { current: config, previous } })));\n }\n return Promise.all(tasks);\n })\n);\n\nexport const setDeviceTags = createAsyncThunk(`${sliceName}/setDeviceTags`, ({ deviceId, tags }, { dispatch }) =>\n // to prevent tag set failures, retrieve the device & use the freshest etag we can get\n Promise.resolve(dispatch(getDeviceById(deviceId))).then(device => {\n const headers = device.etag ? { 'If-Match': device.etag } : {};\n return GeneralApi.put(\n `${inventoryApiUrl}/devices/${deviceId}/tags`,\n Object.entries(tags).map(([name, value]) => ({ name, value })),\n { headers }\n )\n .catch(err => commonErrorHandler(err, `There was an error setting tags for device ${deviceId}.`, dispatch, 'Please check your connection.'))\n .then(() => Promise.all([dispatch(actions.receivedDevice({ ...device, id: deviceId, tags })), dispatch(setSnackbar('Device name changed'))]));\n })\n);\n\nexport const getDeviceTwin = createAsyncThunk(`${sliceName}/getDeviceTwin`, ({ deviceId, integration }, { dispatch, getState }) => {\n let providerResult = {};\n return GeneralApi.get(`${iotManagerBaseURL}/devices/${deviceId}/state`)\n .then(({ data }) => {\n providerResult = { ...data, twinError: '' };\n })\n .catch(err => {\n providerResult = {\n twinError: `There was an error getting the ${EXTERNAL_PROVIDER[integration.provider].twinTitle.toLowerCase()} for device ${deviceId}. ${err}`\n };\n })\n .finally(() => {\n const device = getDeviceByIdSelector(getState(), deviceId);\n Promise.resolve(dispatch(actions.receivedDevice({ ...device, twinsByIntegration: { ...device.twinsByIntegration, ...providerResult } })));\n });\n});\n\nexport const setDeviceTwin = createAsyncThunk(`${sliceName}/setDeviceTwin`, ({ deviceId, integration, settings }, { dispatch, getState }) =>\n GeneralApi.put(`${iotManagerBaseURL}/devices/${deviceId}/state/${integration.id}`, { desired: settings })\n .catch(err =>\n commonErrorHandler(\n err,\n `There was an error updating the ${EXTERNAL_PROVIDER[integration.provider].twinTitle.toLowerCase()} for device ${deviceId}.`,\n dispatch\n )\n )\n .then(() => {\n const device = getDeviceByIdSelector(getState(), deviceId);\n const { twinsByIntegration = {} } = device;\n const { [integration.id]: currentState = {} } = twinsByIntegration;\n return Promise.resolve(\n dispatch(actions.receivedDevice({ ...device, twinsByIntegration: { ...twinsByIntegration, [integration.id]: { ...currentState, desired: settings } } }))\n );\n })\n);\n\nconst prepareSearchArguments = ({ filters, group, state, status }) => {\n const { filterTerms } = convertDeviceListStateToFilters({ filters, group, offlineThreshold: state.app.offlineThreshold, selectedIssues: [], status });\n const { columnSelection = [] } = getUserSettings(state);\n const selectedAttributes = columnSelection.map(column => ({ attribute: column.key, scope: column.scope }));\n const attributes = [...defaultAttributes, getIdAttribute(state), ...selectedAttributes];\n return { attributes, filterTerms };\n};\n\nexport const getSystemDevices = createAsyncThunk(`${sliceName}/getSystemDevices`, (options, { dispatch, getState }) => {\n const { id, page = defaultPage, perPage = defaultPerPage, sortOptions = [] } = options;\n const state = getState();\n const { hasFullFiltering } = getTenantCapabilities(state);\n if (!hasFullFiltering) {\n return Promise.resolve();\n }\n const { attributes: deviceAttributes = {} } = getDeviceByIdSelector(state, id);\n const { mender_gateway_system_id = '' } = deviceAttributes;\n const filters = [\n { ...emptyFilter, key: 'mender_is_gateway', operator: DEVICE_FILTERING_OPTIONS.$ne.key, value: 'true', scope: 'inventory' },\n { ...emptyFilter, key: 'mender_gateway_system_id', value: mender_gateway_system_id, scope: 'inventory' }\n ];\n const { attributes, filterTerms } = prepareSearchArguments({ filters, state });\n return GeneralApi.post(getSearchEndpoint(getState()), {\n page,\n per_page: perPage,\n filters: filterTerms,\n sort: sortOptions,\n attributes\n })\n .catch(err => commonErrorHandler(err, `There was an error getting system devices device ${id}.`, dispatch, 'Please check your connection.'))\n .then(({ data, headers }) => {\n const state = getState();\n const { devicesById, ids } = reduceReceivedDevices(data, [], state);\n const device = {\n ...getDeviceByIdSelector(state, id),\n systemDeviceIds: ids,\n systemDeviceTotal: Number(headers[headerNames.total])\n };\n return Promise.resolve(dispatch(actions.receivedDevices({ ...devicesById, [id]: device })));\n });\n});\n\nexport const getGatewayDevices = createAsyncThunk(`${sliceName}/getGatewayDevices`, (deviceId, { dispatch, getState }) => {\n const state = getState();\n const { attributes = {} } = getDeviceByIdSelector(state, deviceId);\n const { mender_gateway_system_id = '' } = attributes;\n const filters = [\n { ...emptyFilter, key: 'id', operator: DEVICE_FILTERING_OPTIONS.$ne.key, value: deviceId, scope: 'identity' },\n { ...emptyFilter, key: 'mender_is_gateway', value: 'true', scope: 'inventory' },\n { ...emptyFilter, key: 'mender_gateway_system_id', value: mender_gateway_system_id, scope: 'inventory' }\n ];\n const { attributes: attributeSelection, filterTerms } = prepareSearchArguments({ filters, state });\n return GeneralApi.post(getSearchEndpoint(getState()), {\n page: 1,\n per_page: MAX_PAGE_SIZE,\n filters: filterTerms,\n attributes: attributeSelection\n }).then(({ data }) => {\n const { ids } = reduceReceivedDevices(data, [], getState());\n let tasks = ids.map(deviceId => dispatch(getDeviceInfo(deviceId)));\n tasks.push(dispatch(actions.receivedDevice({ id: deviceId, gatewayIds: ids })));\n return Promise.all(tasks);\n });\n});\n\nexport const getDevicesInBounds = createAsyncThunk(`${sliceName}/getDevicesInBounds`, ({ bounds, group }, { dispatch, getState }) => {\n const state = getState();\n const { filterTerms } = convertDeviceListStateToFilters({\n group: group === ALL_DEVICES ? undefined : group,\n groups: state.devices.groups,\n status: DEVICE_STATES.accepted\n });\n return GeneralApi.post(getSearchEndpoint(getState()), {\n page: 1,\n per_page: MAX_PAGE_SIZE,\n filters: filterTerms,\n attributes: geoAttributes,\n geo_bounding_box_filter: {\n geo_bounding_box: {\n location: {\n top_left: { lat: bounds._northEast.lat, lon: bounds._southWest.lng },\n bottom_right: { lat: bounds._southWest.lat, lon: bounds._northEast.lng }\n }\n }\n }\n }).then(({ data }) => {\n const { devicesById } = reduceReceivedDevices(data, [], getState());\n return Promise.resolve(dispatch(actions.receivedDevices(devicesById)));\n });\n});\n","// Copyright 2020 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 { DEVICE_STATES, onboardingSteps as onboardingStepNames, orderedOnboardingSteps as onboardingSteps } from '@northern.tech/store/constants';\nimport { getOnboardingState as getCurrentOnboardingState, getUserCapabilities } from '@northern.tech/store/selectors';\nimport { saveUserSettings } from '@northern.tech/store/thunks';\nimport { getDemoDeviceAddress } from '@northern.tech/utils/helpers';\nimport { createAsyncThunk } from '@reduxjs/toolkit';\nimport Cookies from 'universal-cookie';\n\nimport { actions, sliceName } from '.';\n\nconst cookies = new Cookies();\n\nexport const applyOnboardingFallbacks = progress => {\n const step = onboardingSteps[progress];\n if (step && step.fallbackStep) {\n return step.fallbackStep;\n }\n return progress;\n};\n\nconst determineProgress = (acceptedDevices, pendingDevices, releases, pastDeployments) => {\n const steps = onboardingSteps;\n let progress = -1;\n progress = pendingDevices.length > 1 ? steps.findIndex(step => step === onboardingStepNames.DEVICES_PENDING_ACCEPTING_ONBOARDING) : progress;\n progress = acceptedDevices.length >= 1 ? steps.findIndex(step => step === onboardingStepNames.DEVICES_ACCEPTED_ONBOARDING) : progress;\n progress =\n acceptedDevices.length > 1 && releases.length > 1 && pastDeployments.length > 1\n ? steps.findIndex(step => step === onboardingStepNames.DEPLOYMENTS_PAST_COMPLETED)\n : progress;\n return steps[progress];\n};\n\nconst deductOnboardingState = ({ devicesById, devicesByStatus, onboardingState, pastDeployments, releases, userCapabilities, userId }) => {\n const { canDeploy, canManageDevices, canReadDeployments, canReadDevices, canReadReleases, canUploadReleases } = userCapabilities;\n const userCookie = cookies.get(`${userId}-onboarded`);\n const acceptedDevices = devicesByStatus[DEVICE_STATES.accepted].deviceIds;\n const pendingDevices = devicesByStatus[DEVICE_STATES.pending].deviceIds;\n let deviceType = onboardingState.deviceType ?? [];\n deviceType =\n !deviceType.length && acceptedDevices.length && devicesById[acceptedDevices[0]].hasOwnProperty('attributes')\n ? devicesById[acceptedDevices[0]].attributes.device_type\n : deviceType;\n const progress = applyOnboardingFallbacks(onboardingState.progress || determineProgress(acceptedDevices, pendingDevices, releases, pastDeployments));\n return {\n ...onboardingState,\n complete: !!(\n Boolean(userCookie) ||\n onboardingState.complete ||\n (acceptedDevices.length > 1 && pendingDevices.length > 0 && releases.length > 1 && pastDeployments.length > 1) ||\n (acceptedDevices.length >= 1 && releases.length >= 2 && pastDeployments.length > 2) ||\n (acceptedDevices.length >= 1 && pendingDevices.length > 0 && releases.length >= 2 && pastDeployments.length >= 2) ||\n onboardingSteps.findIndex(step => step === progress) >= onboardingSteps.length - 1 ||\n onboardingState.disable ||\n ![canDeploy, canManageDevices, canReadDeployments, canReadDevices, canReadReleases, canUploadReleases].every(i => i)\n ),\n showTips: onboardingState.showTips != null ? onboardingState.showTips : true,\n deviceType,\n approach: onboardingState.approach || (deviceType.some(type => type.startsWith('qemu')) ? 'virtual' : 'physical'),\n progress\n };\n};\n\nexport const getOnboardingState = createAsyncThunk(`${sliceName}/getOnboardingState`, (_, { dispatch, getState }) => {\n const state = getState();\n let onboardingState = getCurrentOnboardingState(state);\n if (!onboardingState.complete) {\n const userId = state.users.currentUser;\n onboardingState = deductOnboardingState({\n devicesById: state.devices.byId,\n devicesByStatus: state.devices.byStatus,\n onboardingState,\n pastDeployments: state.deployments.byStatus.finished.deploymentIds,\n releases: Object.values(state.releases.byId),\n userCapabilities: getUserCapabilities(state),\n userId\n });\n }\n onboardingState.progress = onboardingState.progress || onboardingStepNames.DASHBOARD_ONBOARDING_START;\n const demoDeviceAddress = `http://${getDemoDeviceAddress(Object.values(state.devices.byId), onboardingState.approach)}`;\n onboardingState.address = state.onboarding.demoArtifactPort ? `${demoDeviceAddress}:${state.onboarding.demoArtifactPort}` : demoDeviceAddress;\n return Promise.all([\n dispatch(actions.setOnboardingComplete(onboardingState.complete)),\n dispatch(actions.setOnboardingState(onboardingState)),\n dispatch(saveUserSettings({ onboarding: onboardingState }))\n ]);\n});\n\nexport const setOnboardingDeviceType = createAsyncThunk(`${sliceName}/setOnboardingDeviceType`, (value, { dispatch }) =>\n Promise.all([dispatch(actions.setOnboardingDeviceType(value)), dispatch(saveUserSettings({ onboarding: { deviceType: value } }))])\n);\n\nexport const setOnboardingApproach = createAsyncThunk(`${sliceName}/setOnboardingApproach`, (value, { dispatch }) =>\n Promise.all([dispatch(actions.setOnboardingApproach(value)), dispatch(saveUserSettings({ onboarding: { approach: value } }))])\n);\n\nexport const setOnboardingComplete = createAsyncThunk(`${sliceName}/setOnboardingComplete`, (value, { dispatch }) => {\n let tasks = [Promise.resolve(dispatch(actions.setOnboardingComplete(value)))];\n if (value) {\n tasks.push(Promise.resolve(dispatch(actions.setShowOnboardingHelp(false))));\n tasks.push(Promise.resolve(dispatch(advanceOnboarding(onboardingStepNames.DEPLOYMENTS_PAST_COMPLETED))));\n }\n return Promise.all(tasks);\n});\n\nexport const setOnboardingCanceled = createAsyncThunk(`${sliceName}/setOnboardingCanceled`, (_, { dispatch }) =>\n Promise.all([\n Promise.resolve(dispatch(actions.setShowOnboardingHelp(false))),\n Promise.resolve(dispatch(actions.setShowDismissOnboardingTipsDialog(false))),\n Promise.resolve(dispatch(actions.setOnboardingComplete(true)))\n ])\n // using DEPLOYMENTS_PAST_COMPLETED to ensure we get the intended onboarding state set after\n // _advancing_ the onboarding progress\n .then(() => dispatch(advanceOnboarding(onboardingStepNames.DEPLOYMENTS_PAST_COMPLETED_FAILURE)))\n);\n\nexport const advanceOnboarding = createAsyncThunk(`${sliceName}/advanceOnboarding`, (stepId, { dispatch, getState }) => {\n const steps = onboardingSteps;\n const progress = steps.findIndex(step => step === getState().onboarding.progress);\n const stepIndex = steps.findIndex(step => step === stepId);\n // if there is no progress set yet, the onboarding state deduction hasn't happened\n // and the subsequent settings persistence would overwrite what we stored\n if (progress > stepIndex || getState().onboarding.progress === null) {\n return;\n }\n const madeProgress = steps[stepIndex + 1];\n const state = { ...getCurrentOnboardingState(getState()), progress: madeProgress };\n state.complete = stepIndex + 1 >= steps.findIndex(step => step === onboardingStepNames.DEPLOYMENTS_PAST_COMPLETED_FAILURE) ? true : state.complete;\n return Promise.all([dispatch(actions.setOnboardingProgress(madeProgress)), dispatch(saveUserSettings({ onboarding: state }))]);\n});\n","// Copyright 2020 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 storeActions from '@northern.tech/store/actions';\nimport Api from '@northern.tech/store/api/general-api';\nimport { Tenant } from '@northern.tech/store/api/types/MenderTypes';\nimport {\n DEVICE_LIST_DEFAULTS,\n SORTING_OPTIONS,\n TENANT_LIST_DEFAULT,\n TIMEOUTS,\n deviceAuthV2,\n headerNames,\n iotManagerBaseURL,\n locations\n} from '@northern.tech/store/constants';\nimport { getCurrentSession, getTenantCapabilities, getTenantsList } from '@northern.tech/store/selectors';\nimport { commonErrorFallback, commonErrorHandler } from '@northern.tech/store/store';\nimport { setFirstLoginAfterSignup } from '@northern.tech/store/thunks';\nimport { deepCompare } from '@northern.tech/utils/helpers';\nimport { createAsyncThunk } from '@reduxjs/toolkit';\nimport { jwtDecode } from 'jwt-decode';\nimport hashString from 'md5';\nimport Cookies from 'universal-cookie';\n\nimport { actions, sliceName } from '.';\nimport { SSO_TYPES, auditLogsApiUrl, ssoIdpApiUrlv1, tenantadmApiUrlv1, tenantadmApiUrlv2 } from './constants';\nimport { getAuditlogState, getOrganization } from './selectors';\n\nconst cookies = new Cookies();\n\nconst { setAnnouncement, setSnackbar } = storeActions;\nconst { page: defaultPage, perPage: defaultPerPage } = DEVICE_LIST_DEFAULTS;\n\nexport const cancelRequest = createAsyncThunk(`${sliceName}/cancelRequest`, (reason, { dispatch, getState }) => {\n const { id: tenantId } = getOrganization(getState());\n return Api.post(`${tenantadmApiUrlv2}/tenants/${tenantId}/cancel`, { reason }).then(() =>\n Promise.resolve(dispatch(setSnackbar({ message: 'Deactivation request was sent successfully', autoHideDuration: TIMEOUTS.fiveSeconds })))\n );\n});\n\nexport const getTargetLocation = key => {\n if (devLocations.includes(window.location.hostname)) {\n return '';\n }\n let subdomainSections = window.location.hostname.substring(0, window.location.hostname.indexOf(locations.us.location)).split('.');\n subdomainSections = subdomainSections.splice(0, subdomainSections.length - 1);\n if (!subdomainSections.find(section => section === key)) {\n subdomainSections = key === locations.us.key ? subdomainSections.filter(section => !locations[section]) : [...subdomainSections, key];\n return `https://${[...subdomainSections, ...locations.us.location.split('.')].join('.')}`;\n }\n return `https://${window.location.hostname}`;\n};\n\nconst devLocations = ['localhost', 'docker.mender.io'];\nexport const createOrganizationTrial = createAsyncThunk(`${sliceName}/createOrganizationTrial`, (data, { dispatch }) => {\n const { key } = locations[data.location];\n const targetLocation = getTargetLocation(key);\n const target = `${targetLocation}${tenantadmApiUrlv2}/tenants/trial`;\n return Api.postUnauthorized(target, data)\n .catch(err => {\n if (err.response.status >= 400 && err.response.status < 500) {\n dispatch(setSnackbar({ message: err.response.data.error, autoHideDuration: TIMEOUTS.fiveSeconds }));\n return Promise.reject(err);\n }\n })\n .then(({ headers }) => {\n cookies.remove('oauth');\n cookies.remove('externalID');\n cookies.remove('email');\n dispatch(setFirstLoginAfterSignup(true));\n return new Promise(resolve =>\n setTimeout(() => {\n window.location.assign(`${targetLocation}${headers.location || ''}`);\n return resolve();\n }, TIMEOUTS.fiveSeconds)\n );\n });\n});\n\nexport const startCardUpdate = createAsyncThunk(`${sliceName}/startCardUpdate`, (_, { dispatch }) =>\n Api.post(`${tenantadmApiUrlv2}/billing/card`)\n .then(({ data }) => {\n dispatch(actions.receiveSetupIntent(data.intent_id));\n return Promise.resolve(data.secret);\n })\n .catch(err => commonErrorHandler(err, `Updating the card failed:`, dispatch))\n);\n\nexport const confirmCardUpdate = createAsyncThunk(`${sliceName}/confirmCardUpdate`, (_, { dispatch, getState }) =>\n Api.post(`${tenantadmApiUrlv2}/billing/card/${getState().organization.intentId}/confirm`)\n .then(() => Promise.all([dispatch(setSnackbar('Payment card was updated successfully')), dispatch(actions.receiveSetupIntent(null))]))\n .catch(err => commonErrorHandler(err, `Updating the card failed:`, dispatch))\n);\n\nexport const getCurrentCard = createAsyncThunk(`${sliceName}/getCurrentCard`, (_, { dispatch }) =>\n Api.get(`${tenantadmApiUrlv2}/billing`).then(res => {\n const { last4, exp_month, exp_year, brand } = res.data.card || {};\n return Promise.resolve(dispatch(actions.receiveCurrentCard({ brand, last4, expiration: { month: exp_month, year: exp_year } })));\n })\n);\n\nexport const startUpgrade = createAsyncThunk(`${sliceName}/startUpgrade`, (tenantId, { dispatch }) =>\n Api.post(`${tenantadmApiUrlv2}/tenants/${tenantId}/upgrade/start`)\n .then(({ data }) => Promise.resolve(data.secret))\n .catch(err => commonErrorHandler(err, `There was an error upgrading your account:`, dispatch))\n);\n\nexport const cancelUpgrade = createAsyncThunk(`${sliceName}/cancelUpgrade`, tenantId => Api.post(`${tenantadmApiUrlv2}/tenants/${tenantId}/upgrade/cancel`));\n\nexport const completeUpgrade = createAsyncThunk(`${sliceName}/completeUpgrade`, ({ tenantId, plan }, { dispatch }) =>\n Api.post(`${tenantadmApiUrlv2}/tenants/${tenantId}/upgrade/complete`, { plan })\n .catch(err => commonErrorHandler(err, `There was an error upgrading your account:`, dispatch))\n .then(() => Promise.resolve(dispatch(getUserOrganization())))\n);\n\nconst prepareAuditlogQuery = ({ startDate, endDate, user: userFilter, type, detail: detailFilter, sort = {} }) => {\n const userId = userFilter?.id || userFilter;\n const detail = detailFilter?.id || detailFilter;\n const createdAfter = startDate ? `&created_after=${Math.round(Date.parse(startDate) / 1000)}` : '';\n const createdBefore = endDate ? `&created_before=${Math.round(Date.parse(endDate) / 1000)}` : '';\n const typeSearch = type ? `&object_type=${type.value}`.toLowerCase() : '';\n const userSearch = userId ? `&actor_id=${userId}` : '';\n const objectSearch = type && detail ? `&${type.queryParameter}=${encodeURIComponent(detail)}` : '';\n const { direction = SORTING_OPTIONS.desc } = sort;\n return `${createdAfter}${createdBefore}${userSearch}${typeSearch}${objectSearch}&sort=${direction}`;\n};\n\nexport const getAuditLogs = createAsyncThunk(`${sliceName}/getAuditLogs`, (selectionState, { dispatch, getState }) => {\n const { page, perPage } = selectionState;\n const { hasAuditlogs } = getTenantCapabilities(getState());\n if (!hasAuditlogs) {\n return Promise.resolve();\n }\n return Api.get(`${auditLogsApiUrl}/logs?page=${page}&per_page=${perPage}${prepareAuditlogQuery(selectionState)}`)\n .then(({ data, headers }) => {\n let total = headers[headerNames.total];\n total = Number(total || data.length);\n return Promise.resolve(dispatch(actions.receiveAuditLogs({ events: data, total })));\n })\n .catch(err => commonErrorHandler(err, `There was an error retrieving audit logs:`, dispatch));\n});\n\nexport const getAuditLogsCsvLink = createAsyncThunk(`${sliceName}/getAuditLogsCsvLink`, (_, { getState }) =>\n Promise.resolve(`${window.location.origin}${auditLogsApiUrl}/logs/export?limit=20000${prepareAuditlogQuery(getAuditlogState(getState()))}`)\n);\n\nexport const setAuditlogsState = createAsyncThunk(`${sliceName}/setAuditlogsState`, (selectionState, { dispatch, getState }) => {\n const currentState = getAuditlogState(getState());\n let nextState = {\n ...currentState,\n ...selectionState,\n sort: { ...currentState.sort, ...selectionState.sort }\n };\n let tasks = [];\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { isLoading: currentLoading, selectedIssue: currentIssue, ...currentRequestState } = currentState;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { isLoading: selectionLoading, selectedIssue: selectionIssue, ...selectionRequestState } = nextState;\n if (!deepCompare(currentRequestState, selectionRequestState)) {\n nextState.isLoading = true;\n tasks.push(dispatch(getAuditLogs(nextState)).finally(() => dispatch(actions.setAuditLogState({ isLoading: false }))));\n }\n tasks.push(dispatch(actions.setAuditLogState(nextState)));\n return Promise.all(tasks);\n});\n\n/*\n Tenant management + Hosted Mender\n*/\nexport const tenantDataDivergedMessage = 'The system detected there is a change in your plan or purchased add-ons. Please log out and log in again';\n\nexport const addTenant = createAsyncThunk(`${sliceName}/createTenant`, (selectionState, { dispatch }) => {\n return Api.post(`${tenantadmApiUrlv2}/tenants`, selectionState)\n .then(() => Promise.all([dispatch(getTenants()), dispatch(setSnackbar('Tenant was created successfully.'))]))\n .catch(err => commonErrorHandler(err, 'There was an error creating tenant', dispatch, commonErrorFallback));\n});\n\nconst tenantListRetrieval = async (config): Promise<[Tenant[], number]> => {\n const { page, perPage } = config;\n const params = new URLSearchParams({ page, per_page: perPage }).toString();\n const tenantList = await Api.get(`${tenantadmApiUrlv2}/tenants?${params}`);\n const totalCount = tenantList.headers[headerNames.total] || TENANT_LIST_DEFAULT.perPage;\n return [tenantList.data, Number(totalCount)];\n};\nexport const getTenants = createAsyncThunk(`${sliceName}/getTenants`, async (_, { dispatch, getState }) => {\n const currentState = getTenantsList(getState());\n const [tenants, pageCount] = await tenantListRetrieval(currentState);\n dispatch(actions.setTenantListState({ ...currentState, total: pageCount, tenants }));\n});\n\nexport const setTenantsListState = createAsyncThunk(`${sliceName}/setTenantsListState`, async (selectionState: any, { dispatch, getState }) => {\n const currentState = getTenantsList(getState());\n const nextState = {\n ...currentState,\n ...selectionState\n };\n if (!deepCompare(currentState, selectionState)) {\n const [tenants, pageCount] = await tenantListRetrieval(nextState);\n return dispatch(actions.setTenantListState({ ...nextState, tenants, total: pageCount }));\n }\n return dispatch(actions.setTenantListState({ ...nextState }));\n});\n\ninterface editTenantBody {\n name: string;\n newLimit: number;\n id: string;\n}\nexport const editTenantDeviceLimit = createAsyncThunk(`${sliceName}/editDeviceLimit`, ({ newLimit, id, name }: editTenantBody, { dispatch }) => {\n return Api.put(`${tenantadmApiUrlv2}/tenants/${id}/child`, { device_limit: newLimit, name })\n .catch(err => commonErrorHandler(err, `Device Limit cannot be changed`, dispatch))\n .then(() => {\n const tasks = [Promise.resolve(dispatch(setSnackbar('Device Limit was changed successfully')))];\n tasks.push(dispatch(getTenants()));\n tasks.push(dispatch(getUserOrganization()));\n return Promise.all(tasks);\n });\n});\nexport const removeTenant = createAsyncThunk(`${sliceName}/editDeviceLimit`, ({ id }: { id: string }, { dispatch }) => {\n return Api.post(`${tenantadmApiUrlv2}/tenants/${id}/remove/start`)\n .catch(err => commonErrorHandler(err, `There was an error removing the tenant`, dispatch))\n .then(() =>\n Promise.all([Promise.resolve(dispatch(setSnackbar('Device Limit was changed successfully'))), dispatch(getTenants()), dispatch(getUserOrganization())])\n );\n});\nexport const getUserOrganization = createAsyncThunk(`${sliceName}/getUserOrganization`, (_, { dispatch, getState }) => {\n return Api.get(`${tenantadmApiUrlv1}/user/tenant`).then(res => {\n let tasks = [dispatch(actions.setOrganization(res.data))];\n const { addons, plan, trial } = res.data;\n const { token } = getCurrentSession(getState());\n const jwt = jwtDecode(token);\n const jwtData = { addons: jwt['mender.addons'], plan: jwt['mender.plan'], trial: jwt['mender.trial'] };\n if (!deepCompare({ addons, plan, trial }, jwtData)) {\n const hash = hashString(tenantDataDivergedMessage);\n cookies.remove(`${jwt.sub}${hash}`);\n tasks.push(dispatch(setAnnouncement(tenantDataDivergedMessage)));\n }\n return Promise.all(tasks);\n });\n});\n\nexport const sendSupportMessage = createAsyncThunk(`${sliceName}/sendSupportMessage`, (content, { dispatch }) =>\n Api.post(`${tenantadmApiUrlv2}/contact/support`, content)\n .catch(err => commonErrorHandler(err, 'There was an error sending your request', dispatch, commonErrorFallback))\n .then(() => Promise.resolve(dispatch(setSnackbar({ message: 'Your request was sent successfully', autoHideDuration: TIMEOUTS.fiveSeconds }))))\n);\n\nexport const requestPlanChange = createAsyncThunk(`${sliceName}/requestPlanChange`, ({ content, tenantId }, { dispatch }) =>\n Api.post(`${tenantadmApiUrlv2}/tenants/${tenantId}/plan`, content)\n .catch(err => commonErrorHandler(err, 'There was an error sending your request', dispatch, commonErrorFallback))\n .then(() => Promise.resolve(dispatch(setSnackbar({ message: 'Your request was sent successfully', autoHideDuration: TIMEOUTS.fiveSeconds }))))\n);\n\nexport const downloadLicenseReport = createAsyncThunk(`${sliceName}/downloadLicenseReport`, (_, { dispatch }) =>\n Api.get(`${deviceAuthV2}/reports/devices`)\n .catch(err => commonErrorHandler(err, 'There was an error downloading the report', dispatch, commonErrorFallback))\n .then(res => res.data)\n);\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport const createIntegration = createAsyncThunk(`${sliceName}/createIntegration`, ({ id, ...integration }, { dispatch }) =>\n Api.post(`${iotManagerBaseURL}/integrations`, integration)\n .catch(err => commonErrorHandler(err, 'There was an error creating the integration', dispatch, commonErrorFallback))\n .then(() => Promise.all([dispatch(setSnackbar('The integration was set up successfully')), dispatch(getIntegrations())]))\n);\n\nexport const changeIntegration = createAsyncThunk(`${sliceName}/changeIntegration`, ({ id, credentials }, { dispatch }) =>\n Api.put(`${iotManagerBaseURL}/integrations/${id}/credentials`, credentials)\n .catch(err => commonErrorHandler(err, 'There was an error updating the integration', dispatch, commonErrorFallback))\n .then(() => Promise.all([dispatch(setSnackbar('The integration was updated successfully')), dispatch(getIntegrations())]))\n);\n\nexport const deleteIntegration = createAsyncThunk(`${sliceName}/deleteIntegration`, ({ id, provider }, { dispatch, getState }) =>\n Api.delete(`${iotManagerBaseURL}/integrations/${id}`, {})\n .catch(err => commonErrorHandler(err, 'There was an error removing the integration', dispatch, commonErrorFallback))\n .then(() => {\n const integrations = getState().organization.externalDeviceIntegrations.filter(item => provider !== item.provider);\n return Promise.all([\n dispatch(setSnackbar('The integration was removed successfully')),\n dispatch(actions.receiveExternalDeviceIntegrations(integrations))\n ]);\n })\n);\n\nexport const getIntegrations = createAsyncThunk(`${sliceName}/getIntegrations`, (_, { dispatch, getState }) =>\n Api.get(`${iotManagerBaseURL}/integrations`)\n .catch(err => commonErrorHandler(err, 'There was an error retrieving the integration', dispatch, commonErrorFallback))\n .then(({ data }) => {\n const existingIntegrations = getState().organization.externalDeviceIntegrations;\n const integrations = data.reduce((accu, item) => {\n const existingIntegration = existingIntegrations.find(integration => item.id === integration.id) ?? {};\n const integration = { ...existingIntegration, ...item };\n accu.push(integration);\n return accu;\n }, []);\n return Promise.resolve(dispatch(actions.receiveExternalDeviceIntegrations(integrations)));\n })\n);\n\nexport const getWebhookEvents = createAsyncThunk(`${sliceName}/getWebhookEvents`, (config = {}, { dispatch, getState }) => {\n const { isFollowUp, page = defaultPage, perPage = defaultPerPage } = config;\n return Api.get(`${iotManagerBaseURL}/events?page=${page}&per_page=${perPage}`)\n .catch(err => commonErrorHandler(err, 'There was an error retrieving activity for this integration', dispatch, commonErrorFallback))\n .then(({ data }) => {\n let tasks = [\n dispatch(\n actions.receiveWebhookEvents({\n value: isFollowUp ? getState().organization.webhooks.events : data,\n total: (page - 1) * perPage + data.length\n })\n )\n ];\n if (data.length >= perPage && !isFollowUp) {\n tasks.push(dispatch(getWebhookEvents({ isFollowUp: true, page: page + 1, perPage: 1 })));\n }\n return Promise.all(tasks);\n });\n});\n\nconst ssoConfigActions = {\n create: { success: 'stored', error: 'storing' },\n edit: { success: 'updated', error: 'updating' },\n read: { success: '', error: 'retrieving' },\n remove: { success: 'removed', error: 'removing' },\n readMultiple: { success: '', error: 'retrieving' }\n};\n\nconst ssoConfigActionErrorHandler = (err, type) => dispatch =>\n commonErrorHandler(err, `There was an error ${ssoConfigActions[type].error} the SSO configuration.`, dispatch, commonErrorFallback);\n\nconst ssoConfigActionSuccessHandler = type => dispatch => dispatch(setSnackbar(`The SSO configuration was ${ssoConfigActions[type].success} successfully`));\n\nexport const storeSsoConfig = createAsyncThunk(`${sliceName}/storeSsoConfig`, ({ config, contentType }, { dispatch }) =>\n Api.post(ssoIdpApiUrlv1, config, { headers: { 'Content-Type': contentType, Accept: 'application/json' } })\n .catch(err => dispatch(ssoConfigActionErrorHandler(err, 'create')))\n .then(() => Promise.all([dispatch(ssoConfigActionSuccessHandler('create')), dispatch(getSsoConfigs())]))\n);\n\nexport const changeSsoConfig = createAsyncThunk(`${sliceName}/changeSsoConfig`, ({ config, contentType }, { dispatch }) =>\n Api.put(`${ssoIdpApiUrlv1}/${config.id}`, config, { headers: { 'Content-Type': contentType, Accept: 'application/json' } })\n .catch(err => dispatch(ssoConfigActionErrorHandler(err, 'edit')))\n .then(() => Promise.all([dispatch(ssoConfigActionSuccessHandler('edit')), dispatch(getSsoConfigs())]))\n);\n\nexport const deleteSsoConfig = createAsyncThunk(`${sliceName}/deleteSsoConfig`, ({ id }, { dispatch, getState }) =>\n Api.delete(`${ssoIdpApiUrlv1}/${id}`)\n .catch(err => dispatch(ssoConfigActionErrorHandler(err, 'remove')))\n .then(() => {\n const configs = getState().organization.ssoConfigs.filter(item => id !== item.id);\n return Promise.all([dispatch(ssoConfigActionSuccessHandler('remove')), dispatch(actions.receiveSsoConfigs(configs))]);\n })\n);\n\nexport const getSsoConfigById = createAsyncThunk(`${sliceName}/getSsoConfigById`, (config, { dispatch }) =>\n Api.get(`${ssoIdpApiUrlv1}/${config.id}`)\n .catch(err => dispatch(ssoConfigActionErrorHandler(err, 'read')))\n .then(({ data, headers }) => {\n const sso = Object.values(SSO_TYPES).find(({ contentType }) => contentType === headers['content-type']);\n return sso ? Promise.resolve({ ...config, config: data, type: sso.id }) : Promise.reject('Unsupported SSO config content type.');\n })\n);\n\nexport const getSsoConfigs = createAsyncThunk(`${sliceName}/getSsoConfigs`, (_, { dispatch }) =>\n Api.get(ssoIdpApiUrlv1)\n .catch(err => dispatch(ssoConfigActionErrorHandler(err, 'readMultiple')))\n .then(({ data }) =>\n Promise.all(data.map(config => dispatch(getSsoConfigById(config)).unwrap()))\n .then(configs => dispatch(actions.receiveSsoConfigs(configs)))\n .catch(err => commonErrorHandler(err, err, dispatch, ''))\n )\n);\n","'use strict';\n\n// Copyright 2019 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 storeActions from '@northern.tech/store/actions';\nimport GeneralApi from '@northern.tech/store/api/general-api';\nimport UsersApi from '@northern.tech/store/api/users-api';\nimport { cleanUp, getSessionInfo, maxSessionAge, setSessionInfo } from '@northern.tech/store/auth';\nimport {\n ALL_RELEASES,\n APPLICATION_JSON_CONTENT_TYPE,\n APPLICATION_JWT_CONTENT_TYPE,\n SSO_TYPES,\n TIMEOUTS,\n apiRoot,\n emptyRole,\n emptyUiPermissions,\n tenantadmApiUrlv2\n} from '@northern.tech/store/constants';\nimport { getOnboardingState, getOrganization, getTooltipsState, getUserSettings as getUserSettingsSelector } from '@northern.tech/store/selectors';\nimport { commonErrorFallback, commonErrorHandler } from '@northern.tech/store/store';\nimport { setOfflineThreshold } from '@northern.tech/store/thunks';\nimport { extractErrorMessage, mergePermissions, preformatWithRequestID } from '@northern.tech/store/utils';\nimport { duplicateFilter, isEmpty } from '@northern.tech/utils/helpers';\nimport { clearAllRetryTimers } from '@northern.tech/utils/retrytimer';\nimport { createAsyncThunk } from '@reduxjs/toolkit';\nimport hashString from 'md5';\nimport Cookies from 'universal-cookie';\n\nimport { actions, sliceName } from '.';\nimport {\n OWN_USER_ID,\n PermissionTypes,\n READ_STATES,\n USER_LOGOUT,\n defaultPermissionSets,\n rolesById as defaultRolesById,\n itemUiPermissionsReducer,\n scopedPermissionAreas,\n settingsKeys,\n twoFAStates,\n uiPermissionsByArea,\n uiPermissionsById,\n useradmApiUrl,\n useradmApiUrlv2\n} from './constants';\nimport { getCurrentUser, getRolesById } from './selectors';\n\nconst cookies = new Cookies();\n\nconst { setAnnouncement, setSnackbar } = storeActions;\n\nconst handleLoginError =\n (err, { token2fa: has2FA, password }, rejectWithValue) =>\n dispatch => {\n const errorText = extractErrorMessage(err);\n const is2FABackend = errorText.includes('2fa');\n if (is2FABackend && !has2FA) {\n return rejectWithValue({ error: '2fa code missing' });\n }\n if (password === undefined) {\n // Enterprise supports two-steps login. On the first step you can enter only email\n // and in case of SSO set up you will receive a redirect URL\n // otherwise you will receive 401 status code and password field will be shown.\n return Promise.reject();\n }\n const twoFAError = is2FABackend ? ' and verification code' : '';\n const errorMessage = `There was a problem logging in. Please check your email${\n twoFAError ? ',' : ' and'\n } password${twoFAError}. If you still have problems, contact an administrator.`;\n // @ts-ignore\n return Promise.reject(dispatch(setSnackbar(preformatWithRequestID(err.response, errorMessage), null, 'Copy to clipboard')));\n };\n\n/*\n User management\n*/\n// @ts-ignore\nexport const loginUser = createAsyncThunk(`${sliceName}/loginUser`, ({ stayLoggedIn, ...userData }, { dispatch, rejectWithValue }) =>\n UsersApi.postLogin(`${useradmApiUrl}/auth/login`, { ...userData, no_expiry: stayLoggedIn })\n .catch(err => {\n cleanUp();\n return Promise.reject(dispatch(handleLoginError(err, userData, rejectWithValue)));\n })\n .then(({ text: response, contentType }) => {\n // If the content type is application/json then backend returned SSO configuration.\n // user should be redirected to the start sso url to finish login process.\n if (contentType.includes(APPLICATION_JSON_CONTENT_TYPE)) {\n const { id, kind } = response;\n const type = kind.split('/')[1];\n const ssoLoginUrl = SSO_TYPES[type].getStartUrl(id);\n window.location.replace(ssoLoginUrl);\n return;\n }\n\n const token = response;\n if (contentType !== APPLICATION_JWT_CONTENT_TYPE || !token) {\n return;\n }\n // save token to local storage & set maxAge if noexpiry checkbox not checked\n let now = new Date();\n now.setSeconds(now.getSeconds() + maxSessionAge);\n const expiresAt = stayLoggedIn ? undefined : now.toISOString();\n setSessionInfo({ token, expiresAt });\n cookies.remove('JWT', { path: '/' });\n // @ts-ignore\n return (\n // @ts-ignore\n Promise.resolve(dispatch(getUser(OWN_USER_ID)))\n // @ts-ignore\n .unwrap()\n .catch(e => {\n cleanUp();\n return Promise.reject(dispatch(setSnackbar(extractErrorMessage(e))));\n })\n .then(() => {\n window.sessionStorage.removeItem('pendings-redirect');\n if (window.location.pathname !== '/ui/') {\n window.location.replace('/ui/');\n }\n return Promise.resolve(dispatch(actions.successfullyLoggedIn({ expiresAt, token })));\n })\n );\n })\n);\n\nexport const logoutUser = createAsyncThunk(`${sliceName}/logoutUser`, (_, { dispatch, getState }) => {\n // @ts-ignore\n if (Object.keys(getState().app.uploadsById).length) {\n return Promise.reject();\n }\n return GeneralApi.post(`${useradmApiUrl}/auth/logout`).finally(() => {\n cleanUp();\n clearAllRetryTimers(setSnackbar);\n return Promise.resolve(dispatch({ type: USER_LOGOUT }));\n });\n});\n\nexport const switchUserOrganization = createAsyncThunk(`${sliceName}/switchUserOrganization`, (tenantId, { getState }) => {\n // @ts-ignore\n if (Object.keys(getState().app.uploadsById).length) {\n return Promise.reject();\n }\n return GeneralApi.get(`${useradmApiUrl}/users/tenants/${tenantId}/token`).then(({ data: token }) => {\n // @ts-ignore\n setSessionInfo({ ...getSessionInfo(), token });\n window.location.reload();\n });\n});\n\nexport const passwordResetStart = createAsyncThunk(`${sliceName}/passwordResetStart`, (email, { dispatch }) =>\n GeneralApi.post(`${useradmApiUrl}/auth/password-reset/start`, { email }).catch(err =>\n commonErrorHandler(err, `The password reset request cannot be processed:`, dispatch, undefined, true)\n )\n);\n// @ts-ignore\nexport const passwordResetComplete = createAsyncThunk(`${sliceName}/passwordResetComplete`, ({ secretHash, newPassword }, { dispatch }) =>\n GeneralApi.post(`${useradmApiUrl}/auth/password-reset/complete`, { secret_hash: secretHash, password: newPassword }).catch((err = {}) => {\n const { error, response = {} } = err;\n let errorMsg = '';\n if (response.status == 400) {\n errorMsg = 'the link you are using expired or the request is not valid, please try again.';\n } else {\n errorMsg = error;\n }\n dispatch(setSnackbar('The password reset request cannot be processed: ' + errorMsg));\n return Promise.reject(err);\n })\n);\n\nexport const verifyEmailStart = createAsyncThunk(`${sliceName}/verifyEmailStart`, (_, { dispatch, getState }) =>\n GeneralApi.post(`${useradmApiUrl}/auth/verify-email/start`, { email: getCurrentUser(getState()).email })\n // @ts-ignore\n .catch(err => commonErrorHandler(err, 'An error occured starting the email verification process:', dispatch))\n // @ts-ignore\n .finally(() => Promise.resolve(dispatch(getUser(OWN_USER_ID))))\n);\n\nexport const verifyEmailComplete = createAsyncThunk(`${sliceName}/verifyEmailComplete`, (secret_hash, { dispatch }) =>\n GeneralApi.post(`${useradmApiUrl}/auth/verify-email/complete`, { secret_hash })\n // @ts-ignore\n .catch(err => commonErrorHandler(err, 'An error occured completing the email verification process:', dispatch))\n // @ts-ignore\n .finally(() => Promise.resolve(dispatch(getUser(OWN_USER_ID))))\n);\n\nexport const verify2FA = createAsyncThunk(`${sliceName}/verify2FA`, (tfaData, { dispatch }) =>\n UsersApi.putVerifyTFA(`${useradmApiUrl}/2faverify`, tfaData)\n // @ts-ignore\n .then(() => Promise.resolve(dispatch(getUser(OWN_USER_ID))))\n .catch(err =>\n commonErrorHandler(err, 'An error occured validating the verification code: failed to verify token, please try again.', dispatch, undefined, true)\n )\n);\n\nexport const getUserList = createAsyncThunk(`${sliceName}/getUserList`, (_, { dispatch }) =>\n GeneralApi.get(`${useradmApiUrl}/users`)\n .then(res => {\n const users = res.data.reduce((accu, item) => {\n accu[item.id] = item;\n return accu;\n }, {});\n return dispatch(actions.receivedUserList(users));\n })\n .catch(err => commonErrorHandler(err, `Users couldn't be loaded.`, dispatch, commonErrorFallback))\n);\n\nexport const getUser = createAsyncThunk(`${sliceName}/getUser`, (id, { dispatch, rejectWithValue }) =>\n GeneralApi.get(`${useradmApiUrl}/users/${id}`)\n .then(({ data: user }) =>\n Promise.all([\n dispatch(actions.receivedUser(user)),\n // @ts-ignore\n dispatch(setHideAnnouncement({ shouldHide: false, userId: user.id })),\n // @ts-ignore\n dispatch(updateUserColumnSettings({ currentUserId: user.id })),\n user\n ])\n )\n .catch(e => rejectWithValue(e))\n);\n// @ts-ignore\nexport const initializeSelf = createAsyncThunk(`${sliceName}/initializeSelf`, (_, { dispatch }) => dispatch(getUser(OWN_USER_ID)));\n// @ts-ignore\nexport const updateUserColumnSettings = createAsyncThunk(`${sliceName}/updateUserColumnSettings`, ({ columns, currentUserId }, { dispatch, getState }) => {\n const userId = currentUserId ?? getCurrentUser(getState()).id;\n const storageKey = `${userId}-column-widths`;\n let customColumns = [];\n if (!columns) {\n try {\n // @ts-ignore\n customColumns = JSON.parse(window.localStorage.getItem(storageKey)) || customColumns;\n } catch {\n // most likely the column info doesn't exist yet or is lost - continue\n }\n } else {\n customColumns = columns;\n }\n window.localStorage.setItem(storageKey, JSON.stringify(customColumns));\n return Promise.resolve(dispatch(actions.setCustomColumns(customColumns)));\n});\n\nconst userActions = {\n add: {\n successMessage: 'The user was added successfully.',\n errorMessage: 'adding'\n },\n create: {\n successMessage: 'The user was created successfully.',\n errorMessage: 'creating'\n },\n edit: {\n successMessage: 'The user has been updated.',\n errorMessage: 'editing'\n },\n remove: {\n successMessage: 'The user was removed from the system.',\n errorMessage: 'removing'\n }\n};\n// @ts-ignore\nconst userActionErrorHandler = (err, type, dispatch) => commonErrorHandler(err, `There was an error ${userActions[type].errorMessage} the user.`, dispatch);\n// @ts-ignore\nexport const createUser = createAsyncThunk(`${sliceName}/createUser`, ({ shouldResetPassword, ...userData }, { dispatch }) =>\n GeneralApi.post(`${useradmApiUrl}/users`, { ...userData, send_reset_password: shouldResetPassword })\n .then(() => Promise.all([dispatch(actions.createdUser(userData)), dispatch(getUserList()), dispatch(setSnackbar(userActions.create.successMessage))]))\n .catch(err => userActionErrorHandler(err, 'create', dispatch))\n);\n\nexport const removeUser = createAsyncThunk(`${sliceName}/removeUser`, (userId, { dispatch }) =>\n // @ts-ignore\n GeneralApi.delete(`${useradmApiUrl}/users/${userId}`)\n .then(() => Promise.all([dispatch(actions.removedUser(userId)), dispatch(getUserList()), dispatch(setSnackbar(userActions.remove.successMessage))]))\n .catch(err => userActionErrorHandler(err, 'remove', dispatch))\n);\n// @ts-ignore\nexport const editUser = createAsyncThunk(`${sliceName}/editUser`, ({ id, ...userData }, { dispatch, getState }) =>\n GeneralApi.put(`${useradmApiUrl}/users/${id}`, userData).then(() =>\n Promise.all([\n dispatch(actions.updatedUser({ ...userData, id: id === OWN_USER_ID ? getCurrentUser(getState()).id : id })),\n dispatch(setSnackbar(userActions.edit.successMessage))\n ])\n )\n);\n\nexport const addUserToCurrentTenant = createAsyncThunk(`${sliceName}/addUserToTenant`, (userId, { dispatch, getState }) => {\n const { id } = getOrganization(getState());\n return (\n GeneralApi.post(`${useradmApiUrl}/users/${userId}/assign`, { tenant_ids: [id] })\n // @ts-ignore\n .catch(err => commonErrorHandler(err, `There was an error adding the user to your organization:`, dispatch))\n .then(() => Promise.all([dispatch(setSnackbar(userActions.add.successMessage)), dispatch(getUserList())]))\n );\n});\n// @ts-ignore\nexport const enableUser2fa = createAsyncThunk(`${sliceName}/enableUser2fa`, (userId = OWN_USER_ID, { dispatch }) =>\n GeneralApi.post(`${useradmApiUrl}/users/${userId}/2fa/enable`)\n // @ts-ignore\n .catch(err => commonErrorHandler(err, `There was an error enabling Two Factor authentication for the user.`, dispatch))\n // @ts-ignore\n .then(() => Promise.resolve(dispatch(getUser(userId))))\n);\n// @ts-ignore\nexport const disableUser2fa = createAsyncThunk(`${sliceName}/disableUser2fa`, (userId = OWN_USER_ID, { dispatch }) =>\n GeneralApi.post(`${useradmApiUrl}/users/${userId}/2fa/disable`)\n // @ts-ignore\n .catch(err => commonErrorHandler(err, `There was an error disabling Two Factor authentication for the user.`, dispatch))\n // @ts-ignore\n .then(() => Promise.resolve(dispatch(getUser(userId))))\n);\n\n/* RBAC related things follow: */\nconst mapHttpPermission = permission =>\n Object.entries(uiPermissionsByArea).reduce(\n (accu, [area, definition]) => {\n const endpointMatches = definition.endpoints.filter(\n endpoint => endpoint.path.test(permission.value) && (endpoint.types.includes(permission.type) || permission.type === PermissionTypes.Any)\n );\n if (permission.value === PermissionTypes.Any || (permission.value.includes(apiRoot) && endpointMatches.length)) {\n // @ts-ignore\n const endpointUiPermission = endpointMatches.reduce((endpointAccu, endpoint) => [...endpointAccu, ...endpoint.uiPermissions], []);\n const collector = (endpointUiPermission || definition.uiPermissions)\n // @ts-ignore\n .reduce((permissionsAccu, uiPermission) => {\n if (permission.type === PermissionTypes.Any || (!endpointMatches.length && uiPermission.verbs.some(verb => verb === permission.type))) {\n permissionsAccu.push(uiPermission.value);\n }\n return permissionsAccu;\n }, [])\n .filter(duplicateFilter);\n if (Array.isArray(accu[area])) {\n accu[area] = [...accu[area], ...collector].filter(duplicateFilter);\n } else {\n accu[area] = mergePermissions(accu[area], { [scopedPermissionAreas[area].excessiveAccessSelector]: collector });\n }\n }\n return accu;\n },\n { ...emptyUiPermissions }\n );\n\nconst permissionActionTypes = {\n any: mapHttpPermission,\n CREATE_DEPLOYMENT: permission =>\n permission.type === PermissionTypes.DeviceGroup\n ? {\n deployments: [uiPermissionsById.deploy.value],\n groups: { [permission.value]: [uiPermissionsById.deploy.value] }\n }\n : {},\n http: mapHttpPermission,\n REMOTE_TERMINAL: permission =>\n permission.type === PermissionTypes.DeviceGroup\n ? {\n groups: { [permission.value]: [uiPermissionsById.connect.value] }\n }\n : {},\n VIEW_DEVICE: permission =>\n permission.type === PermissionTypes.DeviceGroup\n ? {\n groups: { [permission.value]: [uiPermissionsById.read.value] }\n }\n : {}\n};\n\nconst combinePermissions = (existingPermissions, additionalPermissions = {}) =>\n Object.entries(additionalPermissions).reduce((accu, [name, permissions]) => {\n let maybeExistingPermissions = accu[name] || [];\n // @ts-ignore\n accu[name] = [...permissions, ...maybeExistingPermissions].filter(duplicateFilter);\n return accu;\n }, existingPermissions);\n\nconst tryParseCustomPermission = permission => {\n const uiPermissions = permissionActionTypes[permission.action](permission.object);\n const result = mergePermissions({ ...emptyUiPermissions }, uiPermissions);\n return { isCustom: true, permission, result };\n};\n\nconst customPermissionHandler = (accu, permission) => {\n let processor = tryParseCustomPermission(permission);\n return {\n ...accu,\n isCustom: accu.isCustom || processor.isCustom,\n uiPermissions: mergePermissions(accu.uiPermissions, processor.result)\n };\n};\n\nconst mapPermissionSet = (permissionSetName, names, scope, existingGroupsPermissions = {}) => {\n // @ts-ignore\n const permission = Object.values(uiPermissionsById).find(permission => permission.permissionSets[scope] === permissionSetName).value;\n const scopedPermissions = names.reduce((accu, name) => combinePermissions(accu, { [name]: [permission] }), existingGroupsPermissions);\n return Object.entries(scopedPermissions).reduce((accu, [key, permissions]) => ({ ...accu, [key]: deriveImpliedAreaPermissions(scope, permissions) }), {});\n};\n\nconst isEmptyPermissionSet = permissionSet =>\n !Object.values(permissionSet).reduce((accu, permissions) => {\n if (Array.isArray(permissions)) {\n return accu || !!permissions.length;\n }\n return accu || !isEmpty(permissions);\n }, false);\n\nconst parseRolePermissions = ({ permission_sets_with_scope = [], permissions = [] }, permissionSets) => {\n const preliminaryResult = permission_sets_with_scope.reduce(\n (accu, permissionSet) => {\n // @ts-ignore\n let processor = permissionSets[permissionSet.name];\n if (!processor) {\n return accu;\n }\n // @ts-ignore\n const scope = Object.keys(scopedPermissionAreas).find(scope => uiPermissionsByArea[scope].scope === permissionSet.scope?.type);\n if (scope) {\n // @ts-ignore\n const result = mapPermissionSet(permissionSet.name, permissionSet.scope.value, scope, accu.uiPermissions[scope]);\n return { ...accu, uiPermissions: { ...accu.uiPermissions, [scope]: result } };\n } else if (isEmptyPermissionSet(processor.result)) {\n return processor.permissions.reduce(customPermissionHandler, accu);\n }\n return {\n ...accu,\n isCustom: accu.isCustom || processor.isCustom,\n uiPermissions: mergePermissions(accu.uiPermissions, processor.result)\n };\n },\n { isCustom: false, uiPermissions: { ...emptyUiPermissions, groups: {}, releases: {} } }\n );\n return permissions.reduce(customPermissionHandler, preliminaryResult);\n};\n\nexport const normalizeRbacRoles = (roles, rolesById, permissionSets) =>\n roles.reduce(\n (accu, role) => {\n let normalizedPermissions;\n let isCustom = false;\n if (rolesById[role.name]) {\n normalizedPermissions = {\n ...rolesById[role.name].uiPermissions,\n groups: { ...rolesById[role.name].uiPermissions.groups },\n releases: { ...rolesById[role.name].uiPermissions.releases }\n };\n } else {\n const result = parseRolePermissions(role, permissionSets);\n normalizedPermissions = result.uiPermissions;\n isCustom = result.isCustom;\n }\n\n const roleState = accu[role.name] ?? { ...emptyRole };\n accu[role.name] = {\n ...roleState,\n ...role,\n description: roleState.description ? roleState.description : role.description,\n editable: !defaultRolesById[role.name] && !isCustom && (typeof roleState.editable !== 'undefined' ? roleState.editable : true),\n isCustom,\n name: roleState.name ? roleState.name : role.name,\n uiPermissions: normalizedPermissions\n };\n return accu;\n },\n { ...rolesById }\n );\n\nexport const getPermissionSets = createAsyncThunk(`${sliceName}/getPermissionSets`, (_, { dispatch, getState }) =>\n GeneralApi.get(`${useradmApiUrlv2}/permission_sets?per_page=500`)\n .then(({ data }) => {\n const permissionSets = data.reduce(\n (accu, permissionSet) => {\n const permissionSetState = accu[permissionSet.name] ?? {};\n let permissionSetObject = { ...permissionSetState, ...permissionSet };\n permissionSetObject.result = Object.values(uiPermissionsById).reduce(\n (accu, item) =>\n Object.entries(item.permissionSets).reduce((collector, [area, permissionSet]) => {\n if (scopedPermissionAreas[area]) {\n return collector;\n }\n if (permissionSet === permissionSetObject.name) {\n collector[area] = [...collector[area], item.value].filter(duplicateFilter);\n }\n return collector;\n }, accu),\n { ...emptyUiPermissions, ...(permissionSetObject.result ?? {}) }\n );\n const scopes = Object.values(scopedPermissionAreas).reduce((accu, { key, scopeType }) => {\n if (permissionSetObject.supported_scope_types?.includes(key) || permissionSetObject.supported_scope_types?.includes(scopeType)) {\n // @ts-ignore\n accu.push(key);\n }\n return accu;\n }, []);\n permissionSetObject = scopes.reduce((accu, scope) => {\n // @ts-ignore\n accu.result[scope] = mapPermissionSet(permissionSetObject.name, [scopedPermissionAreas[scope].excessiveAccessSelector], scope);\n return accu;\n }, permissionSetObject);\n accu[permissionSet.name] = permissionSetObject;\n return accu;\n },\n // @ts-ignore\n { ...getState().users.permissionSetsById }\n );\n return Promise.all([dispatch(actions.receivedPermissionSets(permissionSets)), permissionSets]);\n })\n .catch(() => console.log('Permission set retrieval failed - likely accessing a non-RBAC backend'))\n);\n\nexport const getRoles = createAsyncThunk(`${sliceName}/getRoles`, (_, { dispatch, getState }) =>\n Promise.all([GeneralApi.get(`${useradmApiUrlv2}/roles?per_page=500`), dispatch(getPermissionSets())])\n // @ts-ignore\n .then(results => {\n if (!results) {\n return Promise.resolve();\n }\n const [{ data: roles }, { payload: permissionSetTasks }] = results;\n // @ts-ignore\n const rolesById = normalizeRbacRoles(roles, getRolesById(getState()), permissionSetTasks[permissionSetTasks.length - 1]);\n return Promise.resolve(dispatch(actions.receivedRoles(rolesById)));\n })\n .catch(() => console.log('Role retrieval failed - likely accessing a non-RBAC backend'))\n);\n\nconst deriveImpliedAreaPermissions = (area, areaPermissions, skipPermissions = []) => {\n const highestAreaPermissionLevelSelected = areaPermissions.reduce(\n (highest, current) => (uiPermissionsById[current].permissionLevel > highest ? uiPermissionsById[current].permissionLevel : highest),\n 1\n );\n return uiPermissionsByArea[area].uiPermissions.reduce((permissions, current) => {\n // @ts-ignore\n if ((current.permissionLevel < highestAreaPermissionLevelSelected || areaPermissions.includes(current.value)) && !skipPermissions.includes(current.value)) {\n permissions.push(current.value);\n }\n return permissions;\n }, []);\n};\n\n/**\n * transforms [{ group: \"groupName\", uiPermissions: [\"read\", \"manage\", \"connect\"] }, ...] to\n * [{ name: \"ReadDevices\", scope: { type: \"DeviceGroups\", value: [\"groupName\", ...] } }, ...]\n */\nconst transformAreaRoleDataToScopedPermissionsSets = (area, areaPermissions, excessiveAccessSelector) => {\n const permissionSetObject = areaPermissions.reduce((accu, { item, uiPermissions }) => {\n // if permission area is release and item is release tag (not all releases) then exclude upload permission as it cannot be applied to tags\n const skipPermissions = scopedPermissionAreas.releases.key === area && item !== ALL_RELEASES ? [uiPermissionsById.upload.value] : [];\n // @ts-ignore\n const impliedPermissions = deriveImpliedAreaPermissions(area, uiPermissions, skipPermissions);\n accu = impliedPermissions.reduce((itemPermissionAccu, impliedPermission) => {\n const permissionSetState = itemPermissionAccu[uiPermissionsById[impliedPermission].permissionSets[area]] ?? {\n type: uiPermissionsByArea[area].scope,\n value: []\n };\n itemPermissionAccu[uiPermissionsById[impliedPermission].permissionSets[area]] = {\n ...permissionSetState,\n value: [...permissionSetState.value, item]\n };\n return itemPermissionAccu;\n }, accu);\n return accu;\n }, {});\n // @ts-ignore\n return Object.entries(permissionSetObject).map(([name, { value, ...scope }]) => {\n if (value.includes(excessiveAccessSelector)) {\n return { name };\n }\n return { name, scope: { ...scope, value: value.filter(duplicateFilter) } };\n });\n};\n\nconst transformRoleDataToRole = (roleData, roleState = {}) => {\n const role = { ...roleState, ...roleData };\n const { description = '', name, uiPermissions = emptyUiPermissions } = role;\n const { maybeUiPermissions, remainderKeys } = Object.entries(emptyUiPermissions).reduce(\n (accu, [key, emptyPermissions]) => {\n if (!scopedPermissionAreas[key]) {\n // @ts-ignore\n accu.remainderKeys.push(key);\n } else if (uiPermissions[key]) {\n accu.maybeUiPermissions[key] = uiPermissions[key].reduce(itemUiPermissionsReducer, emptyPermissions);\n }\n return accu;\n },\n { maybeUiPermissions: {}, remainderKeys: [] }\n );\n const { permissionSetsWithScope, roleUiPermissions } = remainderKeys.reduce(\n (accu, area) => {\n const areaPermissions = role.uiPermissions[area];\n if (!Array.isArray(areaPermissions)) {\n return accu;\n }\n const impliedPermissions = deriveImpliedAreaPermissions(area, areaPermissions);\n // @ts-ignore\n accu.roleUiPermissions[area] = impliedPermissions;\n const mappedPermissions = impliedPermissions.map(uiPermission => ({ name: uiPermissionsById[uiPermission].permissionSets[area] }));\n accu.permissionSetsWithScope.push(...mappedPermissions);\n return accu;\n },\n { permissionSetsWithScope: [{ name: defaultPermissionSets.Basic.name }], roleUiPermissions: {} }\n );\n const scopedPermissionSets = Object.values(scopedPermissionAreas).reduce((accu, { key, excessiveAccessSelector }) => {\n if (!uiPermissions[key]) {\n return accu;\n }\n // @ts-ignore\n accu.push(...transformAreaRoleDataToScopedPermissionsSets(key, uiPermissions[key], excessiveAccessSelector));\n return accu;\n }, []);\n return {\n permissionSetsWithScope: [...permissionSetsWithScope, ...scopedPermissionSets],\n role: {\n ...emptyRole,\n name,\n // @ts-ignore\n description: description ? description : roleState.description,\n uiPermissions: {\n ...emptyUiPermissions,\n ...roleUiPermissions,\n ...maybeUiPermissions\n }\n }\n };\n};\n\nconst roleActions = {\n create: {\n successMessage: 'The role was created successfully.',\n errorMessage: 'creating'\n },\n edit: {\n successMessage: 'The role has been updated.',\n errorMessage: 'editing'\n },\n remove: {\n successMessage: 'The role was deleted successfully.',\n errorMessage: 'removing'\n }\n};\n// @ts-ignore\nconst roleActionErrorHandler = (err, type, dispatch) => commonErrorHandler(err, `There was an error ${roleActions[type].errorMessage} the role.`, dispatch);\n\nexport const createRole = createAsyncThunk(`${sliceName}/createRole`, (roleData, { dispatch }) => {\n const { permissionSetsWithScope, role } = transformRoleDataToRole(roleData);\n return GeneralApi.post(`${useradmApiUrlv2}/roles`, {\n name: role.name,\n description: role.description,\n permission_sets_with_scope: permissionSetsWithScope\n })\n .then(() => Promise.all([dispatch(actions.createdRole(role)), dispatch(getRoles()), dispatch(setSnackbar(roleActions.create.successMessage))]))\n .catch(err => roleActionErrorHandler(err, 'create', dispatch));\n});\n\nexport const editRole = createAsyncThunk(`${sliceName}/editRole`, (roleData, { dispatch, getState }) => {\n // @ts-ignore\n const { permissionSetsWithScope, role } = transformRoleDataToRole(roleData, getRolesById(getState())[roleData.name]);\n return GeneralApi.put(`${useradmApiUrlv2}/roles/${role.name}`, {\n description: role.description,\n name: role.name,\n permission_sets_with_scope: permissionSetsWithScope\n })\n .then(() => Promise.all([dispatch(actions.createdRole(role)), dispatch(getRoles()), dispatch(setSnackbar(roleActions.edit.successMessage))]))\n .catch(err => roleActionErrorHandler(err, 'edit', dispatch));\n});\n\nexport const removeRole = createAsyncThunk(`${sliceName}/removeRole`, (roleId, { dispatch }) =>\n // @ts-ignore\n GeneralApi.delete(`${useradmApiUrlv2}/roles/${roleId}`)\n .then(() => Promise.all([dispatch(actions.removedRole(roleId)), dispatch(getRoles()), dispatch(setSnackbar(roleActions.remove.successMessage))]))\n .catch(err => roleActionErrorHandler(err, 'remove', dispatch))\n);\n\n/*\n Global settings\n*/\nexport const getGlobalSettings = createAsyncThunk(`${sliceName}/getGlobalSettings`, (_, { dispatch }) =>\n GeneralApi.get(`${useradmApiUrl}/settings`).then(({ data: settings, headers: { etag } }) => {\n // @ts-ignore\n window.sessionStorage.setItem(settingsKeys.initialized, true);\n return Promise.all([dispatch(actions.setGlobalSettings(settings)), dispatch(setOfflineThreshold()), etag]);\n })\n);\n\nexport const saveGlobalSettings = createAsyncThunk(\n `${sliceName}/saveGlobalSettings`,\n // @ts-ignore\n ({ beOptimistic = false, notify = false, ...settings }, { dispatch, getState }) => {\n if (!window.sessionStorage.getItem(settingsKeys.initialized) && !beOptimistic) {\n return;\n }\n return dispatch(getGlobalSettings())\n .unwrap()\n .then(result => {\n // @ts-ignore\n let updatedSettings = { ...getState().users.globalSettings, ...settings };\n if (getCurrentUser(getState()).verified) {\n updatedSettings['2fa'] = twoFAStates.enabled;\n } else {\n delete updatedSettings['2fa'];\n }\n let tasks = [dispatch(actions.setGlobalSettings(updatedSettings))];\n const headers = result[result.length - 1] ? { 'If-Match': result[result.length - 1] } : {};\n return GeneralApi.post(`${useradmApiUrl}/settings`, updatedSettings, { headers })\n .then(() => {\n if (notify) {\n // @ts-ignore\n tasks.push(dispatch(setSnackbar('Settings saved successfully')));\n }\n return Promise.all(tasks);\n })\n .catch(err => {\n if (beOptimistic) {\n return Promise.all([tasks]);\n }\n console.log(err);\n // @ts-ignore\n return commonErrorHandler(err, `The settings couldn't be saved.`, dispatch);\n });\n });\n }\n);\n\nexport const getUserSettings = createAsyncThunk(`${sliceName}/getUserSettings`, (_, { dispatch }) =>\n GeneralApi.get(`${useradmApiUrl}/settings/me`).then(({ data: settings, headers: { etag } }) => {\n // @ts-ignore\n window.sessionStorage.setItem(settingsKeys.initialized, true);\n return Promise.all([dispatch(actions.setUserSettings(settings)), etag]);\n })\n);\n// @ts-ignore\nexport const saveUserSettings = createAsyncThunk(`${sliceName}/saveUserSettings`, (settings = { onboarding: {} }, { dispatch, getState }) => {\n if (!getCurrentUser(getState()).id) {\n return Promise.resolve();\n }\n return dispatch(getUserSettings())\n .unwrap()\n .then(result => {\n const userSettings = getUserSettingsSelector(getState());\n const onboardingState = getOnboardingState(getState());\n const tooltipState = getTooltipsState(getState());\n const updatedSettings = {\n ...userSettings,\n // @ts-ignore\n ...settings,\n onboarding: {\n ...onboardingState,\n // @ts-ignore\n ...settings.onboarding\n },\n tooltips: tooltipState\n };\n const headers = result[result.length - 1] ? { 'If-Match': result[result.length - 1] } : {};\n return Promise.all([\n Promise.resolve(dispatch(actions.setUserSettings(updatedSettings))),\n GeneralApi.post(`${useradmApiUrl}/settings/me`, updatedSettings, { headers })\n ]).catch(() => dispatch(actions.setUserSettings(userSettings)));\n });\n});\n\nexport const get2FAQRCode = createAsyncThunk(`${sliceName}/get2FAQRCode`, (_, { dispatch }) =>\n GeneralApi.get(`${useradmApiUrl}/2faqr`).then(res => dispatch(actions.receivedQrCode(res.data.qr)))\n);\n// @ts-ignore\nexport const setHideAnnouncement = createAsyncThunk(`${sliceName}/setHideAnnouncement`, ({ shouldHide, userId }, { dispatch, getState }) => {\n const currentUserId = userId || getCurrentUser(getState()).id;\n // @ts-ignore\n const hash = getState().app.hostedAnnouncement ? hashString(getState().app.hostedAnnouncement) : '';\n const announceCookie = cookies.get(`${currentUserId}${hash}`);\n if (shouldHide || (hash.length && typeof announceCookie !== 'undefined')) {\n cookies.set(`${currentUserId}${hash}`, true, { maxAge: 604800 });\n // @ts-ignore\n return Promise.resolve(dispatch(setAnnouncement()));\n }\n return Promise.resolve();\n});\n\nexport const getTokens = createAsyncThunk(`${sliceName}/getTokens`, (_, { dispatch, getState }) =>\n GeneralApi.get(`${useradmApiUrl}/settings/tokens`).then(({ data: tokens }) => {\n const user = getCurrentUser(getState());\n const updatedUser = {\n ...user,\n tokens\n };\n return Promise.resolve(dispatch(actions.updatedUser(updatedUser)));\n })\n);\n\nconst ONE_YEAR = 31536000;\n// @ts-ignore\nexport const generateToken = createAsyncThunk(`${sliceName}/generateToken`, ({ expiresIn = ONE_YEAR, name }, { dispatch }) =>\n GeneralApi.post(`${useradmApiUrl}/settings/tokens`, { name, expires_in: expiresIn })\n .then(({ data: token }) => Promise.all([dispatch(getTokens()), token]))\n // @ts-ignore\n .catch(err => commonErrorHandler(err, 'There was an error creating the token:', dispatch))\n);\n\nexport const revokeToken = createAsyncThunk(`${sliceName}/revokeToken`, (token, { dispatch }) =>\n // @ts-ignore\n GeneralApi.delete(`${useradmApiUrl}/settings/tokens/${token.id}`).then(() => Promise.resolve(dispatch(getTokens())))\n);\n// @ts-ignore\nexport const setTooltipReadState = createAsyncThunk(`${sliceName}/setTooltipReadState`, ({ persist, ...remainder }, { dispatch }) => {\n let tasks = [dispatch(actions.setTooltipState(remainder))];\n if (persist) {\n // @ts-ignore\n tasks.push(dispatch(saveUserSettings()));\n }\n return Promise.all(tasks);\n});\n// @ts-ignore\nexport const setAllTooltipsReadState = createAsyncThunk(`${sliceName}/toggleHelptips`, ({ readState = READ_STATES.read, tooltips }, { dispatch }) => {\n const updatedTips = tooltips.reduce((accu, id) => ({ ...accu, [id]: { readState } }), {});\n return Promise.resolve(dispatch(actions.setTooltipsState(updatedTips))).then(() => dispatch(saveUserSettings()));\n});\n\ninterface SubmitFeedbackPayload {\n satisfaction: string;\n feedback: string;\n meta?: Record<string, unknown>;\n}\n\nexport const submitFeedback = createAsyncThunk<SubmitFeedbackPayload, SubmitFeedbackPayload>(\n `${sliceName}/submitFeedback`,\n // @ts-ignore\n ({ satisfaction, feedback, ...meta }, { dispatch }) => {\n return GeneralApi.post(`${tenantadmApiUrlv2}/contact/support`, {\n subject: 'feedback submission',\n body: JSON.stringify({ feedback, satisfaction, meta })\n }).then(() => {\n const today = new Date();\n // @ts-ignore\n dispatch(saveUserSettings({ feedbackCollectedAt: today.toISOString().split('T')[0] }));\n setTimeout(() => dispatch(actions.setShowFeedbackDialog(false)), TIMEOUTS.threeSeconds);\n });\n }\n);\n","// Copyright 2019 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 GeneralApi from '@northern.tech/store/api/general-api';\nimport { getOfflineThresholdSettings } from '@northern.tech/store/selectors';\nimport { searchDevices } from '@northern.tech/store/thunks';\nimport { extractErrorMessage, getComparisonCompatibleVersion } from '@northern.tech/store/utils';\nimport { deepCompare } from '@northern.tech/utils/helpers';\nimport { createAsyncThunk } from '@reduxjs/toolkit';\nimport Cookies from 'universal-cookie';\n\nimport { actions, sliceName } from '.';\nimport { getFeatures, getSearchState } from './selectors';\n\nconst cookies = new Cookies();\n\n/*\n General\n*/\nexport const setFirstLoginAfterSignup = createAsyncThunk(`${sliceName}/setFirstLoginAfterSignup`, (firstLoginAfterSignup, { dispatch }) => {\n cookies.set('firstLoginAfterSignup', !!firstLoginAfterSignup, { maxAge: 60, path: '/', domain: '.mender.io', sameSite: false });\n dispatch(actions.setFirstLoginAfterSignup(!!firstLoginAfterSignup));\n});\n\nconst dateFunctionMap = {\n getDays: 'getDate',\n setDays: 'setDate'\n};\nexport const setOfflineThreshold = createAsyncThunk(`${sliceName}/setOfflineThreshold`, (_, { dispatch, getState }) => {\n const { interval, intervalUnit } = getOfflineThresholdSettings(getState());\n const today = new Date();\n const intervalName = `${intervalUnit.charAt(0).toUpperCase()}${intervalUnit.substring(1)}`;\n const setter = dateFunctionMap[`set${intervalName}`] ?? `set${intervalName}`;\n const getter = dateFunctionMap[`get${intervalName}`] ?? `get${intervalName}`;\n today[setter](today[getter]() - interval);\n let value;\n try {\n value = today.toISOString();\n } catch {\n return Promise.resolve(dispatch(actions.setSnackbar('There was an error saving the offline threshold, please check your settings.')));\n }\n return Promise.resolve(dispatch(actions.setOfflineThreshold(value)));\n});\n\nconst versionRegex = new RegExp(/\\d+\\.\\d+/);\nconst getLatestRelease = thing => {\n const latestKey = Object.keys(thing)\n .filter(key => versionRegex.test(key))\n .sort()\n .reverse()[0];\n return thing[latestKey];\n};\n\nconst repoKeyMap = {\n integration: 'Integration',\n mender: 'Mender-Client',\n 'mender-artifact': 'Mender-Artifact'\n};\n\nconst deductSaasState = (latestRelease, guiTags, saasReleases) => {\n const latestGuiTag = guiTags.length ? guiTags[0].name : '';\n const latestSaasRelease = latestGuiTag.startsWith('saas-v') ? { date: latestGuiTag.split('-v')[1].replaceAll('.', '-'), tag: latestGuiTag } : saasReleases[0];\n return latestSaasRelease.date > latestRelease.release_date ? latestSaasRelease.tag : latestRelease.release;\n};\n\nexport const getLatestReleaseInfo = createAsyncThunk(`${sliceName}/getLatestReleaseInfo`, (_, { dispatch, getState }) => {\n if (!getFeatures(getState()).isHosted) {\n return Promise.resolve();\n }\n return Promise.all([GeneralApi.get('/versions.json'), GeneralApi.get('/tags.json')])\n .catch(err => {\n console.log('init error:', extractErrorMessage(err));\n return Promise.resolve([{ data: {} }, { data: [] }]);\n })\n .then(([{ data }, { data: guiTags }]) => {\n if (!guiTags.length) {\n return Promise.resolve();\n }\n const { releases, saas } = data;\n const latestRelease = getLatestRelease(getLatestRelease(releases));\n const { latestRepos, latestVersions } = latestRelease.repos.reduce(\n (accu, item) => {\n if (repoKeyMap[item.name]) {\n accu.latestVersions[repoKeyMap[item.name]] = getComparisonCompatibleVersion(item.version);\n }\n accu.latestRepos[item.name] = getComparisonCompatibleVersion(item.version);\n return accu;\n },\n { latestVersions: { ...getState().app.versionInformation }, latestRepos: {} }\n );\n const info = deductSaasState(latestRelease, guiTags, saas);\n return Promise.resolve(\n dispatch(\n actions.setVersionInformation({\n ...latestVersions,\n backend: info,\n GUI: info,\n latestRelease: {\n releaseDate: latestRelease.release_date,\n repos: latestRepos\n }\n })\n )\n );\n });\n});\n\nexport const setSearchState = createAsyncThunk(`${sliceName}/setSearchState`, (searchState, { dispatch, getState }) => {\n const currentState = getSearchState(getState());\n let nextState = {\n ...currentState,\n ...searchState,\n sort: {\n ...currentState.sort,\n ...searchState.sort\n }\n };\n let tasks = [];\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { isSearching: currentSearching, deviceIds: currentDevices, searchTotal: currentTotal, ...currentRequestState } = currentState;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { isSearching: nextSearching, deviceIds: nextDevices, searchTotal: nextTotal, ...nextRequestState } = nextState;\n if (nextRequestState.searchTerm && !deepCompare(currentRequestState, nextRequestState)) {\n nextState.isSearching = true;\n tasks.push(\n dispatch(searchDevices(nextState))\n .unwrap()\n .then(results => {\n const searchResult = results[results.length - 1];\n return dispatch(actions.setSearchState({ ...searchResult, isSearching: false }));\n })\n .catch(() => dispatch(actions.setSearchState({ isSearching: false, searchTotal: 0 })))\n );\n }\n tasks.push(dispatch(actions.setSearchState(nextState)));\n return Promise.all(tasks);\n});\n"],"mappings":"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","names":["pluralize","getDeploymentsByStatus","sliceName","actions","getDeviceById","deepCompare","createAsyncThunk","setSnackbar","defaultPage","defaultPerPage","getGroups","createAsyncThunk","sliceName","actions","pluralize","getDeviceById","deepCompare","state","deviceId","createAsyncThunk","progress","getOnboardingState","createAsyncThunk","sliceName","actions","deepCompare","createAsyncThunk","Cookies","cookies","Cookies","setSnackbar","defaultPage","defaultPerPage","createAsyncThunk","sliceName","actions","deepCompare","integration","isEmpty","createAsyncThunk","hashString","Cookies","cookies","Cookies","setAnnouncement","setSnackbar","createAsyncThunk","sliceName","actions","permission","isEmpty","scope","rolesById","accu","permissionSet","getGlobalSettings","getUserSettings","hashString","deepCompare","createAsyncThunk","Cookies","cookies","Cookies","createAsyncThunk","deepCompare"]}