@northern.tech/store 0.39.0 → 0.41.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (134) hide show
  1. package/dist/api/general-api.cjs +1 -1
  2. package/dist/api/general-api.js +1 -1
  3. package/dist/appSlice/index.js +1 -1
  4. package/dist/appSlice/selectors.d.cts +1 -1
  5. package/dist/appSlice/selectors.d.ts +1 -1
  6. package/dist/appSlice/thunks.d.cts +1 -1
  7. package/dist/appSlice/thunks.d.ts +1 -1
  8. package/dist/auth.cjs +1 -1
  9. package/dist/auth.js +1 -1
  10. package/dist/commonConstants.cjs +1 -1
  11. package/dist/commonConstants.js +1 -1
  12. package/dist/commonSelectors.cjs +1 -1
  13. package/dist/commonSelectors.d.cts +1 -1
  14. package/dist/commonSelectors.d.ts +1 -1
  15. package/dist/commonSelectors.js +1 -1
  16. package/dist/constants-CNZ5L0A0.cjs +957 -0
  17. package/dist/constants-CNZ5L0A0.cjs.map +1 -0
  18. package/dist/constants-Cj2kp3Iy.js +676 -0
  19. package/dist/constants-Cj2kp3Iy.js.map +1 -0
  20. package/dist/{constants-BwKiHHaB.d.ts → constants-D9o0Cnk_.d.cts} +2 -1
  21. package/dist/{constants-BwKiHHaB.d.cts → constants-D9o0Cnk_.d.ts} +2 -1
  22. package/dist/constants.cjs +48 -718
  23. package/dist/constants.d.cts +1 -1
  24. package/dist/constants.d.ts +1 -1
  25. package/dist/constants.js +1 -672
  26. package/dist/deploymentsSlice/constants.cjs +1 -1
  27. package/dist/deploymentsSlice/constants.d.cts +1 -1
  28. package/dist/deploymentsSlice/constants.d.ts +1 -1
  29. package/dist/deploymentsSlice/constants.js +1 -1
  30. package/dist/deploymentsSlice/index.cjs +1 -1
  31. package/dist/deploymentsSlice/index.js +1 -1
  32. package/dist/deploymentsSlice/mocks.cjs +1 -1
  33. package/dist/deploymentsSlice/mocks.cjs.map +1 -1
  34. package/dist/deploymentsSlice/mocks.d.cts +1 -1
  35. package/dist/deploymentsSlice/mocks.d.ts +1 -1
  36. package/dist/deploymentsSlice/mocks.js +1 -1
  37. package/dist/deploymentsSlice/mocks.js.map +1 -1
  38. package/dist/deploymentsSlice/selectors.cjs +1 -1
  39. package/dist/deploymentsSlice/selectors.d.cts +1 -1
  40. package/dist/deploymentsSlice/selectors.d.ts +1 -1
  41. package/dist/deploymentsSlice/selectors.js +1 -1
  42. package/dist/deploymentsSlice/thunks.d.cts +1 -1
  43. package/dist/deploymentsSlice/thunks.d.ts +1 -1
  44. package/dist/devicesSlice/constants.cjs +1 -1
  45. package/dist/devicesSlice/constants.js +1 -1
  46. package/dist/devicesSlice/index.js +1 -1
  47. package/dist/devicesSlice/mocks.js +1 -1
  48. package/dist/devicesSlice/selectors.cjs +1 -1
  49. package/dist/devicesSlice/selectors.d.cts +1 -1
  50. package/dist/devicesSlice/selectors.d.ts +1 -1
  51. package/dist/devicesSlice/selectors.js +1 -1
  52. package/dist/devicesSlice/thunks.d.cts +3 -3
  53. package/dist/devicesSlice/thunks.d.ts +3 -3
  54. package/dist/liststatehook.cjs +2 -1
  55. package/dist/liststatehook.cjs.map +1 -1
  56. package/dist/liststatehook.js +2 -1
  57. package/dist/liststatehook.js.map +1 -1
  58. package/dist/locationutils.cjs +1 -1
  59. package/dist/locationutils.js +1 -1
  60. package/dist/monitorSlice/index.js +1 -1
  61. package/dist/monitorSlice/mocks.js +1 -1
  62. package/dist/monitorSlice/selectors.d.cts +1 -1
  63. package/dist/monitorSlice/selectors.d.ts +1 -1
  64. package/dist/monitorSlice/thunks.cjs +1 -1
  65. package/dist/monitorSlice/thunks.cjs.map +1 -1
  66. package/dist/monitorSlice/thunks.d.cts +1 -1
  67. package/dist/monitorSlice/thunks.d.ts +1 -1
  68. package/dist/monitorSlice/thunks.js +1 -1
  69. package/dist/monitorSlice/thunks.js.map +1 -1
  70. package/dist/onboardingSlice/selectors.d.cts +1 -1
  71. package/dist/onboardingSlice/selectors.d.ts +1 -1
  72. package/dist/onboardingSlice/thunks.d.cts +1 -1
  73. package/dist/onboardingSlice/thunks.d.ts +1 -1
  74. package/dist/organizationSlice/constants.cjs +1 -1
  75. package/dist/organizationSlice/constants.js +1 -1
  76. package/dist/organizationSlice/index.cjs +1 -1
  77. package/dist/organizationSlice/index.js +1 -1
  78. package/dist/organizationSlice/mocks.js +1 -1
  79. package/dist/organizationSlice/selectors.cjs +1 -1
  80. package/dist/organizationSlice/selectors.d.cts +1 -1
  81. package/dist/organizationSlice/selectors.d.ts +1 -1
  82. package/dist/organizationSlice/selectors.js +1 -1
  83. package/dist/organizationSlice/thunks.d.cts +1 -1
  84. package/dist/organizationSlice/thunks.d.ts +1 -1
  85. package/dist/releasesSlice/index.js +1 -1
  86. package/dist/releasesSlice/mocks.js +1 -1
  87. package/dist/releasesSlice/selectors.d.cts +1 -1
  88. package/dist/releasesSlice/selectors.d.ts +1 -1
  89. package/dist/releasesSlice/thunks.cjs +6 -4
  90. package/dist/releasesSlice/thunks.cjs.map +1 -1
  91. package/dist/releasesSlice/thunks.d.cts +1 -1
  92. package/dist/releasesSlice/thunks.d.ts +1 -1
  93. package/dist/releasesSlice/thunks.js +6 -4
  94. package/dist/releasesSlice/thunks.js.map +1 -1
  95. package/dist/sockethook.cjs +1 -1
  96. package/dist/sockethook.js +1 -1
  97. package/dist/{store-xV2zaXAc.d.cts → store-B5-0USDz.d.cts} +3 -3
  98. package/dist/{store-BzrMxxAO.d.ts → store-CmiiLjxd.d.ts} +3 -3
  99. package/dist/store.cjs +1 -1
  100. package/dist/store.d.cts +1 -1
  101. package/dist/store.d.ts +1 -1
  102. package/dist/store.js +1 -1
  103. package/dist/storehooks.cjs +1 -1
  104. package/dist/storehooks.d.cts +1 -1
  105. package/dist/storehooks.d.ts +1 -1
  106. package/dist/storehooks.js +1 -1
  107. package/dist/thunks.cjs +57 -40
  108. package/dist/thunks.cjs.map +1 -1
  109. package/dist/thunks.d.cts +2 -2
  110. package/dist/thunks.d.ts +2 -2
  111. package/dist/thunks.js +54 -41
  112. package/dist/thunks.js.map +1 -1
  113. package/dist/usersSlice/constants.cjs +1 -1
  114. package/dist/usersSlice/constants.js +1 -1
  115. package/dist/usersSlice/index.cjs +1 -1
  116. package/dist/usersSlice/index.js +1 -1
  117. package/dist/usersSlice/mocks.js +1 -1
  118. package/dist/usersSlice/selectors.cjs +1 -1
  119. package/dist/usersSlice/selectors.d.cts +1 -1
  120. package/dist/usersSlice/selectors.d.ts +1 -1
  121. package/dist/usersSlice/selectors.js +1 -1
  122. package/dist/usersSlice/thunks.cjs +4 -0
  123. package/dist/usersSlice/thunks.d.cts +43 -3
  124. package/dist/usersSlice/thunks.d.ts +43 -3
  125. package/dist/usersSlice/thunks.js +2 -2
  126. package/dist/utils.cjs +11 -21
  127. package/dist/utils.cjs.map +1 -1
  128. package/dist/utils.d.cts +1 -1
  129. package/dist/utils.d.ts +1 -1
  130. package/dist/utils.js +11 -21
  131. package/dist/utils.js.map +1 -1
  132. package/package.json +3 -3
  133. package/dist/constants.cjs.map +0 -1
  134. package/dist/constants.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"thunks.cjs","names":["cookies","Cookies","createAppAsyncThunk","actions","getOfflineThresholdSettings","getSearchState","storeActions","defaultPage","defaultPerPage","DEVICE_LIST_DEFAULTS","deploymentPrototype","mapTermsToFilters","createAppAsyncThunk","sliceName","SORTING_OPTIONS","getIdAttribute","GeneralApi","deploymentsApiUrlV2","headerNames","actions","DEPLOYMENT_TYPES","stripUndefined","deploymentsApiUrl","getDeploymentsByStatusSelector","getGlobalSettings","getOrganization","commonErrorHandler","setSnackbar","TIMEOUTS","getUserCapabilities","standardizePhases","getDevicesById","DEPLOYMENT_ROUTES","DEPLOYMENT_STATES","getDeploymentsById","apiRoot","storeActions","defaultPage","defaultPerPage","DEVICE_LIST_DEFAULTS","rootfsImageVersion","createAppAsyncThunk","sliceName","GeneralApi","inventoryApiUrl","getGroupsById","UNGROUPED_GROUP","DEVICE_FILTERING_OPTIONS","actions","setSnackbar","TIMEOUTS","commonErrorHandler","getDeviceReportsForUser","inventoryApiUrlV2","commonErrorFallback","mapTermsToFilters","mapFiltersToTerms","headerNames","filtersFilter","getSelectedGroup","getDeviceByIdSelector","mapDeviceAttributes","DEVICE_STATES","extractErrorMessage","getTenantCapabilities","getUserCapabilities","getDeviceTwinIntegrations","getLatestDeviceAlerts","getDeviceMonitorConfig","deviceAuthV2","getDeviceListState","SORTING_OPTIONS","ALL_DEVICE_STATES","getSelectedDeviceAttribute","convertDeviceListStateToFilters","getDeviceFilters","getIdAttribute","getUserSettings","getDevicesById","getDeviceCountsByStatus","getDeviceReports","getAcceptedDevices","deviceConnect","auditLogsApiUrl","progress","deviceConfig","getGlobalSettings","iotManagerBaseURL","EXTERNAL_PROVIDER","emptyFilter","cookies","Cookies","onboardingSteps","onboardingStepNames","DEVICE_STATES","createAppAsyncThunk","sliceName","getCurrentOnboardingState","getUserCapabilities","actions","Tracking","cookies","Cookies","utc","storeActions","DEVICE_LIST_DEFAULTS","createAppAsyncThunk","sliceName","getOrganization","Api","tenantadmApiUrlv2","setSnackbar","TIMEOUTS","PLANS","ADDONS","locations","actions","commonErrorHandler","SORTING_OPTIONS","getTenantCapabilities","auditLogsApiUrl","headerNames","getAuditlogState","getSpLimits","convertToBackendSPLimits","commonErrorFallback","TENANT_LIST_DEFAULT","getTenantsList","tenantadmApiUrlv1","getCurrentUser","setAnnouncement","parseSubscriptionPreview","deviceAuthV2","iotManagerBaseURL","ssoIdpApiUrlv1","SSO_TYPES","Cookies","storeActions","maxSessionAge","actions","createAppAsyncThunk","sliceName","UsersApi","useradmApiUrl","APPLICATION_JWT_CONTENT_TYPE","APPLICATION_JSON_CONTENT_TYPE","SSO_TYPES","GeneralApi","USER_LOGOUT","getSessionInfo","commonErrorHandler","getCurrentUser","getUsersById","commonErrorFallback","stripUndefined","getOrganization","uiPermissionsByArea","PermissionTypes","apiRoot","duplicateFilter","mergePermissions","scopedPermissionAreas","emptyUiPermissions","uiPermissionsById","emptyRole","defaultRolesById","useradmApiUrlv2","getRolesById","ALL_RELEASES","itemUiPermissionsReducer","defaultPermissionSets","settingsKeys","twoFAStates","getUserSettingsSelector","getOnboardingState","getTooltipsState","getHostedAnnouncement","READ_STATES"],"sources":["../src/appSlice/thunks.ts","../src/deploymentsSlice/thunks.ts","../src/devicesSlice/thunks.ts","../src/onboardingSlice/thunks.ts","../src/organizationSlice/thunks.ts","../src/usersSlice/thunks.ts"],"sourcesContent":["// 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.\nimport { deepCompare } from '@northern.tech/utils/helpers';\nimport Cookies from 'universal-cookie';\n\nimport type { SearchState } from '.';\nimport { actions, sliceName } from '.';\nimport { getOfflineThresholdSettings } from '../selectors';\nimport type { AppDispatch } from '../store';\nimport { createAppAsyncThunk } from '../store';\nimport { searchDevices } from '../thunks';\nimport { getSearchState } from './selectors';\n\nconst cookies = new Cookies();\n\n/*\n General\n*/\nexport const setFirstLoginAfterSignup = createAppAsyncThunk<void, boolean>(`${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 = createAppAsyncThunk(`${sliceName}/setOfflineThreshold`, async (_, { 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: string;\n try {\n value = today.toISOString();\n } catch {\n dispatch(actions.setSnackbar('There was an error saving the offline threshold, please check your settings.'));\n return;\n }\n return dispatch(actions.setOfflineThreshold(value));\n});\n\nexport const setSearchState = createAppAsyncThunk(`${sliceName}/setSearchState`, (searchState: Partial<SearchState>, { dispatch, getState }) => {\n const currentState = getSearchState(getState());\n const nextState = {\n ...currentState,\n ...searchState,\n sort: {\n ...currentState.sort,\n ...searchState.sort\n }\n };\n const tasks: Promise<ReturnType<AppDispatch> | unknown>[] = [];\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(searchResult => dispatch(actions.setSearchState({ ...searchResult, isSearching: false })))\n .catch(() => dispatch(actions.setSearchState({ isSearching: false, searchTotal: 0 })))\n );\n }\n tasks.push(Promise.resolve(dispatch(actions.setSearchState(nextState))));\n return Promise.all(tasks);\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/*eslint import/namespace: ['error', { allowComputed: true }]*/\nimport type {\n DeploymentV1 as BackendDeploymentV1,\n DeploymentV2 as BackendDeploymentV2,\n ConfigurationTenant,\n DeviceWithImage,\n NewDeploymentTypeManagement as NewDeployment,\n NewDeploymentForGroup,\n NewDeploymentV2TypeManagement as NewDeploymentV2\n} from '@northern.tech/types/MenderTypes';\nimport { customSort, deepCompare, isEmpty, standardizePhases } from '@northern.tech/utils/helpers';\nimport Tracking from '@northern.tech/utils/tracking';\nimport validator from 'validator';\n\nimport type {\n Deployment,\n DeploymentByStatus,\n DeploymentByStatusKey,\n DeploymentConfig,\n DeploymentStatus,\n DeviceDeployment,\n SelectionListState,\n SelectionState\n} from '.';\nimport { actions, sliceName } from '.';\nimport storeActions from '../actions';\nimport GeneralApi from '../api/general-api';\nimport { DEVICE_LIST_DEFAULTS, SORTING_OPTIONS, TIMEOUTS, apiRoot, deploymentsApiUrl, deploymentsApiUrlV2, headerNames } from '../constants';\nimport type { SortOptions } from '../constants';\nimport { getDevicesById, getGlobalSettings, getIdAttribute, getOrganization, getUserCapabilities } from '../selectors';\nimport { commonErrorHandler, createAppAsyncThunk } from '../store';\nimport { getDeviceAuth, getDeviceById, saveGlobalSettings } from '../thunks';\nimport { mapTermsToFilters, stripUndefined } from '../utils';\nimport { DEPLOYMENT_ROUTES, DEPLOYMENT_STATES, DEPLOYMENT_TYPES, deploymentPrototype } from './constants';\nimport { getDeploymentsById, getDeploymentsByStatus as getDeploymentsByStatusSelector } from './selectors';\n\nconst { isUUID } = validator;\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 }: Deployment) =>\n group || (groups.length === 1 && !isUUID(name)) ? groups[0] : filter?.name;\n\ntype ReceivedDeployment = BackendDeploymentV1 | BackendDeploymentV2;\n// a deployment name can legitimately contain a bare '%' or an otherwise invalid escape (e.g. a\n// trailing '%2') that decodeURIComponent rejects with a URIError. Falling back to the raw name\n// keeps a single bad name from rejecting getDeploymentsByStatus and breaking the entire list.\nconst decodeDeploymentName = (name: string) => {\n try {\n return decodeURIComponent(name);\n } catch {\n return name;\n }\n};\nexport const transformDeployments = (deployments: ReceivedDeployment[], deploymentsById: Record<string, Deployment>) =>\n deployments.sort(customSort(true, 'created')).reduce<{ deploymentIds: string[]; deployments: Record<string, Deployment> }>(\n (accu, item) => {\n const filter = item.filter;\n let deployment: Deployment = {\n ...deploymentPrototype,\n ...deploymentsById[item.id],\n ...item,\n // TODO: explicitly set filter term types to address scope type mismatch in deployment specs\n // @ts-expect-error: type misalignment in filter terms type\n filter: filter ? { ...filter, name: filter.name ?? filter.id, filters: mapTermsToFilters(filter.terms) } : undefined,\n name: decodeDeploymentName(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 type GetDeploymentsByStatusPayload = Partial<SelectionListState> & {\n group?: string;\n shouldSelect?: boolean;\n sort?: SortOptions;\n status: DeploymentByStatusKey;\n};\nexport const getDeploymentsByStatus = createAppAsyncThunk(\n `${sliceName}/getDeploymentsByStatus`,\n (options: GetDeploymentsByStatusPayload, { dispatch, getState }) => {\n const { status, page = defaultPage, perPage = 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 { attribute, scope } = getIdAttribute(getState());\n const attributeHint = `&id_attribute=${attribute}&id_scope=${scope}`;\n const search = group ? `&name=${group}${attributeHint}` : '';\n const typeFilter = type ? `&type=${type}` : '';\n return GeneralApi.get<BackendDeploymentV1[]>(\n `${deploymentsApiUrlV2}/deployments?status=${status}&per_page=${perPage}&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 const tasks: Promise<unknown>[] = [\n Promise.resolve(dispatch(actions.receivedDeployments(deployments))),\n Promise.resolve(\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 ];\n deploymentIds.forEach(deploymentId => {\n if (deployments[deploymentId].type === DEPLOYMENT_TYPES.configuration) {\n tasks.push(dispatch(getSingleDeployment(deploymentId)).unwrap());\n }\n });\n if (shouldSelect) {\n tasks.push(Promise.resolve(dispatch(actions.selectDeploymentsForStatus({ deploymentIds, status, total }))));\n }\n tasks.push(Promise.resolve({ deploymentIds, total }));\n return Promise.all(tasks);\n });\n }\n);\n\nconst isWithinFirstMonth = (expirationDate?: string) => {\n if (!expirationDate) {\n return false;\n }\n const endOfFirstMonth = new Date(expirationDate);\n endOfFirstMonth.setMonth(endOfFirstMonth.getMonth() - 11);\n return endOfFirstMonth > new Date();\n};\n\nconst trackDeploymentCreation = (totalDeploymentCount: number, hasDeployments: boolean, trial_expiration?: string) => {\n Tracking.event({ category: 'deployments', action: 'create' });\n if (!totalDeploymentCount) {\n if (!hasDeployments) {\n Tracking.event({ category: 'deployments', action: 'create_initial_deployment' });\n if (isWithinFirstMonth(trial_expiration)) {\n Tracking.event({ category: 'deployments', action: 'create_initial_deployment_first_month' });\n }\n }\n Tracking.event({ category: 'deployments', action: 'create_initial_deployment_user' });\n }\n};\n\nconst cleanPhases = (phases?: NewDeployment['phases']) =>\n phases?.map(({ batch_size, batch_size_devices, start_ts }) => stripUndefined({ batch_size, batch_size_devices, start_ts }));\n\nconst MAX_PREVIOUS_PHASES_COUNT = 5;\nexport const createDeployment = createAppAsyncThunk(\n `${sliceName}/createDeployment`,\n ({ newDeployment }: { newDeployment: NewDeployment | (NewDeploymentForGroup & { group: string }) | NewDeploymentV2 }, { dispatch, getState }) => {\n let request;\n const { name, artifact_name, retries, update_control_map, autogenerate_delta } = newDeployment;\n const common = { name, artifact_name, phases: cleanPhases(newDeployment.phases), retries, update_control_map, autogenerate_delta };\n if ('filter_id' in newDeployment && newDeployment.filter_id) {\n const { filter_id, max_devices, uniform_phases } = newDeployment;\n request = GeneralApi.post(\n `${deploymentsApiUrlV2}/deployments`,\n stripUndefined({ ...common, filter_id, max_devices, uniform_phases, phases: uniform_phases ? undefined : common.phases })\n );\n } else if ('group' in newDeployment && newDeployment.group) {\n const { force_installation, group } = newDeployment;\n request = GeneralApi.post(`${deploymentsApiUrl}/deployments/group/${group}`, stripUndefined({ ...common, force_installation }));\n } else {\n const { devices, all_devices, force_installation } = newDeployment as NewDeployment;\n request = GeneralApi.post(`${deploymentsApiUrl}/deployments`, stripUndefined({ ...common, devices, all_devices, force_installation }));\n }\n const totalDeploymentCount = (Object.values(getDeploymentsByStatusSelector(getState())) as DeploymentStatus[]).reduce<number>(\n (accu, item) => accu + item.total,\n 0\n );\n const { hasDeployments } = getGlobalSettings(getState());\n const { trial_expiration } = getOrganization(getState());\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: 'devices' in newDeployment && newDeployment.devices ? newDeployment.devices.map(id => ({ id, status: 'pending' })) : [],\n statistics: { status: {} }\n };\n const tasks: Promise<unknown>[] = [\n Promise.resolve(dispatch(actions.createdDeployment(deployment))),\n dispatch(getSingleDeployment(deploymentId)),\n Promise.resolve(dispatch(setSnackbar({ message: 'Deployment created successfully', autoHideDuration: TIMEOUTS.fiveSeconds })))\n ];\n // track in GA\n trackDeploymentCreation(totalDeploymentCount, hasDeployments, trial_expiration);\n const { canManageUsers } = getUserCapabilities(getState());\n if (canManageUsers) {\n const { phases = [], uniform_phases } = newDeployment as NewDeploymentV2;\n const { previousPhases = [] } = getGlobalSettings(getState());\n const newSettings: any = { hasDeployments: true };\n if (phases) {\n const standardPhases = standardizePhases(uniform_phases ? [uniform_phases] : phases);\n const 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);\n\nexport const getDeploymentDevices = createAppAsyncThunk(\n `${sliceName}/getDeploymentDevices`,\n (options: { id: string; page?: number; perPage?: number }, { dispatch, getState }) => {\n const { id, page = defaultPage, perPage = defaultPerPage } = options;\n return GeneralApi.get<DeviceWithImage[]>(`${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<Record<string, DeviceWithImage>>((accu, item) => {\n accu[item.id] = item;\n const log: boolean = (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 const tasks: Promise<unknown>[] = [\n Promise.resolve(\n dispatch(\n actions.receivedDeploymentDevices({\n id,\n devices,\n selectedDeviceIds,\n totalDeviceCount: Number(response.headers[headerNames.total])\n })\n )\n )\n ];\n const devicesById = getDevicesById(getState());\n // only update those that have changed & lack data\n const lackingData = selectedDeviceIds.reduce<string[]>((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 lackingData.forEach(deviceId => {\n tasks.push(dispatch(getDeviceById(deviceId)).unwrap(), dispatch(getDeviceAuth(deviceId)).unwrap());\n });\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 deployment: Deployment;\n device: DeviceWithImage;\n}): DeviceDeployment => ({\n id,\n release,\n created,\n deleted,\n deviceId,\n finished,\n status,\n log,\n route: Object.values(DEPLOYMENT_ROUTES).reduce<string>((accu, { key, states }) => {\n if (!accu) {\n return (states as readonly string[]).includes(deploymentStatus) ? key : accu;\n }\n return accu;\n }, '')\n});\ntype GetDeviceDeploymentsPayload = {\n deviceId: string;\n filterSelection?: string[];\n page?: number;\n perPage?: number;\n};\n\nexport const getDeviceDeployments = createAppAsyncThunk(`${sliceName}/getDeviceDeployments`, (options: GetDeviceDeploymentsPayload, { 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 = createAppAsyncThunk(`${sliceName}/resetDeviceDeployments`, (deviceId: string, { 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 = createAppAsyncThunk(`${sliceName}/getSingleDeployment`, (id: string, { dispatch, getState }) =>\n GeneralApi.get<BackendDeploymentV1>(`${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 = createAppAsyncThunk(\n `${sliceName}/getDeviceLog`,\n ({ deploymentId, deviceId }: { deploymentId: string; deviceId: string }, { 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 = createAppAsyncThunk(`${sliceName}/abortDeployment`, (deploymentId: string, { dispatch, getState }) =>\n GeneralApi.put(`${deploymentsApiUrl}/deployments/${deploymentId}/status`, { status: 'aborted' })\n .then(() => {\n const deploymentsByStatus: DeploymentByStatus = getDeploymentsByStatusSelector(getState());\n let status: DeploymentByStatusKey = DEPLOYMENT_STATES.pending;\n let index = deploymentsByStatus.pending.deploymentIds.findIndex((id: string) => id === deploymentId);\n if (index < 0) {\n status = DEPLOYMENT_STATES.inprogress;\n index = deploymentsByStatus.inprogress.deploymentIds.findIndex((id: string) => 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<Record<string, Deployment>>((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 = createAppAsyncThunk(\n `${sliceName}/updateDeploymentControlMap`,\n ({ deploymentId, updateControlMap }: { deploymentId: string; updateControlMap: BackendDeploymentV1['update_control_map'] }, { 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\ntype DeepPartial<T> = {\n [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];\n};\n\ntype SetDeploymentsStatePayload = DeepPartial<SelectionState> & { page?: number; perPage?: number };\nexport const setDeploymentsState = createAppAsyncThunk(`${sliceName}/setDeploymentsState`, (selection: SetDeploymentsStatePayload, { 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 const nextState = {\n ...currentState,\n ...selectionState,\n ...Object.keys(DEPLOYMENT_STATES).reduce<Partial<SelectionState>>((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 } as SelectionState;\n const tasks: Promise<unknown>[] = [Promise.resolve(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 = createAppAsyncThunk(`${sliceName}/getDeploymentsConfig`, (_, { dispatch, getState }) =>\n GeneralApi.get<ConfigurationTenant>(`${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 = {} } = binary_delta;\n const { xdelta_args_limits = {} } = binary_delta_limits;\n const config = {\n ...oldConfig,\n hasDelta: Boolean(delta.enabled),\n binaryDelta: {\n ...oldConfig.binaryDelta,\n ...mapExternalDeltaConfig(xdelta_args)\n },\n binaryDeltaLimits: {\n ...oldConfig.binaryDeltaLimits,\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 = <T extends Record<string, any>>(source: T): Partial<T> | undefined =>\n Object.entries(source).reduce<Partial<T> | undefined>((accu, [key, value]) => {\n if (value !== undefined) {\n const 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 } as Partial<T>;\n }\n return accu;\n }, undefined);\n\nexport const saveDeltaDeploymentsConfig = createAppAsyncThunk(\n `${sliceName}/saveDeltaDeploymentsConfig`,\n (config: DeploymentConfig['binaryDelta'], { dispatch, getState }) => {\n const configChange = {\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);\n\nexport const generateDeploymentLogAnalysis = createAppAsyncThunk(\n `${sliceName}/generateDeploymentLogAnalysis`,\n ({ deploymentId, deviceId }: { deploymentId: string; deviceId: string }, { dispatch, rejectWithValue }) =>\n GeneralApi.get<string>(`${apiRoot}/v1alpha1/deployments/deployments/${deploymentId}/devices/${deviceId}/log/explain`, { timeout: 60 * TIMEOUTS.oneSecond })\n .then(({ data: result }) => Promise.resolve(result))\n .catch(err => {\n if (err.response.status === 429) {\n return rejectWithValue(err.response);\n }\n commonErrorHandler(err, 'There was an error analysing the deployment log:', dispatch);\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.\nimport type {\n Attribute,\n Device as BackendDevice,\n Filter as BackendFilter,\n ConnectionState,\n DeviceConfiguration,\n DeviceInventory,\n DeviceState,\n DeviceTierLimits,\n DeviceWithImage,\n Integration,\n ManagementApiConfiguration,\n NewConfigurationDeployment,\n NewConfigurationDeploymentResponse,\n PreAuthSet,\n SortCriteria,\n Status\n} from '@northern.tech/types/MenderTypes';\nimport { attributeDuplicateFilter, dateRangeToUnix, deepCompare } from '@northern.tech/utils/helpers';\nimport { isCancel } from 'axios';\nimport pluralize from 'pluralize';\nimport { v4 as uuid } from 'uuid';\n\nimport type { Device, DeviceFilter, DeviceGroup, DeviceGroups, DeviceListState, DeviceSelectedAttribute } from '.';\nimport { actions, sliceName } from '.';\nimport storeActions from '../actions';\nimport GeneralApi from '../api/general-api';\nimport type { SearchState } from '../appSlice';\nimport {\n ALL_DEVICE_STATES,\n DEVICE_FILTERING_OPTIONS,\n DEVICE_LIST_DEFAULTS,\n DEVICE_STATES,\n EXTERNAL_PROVIDER,\n MAX_PAGE_SIZE,\n SORTING_OPTIONS,\n TIMEOUTS,\n UNGROUPED_GROUP,\n auditLogsApiUrl,\n deviceAuthV2,\n deviceConfig,\n deviceConnect,\n headerNames,\n inventoryApiUrl,\n inventoryApiUrlV2,\n iotManagerBaseURL,\n rootfsImageVersion\n} from '../constants';\nimport type { DeviceAuthState, DeviceIssueOptionKey } from '../constants';\nimport {\n getAcceptedDevices,\n getDeviceReports,\n getDeviceReportsForUser,\n getDeviceTwinIntegrations,\n getGlobalSettings,\n getIdAttribute,\n getSelectedDeviceAttribute,\n getTenantCapabilities,\n getUserCapabilities,\n getUserSettings\n} from '../selectors';\nimport type { AppDispatch, RootState } from '../store';\nimport { commonErrorFallback, commonErrorHandler, createAppAsyncThunk } from '../store';\nimport { getDeviceMonitorConfig, getLatestDeviceAlerts, getSingleDeployment, saveGlobalSettings, saveUserSettings } from '../thunks';\nimport {\n convertDeviceListStateToFilters,\n dispatchDelayed,\n extractErrorMessage,\n filtersFilter,\n mapDeviceAttributes,\n mapFiltersToTerms,\n mapTermsToFilters,\n progress\n} from '../utils';\nimport { emptyFilter } from './constants';\nimport {\n getDeviceById as getDeviceByIdSelector,\n getDeviceCountsByStatus,\n getDeviceFilters,\n getDeviceListState,\n getDevicesById,\n getGroupsById,\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 = createAppAsyncThunk(`${sliceName}/getGroups`, async (_, { dispatch, getState }) => {\n const res = await GeneralApi.get<string[]>(`${inventoryApiUrl}/groups`);\n const state: Record<string, DeviceGroup> = 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: DeviceFilter[] = [{ key: 'group', value: res.data, operator: DEVICE_FILTERING_OPTIONS.$nin.key, scope: 'system' }];\n const [, devicesRetrieval] = await Promise.all([\n dispatch(actions.receivedGroups(groups)),\n dispatch(getDevicesByStatus({ filterSelection: filters, group: '', page: 1, perPage: 1, status: undefined }))\n ]);\n const { total } = (devicesRetrieval?.payload as { total?: number }) ?? {};\n if (!total) {\n return;\n }\n return 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\nexport const addDevicesToGroup = createAppAsyncThunk(\n `${sliceName}/addDevicesToGroup`,\n ({ group, deviceIds, isCreation }: { deviceIds: string[]; group: string; isCreation: boolean }, { 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 = createAppAsyncThunk(\n `${sliceName}/removeDevicesFromGroup`,\n ({ group, deviceIds }: { deviceIds: string[]; group: string }, { dispatch }) =>\n GeneralApi.delete(`${inventoryApiUrl}/groups/${group}/devices`, deviceIds).then(() =>\n Promise.all([\n dispatch(actions.removeFromGroup({ group, deviceIds })),\n dispatch(\n setSnackbar({\n message: `The ${pluralize('devices', deviceIds.length)} ${pluralize('were', deviceIds.length)} removed from the group`,\n autoHideDuration: TIMEOUTS.fiveSeconds\n })\n )\n ])\n )\n);\n\nexport const addStaticGroup = createAppAsyncThunk(\n `${sliceName}/addStaticGroup`,\n ({ group, devices }: { devices: Device[]; group: string }, { 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(async () => {\n await dispatch(setDeviceListState({ setOnly: true })).unwrap();\n await dispatch(getGroups()).unwrap();\n })\n )\n .catch(err => commonErrorHandler(err, `Group could not be updated:`, dispatch))\n);\nexport const removeReportsByGroupName = createAppAsyncThunk(`${sliceName}/removeReportsByGroupName`, (groupName: string, { dispatch, getState }) => {\n if (!groupName) return Promise.resolve();\n const reports = getDeviceReportsForUser(getState());\n const filteredReports = reports.filter(report => report.group !== groupName);\n dispatch(saveUserSettings({ reports: filteredReports }));\n});\n\nexport const removeStaticGroup = createAppAsyncThunk(`${sliceName}/removeStaticGroup`, (groupName: string, { dispatch }) =>\n GeneralApi.delete(`${inventoryApiUrl}/groups/${groupName}`).then(() =>\n Promise.all([\n dispatch(actions.removeGroup(groupName)),\n dispatch(removeReportsByGroupName(groupName)),\n dispatch(getGroups()),\n dispatch(setSnackbar({ message: 'Group was removed successfully', autoHideDuration: TIMEOUTS.fiveSeconds }))\n ])\n )\n);\nexport const getDynamicGroup = createAppAsyncThunk(`${sliceName}/getDynamicGroupById`, (id, { dispatch }) =>\n GeneralApi.get<BackendFilter>(`${inventoryApiUrlV2}/filters/${id}`).catch(err => {\n if (err.response && err.response.status === 404) {\n throw new Error('Request failed with status code 404');\n }\n return commonErrorHandler(err, `Error retrieving the group: `, dispatch, commonErrorFallback);\n })\n);\n\nexport const getDynamicGroups = createAppAsyncThunk(`${sliceName}/getDynamicGroups`, (_, { dispatch, getState }) =>\n GeneralApi.get(`${inventoryApiUrlV2}/filters?per_page=${MAX_PAGE_SIZE}`)\n .then(({ data: filters }) => {\n const state: Record<string, DeviceGroup> = 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 = createAppAsyncThunk(\n `${sliceName}/addDynamicGroup`,\n ({ groupName, filterPredicates }: { filterPredicates: DeviceFilter[]; groupName: string }, { 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(async () => {\n const { cleanedFilters } = getGroupFilters(groupName, getState().devices.groups);\n dispatch(actions.setDeviceFilters(cleanedFilters));\n await dispatch(getDynamicGroups()).unwrap();\n })\n )\n .catch(err => commonErrorHandler(err, `Group could not be updated:`, dispatch))\n);\n\nexport const updateDynamicGroup = createAppAsyncThunk(\n `${sliceName}/updateDynamicGroup`,\n ({ groupName, filterPredicates }: { filterPredicates: DeviceFilter[]; groupName: string }, { dispatch, getState }) => {\n const filterId = getState().devices.groups.byId[groupName].id;\n return GeneralApi.delete(`${inventoryApiUrlV2}/filters/${filterId}`).then(() => dispatch(addDynamicGroup({ groupName, filterPredicates })).unwrap());\n }\n);\n\nexport const removeDynamicGroup = createAppAsyncThunk(`${sliceName}/removeDynamicGroup`, (groupName: string, { dispatch, getState }) => {\n const filterId = getState().devices.groups.byId[groupName].id;\n return GeneralApi.delete(`${inventoryApiUrlV2}/filters/${filterId}`).then(() =>\n Promise.all([\n dispatch(actions.removeGroup(groupName)),\n dispatch(removeReportsByGroupName(groupName)),\n dispatch(setSnackbar({ message: 'Group was removed successfully', autoHideDuration: TIMEOUTS.fiveSeconds }))\n ])\n );\n});\n\n/*\n * Device inventory functions\n */\nconst getGroupFilters = (group: string, groupsState: DeviceGroups, filters: DeviceFilter[] = []) => {\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 = createAppAsyncThunk<unknown, { filters?: DeviceFilter[]; group: string }>(\n `${sliceName}/selectGroup`,\n ({ 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 const tasks: Promise<ReturnType<AppDispatch> | unknown>[] = [];\n if (groupFilterLength) {\n tasks.push(Promise.resolve(dispatch(actions.setDeviceFilters(cleanedFilters))));\n } else {\n tasks.push(Promise.resolve(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(Promise.resolve(dispatch(actions.selectGroup(selectedGroupName))));\n return Promise.all(tasks);\n }\n);\n\nconst getEarliestTs = (dateA = '', dateB = '') => (!dateA || !dateB ? dateA || dateB : dateA < dateB ? dateA : dateB);\n\ntype ReceivedDevice = BackendDevice & DeviceInventory & Omit<DeviceWithImage, 'status'>;\nconst reduceReceivedDevices = (devices: ReceivedDevice[], ids: string[], state: RootState, status?: DeviceAuthState) =>\n devices.reduce(\n (accu, device: any) => {\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 const lastCheckIn = device.check_in_time_exact ?? device.check_in_time_rounded;\n device.isOffline = new Date(lastCheckIn) < new Date(state.app.offlineThreshold) || lastCheckIn === 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 );\ntype getGroupDevicesPayload = {\n group: string;\n page?: number;\n perPage?: number;\n shouldIncludeAllStates: boolean;\n};\nexport const getGroupDevices = createAppAsyncThunk(`${sliceName}/getGroupDevices`, async (options: getGroupDevicesPayload, { dispatch, getState }) => {\n const { group, shouldIncludeAllStates, ...remainder } = options;\n const { cleanedFilters: filterSelection } = getGroupFilters(group, getState().devices.groups);\n const { deviceAccu, total } = await dispatch(\n getDevicesByStatus({\n ...remainder,\n filterSelection,\n group,\n status: shouldIncludeAllStates ? undefined : DEVICE_STATES.accepted\n })\n ).unwrap();\n if (!group) {\n return;\n }\n const stateGroup = getState().devices.groups.byId[group];\n if (!stateGroup && !total && !deviceAccu.ids.length) {\n return;\n }\n return dispatch(\n actions.addGroup({\n group: {\n deviceIds:\n deviceAccu.ids.length === total || (stateGroup && stateGroup.deviceIds && deviceAccu.ids.length > stateGroup.deviceIds.length)\n ? deviceAccu.ids\n : stateGroup.deviceIds,\n total\n },\n groupName: group\n })\n );\n});\n\nexport const getAllGroupDevices = createAppAsyncThunk(\n `${sliceName}/getAllGroupDevices`,\n ({ group, attribute }: { attribute: string; group: string }, { 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: string[] = []) =>\n GeneralApi.post(`${inventoryApiUrlV2}/filters/search`, {\n page,\n per_page: perPage,\n filters: filterTerms,\n attributes: [...attributes, { scope: 'inventory', attribute }]\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);\n\nexport const getAllDynamicGroupDevices = createAppAsyncThunk(\n `${sliceName}/getAllDynamicGroupDevices`,\n ({ group, attribute }: { attribute: string; group: string }, { 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: string[] = []) =>\n GeneralApi.post(`${inventoryApiUrlV2}/filters/search`, {\n page,\n per_page: perPage,\n filters,\n attributes: [...attributes, { scope: 'inventory', attribute }]\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 > 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);\n\nexport const getDeviceById = createAppAsyncThunk(`${sliceName}/getDeviceById`, (id: string, { 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 log: false\n }\n ],\n [],\n getState()\n ).devicesById[id];\n dispatch(actions.receivedDevice(device));\n }\n })\n);\n\nexport const getDeviceInfo = createAppAsyncThunk(`${sliceName}/getDeviceInfo`, (deviceId: string, { dispatch, getState }) => {\n const device = getDeviceByIdSelector(getState(), deviceId) as Device;\n const { hasDeviceConfig, hasDeviceConnect, hasMonitor } = getTenantCapabilities(getState());\n const { canConfigure } = getUserCapabilities(getState());\n const integrations = getDeviceTwinIntegrations(getState());\n // Get full device identity details for single selected device\n const tasks: Promise<ReturnType<AppDispatch> | unknown>[] = [\n dispatch(getDeviceAuth(deviceId)),\n dispatch(getDeviceById(deviceId)),\n ...integrations.map(integration => dispatch(getDeviceTwin({ deviceId, integration })))\n ];\n if (hasDeviceConfig && canConfigure && (device.status === DEVICE_STATES.accepted || device.status === DEVICE_STATES.preauth)) {\n tasks.push(dispatch(getDeviceConfig(deviceId)));\n }\n if (device.status === DEVICE_STATES.accepted) {\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\n/*\n Device Auth + admission\n */\nexport const getAllDeviceCounts = createAppAsyncThunk(`${sliceName}/getAllDeviceCounts`, (_, { dispatch }) =>\n GeneralApi.get(`${inventoryApiUrlV2}/statistics`).then(({ data }) => {\n const { devices_by_status }: { devices_by_status: Record<DeviceAuthState, DeviceTierLimits> } = data;\n Object.entries(devices_by_status).map(([status, countsPerTier]) => dispatch(actions.setDevicesCountByStatus({ countsPerTier, status })));\n return;\n })\n);\n\nexport const getDeviceLimits = createAppAsyncThunk(`${sliceName}/getDeviceLimit`, (_, { dispatch }) =>\n GeneralApi.get(`${deviceAuthV2}/limits/devices`).then(res => dispatch(actions.setDeviceLimits(res.data)))\n);\n\nexport const getTestDeviceCount = createAppAsyncThunk(`${sliceName}/getTestDeviceCount`, async (_, { dispatch }) => {\n const res = await GeneralApi.post(`${inventoryApiUrlV2}/filters/search`, {\n page: 1,\n per_page: 1,\n filters: [{ scope: 'system', attribute: 'test_device', type: DEVICE_FILTERING_OPTIONS.$eq.key, value: 'true' }],\n attributes: [{ scope: 'identity', attribute: 'status' }]\n }).catch(err => commonErrorHandler(err, `Retrieving test device count failed:`, dispatch, commonErrorFallback));\n return dispatch(actions.setTestDeviceCount(Number(res.headers[headerNames.total])));\n});\n\ntype SetDeviceListStatePayload = {\n fetchAuth?: boolean;\n forceRefresh?: boolean;\n shouldSelectDevices?: boolean;\n} & Partial<DeviceListState>;\nexport const setDeviceListState = createAppAsyncThunk(\n `${sliceName}/setDeviceListState`,\n ({ shouldSelectDevices = true, forceRefresh, fetchAuth = true, ...selectionState }: SetDeviceListStatePayload, { dispatch, getState }) => {\n const currentState = getDeviceListState(getState());\n const refreshTrigger = forceRefresh ? !currentState.refreshTrigger : selectionState.refreshTrigger;\n const nextState = {\n ...currentState,\n setOnly: false,\n refreshTrigger,\n ...selectionState,\n sort: { ...currentState.sort, ...selectionState.sort }\n };\n const tasks: Promise<unknown>[] = [];\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 as SortCriteria['order'], scope: sortScope }] as SortCriteria[]) : 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 as DeviceAuthState | undefined, sortOptions: sortBy, fetchAuth }))\n .unwrap()\n .then(({ deviceAccu, total }) => {\n const devicesState: Partial<DeviceListState> = 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 if (\n currentState.page !== nextState.page ||\n currentState.perPage > nextState.perPage ||\n currentState.state !== nextState.state ||\n !deepCompare(currentState.sort, nextState.sort)\n ) {\n nextState.selection = [];\n }\n tasks.push(Promise.resolve(dispatch(actions.setDeviceListState(nextState))));\n return Promise.all(tasks);\n }\n);\n\ntype GetDevicesByStatusPayload = {\n fetchAuth: boolean;\n filterSelection: DeviceFilter[];\n group: string;\n page: number;\n perPage: number;\n selectedAttributes: DeviceSelectedAttribute[];\n selectedIssues: DeviceIssueOptionKey[];\n sortOptions: SortCriteria[];\n status: DeviceAuthState;\n};\n// get devices from inventory\nexport const getDevicesByStatus = createAppAsyncThunk(\n `${sliceName}/getDevicesByStatus`,\n async (options: Partial<GetDevicesByStatusPayload>, { 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 = getSelectedDeviceAttribute(getState())\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 const response = await GeneralApi.post(`${inventoryApiUrlV2}/filters/search`, {\n page,\n per_page: perPage,\n filters: filterTerms,\n sort: sortOptions,\n attributes\n }).catch(err => commonErrorHandler(err, `${status} devices couldn't be loaded.`, dispatch, commonErrorFallback));\n const currentState = getState();\n const deviceAccu = reduceReceivedDevices(response.data, [], currentState, status);\n let total = !applicableFilters.length ? Number(response.headers[headerNames.total]) : 0;\n if (status && currentState.devices.byStatus[status].counts.total === deviceAccu.ids.length) {\n total = deviceAccu.ids.length;\n }\n const sideEffects: Promise<unknown>[] = [Promise.resolve(dispatch(actions.receivedDevices(deviceAccu.devicesById)))];\n if (status) {\n sideEffects.push(Promise.resolve(dispatch(actions.setDevicesByStatus({ deviceIds: deviceAccu.ids, status, total }))));\n }\n // for each device, get device identity info\n const receivedDevices: Device[] = Object.values(deviceAccu.devicesById);\n if (receivedDevices.length && fetchAuth) {\n sideEffects.push(dispatch(getDevicesWithAuth(receivedDevices as { id: string }[])));\n }\n await Promise.all(sideEffects);\n return { deviceAccu, total: Number(response.headers[headerNames.total]) };\n }\n);\n\nexport const getAllDevicesByStatus = createAppAsyncThunk(\n `${sliceName}/getAllDevicesByStatus`,\n ({ status, attribute }: { attribute: string; status: DeviceAuthState }, { dispatch, getState }) => {\n const attributes = [...defaultAttributes, getIdAttribute(getState())];\n const getAllDevices = (perPage = MAX_PAGE_SIZE, page = 1, devices: string[] = []) =>\n GeneralApi.post(`${inventoryApiUrlV2}/filters/search`, {\n page,\n per_page: perPage,\n filters: mapFiltersToTerms([{ key: 'status', value: status, operator: DEVICE_FILTERING_OPTIONS.$eq.key, scope: 'identity' }]),\n attributes: [...attributes, { scope: 'inventory', attribute }]\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 return Promise.resolve();\n });\n return getAllDevices();\n }\n);\n\ntype SearchDevicesPayload = SearchState & { sortOptions: SortCriteria[] };\nexport const searchDevices = createAppAsyncThunk(\n `${sliceName}/searchDevices`,\n async (passedOptions: Partial<SearchDevicesPayload> = {}, { dispatch, getState }) => {\n const state = getState();\n const 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 const response = await GeneralApi.post(`${inventoryApiUrlV2}/filters/search`, {\n page,\n per_page: 10,\n filters: [],\n sort: sortOptions,\n text: searchTerm,\n attributes\n }).catch(err => commonErrorHandler(err, `devices couldn't be searched.`, dispatch, commonErrorFallback));\n const deviceAccu = reduceReceivedDevices(response.data, [], getState());\n dispatch(actions.receivedDevices(deviceAccu.devicesById));\n return { deviceIds: deviceAccu.ids, searchTotal: Number(response.headers[headerNames.total]) };\n }\n);\n\nconst ATTRIBUTE_LIST_CUTOFF = 100;\nconst attributeReducer = (attributes: Attribute[] = []) =>\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 = createAppAsyncThunk(`${sliceName}/getDeviceAttributes`, (_, { dispatch }) =>\n GeneralApi.get(`${inventoryApiUrlV2}/filters/attributes`).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\nconst initializeDistributionData = (report, groups: Record<string, DeviceGroup>, devices: Record<string, Device>, totalDeviceCount: number) => {\n const { attribute, group = '', software = '' } = report;\n const effectiveAttribute = software ? software : attribute;\n const { deviceIds, total = 0 } = groups[group] || {};\n const relevantDevices: Device[] = deviceIds ? deviceIds.map(id => devices[id]) : Object.values(devices);\n const distributionByAttribute = relevantDevices.reduce<Record<string, number>>((accu, item) => {\n if (!item.attributes || item.status !== DEVICE_STATES.accepted) return accu;\n const attributeValue = (item.attributes[effectiveAttribute] as string) ?? '';\n if (!accu[attributeValue]) {\n accu[attributeValue] = 0;\n }\n accu[attributeValue] = accu[attributeValue] + 1;\n return accu;\n }, {});\n const distributionByAttributeSorted = Object.entries(distributionByAttribute).sort((pairA, pairB) => pairB[1] - pairA[1]);\n const items: { count: number; key: string }[] = distributionByAttributeSorted.map(([key, count]) => ({ key, count }));\n const dataCount = items.reduce<number>((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 updateReportData = createAppAsyncThunk(`${sliceName}/updateReportData`, (reportIndex: number, { dispatch, getState }) => {\n const reports = getDeviceReportsForUser(getState());\n const report = reports[reportIndex];\n const { group = '' } = report;\n const devicesById = getDevicesById(getState());\n const groups = getGroupsById(getState());\n const { accepted: acceptedDevicesCount } = getDeviceCountsByStatus(getState());\n const totalDeviceCount = groups[group] ? (groups[group].total as number) : acceptedDevicesCount;\n\n const reportsData = getDeviceReports(getState());\n const newReports = [...reportsData];\n newReports[reportIndex] = initializeDistributionData(report, groups, devicesById, totalDeviceCount);\n return Promise.resolve(dispatch(actions.setDeviceReports(newReports)));\n});\n\nexport const getReportDataWithoutBackendSupport = createAppAsyncThunk(\n `${sliceName}/getReportDataWithoutBackendSupport`,\n (reportIndex: number, { dispatch, getState }) => {\n const reports = getDeviceReportsForUser(getState());\n const report = reports[reportIndex];\n if (!report) {\n return;\n }\n const { attribute, group = '', software = '' } = report;\n const effectiveAttribute = software ? software : attribute;\n const devicesById = getDevicesById(getState());\n const acceptedDevices = getAcceptedDevices(getState());\n const { accepted: acceptedDevicesCount } = getDeviceCountsByStatus(getState());\n const groups = getGroupsById(getState());\n const { deviceIds = [], filters = [], total = 0 } = groups[group] || {};\n const relevantIds = group ? deviceIds : acceptedDevices.deviceIds;\n const hasAttributeData = relevantIds.every(id => devicesById[id]?.attributes?.[effectiveAttribute] !== undefined);\n let groupDevicesRequest = Promise.resolve({\n payload: { groupName: '', group: { deviceIds: Object.keys(devicesById), total: Object.keys(devicesById).length } }\n });\n if (group && (!(deviceIds.length && total) || deviceIds.length !== total || !deviceIds.every(id => !!devicesById[id]) || !hasAttributeData)) {\n groupDevicesRequest = filters.length\n ? dispatch(getAllDynamicGroupDevices({ group, attribute: effectiveAttribute })).unwrap()\n : dispatch(getAllGroupDevices({ group, attribute: effectiveAttribute })).unwrap();\n } else if (\n !group &&\n (acceptedDevices.deviceIds.length !== acceptedDevicesCount || !acceptedDevices.deviceIds.every(id => !!devicesById[id]) || !hasAttributeData)\n ) {\n groupDevicesRequest = dispatch(getAllDevicesByStatus({ status: DEVICE_STATES.accepted, attribute: effectiveAttribute })).unwrap();\n }\n return groupDevicesRequest.then(() => dispatch(updateReportData(reportIndex)));\n }\n);\n\nexport const getDeviceConnect = createAppAsyncThunk(`${sliceName}/getDeviceConnect`, (id: string, { dispatch }) =>\n GeneralApi.get<ConnectionState>(`${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\nconst updateTypeMap = { deploymentUpdate: 'check-update', inventoryUpdate: 'send-inventory' };\nexport const triggerDeviceUpdate = createAppAsyncThunk(`${sliceName}/triggerDeviceUpdate`, async ({ id, type }: { id: string; type: string }, { dispatch }) => {\n await GeneralApi.post(`${deviceConnect}/devices/${id}/${updateTypeMap[type] ?? updateTypeMap.deploymentUpdate}`).catch(err =>\n commonErrorHandler(err, `The request couldn't be sent.`, dispatch)\n );\n dispatch(setSnackbar('Request has been sent.'));\n await new Promise(resolve => setTimeout(resolve, TIMEOUTS.threeSeconds));\n return dispatch(getDeviceById(id));\n});\n\ntype GetSessionDetailsPayload = { deviceId: string; endDate: string; sessionId: string; startDate: string; userId: string };\nexport const getSessionDetails = createAppAsyncThunk(\n `${sliceName}/getSessionDetails`,\n ({ sessionId, deviceId, userId, startDate, endDate }: GetSessionDetailsPayload) => {\n const { start: startUnix, end: endUnix } = dateRangeToUnix(startDate, endDate);\n const createdAfter = startDate ? `&created_after=${startUnix}` : '';\n const createdBefore = endDate ? `&created_before=${endUnix}` : '';\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);\n\nexport const getDeviceFileDownloadLink = createAppAsyncThunk(\n `${sliceName}/getDeviceFileDownloadLink`,\n ({ deviceId, path }: { deviceId: string; path: string }) =>\n Promise.resolve(`${window.location.origin}${deviceConnect}/devices/${deviceId}/download?path=${encodeURIComponent(path)}`)\n);\n\nexport const deviceFileUpload = createAppAsyncThunk(\n `${sliceName}/deviceFileUpload`,\n ({ deviceId, path, file }: { deviceId: string; file: File; path: string }, { dispatch }) => {\n const 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: { progress: 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({ message: 'Upload successful', autoHideDuration: TIMEOUTS.fiveSeconds }))))\n .catch(err => {\n if (isCancel(err)) {\n return dispatch(setSnackbar({ message: 'The upload has been cancelled', autoHideDuration: TIMEOUTS.fiveSeconds }));\n }\n return commonErrorHandler(err, `Error uploading file to device.`, dispatch);\n })\n .finally(() => dispatch(cleanUpUpload(uploadId)));\n }\n);\n\nexport const getDeviceAuth = createAppAsyncThunk(`${sliceName}/getDeviceAuth`, async (id: string, { dispatch }) => {\n const receivedDevices = await dispatch(getDevicesWithAuth([{ id }])).unwrap();\n return receivedDevices?.[0];\n});\n\nexport const getDevicesWithAuth = createAppAsyncThunk(`${sliceName}/getDevicesWithAuth`, async (devices: { id: string }[], { dispatch, getState }) => {\n if (!devices.length) {\n return [] as ReceivedDevice[];\n }\n const { data: receivedDevices } = await GeneralApi.get(`${deviceAuthV2}/devices?id=${devices.map(device => device.id).join('&id=')}`).catch(err =>\n commonErrorHandler(err, `Error: ${err}`, dispatch)\n );\n const { devicesById } = reduceReceivedDevices(receivedDevices, [], getState());\n dispatch(actions.receivedDevices(devicesById));\n return receivedDevices as ReceivedDevice[];\n});\n\nconst getSnackbarMessage = (skipped: number, done: number, failed: number = 0) => {\n pluralize.addIrregularRule('its', 'their');\n const skipText = skipped\n ? `${skipped} ${pluralize('devices', skipped)} ${pluralize('have', skipped)} more than one pending authset. Expand ${pluralize(\n 'this',\n skipped\n )} ${pluralize('device', skipped)} to individually adjust ${pluralize('their', skipped)} authorization status. `\n : '';\n const failedText = failed ? `${failed} ${pluralize('device', failed)} could not be updated. You may have reached your device limit. ` : '';\n const doneText = done ? `${done} ${pluralize('device', done)} ${pluralize('was', done)} updated successfully. ` : '';\n return `${doneText}${skipText}${failedText}`;\n};\n\nexport const updateDeviceAuth = createAppAsyncThunk(\n `${sliceName}/updateDeviceAuth`,\n ({ deviceId, authId, status }: { authId: string; deviceId: string; status: Status['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 => {\n const errorContext =\n err.response?.status === 422\n ? 'Device limit reached: You have reached your limit of accepted devices.'\n : 'There was a problem updating the device authorization status:';\n return commonErrorHandler(err, errorContext, dispatch);\n })\n .then(() => Promise.resolve(dispatch(actions.maybeUpdateDevicesByStatus({ deviceId, authId }))))\n .finally(() => dispatch(setDeviceListState({ refreshTrigger: !getDeviceListState(getState()).refreshTrigger })))\n);\n\nexport const updateDevicesAuth = createAppAsyncThunk(\n `${sliceName}/updateDevicesAuth`,\n ({ deviceIds, status }: { deviceIds: string[]; status: Status['status'] }, { dispatch, getState }) => {\n let devices = getDevicesById(getState());\n const deviceIdsWithoutAuth = deviceIds.reduce<{ id: string }[]>((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 && 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, failed, count } = results.reduce(\n (accu, item) => {\n if (item.status === 'rejected') {\n if (item.reason) {\n accu.failed = accu.failed + 1;\n } else {\n accu.skipped = accu.skipped + 1;\n }\n } else {\n accu.count = accu.count + 1;\n }\n return accu;\n },\n { skipped: 0, failed: 0, count: 0 }\n );\n const message = getSnackbarMessage(skipped, count, failed);\n // break if an error occurs, display status up til this point before error message\n return dispatch(setSnackbar(message));\n });\n });\n }\n);\n\nexport const deleteAuthset = createAppAsyncThunk(\n `${sliceName}/deleteAuthset`,\n ({ deviceId, authId }: { authId: string; deviceId: string }, { 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 = createAppAsyncThunk(`${sliceName}/preauthDevice`, (authset: PreAuthSet, { dispatch, rejectWithValue }) =>\n GeneralApi.post(`${deviceAuthV2}/devices`, authset)\n .then(() =>\n Promise.resolve(dispatch(setSnackbar({ message: 'Device was successfully added to the preauthorization list', autoHideDuration: TIMEOUTS.fiveSeconds })))\n )\n .catch(err => {\n if (err.response.status === 409) {\n return rejectWithValue('A device with a matching identity data set already exists');\n }\n return commonErrorHandler(err, 'The device could not be added:', dispatch);\n })\n);\n\nexport const decommissionDevice = createAppAsyncThunk(\n `${sliceName}/decommissionDevice`,\n ({ deviceId, authId }: { authId?: string; deviceId: string }, { 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 = createAppAsyncThunk(`${sliceName}/getDeviceConfig`, (deviceId: string, { dispatch }) =>\n GeneralApi.get<DeviceConfiguration>(`${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 = createAppAsyncThunk(\n `${sliceName}/setDeviceConfig`,\n ({ deviceId, config }: { config: ManagementApiConfiguration; deviceId: string }, { 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);\ntype ApplyDeviceConfigPayload = {\n config: DeviceConfiguration;\n configDeploymentConfiguration: NewConfigurationDeployment;\n deviceId: string;\n isDefault: boolean;\n};\nexport const applyDeviceConfig = createAppAsyncThunk(\n `${sliceName}/applyDeviceConfig`,\n ({ deviceId, configDeploymentConfiguration, isDefault, config }: ApplyDeviceConfigPayload, { dispatch, getState }) =>\n GeneralApi.post<NewConfigurationDeploymentResponse>(`${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 const tasks: Promise<ReturnType<AppDispatch> | unknown>[] = [\n Promise.resolve(dispatch(actions.receivedDevice({ ...device, config: { ...device.config, deployment_id: data.deployment_id! } })))\n ];\n dispatchDelayed({ action: getSingleDeployment(data.deployment_id!), delay: TIMEOUTS.oneSecond, dispatch });\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 = createAppAsyncThunk(\n `${sliceName}/setDeviceTags`,\n ({ deviceId, tags }: { deviceId: string; tags: Record<string, string> }, { dispatch }) =>\n // to prevent tag set failures, retrieve the device & use the freshest etag we can get\n dispatch(getDeviceById(deviceId))\n .unwrap()\n .then(device => {\n const headers = device.etag ? { 'If-Match': device.etag } : {};\n const tagList = Object.entries(tags).map(([name, value]) => ({ name, value }));\n const isNameChange = tagList.some(({ name }) => name === 'name');\n return GeneralApi.put(`${inventoryApiUrl}/devices/${deviceId}/tags`, tagList, { headers })\n .catch(err => commonErrorHandler(err, `There was an error setting tags for device ${deviceId}.`, dispatch, 'Please check your connection.'))\n .then(() =>\n Promise.all([\n dispatch(actions.receivedDevice({ ...device, id: deviceId, tags })),\n dispatch(setSnackbar(`Device ${tagList.length === 1 && isNameChange ? 'name' : 'tags'} changed`))\n ])\n );\n })\n);\n\nexport const setTestDeviceStatus = createAppAsyncThunk(\n `${sliceName}/setTestDeviceStatus`,\n ({ deviceId, test_device }: { deviceId: string; test_device: boolean }, { dispatch }) =>\n GeneralApi.put(`${deviceAuthV2}/devices/${deviceId}/flags`, { test_device })\n .catch(err => commonErrorHandler(err, `There was an error setting test status for device ${deviceId}.`, dispatch, 'Please check your connection.'))\n .then(() =>\n Promise.all([\n dispatch(setSnackbar('Device updated successfully')),\n dispatch(actions.receivedDevice({ id: deviceId, flags: { test_device } })), // optimistic\n dispatch(getDeviceById(deviceId)),\n dispatch(getTestDeviceCount())\n ])\n )\n);\n\ntype DeviceTwinPayload = { deviceId: string; integration: Integration };\nexport const getDeviceTwin = createAppAsyncThunk(`${sliceName}/getDeviceTwin`, ({ deviceId, integration }: DeviceTwinPayload, { dispatch, getState }) => {\n let providerResult = {};\n return GeneralApi.get<DeviceState>(`${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\ntype SetDeviceTwinPayload = { deviceId: string; integration: Integration; settings: any };\nexport const setDeviceTwin = createAppAsyncThunk(\n `${sliceName}/setDeviceTwin`,\n ({ deviceId, integration, settings }: SetDeviceTwinPayload, { 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(\n actions.receivedDevice({ ...device, twinsByIntegration: { ...twinsByIntegration, [integration.id!]: { ...currentState, desired: settings } } })\n )\n );\n })\n);\n\nconst prepareSearchArguments = ({ filters, group, state, status }: { filters?: DeviceFilter[]; group?: string; state: RootState; status?: string }) => {\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};\ntype GetSystemDevicesPayload = { id: string; page?: number; perPage?: number; sortOptions: SortCriteria[] };\nexport const getSystemDevices = createAppAsyncThunk(`${sliceName}/getSystemDevices`, (options: GetSystemDevicesPayload, { 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 as { mender_gateway_system_id?: string };\n const filters: DeviceFilter[] = [\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(`${inventoryApiUrlV2}/filters/search`, {\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 = createAppAsyncThunk(`${sliceName}/getGatewayDevices`, (deviceId: string, { dispatch, getState }) => {\n const state = getState();\n const { attributes = {} } = getDeviceByIdSelector(state, deviceId);\n const { mender_gateway_system_id = '' } = attributes as { mender_gateway_system_id?: string };\n const filters: DeviceFilter[] = [\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(`${inventoryApiUrlV2}/filters/search`, {\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 const tasks: Promise<ReturnType<AppDispatch> | unknown>[] = ids.map(deviceId => dispatch(getDeviceInfo(deviceId)));\n tasks.push(Promise.resolve(dispatch(actions.receivedDevice({ id: deviceId, gatewayIds: ids }))));\n return Promise.all(tasks);\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.\nimport { getDemoDeviceAddress } from '@northern.tech/utils/helpers';\nimport Tracking from '@northern.tech/utils/tracking';\nimport Cookies from 'universal-cookie';\n\nimport type { OnboardingApproach } from '.';\nimport { actions, sliceName } from '.';\nimport type { OnboardingStep } from '../constants';\nimport { DEVICE_STATES, onboardingSteps as onboardingStepNames, orderedOnboardingSteps as onboardingSteps } from '../constants';\nimport { getOnboardingState as getCurrentOnboardingState, getUserCapabilities } from '../selectors';\nimport type { AppDispatch } from '../store';\nimport { createAppAsyncThunk } from '../store';\nimport { saveUserSettings } from '../thunks';\n\nconst cookies = new Cookies();\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 deviceTier = acceptedDevices.length && devicesById[acceptedDevices[0]].tier;\n let approach: OnboardingApproach | null = null;\n if (deviceType.some(type => type.startsWith('qemu'))) {\n approach = 'virtual';\n } else if (deviceType.some(type => type.startsWith('esp32')) || deviceTier === 'micro') {\n approach = 'mcu';\n } else if (deviceType.length) {\n approach = 'physical';\n }\n const progress = 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 || approach,\n progress\n };\n};\n\nexport const getOnboardingState = createAppAsyncThunk(`${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 = createAppAsyncThunk(`${sliceName}/setOnboardingDeviceType`, (value: string[] | string, { dispatch }) =>\n Promise.all([dispatch(actions.setOnboardingDeviceType(value)), dispatch(saveUserSettings({ onboarding: { deviceType: value } }))])\n);\n\nexport const setOnboardingApproach = createAppAsyncThunk(`${sliceName}/setOnboardingApproach`, (value: OnboardingApproach, { dispatch }) =>\n Promise.all([dispatch(actions.setOnboardingApproach(value)), dispatch(saveUserSettings({ onboarding: { approach: value } }))])\n);\n\nexport const setOnboardingComplete = createAppAsyncThunk(`${sliceName}/setOnboardingComplete`, (value: boolean, { dispatch }) => {\n const tasks: Promise<ReturnType<AppDispatch> | unknown>[] = [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 = createAppAsyncThunk(`${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 // since we can't advance after ONBOARDING_CANCELED, track the step manually here\n .then(() => Tracking.event({ category: 'onboarding', action: onboardingStepNames.ONBOARDING_CANCELED }))\n);\n\nexport const advanceOnboarding = createAppAsyncThunk(`${sliceName}/advanceOnboarding`, (stepId: OnboardingStep, { 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 >= onboardingSteps.findIndex(step => step === onboardingStepNames.DEPLOYMENTS_PAST_COMPLETED_FAILURE) ? true : state.complete;\n Tracking.event({ category: 'onboarding', action: stepId });\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.\nimport type {\n Tenant as BackendTenant,\n BillingInfo,\n BillingProfile,\n CardSetupData,\n ConstraintsInfo,\n Event,\n GetAuditLogsResponse,\n GetIdpSamlOrOpenIdConnectMetadataForTheTenantResponse,\n Integration,\n NewTenantTypeManagement as NewTenant,\n PreviewRequest,\n Product,\n ProductInfo,\n Subscription,\n SupportRequest,\n UpdateChildTenant\n} from '@northern.tech/types/MenderTypes';\nimport { dateRangeToUnix, deepCompare } from '@northern.tech/utils/helpers';\nimport type { AxiosResponse } from 'axios';\nimport dayjs from 'dayjs';\nimport utc from 'dayjs/plugin/utc.js';\nimport hashString from 'md5';\nimport Cookies from 'universal-cookie';\n\nimport { actions, sliceName } from '.';\nimport storeActions from '../actions';\nimport Api from '../api/general-api';\nimport type { Addon, AvailablePlans, ContentType, PaginationOptions, SortOptions } from '../constants';\nimport {\n ADDONS,\n DEVICE_LIST_DEFAULTS,\n PLANS,\n SORTING_OPTIONS,\n TENANT_LIST_DEFAULT,\n TIMEOUTS,\n auditLogsApiUrl,\n deviceAuthV2,\n headerNames,\n iotManagerBaseURL,\n locations,\n ssoIdpApiUrlv1,\n tenantadmApiUrlv1,\n tenantadmApiUrlv2\n} from '../constants';\nimport { getCurrentUser, getSpLimits, getTenantCapabilities, getTenantsList } from '../selectors';\nimport type { AppDispatch } from '../store';\nimport { commonErrorFallback, commonErrorHandler, createAppAsyncThunk } from '../store';\nimport { getDeviceLimits, setFirstLoginAfterSignup } from '../thunks';\nimport { convertToBackendSPLimits, dispatchDelayed, parseSubscriptionPreview } from '../utils';\nimport { SSO_TYPES } from './constants';\nimport { getAuditlogState, getOrganization } from './selectors';\nimport type { AuditLogSelectionState, ProductConfig, ProductPlan, ProductTier, SSOConfig, Tenant, TenantList } from './types';\n\nconst cookies = new Cookies();\n\ndayjs.extend(utc);\nconst { setAnnouncement, setSnackbar } = storeActions;\nconst { page: defaultPage, perPage: defaultPerPage } = DEVICE_LIST_DEFAULTS;\n\nexport const cancelRequest = createAppAsyncThunk(`${sliceName}/cancelRequest`, (reason: string, { 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\nconst getTierId = tierName => tierName.replace('mender_', '');\n\nconst getProductPlans = (products: ProductInfo[]) => {\n const backendPlansById = products.reduce(\n (plansById: Record<string, ProductPlan>, product: ProductInfo) => {\n const { name, prices } = product;\n const tierId = getTierId(name);\n prices.forEach(price => {\n const existing = plansById[price.plan] ?? { ...PLANS[price.plan], tierLimitsConstrains: {} };\n const tierConstraints = price.constraints\n ? { [tierId]: { min: price.constraints.min!, max: price.constraints.max!, div: price.constraints.div! } }\n : {};\n plansById[price.plan] = {\n ...existing,\n tierLimitsConstrains: {\n ...existing.tierLimitsConstrains,\n ...tierConstraints\n }\n };\n });\n return plansById;\n },\n {} as Record<string, ProductPlan>\n );\n return { ...backendPlansById, enterprise: { ...PLANS.enterprise } as ProductPlan };\n};\n\nconst getProductAddons = products =>\n products.reduce((accu: Record<string, Addon>, product: ProductInfo) => {\n const { addons = [] } = product;\n addons.forEach(addon => {\n const { name: addonName = '', prices: addonPrices = [] } = addon;\n const existingEligible = accu[addonName]?.eligible ?? [];\n const newEligible = addonPrices.map(p => p.plan);\n accu[addonName] = {\n ...ADDONS[addonName],\n eligible: [...new Set([...existingEligible, ...newEligible, PLANS.enterprise.id])]\n };\n });\n return accu;\n }, {});\n\nexport const transformProductResponse = (products: ProductInfo[]): ProductConfig => {\n const tiers: ProductTier[] = [];\n const sortedProducts = products.sort((a, b) => a.name.localeCompare(b.name));\n sortedProducts.forEach(tier => {\n const addonsSupported = Object.fromEntries((tier.addons || []).map(addon => [addon.name, addon.prices?.map(p => p.plan)])) as Record<string, string[]>;\n\n const allPlans = tier.prices.map(price => price.plan);\n\n const addonsTransposed = allPlans.reduce((acc, plan) => {\n acc[plan] = Object.entries(addonsSupported)\n .filter(([, addonSupportedPlans]) => addonSupportedPlans.includes(plan))\n .map(([addon]) => addon);\n\n return acc;\n }, {});\n\n const tierId = getTierId(tier.name);\n tiers.push({\n id: tierId,\n title: tierId,\n stripeProductName: tier.name,\n limitConstrains: Object.fromEntries(tier.prices.map(p => [p.plan, p.constraints])) as Record<string, Required<ConstraintsInfo>>,\n addons: addonsSupported,\n addonsByPlan: addonsTransposed\n });\n });\n\n const plans = getProductPlans(products);\n\n const addons = getProductAddons(products);\n\n return { plans, tiers, addons };\n};\n\nexport const getTargetLocation = (key: string) => {\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'];\n\ntype OrganizationTrialPayload = {\n email: string;\n 'g-recaptcha-response': string;\n location: keyof typeof locations;\n name: string;\n organization: string;\n password: string;\n plan: string;\n tos: boolean;\n ts?: number;\n};\nexport const createOrganizationTrial = createAppAsyncThunk(`${sliceName}/createOrganizationTrial`, async (data: OrganizationTrialPayload, { dispatch }) => {\n const { location, tos: _tos, ...trialPayload } = data;\n const { key } = locations[location];\n const targetLocation = getTargetLocation(key);\n const target = `${targetLocation}${tenantadmApiUrlv2}/tenants/trial`;\n const response = await Api.postUnauthorized(target, trialPayload).catch(err => {\n if (err.response?.status >= 400 && err.response?.status < 500) {\n dispatch(setSnackbar({ message: err.response.data.error, autoHideDuration: TIMEOUTS.fiveSeconds }));\n } else {\n // This handles \"timeouts\", \"general connectivity\" and \"500 - Internal Server Error\" errors\n dispatch(setSnackbar({ message: 'There was an error creating your account', autoHideDuration: TIMEOUTS.fiveSeconds }));\n }\n return Promise.reject(err);\n });\n //TODO: resolve the case with no response more gracefully\n //UPD: soon to be removed due to change to the subscription flow\n const { headers } = response;\n cookies.remove('oauth');\n cookies.remove('externalID');\n cookies.remove('email');\n dispatch(setFirstLoginAfterSignup(true));\n return new Promise<void>(resolve =>\n setTimeout(() => {\n window.location.assign(`${targetLocation}${headers.location || ''}`);\n return resolve();\n }, TIMEOUTS.fiveSeconds)\n );\n});\n\nexport const startCardUpdate = createAppAsyncThunk(`${sliceName}/startCardUpdate`, (_, { dispatch }) =>\n Api.post<CardSetupData>(`${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 = createAppAsyncThunk(`${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 = createAppAsyncThunk(`${sliceName}/getCurrentCard`, (_, { dispatch }) =>\n Api.get<BillingInfo>(`${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 = createAppAsyncThunk(`${sliceName}/startUpgrade`, (tenantId: string, { dispatch }) =>\n Api.post<{ secret: string }>(`${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 = createAppAsyncThunk(`${sliceName}/cancelUpgrade`, (tenantId: string) =>\n Api.post(`${tenantadmApiUrlv2}/tenants/${tenantId}/upgrade/cancel`)\n);\n\ninterface completeUpgradePayload {\n billing_profile: BillingProfile;\n plan: AvailablePlans;\n tenantId: string;\n}\nexport const completeUpgrade = createAppAsyncThunk(\n `${sliceName}/completeUpgrade`,\n ({ tenantId, plan, billing_profile }: completeUpgradePayload, { dispatch }) =>\n Api.post(`${tenantadmApiUrlv2}/tenants/${tenantId}/upgrade/complete`, { plan, billing_profile })\n .catch(err => commonErrorHandler(err, `There was an error upgrading your account:`, dispatch))\n .then(() => Promise.all([dispatch(getDeviceLimits()), dispatch(getUserOrganization())]))\n);\n\ntype AuditLogQuery = {\n detail?: { id: string } | string;\n\n endDate?: string;\n sort?: SortOptions;\n startDate?: string;\n type?: {\n queryParameter: string;\n title: string;\n value: string;\n } | null;\n user?: { id: string } | string;\n};\nconst prepareAuditlogQuery = ({\n startDate,\n endDate,\n user: userFilter,\n type,\n detail: detailFilter,\n sort = { direction: SORTING_OPTIONS.desc }\n}: AuditLogQuery) => {\n const userId = typeof userFilter === 'object' && userFilter ? userFilter.id : userFilter;\n const detail = typeof detailFilter === 'object' && detailFilter ? detailFilter.id : detailFilter;\n const { start: startUnix, end: endUnix } = dateRangeToUnix(startDate, endDate);\n const createdAfter = startDate ? `&created_after=${startUnix}` : '';\n const createdBefore = endDate ? `&created_before=${endUnix}` : '';\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\ntype GetAuditLogPayload = PaginationOptions & AuditLogQuery;\nexport const getAuditLogs = createAppAsyncThunk(`${sliceName}/getAuditLogs`, async (selectionState: GetAuditLogPayload, { dispatch, getState }) => {\n const { page, perPage } = selectionState;\n const { hasAuditlogs } = getTenantCapabilities(getState());\n if (!hasAuditlogs) {\n return;\n }\n const { data, headers } = await Api.get<GetAuditLogsResponse>(\n `${auditLogsApiUrl}/logs?page=${page}&per_page=${perPage}${prepareAuditlogQuery(selectionState)}`\n ).catch(err => commonErrorHandler(err, `There was an error retrieving audit logs:`, dispatch));\n const total = Number(headers[headerNames.total] || data.length);\n return dispatch(actions.receiveAuditLogs({ events: data, total }));\n});\n\nexport const getAuditLogsCsvLink = createAppAsyncThunk(`${sliceName}/getAuditLogsCsvLink`, (_, { getState }) =>\n Promise.resolve(`${window.location.origin}${auditLogsApiUrl}/logs/export?limit=20000${prepareAuditlogQuery(getAuditlogState(getState()))}`)\n);\n\nexport const setAuditlogsState = createAppAsyncThunk(\n `${sliceName}/setAuditlogsState`,\n (selectionState: Partial<AuditLogSelectionState>, { dispatch, getState }) => {\n const currentState = getAuditlogState(getState());\n const nextState = {\n ...currentState,\n ...selectionState,\n sort: { ...currentState.sort, ...selectionState.sort }\n };\n const tasks: Promise<ReturnType<AppDispatch>>[] = [];\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 as GetAuditLogPayload)).finally(() => dispatch(actions.setAuditLogState({ isLoading: false }))));\n }\n tasks.push(Promise.resolve(dispatch(actions.setAuditLogState(nextState))));\n return Promise.all(tasks);\n }\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 = createAppAsyncThunk(\n `${sliceName}/createTenant`,\n (selectionState: NewTenant & UpdateChildTenant & { deviceLimits: Record<string, string> }, { dispatch, getState }) => {\n const spLimits = getSpLimits(getState());\n const { deviceLimits, ...rest } = selectionState;\n const device_limits = convertToBackendSPLimits(deviceLimits, spLimits);\n return Api.post(`${tenantadmApiUrlv2}/tenants`, { ...rest, device_limits })\n .then(() => {\n dispatch(setSnackbar('Tenant was created successfully.'));\n dispatchDelayed({ action: getTenants(), delay: TIMEOUTS.oneSecond, dispatch });\n })\n .catch(err => commonErrorHandler(err, 'There was an error creating tenant', dispatch, commonErrorFallback));\n }\n);\n\nconst tenantListRetrieval = async (config): Promise<[BackendTenant[], number]> => {\n const { page, perPage } = config;\n const params = new URLSearchParams({ page, per_page: perPage, tiers: 'true' }).toString();\n const tenantList = await Api.get<BackendTenant[]>(`${tenantadmApiUrlv2}/tenants?${params}`);\n const totalCount = tenantList.headers[headerNames.total] || TENANT_LIST_DEFAULT.perPage;\n return [tenantList.data, Number(totalCount)];\n};\nexport const getTenants = createAppAsyncThunk(`${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 = createAppAsyncThunk(\n `${sliceName}/setTenantsListState`,\n async (selectionState: Partial<TenantList>, { 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);\n\ntype EditTenantArgs = {\n deviceLimits: Record<string, number>;\n id: string;\n name: string;\n};\nexport const editTenant = createAppAsyncThunk(`${sliceName}/editDeviceLimit`, ({ deviceLimits, id, name }: EditTenantArgs, { dispatch, getState }) => {\n const spLimits = getSpLimits(getState());\n const device_limits = convertToBackendSPLimits(deviceLimits, spLimits);\n return Api.put(`${tenantadmApiUrlv2}/tenants/${id}/child`, { device_limits, name })\n .catch(err => commonErrorHandler(err, `Device Limit cannot be changed`, dispatch))\n .then(() => {\n dispatch(setSnackbar('Tenant was changed successfully'));\n dispatch(getUserOrganization());\n dispatchDelayed({ action: getTenants(), delay: TIMEOUTS.oneSecond, dispatch });\n });\n});\nexport const editBillingProfile = createAppAsyncThunk(\n `${sliceName}/editBillingProfileEmail`,\n ({ billingProfile }: { billingProfile: BillingProfile }, { dispatch }) =>\n Api.patch(`${tenantadmApiUrlv2}/billing/profile`, billingProfile)\n .catch(err => commonErrorHandler(err, `Failed to change billing profile`, dispatch))\n .then(() => Promise.all([dispatch(setSnackbar('Billing Profile was changed successfully')), dispatch(getUserBilling())]))\n);\nexport const createBillingProfile = createAppAsyncThunk(\n `${sliceName}/createBillingProfileEmail`,\n ({ billingProfile }: { billingProfile: BillingProfile }, { dispatch }) =>\n Api.post(`${tenantadmApiUrlv2}/billing/profile`, billingProfile)\n .catch(err => commonErrorHandler(err, `Failed to create billing profile`, dispatch))\n .then(() => Promise.all([dispatch(setSnackbar('Billing Profile was created successfully')), dispatch(getUserBilling())]))\n);\n\nexport const removeTenant = createAppAsyncThunk(`${sliceName}/editDeviceLimit`, ({ id }: { id: string }, { dispatch }) =>\n Api.post(`${tenantadmApiUrlv2}/tenants/${id}/remove/start`)\n .catch(err => commonErrorHandler(err, `There was an error removing the tenant`, dispatch))\n .then(async () => {\n dispatch(setSnackbar('The tenant was removed successfully'));\n await dispatch(getUserOrganization()).unwrap();\n dispatchDelayed({ action: getTenants(), delay: TIMEOUTS.oneSecond, dispatch });\n })\n);\nexport const getUserOrganization = createAppAsyncThunk(`${sliceName}/getUserOrganization`, (_, { dispatch, getState }) =>\n Api.get<Tenant>(`${tenantadmApiUrlv1}/user/tenant?tiers=true`).then(res => {\n const { addons, plan, trial } = res.data;\n const { addons: currentAddons, id: currentId, plan: currentPlan, trial: currentTrial } = getOrganization(getState());\n const tasks: ReturnType<AppDispatch>[] = [dispatch(actions.setOrganization(res.data))];\n if (currentId && !deepCompare({ addons, plan, trial }, { addons: currentAddons, plan: currentPlan, trial: currentTrial })) {\n const hash = hashString(tenantDataDivergedMessage);\n const { id: currentUserId } = getCurrentUser(getState());\n cookies.remove(`${currentUserId}${hash}`);\n tasks.push(dispatch(setAnnouncement(tenantDataDivergedMessage)));\n }\n return Promise.all(tasks);\n })\n);\n\nexport const getUserBilling = createAppAsyncThunk(`${sliceName}/getUserBilling`, (_, { dispatch }) =>\n Api.get<BillingProfile>(`${tenantadmApiUrlv2}/billing/profile`)\n .catch(err => commonErrorHandler(err, 'There was an error getting your billing profile:', dispatch, commonErrorFallback))\n .then(res => dispatch(actions.setBillingProfile(res.data)))\n);\n\nexport const getUserSubscription = createAppAsyncThunk(`${sliceName}/getUserSubscription`, async (_, { dispatch }) => {\n // We need to fetch current subscription first to ensure non-stripe customers handled right\n const currentSubscription = await dispatch(getCurrentSubscription()).unwrap();\n const currentPreview = await dispatch(getBillingPreview({ preview_mode: 'next' })).unwrap();\n return dispatch(actions.setSubscription({ ...currentPreview, ...currentSubscription }));\n});\n\n//Can also be used to get current subscription when no products supplied\nexport const getBillingPreview = createAppAsyncThunk(`${sliceName}/getBillingPreview`, (order: PreviewRequest, { dispatch }) =>\n Api.post(`${tenantadmApiUrlv2}/billing/subscription/invoices/preview`, order)\n .catch(err => commonErrorHandler(err, 'There was an error getting your billing information:', dispatch, commonErrorFallback))\n .then(({ data }) => (order.preview_mode === 'recurring' ? { items: parseSubscriptionPreview(data.lines), total: data.total } : data))\n);\n\nexport const getCurrentSubscription = createAppAsyncThunk(`${sliceName}/getCurrentSubscription`, (_, { dispatch }) =>\n Api.get<Subscription>(`${tenantadmApiUrlv2}/billing/subscription`)\n .then(res => res.data)\n .catch(err => {\n if (err.response && err.response.status === 404) {\n throw new Error('Request failed with status code 404');\n }\n return commonErrorHandler(err, 'There was an error retrieving your current subscription', dispatch, commonErrorFallback);\n })\n);\nexport const getProducts = createAppAsyncThunk(`${sliceName}/getEnabledTiers`, (_, { dispatch }) =>\n Api.get<ProductInfo[]>(`${tenantadmApiUrlv2}/billing/products`)\n .catch(err => commonErrorHandler(err, 'There was an error getting Mender products:', dispatch, commonErrorFallback))\n .then(res => dispatch(actions.setProducts(transformProductResponse(res.data))))\n);\n\nexport const requestPlanUpgrade = createAppAsyncThunk(`${sliceName}/requestPlanUpgrade`, (order: { plan: string; products: Product[] }, { dispatch }) =>\n Api.post(`${tenantadmApiUrlv2}/billing/subscription`, order)\n .catch(err => commonErrorHandler(err, 'There was an error sending your request', dispatch, commonErrorFallback))\n .then(() =>\n Promise.all([new Promise(resolve => setTimeout(resolve, TIMEOUTS.threeSeconds)).then(() => dispatch(getDeviceLimits())), dispatch(getUserOrganization())])\n )\n);\n\nexport const sendSupportMessage = createAppAsyncThunk(`${sliceName}/sendSupportMessage`, (content: SupportRequest, { 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);\ninterface requestPlanChangePayload {\n content: {\n current_addons: string;\n current_plan: string;\n requested_addons: string;\n requested_plan: string;\n user_message: string;\n };\n tenantId: string;\n}\nexport const requestPlanChange = createAppAsyncThunk(\n `${sliceName}/requestPlanChange`,\n ({ content, tenantId }: requestPlanChangePayload, { dispatch, rejectWithValue }) =>\n Api.post(`${tenantadmApiUrlv2}/tenants/${tenantId}/plan`, content)\n .catch(async err => {\n await commonErrorHandler(err, 'There was an error sending your request', dispatch, commonErrorFallback);\n rejectWithValue(err);\n })\n .then(() => Promise.resolve(dispatch(setSnackbar({ message: 'Your request was sent successfully', autoHideDuration: TIMEOUTS.fiveSeconds }))))\n);\n\nexport const downloadLicenseReport = createAppAsyncThunk(`${sliceName}/downloadLicenseReport`, (_, { dispatch }) =>\n Api.get<string>(`${deviceAuthV2}/license`)\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 = createAppAsyncThunk(`${sliceName}/createIntegration`, ({ id, ...integration }: 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 = createAppAsyncThunk(`${sliceName}/changeIntegration`, ({ id, credentials }: Integration, { 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 = createAppAsyncThunk(\n `${sliceName}/deleteIntegration`,\n async ({ id, provider }: { id: string } & Integration, { dispatch, getState }) => {\n await Api.delete(`${iotManagerBaseURL}/integrations/${id}`, {}).catch(err =>\n commonErrorHandler(err, 'There was an error removing the integration', dispatch, commonErrorFallback)\n );\n const integrations = getState().organization.externalDeviceIntegrations.filter(item => provider !== item.provider);\n dispatch(setSnackbar('The integration was removed successfully'));\n dispatch(actions.receiveExternalDeviceIntegrations(integrations));\n await dispatch(getIntegrations()).unwrap();\n }\n);\n\nexport const getIntegrations = createAppAsyncThunk(`${sliceName}/getIntegrations`, (_, { dispatch, getState }) =>\n Api.get<Integration[]>(`${iotManagerBaseURL}/integrations`)\n .catch(err => commonErrorHandler(err, 'There was an error retrieving the integrations', dispatch, commonErrorFallback))\n .then(({ data }) => {\n const existingIntegrations = getState().organization.externalDeviceIntegrations;\n const integrations = data.reduce<Integration[]>((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\ntype GetWebhookEventsPayload = {\n isFollowUp?: boolean;\n page?: number;\n perPage?: number;\n};\nexport const getWebhookEvents = createAppAsyncThunk(`${sliceName}/getWebhookEvents`, (config: GetWebhookEventsPayload = {}, { dispatch, getState }) => {\n const { isFollowUp, page = defaultPage, perPage = defaultPerPage } = config;\n return Api.get<Event[]>(`${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 const tasks: Promise<ReturnType<AppDispatch> | unknown>[] = [\n Promise.resolve(\n dispatch(\n actions.receiveWebhookEvents({\n value: isFollowUp ? getState().organization.webhooks.events : data,\n total: (page - 1) * perPage + data.length\n })\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} as const;\ntype SsoConfigActionKeys = keyof typeof ssoConfigActions;\n\nconst ssoConfigActionErrorHandler = (err, type: keyof typeof ssoConfigActions) => (dispatch: AppDispatch) =>\n commonErrorHandler(err, `There was an error ${ssoConfigActions[type].error} the SSO configuration.`, dispatch, commonErrorFallback);\n\nconst ssoConfigActionSuccessHandler = (type: SsoConfigActionKeys) => (dispatch: AppDispatch) =>\n dispatch(setSnackbar(`The SSO configuration was ${ssoConfigActions[type].success} successfully`));\n\nexport const storeSsoConfig = createAppAsyncThunk(\n `${sliceName}/storeSsoConfig`,\n ({ config, contentType }: { config: string; contentType: 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 = createAppAsyncThunk(\n `${sliceName}/changeSsoConfig`,\n ({ config, contentType }: { config: SSOConfig; contentType: ContentType }, { dispatch }) =>\n Api.put(`${ssoIdpApiUrlv1}/${config.id}`, config.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 = createAppAsyncThunk(`${sliceName}/deleteSsoConfig`, ({ id }: SSOConfig, { 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 = createAppAsyncThunk(\n `${sliceName}/getSsoConfigById`,\n (config: SSOConfig, { dispatch }): Promise<SSOConfig> =>\n Api.get<string>(`${ssoIdpApiUrlv1}/${config.id}`)\n .catch(err => dispatch(ssoConfigActionErrorHandler(err, 'read')))\n .then(({ data, headers }: AxiosResponse<GetIdpSamlOrOpenIdConnectMetadataForTheTenantResponse>): Promise<SSOConfig> => {\n const sso = Object.values(SSO_TYPES).find(({ contentType }) => contentType === headers['content-type']);\n return sso\n ? Promise.resolve({ ...config, config: data, type: sso.id as unknown as SSOConfig['type'] } as SSOConfig)\n : Promise.reject('Unsupported SSO config content type.');\n })\n);\n\nexport const getSsoConfigs = createAppAsyncThunk(`${sliceName}/getSsoConfigs`, (_, { dispatch }) =>\n (Api.get<SSOConfig[]>(ssoIdpApiUrlv1) as Promise<AxiosResponse<SSOConfig[]>>)\n .catch(err => dispatch(ssoConfigActionErrorHandler(err, 'readMultiple')))\n .then(({ data }) =>\n Promise.all(data.map((config: SSOConfig) => dispatch(getSsoConfigById(config)).unwrap()))\n .then((configs: SSOConfig[]) => dispatch(actions.receiveSsoConfigs(configs)))\n .catch(err => commonErrorHandler(err, err, dispatch, ''))\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.\nimport type { PermissionSetWithScope, PersonalAccessToken, RolePermission, RolePermissionObject } from '@northern.tech/types/MenderTypes';\nimport { duplicateFilter, extractErrorMessage, isEmpty } from '@northern.tech/utils/helpers';\nimport { clearAllRetryTimers } from '@northern.tech/utils/retrytimer';\nimport dayjs from 'dayjs';\nimport hashString from 'md5';\nimport Cookies from 'universal-cookie';\n\nimport type { CustomColumn, GlobalSettings, User, UserSettings } from '.';\nimport { actions, sliceName } from '.';\nimport storeActions from '../actions';\nimport GeneralApi from '../api/general-api';\nimport UsersApi from '../api/users-api';\nimport { cleanUp, getSessionInfo, setSessionInfo } from '../auth';\nimport type {\n AnyPermission,\n AuditLogPermission,\n DeploymentPermission,\n GroupsPermission,\n PermissionObject,\n PermissionSet,\n PermissionSetId,\n ReadState,\n ReleasesPermission,\n Role,\n ScopedPermissionsByAreaKey,\n UiPermissionsByAreaKey,\n UiPermissionsByIdKey,\n UiPermissionsDefinition,\n UserManagementPermission\n} from '../constants';\nimport {\n ALL_RELEASES,\n APPLICATION_JSON_CONTENT_TYPE,\n APPLICATION_JWT_CONTENT_TYPE,\n PermissionTypes,\n SSO_TYPES,\n apiRoot,\n defaultPermissionSets,\n rolesById as defaultRolesById,\n emptyRole,\n emptyUiPermissions,\n maxSessionAge,\n scopedPermissionAreas,\n twoFAStates,\n uiPermissionsByArea,\n uiPermissionsById,\n useradmApiUrl,\n useradmApiUrlv2\n} from '../constants';\nimport { getHostedAnnouncement, getOnboardingState, getOrganization, getTooltipsState, getUserSettings as getUserSettingsSelector } from '../selectors';\nimport type { AppDispatch } from '../store';\nimport { commonErrorFallback, commonErrorHandler, createAppAsyncThunk } from '../store';\nimport { setOfflineThreshold } from '../thunks';\nimport { dispatchDelayed, mergePermissions, stripUndefined } from '../utils';\nimport { OWN_USER_ID, READ_STATES, USER_LOGOUT, itemUiPermissionsReducer, settingsKeys } from './constants';\nimport { getCurrentUser, getRolesById, getUsersById } from './selectors';\n\nconst cookies = new Cookies();\n\nconst { setAnnouncement, setSnackbar } = storeActions;\n\ntype ThunkPermissionSet = Record<string, PermissionSet>;\ntype CombinedPermissions = Record<string, UiPermissionsByIdKey[]>;\ntype TransformedAreaRoles = { name: PermissionSetId; scope?: { type?: string; value: string[] } }[];\n\ntype SubmittedRoleUiPermissions = {\n auditlog: AuditLogPermission[];\n deployments: DeploymentPermission[];\n groups: { disableEdit?: boolean; item: string; notFound?: boolean; uiPermissions: GroupsPermission[] }[];\n releases: { disableEdit?: boolean; item: string; notFound?: boolean; uiPermissions: ReleasesPermission[] }[];\n tenantManagement?: UserManagementPermission[];\n userManagement: UserManagementPermission[];\n};\nexport type SubmittedRole = {\n allowUserManagement?: boolean;\n description?: string;\n name: string;\n source?: Omit<SubmittedRole, 'source'>;\n uiPermissions: Partial<SubmittedRoleUiPermissions>;\n};\n\nconst handleLoginError =\n (err: Error, { token2fa: has2FA, password }: { password?: string; token2fa?: string }, rejectWithValue) =>\n () => {\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 return rejectWithValue({ error: errorMessage });\n };\n\n/*\n User management\n*/\ninterface LoginUserPayload {\n email: string;\n password?: string;\n stayLoggedIn?: boolean;\n token2fa?: string;\n}\n\nconst finalizeJwtLogin = ({ dispatch, stayLoggedIn, token }: { dispatch: AppDispatch; stayLoggedIn?: boolean; token: string }) => {\n const 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 return dispatch(getUser(OWN_USER_ID))\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\nexport const confirmOAuthLink = createAppAsyncThunk(\n `${sliceName}/confirmOAuthLink`,\n ({ stayLoggedIn, ...userData }: LoginUserPayload, { dispatch, rejectWithValue }) =>\n UsersApi.postLogin(`${useradmApiUrl}/oauth2/link`, userData)\n .catch(err => {\n cleanUp();\n return Promise.reject(dispatch(handleLoginError(err, userData, rejectWithValue)));\n })\n .then(({ text: token, contentType }) => {\n if (contentType !== APPLICATION_JWT_CONTENT_TYPE || !token) {\n return;\n }\n return finalizeJwtLogin({ token, dispatch, stayLoggedIn });\n })\n);\n\nexport const loginUser = createAppAsyncThunk(`${sliceName}/loginUser`, ({ stayLoggedIn, ...userData }: LoginUserPayload, { 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: token, 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 } = token as unknown as { id: string; kind: string };\n const type = kind.split('/')[1];\n const ssoLoginUrl = SSO_TYPES[type].getStartUrl(id);\n window.location.replace(ssoLoginUrl);\n return;\n }\n\n if (contentType !== APPLICATION_JWT_CONTENT_TYPE || !token) {\n return;\n }\n return finalizeJwtLogin({ token, dispatch, stayLoggedIn });\n })\n);\n\nexport const logoutUser = createAppAsyncThunk(`${sliceName}/logoutUser`, (_, { dispatch, getState }) => {\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 = createAppAsyncThunk(`${sliceName}/switchUserOrganization`, (tenantId: string, { getState }) => {\n if (Object.keys(getState().app.uploadsById).length) {\n return Promise.reject();\n }\n return GeneralApi.get<string>(`${useradmApiUrl}/users/tenants/${tenantId}/token`).then(({ data: token }) => {\n window.sessionStorage.setItem('tenantChanged', 'true');\n setSessionInfo({ ...getSessionInfo(), token });\n window.location.reload();\n });\n});\n\nexport const passwordResetStart = createAppAsyncThunk(`${sliceName}/passwordResetStart`, (email: string, { 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\ninterface PasswordResetPayload {\n newPassword: string;\n secretHash: string;\n}\nexport const passwordResetComplete = createAppAsyncThunk(\n `${sliceName}/passwordResetComplete`,\n ({ secretHash, newPassword }: PasswordResetPayload, { 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 = createAppAsyncThunk(`${sliceName}/verifyEmailStart`, (_, { dispatch, getState }) =>\n GeneralApi.post(`${useradmApiUrl}/auth/verify-email/start`, { email: getCurrentUser(getState()).email })\n .catch(err => commonErrorHandler(err, 'An error occured starting the email verification process:', dispatch))\n .finally(() => Promise.resolve(dispatch(getUser(OWN_USER_ID))))\n);\n\nexport const verifyEmailComplete = createAppAsyncThunk(`${sliceName}/verifyEmailComplete`, (secret_hash: string, { dispatch, rejectWithValue }) =>\n GeneralApi.post(`${useradmApiUrl}/auth/verify-email/complete`, { secret_hash })\n .catch(err => rejectWithValue({ status: err.response?.status, data: err.response?.data }))\n .finally(() => Promise.resolve(dispatch(getUser(OWN_USER_ID))))\n);\n\nexport const verify2FA = createAppAsyncThunk(`${sliceName}/verify2FA`, (tfaData: { token2fa: string }, { dispatch }) =>\n UsersApi.putVerifyTFA(`${useradmApiUrl}/2faverify`, tfaData)\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 = createAppAsyncThunk(`${sliceName}/getUserList`, (_, { dispatch, getState }) =>\n GeneralApi.get<User[]>(`${useradmApiUrl}/users`)\n .then(res => {\n const currentUsersById = getUsersById(getState());\n const users = res.data.reduce(\n (accu, item) => {\n accu[item.id] = {\n ...accu[item.id],\n ...item\n };\n return accu;\n },\n { ...currentUsersById }\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 = createAppAsyncThunk(`${sliceName}/getUser`, (id: string, { dispatch, rejectWithValue }) =>\n GeneralApi.get<User>(`${useradmApiUrl}/users/${id}`)\n .then(({ data: user }) =>\n Promise.all([\n dispatch(actions.receivedUser(user)),\n dispatch(setHideAnnouncement({ shouldHide: false, userId: user.id })),\n dispatch(updateUserColumnSettings({ currentUserId: user.id })),\n user\n ])\n )\n .catch(e => rejectWithValue(e))\n);\n\nexport const initializeSelf = createAppAsyncThunk(`${sliceName}/initializeSelf`, (_, { dispatch }) => dispatch(getUser(OWN_USER_ID)));\n\ninterface UpdateColumnSettingsPayload {\n columns?: CustomColumn[];\n currentUserId?: string;\n}\n\nexport const updateUserColumnSettings = createAppAsyncThunk(\n `${sliceName}/updateUserColumnSettings`,\n ({ columns, currentUserId }: UpdateColumnSettingsPayload, { dispatch, getState }) => {\n const userId = currentUserId ?? getCurrentUser(getState()).id;\n const storageKey = `${userId}-column-widths`;\n let customColumns: CustomColumn[] = [];\n if (!columns) {\n try {\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);\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} as const;\n\nconst userActionErrorHandler = (err: Error, type: keyof typeof userActions, dispatch: AppDispatch) =>\n commonErrorHandler(err, `There was an error ${userActions[type].errorMessage} the user.`, dispatch);\n\ninterface CreateUserPayload {\n email: string;\n password: string;\n shouldResetPassword?: boolean;\n sso?: boolean;\n}\n\nexport const createUser = createAppAsyncThunk(`${sliceName}/createUser`, ({ shouldResetPassword, ...userData }: CreateUserPayload, { dispatch }) =>\n GeneralApi.post(`${useradmApiUrl}/users`, { ...userData, send_reset_password: shouldResetPassword })\n .then(() => Promise.all([dispatch(getUserList()), dispatch(setSnackbar(userActions.create.successMessage))]))\n .catch(err => userActionErrorHandler(err, 'create', dispatch))\n);\n\nexport const removeUser = createAppAsyncThunk(`${sliceName}/removeUser`, (userId: string, { dispatch }) =>\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\ninterface EditUserPayload {\n current_password: string;\n email: string;\n id: string;\n password: string;\n roles?: string[];\n}\n\nexport const editUser = createAppAsyncThunk(\n `${sliceName}/editUser`,\n ({ id, email, password, current_password, roles }: EditUserPayload, { dispatch, getState }) => {\n const userData = stripUndefined({ email, password, current_password, roles });\n return GeneralApi.put(`${useradmApiUrl}/users/${id}`, userData)\n .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 .catch(err => userActionErrorHandler(err, 'edit', dispatch));\n }\n);\n\nexport const checkEmailExists = createAppAsyncThunk(`${sliceName}/checkEmailExists`, async (email: string) => {\n const response = await GeneralApi.get<{ exists?: boolean }>(`${useradmApiUrl}/users/exists?email=${encodeURIComponent(email)}`);\n return response.data.exists;\n});\n\nexport const addUserToCurrentTenant = createAppAsyncThunk(`${sliceName}/addUserToTenant`, (userId: string, { dispatch, getState }) => {\n const { id } = getOrganization(getState());\n return GeneralApi.post(`${useradmApiUrl}/users/${userId}/assign`, { tenant_ids: [id] })\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\nexport const enableUser2fa = createAppAsyncThunk(`${sliceName}/enableUser2fa`, (userId: string = OWN_USER_ID, { dispatch }) =>\n GeneralApi.post(`${useradmApiUrl}/users/${userId}/2fa/enable`)\n .catch(err => commonErrorHandler(err, `There was an error enabling Two Factor authentication for the user.`, dispatch))\n .then(() => Promise.resolve(dispatch(getUser(userId))))\n);\n\nexport const disableUser2fa = createAppAsyncThunk(`${sliceName}/disableUser2fa`, (userId: string = OWN_USER_ID, { dispatch }) =>\n GeneralApi.post(`${useradmApiUrl}/users/${userId}/2fa/disable`)\n .catch(err => commonErrorHandler(err, `There was an error disabling Two Factor authentication for the user.`, dispatch))\n .then(() => Promise.all([dispatch(getUser(userId)), dispatch(actions.receivedQrCode(null))]))\n);\n\n/* RBAC related things follow: */\nconst mapHttpPermission = (permission: RolePermissionObject) =>\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 const endpointUiPermission = endpointMatches.reduce<PermissionObject[]>((endpointAccu, endpoint) => [...endpointAccu, ...endpoint.uiPermissions], []);\n const collector = (endpointUiPermission || definition.uiPermissions)\n .reduce((permissionsAccu: AnyPermission[], 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 } as typeof emptyUiPermissions);\n }\n }\n return accu;\n },\n { ...emptyUiPermissions }\n );\n\nconst permissionActionTypes = {\n any: mapHttpPermission,\n CREATE_DEPLOYMENT: (permission: RolePermissionObject) =>\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: RolePermissionObject) =>\n permission.type === PermissionTypes.DeviceGroup\n ? {\n groups: { [permission.value]: [uiPermissionsById.connect.value] }\n }\n : {},\n VIEW_DEVICE: (permission: RolePermissionObject) =>\n permission.type === PermissionTypes.DeviceGroup\n ? {\n groups: { [permission.value]: [uiPermissionsById.read.value] }\n }\n : {}\n};\n\nconst combinePermissions = (existingPermissions: CombinedPermissions, additionalPermissions: CombinedPermissions = {}): CombinedPermissions =>\n Object.entries(additionalPermissions).reduce((accu, [name, permissions]) => {\n const maybeExistingPermissions = accu[name] || [];\n accu[name] = [...permissions, ...maybeExistingPermissions].filter(duplicateFilter);\n return accu;\n }, existingPermissions);\n\nconst tryParseCustomPermission = (permission: RolePermission) => {\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: RolePermission) => {\n const 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 = (\n permissionSetName: PermissionSetId,\n names: string[],\n scope: UiPermissionsByAreaKey,\n existingGroupsPermissions: CombinedPermissions = {}\n): Record<string, AnyPermission[]> => {\n const permission = Object.values(uiPermissionsById).find(permission => permission.permissionSets[scope] === permissionSetName)?.value as UiPermissionsByIdKey;\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: Partial<UiPermissionsDefinition>) =>\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 = [] }: Role, permissionSets: Record<string, PermissionSet>) => {\n const preliminaryResult = permission_sets_with_scope.reduce(\n (accu, permissionSet) => {\n if (!permissionSet.name) {\n return accu;\n }\n const processor = permissionSets[permissionSet.name];\n if (!processor) {\n return accu;\n }\n const scope = Object.keys(scopedPermissionAreas).find(scope => uiPermissionsByArea[scope].scope === permissionSet.scope?.type) as UiPermissionsByAreaKey;\n if (scope) {\n const result = mapPermissionSet(\n permissionSet.name as PermissionSetId,\n permissionSet.scope?.value ?? [],\n scope,\n accu.uiPermissions[scope] as CombinedPermissions\n );\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 as typeof emptyUiPermissions)\n };\n },\n { isCustom: false, uiPermissions: { ...emptyUiPermissions, groups: {}, releases: {} } }\n );\n return permissions.reduce(customPermissionHandler, preliminaryResult);\n};\n\nexport const normalizeRbacRoles = (roles: Role[], rolesById: Record<string, Role>, permissionSets: ThunkPermissionSet) =>\n roles.reduce(\n (accu, role) => {\n let normalizedPermissions: UiPermissionsDefinition;\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 = createAppAsyncThunk(`${sliceName}/getPermissionSets`, (_, { dispatch, getState }) =>\n GeneralApi.get<Omit<PermissionSet, 'result'>[]>(`${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<PermissionObject>(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: ScopedPermissionsByAreaKey[], { key, scopeType }) => {\n if (permissionSetObject.supported_scope_types?.includes(key) || permissionSetObject.supported_scope_types?.includes(scopeType)) {\n accu.push(key);\n }\n return accu;\n }, []);\n permissionSetObject = scopes.reduce<PermissionSet>((accu, scope) => {\n accu.result = {\n ...accu.result,\n [scope]: mapPermissionSet(permissionSetObject.name, [scopedPermissionAreas[scope].excessiveAccessSelector], scope) as Record<string, any[]>\n };\n return accu;\n }, permissionSetObject);\n accu[permissionSet.name] = permissionSetObject;\n return accu;\n },\n { ...getState().users.permissionSetsById }\n );\n return Promise.all([\n Promise.resolve(dispatch(actions.receivedPermissionSets(permissionSets))) as Promise<ReturnType<AppDispatch>>,\n Promise.resolve(permissionSets)\n ]);\n })\n .catch(() => console.log('Permission set retrieval failed - likely accessing a non-RBAC backend'))\n);\n\nexport const getRoles = createAppAsyncThunk(`${sliceName}/getRoles`, async (_, { dispatch, getState }) => {\n try {\n const [{ data: roles }, permissionSetResult] = await Promise.all([\n GeneralApi.get<Role[]>(`${useradmApiUrlv2}/roles?per_page=500`),\n dispatch(getPermissionSets())\n ]);\n const permissionSetTasks = permissionSetResult.payload as [unknown, unknown];\n const rolesById = normalizeRbacRoles(roles, getRolesById(getState()), permissionSetTasks[permissionSetTasks.length - 1] as ThunkPermissionSet);\n return dispatch(actions.receivedRoles(rolesById));\n } catch {\n console.log('Role retrieval failed - likely accessing a non-RBAC backend');\n } finally {\n dispatch(actions.finishedRoleInitialization(true));\n }\n});\n\nconst deriveImpliedAreaPermissions = (\n area: UiPermissionsByAreaKey,\n areaPermissions: UiPermissionsByIdKey[],\n skipPermissions: AnyPermission[] = []\n): AnyPermission[] => {\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: AnyPermission[], current) => {\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 */\n\nconst transformAreaRoleDataToScopedPermissionsSets = (\n area: ScopedPermissionsByAreaKey,\n areaPermissions: { item: string; uiPermissions: UiPermissionsByIdKey[] }[],\n excessiveAccessSelector: string\n): TransformedAreaRoles => {\n type PermissionSetObject = Record<PermissionSetId, { type?: string; value: string[] }>;\n const permissionSetObject: 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\n const skipPermissions = scopedPermissionAreas.releases.key === area && item !== ALL_RELEASES ? [uiPermissionsById.upload.value] : [];\n const impliedPermissions = deriveImpliedAreaPermissions(area, uiPermissions, skipPermissions);\n accu = impliedPermissions.reduce((itemPermissionAccu, impliedPermission): PermissionSetObject => {\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 }, {} as PermissionSetObject);\n return Object.entries(permissionSetObject).map(([name, { value, ...scope }]) => {\n if (value.includes(excessiveAccessSelector)) {\n return { name: name as PermissionSetId };\n }\n return { name: name as PermissionSetId, scope: { ...scope, value: value.filter(duplicateFilter) } };\n });\n};\n\nconst transformRoleDataToRole = (roleData: SubmittedRole, roleState: Partial<Role> = {}): { permissionSetsWithScope: PermissionSetWithScope[]; role: Role } => {\n const role = { ...roleState, ...roleData };\n const { description = '', name, uiPermissions = emptyUiPermissions } = role;\n const { maybeUiPermissions, remainderKeys } = Object.entries(emptyUiPermissions).reduce<{\n maybeUiPermissions: Partial<Record<ScopedPermissionsByAreaKey, Record<string, AnyPermission[]>>>;\n remainderKeys: UiPermissionsByAreaKey[];\n }>(\n (accu, [key, emptyPermissions]) => {\n if (!scopedPermissionAreas[key]) {\n accu.remainderKeys.push(key as UiPermissionsByAreaKey);\n } else if (uiPermissions[key]) {\n accu.maybeUiPermissions[key as ScopedPermissionsByAreaKey] = 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 as AnyPermission[]);\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 accu.push(\n ...transformAreaRoleDataToScopedPermissionsSets(\n key,\n uiPermissions[key] as unknown as { item: string; uiPermissions: UiPermissionsByIdKey[] }[],\n excessiveAccessSelector\n )\n );\n return accu;\n }, [] as TransformedAreaRoles);\n return {\n permissionSetsWithScope: [...permissionSetsWithScope, ...scopedPermissionSets],\n role: {\n ...emptyRole,\n name,\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} as const;\n\nconst roleActionErrorHandler = (err: Error, type: keyof typeof roleActions, dispatch: AppDispatch, meta?: { name: string; permissionSetsCreated: number }) => {\n let errorContext = `There was an error ${roleActions[type].errorMessage} the role.`;\n if (meta) {\n const { permissionSetsCreated, name } = meta;\n errorContext += ` Tried to ${type} role ${name} with ${permissionSetsCreated} permission sets.`;\n }\n return commonErrorHandler(err, errorContext, dispatch);\n};\n\nexport const createRole = createAppAsyncThunk(`${sliceName}/createRole`, (roleData: SubmittedRole, { 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, { permissionSetsCreated: permissionSetsWithScope.length, name: role.name }));\n});\n\nexport const editRole = createAppAsyncThunk(`${sliceName}/editRole`, (roleData: SubmittedRole, { dispatch, getState }) => {\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, { permissionSetsCreated: permissionSetsWithScope.length, name: role.name }));\n});\n\nexport const removeRole = createAppAsyncThunk(`${sliceName}/removeRole`, (roleId: string, { dispatch }) =>\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 = createAppAsyncThunk(`${sliceName}/getGlobalSettings`, async (_, { dispatch }) => {\n const {\n data: settings,\n headers: { etag }\n } = await GeneralApi.get<GlobalSettings>(`${useradmApiUrl}/settings`);\n window.sessionStorage.setItem(settingsKeys.initialized, 'true');\n await Promise.all([dispatch(actions.setGlobalSettings(settings)), dispatch(setOfflineThreshold())]);\n return { etag };\n});\n\nexport const saveGlobalSettings = createAppAsyncThunk(\n `${sliceName}/saveGlobalSettings`,\n ({ beOptimistic = false, notify = false, ...settings }: Partial<GlobalSettings>, { dispatch, getState }) => {\n if (!window.sessionStorage.getItem(settingsKeys.initialized) && !beOptimistic) {\n return;\n }\n return dispatch(getGlobalSettings())\n .unwrap()\n .then(result => {\n const updatedSettings = { ...getState().users.globalSettings, ...settings };\n if (getCurrentUser(getState()).verified) {\n updatedSettings['2fa'] = twoFAStates.enabled;\n } else {\n delete updatedSettings['2fa'];\n }\n const tasks: Promise<ReturnType<AppDispatch> | unknown>[] = [Promise.resolve(dispatch(actions.setGlobalSettings(updatedSettings)))];\n const headers = result.etag ? { 'If-Match': result.etag } : {};\n return GeneralApi.post(`${useradmApiUrl}/settings`, updatedSettings, { headers })\n .then(() => {\n if (notify) {\n tasks.push(Promise.resolve(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 return commonErrorHandler(err, `The settings couldn't be saved.`, dispatch);\n });\n });\n }\n);\n\nexport const getUserSettings = createAppAsyncThunk(`${sliceName}/getUserSettings`, async (_, { dispatch }) => {\n const {\n data: settings,\n headers: { etag }\n } = await GeneralApi.get<UserSettings>(`${useradmApiUrl}/settings/me`);\n window.sessionStorage.setItem(settingsKeys.initialized, 'true');\n dispatch(actions.setUserSettings(settings));\n return { etag };\n});\n\nexport const saveUserSettings = createAppAsyncThunk(\n `${sliceName}/saveUserSettings`,\n (settings: Partial<UserSettings> = { 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 ...settings,\n firstLoginTimestamp: userSettings.firstLoginTimestamp ?? dayjs().format(),\n onboarding: {\n ...onboardingState,\n ...settings.onboarding\n },\n tooltips: tooltipState\n };\n const headers = result.etag ? { 'If-Match': result.etag } : {};\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);\n\nexport const get2FAQRCode = createAppAsyncThunk(`${sliceName}/get2FAQRCode`, (_, { dispatch }) =>\n GeneralApi.get<{ qr: string }>(`${useradmApiUrl}/2faqr`).then(res => dispatch(actions.receivedQrCode(res.data.qr)))\n);\n\nexport const setHideAnnouncement = createAppAsyncThunk<void, { shouldHide: boolean; userId?: string }>(\n `${sliceName}/setHideAnnouncement`,\n ({ shouldHide, userId }, { dispatch, getState }) => {\n const currentUserId = userId || getCurrentUser(getState()).id;\n const announcement = getHostedAnnouncement(getState());\n const hash = announcement ? hashString(announcement) : '';\n const announceCookie = cookies.get(`${currentUserId}${hash}`);\n if (shouldHide || (hash.length && typeof announceCookie !== 'undefined')) {\n cookies.set(`${currentUserId}${hash}`, true, { maxAge: 604800 });\n dispatch(setAnnouncement(''));\n }\n }\n);\n\nexport const getTokens = createAppAsyncThunk(`${sliceName}/getTokens`, (_, { dispatch, getState }) =>\n GeneralApi.get<PersonalAccessToken[]>(`${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\nexport const generateToken = createAppAsyncThunk(\n `${sliceName}/generateToken`,\n async ({ expiresIn = ONE_YEAR, name }: { expiresIn?: number; name: string }, { dispatch }) => {\n const { data: token } = await GeneralApi.post<string>(`${useradmApiUrl}/settings/tokens`, { name, expires_in: expiresIn }).catch(err =>\n commonErrorHandler(err, 'There was an error creating the token:', dispatch)\n );\n await dispatch(getTokens());\n return token;\n }\n);\n\nexport const revokeToken = createAppAsyncThunk(`${sliceName}/revokeToken`, (token: PersonalAccessToken, { dispatch }) =>\n GeneralApi.delete(`${useradmApiUrl}/settings/tokens/${token.id}`).then(() => Promise.resolve(dispatch(getTokens())))\n);\n\nexport const setTooltipReadState = createAppAsyncThunk(\n `${sliceName}/setTooltipReadState`,\n async ({ persist, ...remainder }: { id: string; persist: boolean; readState: ReadState }, { dispatch }) => {\n dispatch(actions.setTooltipState(remainder));\n if (persist) {\n await dispatch(saveUserSettings());\n }\n }\n);\n\nexport const setAllTooltipsReadState = createAppAsyncThunk(\n `${sliceName}/toggleHelptips`,\n ({ readState = READ_STATES.read, tooltipIds }: { readState: string; tooltipIds: string[] }, { dispatch }) => {\n const updatedTips = tooltipIds.reduce((accu, id) => ({ ...accu, [id]: { readState } }), {});\n return Promise.resolve(dispatch(actions.setTooltipsState(updatedTips))).then(() => dispatch(saveUserSettings()));\n }\n);\n\ntype LogAnalysisFeedback = {\n deployment_id: string;\n device_id: string;\n useful: boolean;\n};\n\ntype ProductFeedback = {\n message: string;\n score: number;\n};\n\ntype SubmitFeedbackPayload = {\n feedback: LogAnalysisFeedback | ProductFeedback;\n formId: string;\n};\n\nexport const submitUserFeedback = createAppAsyncThunk(`${sliceName}/submitFeedback`, ({ formId, feedback }: SubmitFeedbackPayload, { dispatch }) =>\n GeneralApi.post(`${useradmApiUrlv2}/support/feedback/${formId}`, feedback).then(() => {\n if (formId === 'product') {\n const today = new Date();\n dispatch(saveUserSettings({ feedbackCollectedAt: today.toISOString().split('T')[0] }));\n dispatchDelayed({ action: actions.setShowFeedbackDialog(false), dispatch });\n }\n })\n);\n"],"mappings":"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"}
1
+ {"version":3,"file":"thunks.cjs","names":["cookies","Cookies","createAppAsyncThunk","actions","getOfflineThresholdSettings","getSearchState","storeActions","defaultPage","defaultPerPage","DEVICE_LIST_DEFAULTS","deploymentPrototype","mapTermsToFilters","createAppAsyncThunk","sliceName","SORTING_OPTIONS","getIdAttribute","GeneralApi","deploymentsApiUrlV2","headerNames","actions","DEPLOYMENT_TYPES","stripUndefined","deploymentsApiUrl","getDeploymentsByStatusSelector","getGlobalSettings","getOrganization","commonErrorHandler","setSnackbar","TIMEOUTS","getUserCapabilities","standardizePhases","getDevicesById","DEPLOYMENT_ROUTES","DEPLOYMENT_STATES","getDeploymentsById","apiRoot","storeActions","defaultPage","defaultPerPage","DEVICE_LIST_DEFAULTS","rootfsImageVersion","createAppAsyncThunk","sliceName","GeneralApi","inventoryApiUrl","getGroupsById","UNGROUPED_GROUP","DEVICE_FILTERING_OPTIONS","actions","setSnackbar","TIMEOUTS","commonErrorHandler","getDeviceReportsForUser","inventoryApiUrlV2","commonErrorFallback","mapTermsToFilters","mapFiltersToTerms","headerNames","filtersFilter","getSelectedGroup","getDeviceByIdSelector","mapDeviceAttributes","DEVICE_STATES","extractErrorMessage","getTenantCapabilities","getUserCapabilities","getDeviceTwinIntegrations","getLatestDeviceAlerts","getDeviceMonitorConfig","deviceAuthV2","getDeviceListState","SORTING_OPTIONS","ALL_DEVICE_STATES","getSelectedDeviceAttribute","convertDeviceListStateToFilters","getDeviceFilters","getIdAttribute","getUserSettings","getDevicesById","getDeviceCountsByStatus","getDeviceReports","getAcceptedDevices","deviceConnect","auditLogsApiUrl","progress","deviceConfig","getGlobalSettings","iotManagerBaseURL","EXTERNAL_PROVIDER","emptyFilter","cookies","Cookies","onboardingSteps","onboardingStepNames","DEVICE_STATES","createAppAsyncThunk","sliceName","getCurrentOnboardingState","getUserCapabilities","actions","Tracking","cookies","Cookies","utc","storeActions","DEVICE_LIST_DEFAULTS","createAppAsyncThunk","sliceName","getOrganization","Api","tenantadmApiUrlv2","setSnackbar","TIMEOUTS","PLANS","ADDONS","locations","actions","commonErrorHandler","SORTING_OPTIONS","getTenantCapabilities","auditLogsApiUrl","headerNames","getAuditlogState","getSpLimits","convertToBackendSPLimits","commonErrorFallback","TENANT_LIST_DEFAULT","getTenantsList","tenantadmApiUrlv1","getCurrentUser","setAnnouncement","parseSubscriptionPreview","deviceAuthV2","iotManagerBaseURL","ssoIdpApiUrlv1","SSO_TYPES","Cookies","storeActions","maxSessionAge","actions","createAppAsyncThunk","sliceName","UsersApi","useradmApiUrl","APPLICATION_JWT_CONTENT_TYPE","APPLICATION_JSON_CONTENT_TYPE","SSO_TYPES","GeneralApi","USER_LOGOUT","getSessionInfo","commonErrorHandler","getCurrentUser","getUsersById","commonErrorFallback","stripUndefined","getOrganization","uiPermissionsByArea","PermissionTypes","apiRoot","duplicateFilter","mergePermissions","scopedPermissionAreas","emptyUiPermissions","uiPermissionsById","emptyRole","defaultRolesById","useradmApiUrlv2","getRolesById","ALL_RELEASES","itemUiPermissionsReducer","defaultPermissionSets","settingsKeys","twoFAStates","getUserSettingsSelector","getOnboardingState","getTooltipsState","getHostedAnnouncement","READ_STATES"],"sources":["../src/appSlice/thunks.ts","../src/deploymentsSlice/thunks.ts","../src/devicesSlice/thunks.ts","../src/onboardingSlice/thunks.ts","../src/organizationSlice/thunks.ts","../src/usersSlice/thunks.ts"],"sourcesContent":["// 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.\nimport { deepCompare } from '@northern.tech/utils/helpers';\nimport Cookies from 'universal-cookie';\n\nimport type { SearchState } from '.';\nimport { actions, sliceName } from '.';\nimport { getOfflineThresholdSettings } from '../selectors';\nimport type { AppDispatch } from '../store';\nimport { createAppAsyncThunk } from '../store';\nimport { searchDevices } from '../thunks';\nimport { getSearchState } from './selectors';\n\nconst cookies = new Cookies();\n\n/*\n General\n*/\nexport const setFirstLoginAfterSignup = createAppAsyncThunk<void, boolean>(`${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 = createAppAsyncThunk(`${sliceName}/setOfflineThreshold`, async (_, { 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: string;\n try {\n value = today.toISOString();\n } catch {\n dispatch(actions.setSnackbar('There was an error saving the offline threshold, please check your settings.'));\n return;\n }\n return dispatch(actions.setOfflineThreshold(value));\n});\n\nexport const setSearchState = createAppAsyncThunk(`${sliceName}/setSearchState`, (searchState: Partial<SearchState>, { dispatch, getState }) => {\n const currentState = getSearchState(getState());\n const nextState = {\n ...currentState,\n ...searchState,\n sort: {\n ...currentState.sort,\n ...searchState.sort\n }\n };\n const tasks: Promise<ReturnType<AppDispatch> | unknown>[] = [];\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(searchResult => dispatch(actions.setSearchState({ ...searchResult, isSearching: false })))\n .catch(() => dispatch(actions.setSearchState({ isSearching: false, searchTotal: 0 })))\n );\n }\n tasks.push(Promise.resolve(dispatch(actions.setSearchState(nextState))));\n return Promise.all(tasks);\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/*eslint import/namespace: ['error', { allowComputed: true }]*/\nimport type {\n DeploymentV1 as BackendDeploymentV1,\n DeploymentV2 as BackendDeploymentV2,\n ConfigurationTenant,\n DeviceWithImage,\n NewDeploymentTypeManagement as NewDeployment,\n NewDeploymentForGroup,\n NewDeploymentV2TypeManagement as NewDeploymentV2\n} from '@northern.tech/types/MenderTypes';\nimport { customSort, deepCompare, isEmpty, standardizePhases } from '@northern.tech/utils/helpers';\nimport Tracking from '@northern.tech/utils/tracking';\nimport validator from 'validator';\n\nimport type {\n Deployment,\n DeploymentByStatus,\n DeploymentByStatusKey,\n DeploymentConfig,\n DeploymentStatus,\n DeviceDeployment,\n SelectionListState,\n SelectionState\n} from '.';\nimport { actions, sliceName } from '.';\nimport storeActions from '../actions';\nimport GeneralApi from '../api/general-api';\nimport { DEVICE_LIST_DEFAULTS, SORTING_OPTIONS, TIMEOUTS, apiRoot, deploymentsApiUrl, deploymentsApiUrlV2, headerNames } from '../constants';\nimport type { SortOptions } from '../constants';\nimport { getDevicesById, getGlobalSettings, getIdAttribute, getOrganization, getUserCapabilities } from '../selectors';\nimport { commonErrorHandler, createAppAsyncThunk } from '../store';\nimport { getDeviceAuth, getDeviceById, saveGlobalSettings } from '../thunks';\nimport { mapTermsToFilters, stripUndefined } from '../utils';\nimport { DEPLOYMENT_ROUTES, DEPLOYMENT_STATES, DEPLOYMENT_TYPES, deploymentPrototype } from './constants';\nimport { getDeploymentsById, getDeploymentsByStatus as getDeploymentsByStatusSelector } from './selectors';\n\nconst { isUUID } = validator;\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 }: Deployment) =>\n group || (groups.length === 1 && !isUUID(name)) ? groups[0] : filter?.name;\n\ntype ReceivedDeployment = BackendDeploymentV1 | BackendDeploymentV2;\n// a deployment name can legitimately contain a bare '%' or an otherwise invalid escape (e.g. a\n// trailing '%2') that decodeURIComponent rejects with a URIError. Falling back to the raw name\n// keeps a single bad name from rejecting getDeploymentsByStatus and breaking the entire list.\nconst decodeDeploymentName = (name: string) => {\n try {\n return decodeURIComponent(name);\n } catch {\n return name;\n }\n};\nexport const transformDeployments = (deployments: ReceivedDeployment[], deploymentsById: Record<string, Deployment>) =>\n deployments.sort(customSort(true, 'created')).reduce<{ deploymentIds: string[]; deployments: Record<string, Deployment> }>(\n (accu, item) => {\n const filter = item.filter;\n let deployment: Deployment = {\n ...deploymentPrototype,\n ...deploymentsById[item.id],\n ...item,\n // TODO: explicitly set filter term types to address scope type mismatch in deployment specs\n // @ts-expect-error: type misalignment in filter terms type\n filter: filter ? { ...filter, name: filter.name ?? filter.id, filters: mapTermsToFilters(filter.terms) } : undefined,\n name: decodeDeploymentName(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 type GetDeploymentsByStatusPayload = Partial<SelectionListState> & {\n group?: string;\n shouldSelect?: boolean;\n sort?: SortOptions;\n status: DeploymentByStatusKey;\n};\nexport const getDeploymentsByStatus = createAppAsyncThunk(\n `${sliceName}/getDeploymentsByStatus`,\n (options: GetDeploymentsByStatusPayload, { dispatch, getState }) => {\n const { status, page = defaultPage, perPage = 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 { attribute, scope } = getIdAttribute(getState());\n const attributeHint = `&id_attribute=${attribute}&id_scope=${scope}`;\n const search = group ? `&name=${group}${attributeHint}` : '';\n const typeFilter = type ? `&type=${type}` : '';\n return GeneralApi.get<BackendDeploymentV1[]>(\n `${deploymentsApiUrlV2}/deployments?status=${status}&per_page=${perPage}&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 const tasks: Promise<unknown>[] = [\n Promise.resolve(dispatch(actions.receivedDeployments(deployments))),\n Promise.resolve(\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 ];\n deploymentIds.forEach(deploymentId => {\n if (deployments[deploymentId].type === DEPLOYMENT_TYPES.configuration) {\n tasks.push(dispatch(getSingleDeployment(deploymentId)).unwrap());\n }\n });\n if (shouldSelect) {\n tasks.push(Promise.resolve(dispatch(actions.selectDeploymentsForStatus({ deploymentIds, status, total }))));\n }\n tasks.push(Promise.resolve({ deploymentIds, total }));\n return Promise.all(tasks);\n });\n }\n);\n\nconst isWithinFirstMonth = (expirationDate?: string) => {\n if (!expirationDate) {\n return false;\n }\n const endOfFirstMonth = new Date(expirationDate);\n endOfFirstMonth.setMonth(endOfFirstMonth.getMonth() - 11);\n return endOfFirstMonth > new Date();\n};\n\nconst trackDeploymentCreation = (totalDeploymentCount: number, hasDeployments: boolean, trial_expiration?: string) => {\n Tracking.event({ category: 'deployments', action: 'create' });\n if (!totalDeploymentCount) {\n if (!hasDeployments) {\n Tracking.event({ category: 'deployments', action: 'create_initial_deployment' });\n if (isWithinFirstMonth(trial_expiration)) {\n Tracking.event({ category: 'deployments', action: 'create_initial_deployment_first_month' });\n }\n }\n Tracking.event({ category: 'deployments', action: 'create_initial_deployment_user' });\n }\n};\n\nconst cleanPhases = (phases?: NewDeployment['phases']) =>\n phases?.map(({ batch_size, batch_size_devices, start_ts }) => stripUndefined({ batch_size, batch_size_devices, start_ts }));\n\nconst MAX_PREVIOUS_PHASES_COUNT = 5;\nexport const createDeployment = createAppAsyncThunk(\n `${sliceName}/createDeployment`,\n ({ newDeployment }: { newDeployment: NewDeployment | (NewDeploymentForGroup & { group: string }) | NewDeploymentV2 }, { dispatch, getState }) => {\n let request;\n const { name, artifact_name, retries, update_control_map, autogenerate_delta } = newDeployment;\n const common = { name, artifact_name, phases: cleanPhases(newDeployment.phases), retries, update_control_map, autogenerate_delta };\n if ('filter_id' in newDeployment && newDeployment.filter_id) {\n const { filter_id, max_devices, uniform_phases } = newDeployment;\n request = GeneralApi.post(\n `${deploymentsApiUrlV2}/deployments`,\n stripUndefined({ ...common, filter_id, max_devices, uniform_phases, phases: uniform_phases ? undefined : common.phases })\n );\n } else if ('group' in newDeployment && newDeployment.group) {\n const { force_installation, group } = newDeployment;\n request = GeneralApi.post(`${deploymentsApiUrl}/deployments/group/${group}`, stripUndefined({ ...common, force_installation }));\n } else {\n const { devices, all_devices, force_installation } = newDeployment as NewDeployment;\n request = GeneralApi.post(`${deploymentsApiUrl}/deployments`, stripUndefined({ ...common, devices, all_devices, force_installation }));\n }\n const totalDeploymentCount = (Object.values(getDeploymentsByStatusSelector(getState())) as DeploymentStatus[]).reduce<number>(\n (accu, item) => accu + item.total,\n 0\n );\n const { hasDeployments } = getGlobalSettings(getState());\n const { trial_expiration } = getOrganization(getState());\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: 'devices' in newDeployment && newDeployment.devices ? newDeployment.devices.map(id => ({ id, status: 'pending' })) : [],\n statistics: { status: {} }\n };\n const tasks: Promise<unknown>[] = [\n Promise.resolve(dispatch(actions.createdDeployment(deployment))),\n dispatch(getSingleDeployment(deploymentId)),\n Promise.resolve(dispatch(setSnackbar({ message: 'Deployment created successfully', autoHideDuration: TIMEOUTS.fiveSeconds })))\n ];\n // track in GA\n trackDeploymentCreation(totalDeploymentCount, hasDeployments, trial_expiration);\n const { canManageUsers } = getUserCapabilities(getState());\n if (canManageUsers) {\n const { phases = [], uniform_phases } = newDeployment as NewDeploymentV2;\n const { previousPhases = [] } = getGlobalSettings(getState());\n const newSettings: any = { hasDeployments: true };\n if (phases) {\n const standardPhases = standardizePhases(uniform_phases ? [uniform_phases] : phases);\n const 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);\n\nexport const getDeploymentDevices = createAppAsyncThunk(\n `${sliceName}/getDeploymentDevices`,\n (options: { id: string; page?: number; perPage?: number }, { dispatch, getState }) => {\n const { id, page = defaultPage, perPage = defaultPerPage } = options;\n return GeneralApi.get<DeviceWithImage[]>(`${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<Record<string, DeviceWithImage>>((accu, item) => {\n accu[item.id] = item;\n const log: boolean = (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 const tasks: Promise<unknown>[] = [\n Promise.resolve(\n dispatch(\n actions.receivedDeploymentDevices({\n id,\n devices,\n selectedDeviceIds,\n totalDeviceCount: Number(response.headers[headerNames.total])\n })\n )\n )\n ];\n const devicesById = getDevicesById(getState());\n // only update those that have changed & lack data\n const lackingData = selectedDeviceIds.reduce<string[]>((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 lackingData.forEach(deviceId => {\n tasks.push(dispatch(getDeviceById(deviceId)).unwrap(), dispatch(getDeviceAuth(deviceId)).unwrap());\n });\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 deployment: Deployment;\n device: DeviceWithImage;\n}): DeviceDeployment => ({\n id,\n release,\n created,\n deleted,\n deviceId,\n finished,\n status,\n log,\n route: Object.values(DEPLOYMENT_ROUTES).reduce<string>((accu, { key, states }) => {\n if (!accu) {\n return (states as readonly string[]).includes(deploymentStatus) ? key : accu;\n }\n return accu;\n }, '')\n});\ntype GetDeviceDeploymentsPayload = {\n deviceId: string;\n filterSelection?: string[];\n page?: number;\n perPage?: number;\n};\n\nexport const getDeviceDeployments = createAppAsyncThunk(`${sliceName}/getDeviceDeployments`, (options: GetDeviceDeploymentsPayload, { 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 = createAppAsyncThunk(`${sliceName}/resetDeviceDeployments`, (deviceId: string, { 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 = createAppAsyncThunk(`${sliceName}/getSingleDeployment`, (id: string, { dispatch, getState }) =>\n GeneralApi.get<BackendDeploymentV1>(`${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 = createAppAsyncThunk(\n `${sliceName}/getDeviceLog`,\n ({ deploymentId, deviceId }: { deploymentId: string; deviceId: string }, { 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 = createAppAsyncThunk(`${sliceName}/abortDeployment`, (deploymentId: string, { dispatch, getState }) =>\n GeneralApi.put(`${deploymentsApiUrl}/deployments/${deploymentId}/status`, { status: 'aborted' })\n .then(() => {\n const deploymentsByStatus: DeploymentByStatus = getDeploymentsByStatusSelector(getState());\n let status: DeploymentByStatusKey = DEPLOYMENT_STATES.pending;\n let index = deploymentsByStatus.pending.deploymentIds.findIndex((id: string) => id === deploymentId);\n if (index < 0) {\n status = DEPLOYMENT_STATES.inprogress;\n index = deploymentsByStatus.inprogress.deploymentIds.findIndex((id: string) => 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<Record<string, Deployment>>((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 = createAppAsyncThunk(\n `${sliceName}/updateDeploymentControlMap`,\n ({ deploymentId, updateControlMap }: { deploymentId: string; updateControlMap: BackendDeploymentV1['update_control_map'] }, { 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\ntype DeepPartial<T> = {\n [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];\n};\n\ntype SetDeploymentsStatePayload = DeepPartial<SelectionState> & { page?: number; perPage?: number };\nexport const setDeploymentsState = createAppAsyncThunk(`${sliceName}/setDeploymentsState`, (selection: SetDeploymentsStatePayload, { 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 const nextState = {\n ...currentState,\n ...selectionState,\n ...Object.keys(DEPLOYMENT_STATES).reduce<Partial<SelectionState>>((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 } as SelectionState;\n const tasks: Promise<unknown>[] = [Promise.resolve(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 = createAppAsyncThunk(`${sliceName}/getDeploymentsConfig`, (_, { dispatch, getState }) =>\n GeneralApi.get<ConfigurationTenant>(`${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 = {} } = binary_delta;\n const { xdelta_args_limits = {} } = binary_delta_limits;\n const config = {\n ...oldConfig,\n hasDelta: Boolean(delta.enabled),\n binaryDelta: {\n ...oldConfig.binaryDelta,\n ...mapExternalDeltaConfig(xdelta_args)\n },\n binaryDeltaLimits: {\n ...oldConfig.binaryDeltaLimits,\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 = <T extends Record<string, any>>(source: T): Partial<T> | undefined =>\n Object.entries(source).reduce<Partial<T> | undefined>((accu, [key, value]) => {\n if (value !== undefined) {\n const 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 } as Partial<T>;\n }\n return accu;\n }, undefined);\n\nexport const saveDeltaDeploymentsConfig = createAppAsyncThunk(\n `${sliceName}/saveDeltaDeploymentsConfig`,\n (config: DeploymentConfig['binaryDelta'], { dispatch, getState }) => {\n const configChange = {\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);\n\nexport const generateDeploymentLogAnalysis = createAppAsyncThunk(\n `${sliceName}/generateDeploymentLogAnalysis`,\n ({ deploymentId, deviceId }: { deploymentId: string; deviceId: string }, { dispatch, rejectWithValue }) =>\n GeneralApi.get<string>(`${apiRoot}/v1alpha1/deployments/deployments/${deploymentId}/devices/${deviceId}/log/explain`, { timeout: 60 * TIMEOUTS.oneSecond })\n .then(({ data: result }) => Promise.resolve(result))\n .catch(err => {\n if (err.response.status === 429) {\n return rejectWithValue(err.response);\n }\n commonErrorHandler(err, 'There was an error analysing the deployment log:', dispatch);\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.\nimport type {\n AttributeResponse,\n Device as BackendDevice,\n Filter as BackendFilter,\n ConnectionState,\n DeviceConfiguration,\n DeviceInventoryResponse,\n DeviceState,\n DeviceTierLimits,\n DeviceWithImage,\n Integration,\n ManagementApiConfiguration,\n NewConfigurationDeployment,\n NewConfigurationDeploymentResponse,\n PreAuthSet,\n SortCriteria,\n Status\n} from '@northern.tech/types/MenderTypes';\nimport { attributeDuplicateFilter, dateRangeToUnix, deepCompare } from '@northern.tech/utils/helpers';\nimport { isCancel } from 'axios';\nimport pluralize from 'pluralize';\nimport { v4 as uuid } from 'uuid';\n\nimport type { Device, DeviceFilter, DeviceGroup, DeviceGroups, DeviceListState, DeviceSelectedAttribute } from '.';\nimport { actions, sliceName } from '.';\nimport storeActions from '../actions';\nimport GeneralApi from '../api/general-api';\nimport type { SearchState } from '../appSlice';\nimport {\n ALL_DEVICE_STATES,\n DEVICE_FILTERING_OPTIONS,\n DEVICE_LIST_DEFAULTS,\n DEVICE_STATES,\n EXTERNAL_PROVIDER,\n MAX_PAGE_SIZE,\n SORTING_OPTIONS,\n TIMEOUTS,\n UNGROUPED_GROUP,\n auditLogsApiUrl,\n deviceAuthV2,\n deviceConfig,\n deviceConnect,\n headerNames,\n inventoryApiUrl,\n inventoryApiUrlV2,\n iotManagerBaseURL,\n rootfsImageVersion\n} from '../constants';\nimport type { DeviceAuthState, DeviceIssueOptionKey } from '../constants';\nimport {\n getAcceptedDevices,\n getDeviceReports,\n getDeviceReportsForUser,\n getDeviceTwinIntegrations,\n getGlobalSettings,\n getIdAttribute,\n getSelectedDeviceAttribute,\n getTenantCapabilities,\n getUserCapabilities,\n getUserSettings\n} from '../selectors';\nimport type { AppDispatch, RootState } from '../store';\nimport { commonErrorFallback, commonErrorHandler, createAppAsyncThunk } from '../store';\nimport { getDeviceMonitorConfig, getLatestDeviceAlerts, getSingleDeployment, saveGlobalSettings, saveUserSettings } from '../thunks';\nimport {\n convertDeviceListStateToFilters,\n dispatchDelayed,\n extractErrorMessage,\n filtersFilter,\n mapDeviceAttributes,\n mapFiltersToTerms,\n mapTermsToFilters,\n progress\n} from '../utils';\nimport { emptyFilter } from './constants';\nimport {\n getDeviceById as getDeviceByIdSelector,\n getDeviceCountsByStatus,\n getDeviceFilters,\n getDeviceListState,\n getDevicesById,\n getGroupsById,\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 = createAppAsyncThunk(`${sliceName}/getGroups`, async (_, { dispatch, getState }) => {\n const res = await GeneralApi.get<string[]>(`${inventoryApiUrl}/groups`);\n const state: Record<string, DeviceGroup> = 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: DeviceFilter[] = [{ key: 'group', value: res.data, operator: DEVICE_FILTERING_OPTIONS.$nin.key, scope: 'system' }];\n const [, devicesRetrieval] = await Promise.all([\n dispatch(actions.receivedGroups(groups)),\n dispatch(getDevicesByStatus({ filterSelection: filters, group: '', page: 1, perPage: 1, status: undefined }))\n ]);\n const { total } = (devicesRetrieval?.payload as { total?: number }) ?? {};\n if (!total) {\n return;\n }\n return 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\nexport const addDevicesToGroup = createAppAsyncThunk(\n `${sliceName}/addDevicesToGroup`,\n ({ group, deviceIds, isCreation }: { deviceIds: string[]; group: string; isCreation: boolean }, { 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 = createAppAsyncThunk(\n `${sliceName}/removeDevicesFromGroup`,\n ({ group, deviceIds }: { deviceIds: string[]; group: string }, { dispatch }) =>\n GeneralApi.delete(`${inventoryApiUrl}/groups/${group}/devices`, deviceIds).then(() =>\n Promise.all([\n dispatch(actions.removeFromGroup({ group, deviceIds })),\n dispatch(\n setSnackbar({\n message: `The ${pluralize('devices', deviceIds.length)} ${pluralize('were', deviceIds.length)} removed from the group`,\n autoHideDuration: TIMEOUTS.fiveSeconds\n })\n )\n ])\n )\n);\n\nexport const addStaticGroup = createAppAsyncThunk(\n `${sliceName}/addStaticGroup`,\n ({ group, devices }: { devices: Device[]; group: string }, { 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(async () => {\n await dispatch(setDeviceListState({ setOnly: true })).unwrap();\n await dispatch(getGroups()).unwrap();\n })\n )\n .catch(err => commonErrorHandler(err, `Group could not be updated:`, dispatch))\n);\nexport const removeReportsByGroupName = createAppAsyncThunk(`${sliceName}/removeReportsByGroupName`, (groupName: string, { dispatch, getState }) => {\n if (!groupName) return Promise.resolve();\n const reports = getDeviceReportsForUser(getState());\n const filteredReports = reports.filter(report => report.group !== groupName);\n dispatch(saveUserSettings({ reports: filteredReports }));\n});\n\nexport const removeStaticGroup = createAppAsyncThunk(`${sliceName}/removeStaticGroup`, (groupName: string, { dispatch }) =>\n GeneralApi.delete(`${inventoryApiUrl}/groups/${groupName}`).then(() =>\n Promise.all([\n dispatch(actions.removeGroup(groupName)),\n dispatch(removeReportsByGroupName(groupName)),\n dispatch(getGroups()),\n dispatch(setSnackbar({ message: 'Group was removed successfully', autoHideDuration: TIMEOUTS.fiveSeconds }))\n ])\n )\n);\nexport const getDynamicGroup = createAppAsyncThunk(`${sliceName}/getDynamicGroupById`, (id, { dispatch }) =>\n GeneralApi.get<BackendFilter>(`${inventoryApiUrlV2}/filters/${id}`).catch(err => {\n if (err.response && err.response.status === 404) {\n throw new Error('Request failed with status code 404');\n }\n return commonErrorHandler(err, `Error retrieving the group: `, dispatch, commonErrorFallback);\n })\n);\n\nexport const getDynamicGroups = createAppAsyncThunk(`${sliceName}/getDynamicGroups`, (_, { dispatch, getState }) =>\n GeneralApi.get(`${inventoryApiUrlV2}/filters?per_page=${MAX_PAGE_SIZE}`)\n .then(({ data: filters }) => {\n const state: Record<string, DeviceGroup> = 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 = createAppAsyncThunk(\n `${sliceName}/addDynamicGroup`,\n ({ groupName, filterPredicates }: { filterPredicates: DeviceFilter[]; groupName: string }, { 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(async () => {\n const { cleanedFilters } = getGroupFilters(groupName, getState().devices.groups);\n dispatch(actions.setDeviceFilters(cleanedFilters));\n await dispatch(getDynamicGroups()).unwrap();\n })\n )\n .catch(err => commonErrorHandler(err, `Group could not be updated:`, dispatch))\n);\n\nexport const updateDynamicGroup = createAppAsyncThunk(\n `${sliceName}/updateDynamicGroup`,\n ({ groupName, filterPredicates }: { filterPredicates: DeviceFilter[]; groupName: string }, { dispatch, getState }) => {\n const filterId = getState().devices.groups.byId[groupName].id;\n return GeneralApi.delete(`${inventoryApiUrlV2}/filters/${filterId}`).then(() => dispatch(addDynamicGroup({ groupName, filterPredicates })).unwrap());\n }\n);\n\nexport const removeDynamicGroup = createAppAsyncThunk(`${sliceName}/removeDynamicGroup`, (groupName: string, { dispatch, getState }) => {\n const filterId = getState().devices.groups.byId[groupName].id;\n return GeneralApi.delete(`${inventoryApiUrlV2}/filters/${filterId}`).then(() =>\n Promise.all([\n dispatch(actions.removeGroup(groupName)),\n dispatch(removeReportsByGroupName(groupName)),\n dispatch(setSnackbar({ message: 'Group was removed successfully', autoHideDuration: TIMEOUTS.fiveSeconds }))\n ])\n );\n});\n\n/*\n * Device inventory functions\n */\nconst getGroupFilters = (group: string, groupsState: DeviceGroups, filters: DeviceFilter[] = []) => {\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 = createAppAsyncThunk<unknown, { filters?: DeviceFilter[]; group: string }>(\n `${sliceName}/selectGroup`,\n ({ 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 const tasks: Promise<ReturnType<AppDispatch> | unknown>[] = [];\n if (groupFilterLength) {\n tasks.push(Promise.resolve(dispatch(actions.setDeviceFilters(cleanedFilters))));\n } else {\n tasks.push(Promise.resolve(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(Promise.resolve(dispatch(actions.selectGroup(selectedGroupName))));\n return Promise.all(tasks);\n }\n);\n\nconst getEarliestTs = (dateA = '', dateB = '') => (!dateA || !dateB ? dateA || dateB : dateA < dateB ? dateA : dateB);\n\ntype ReceivedDevice = BackendDevice & DeviceInventoryResponse & Omit<DeviceWithImage, 'status'>;\nconst reduceReceivedDevices = (devices: ReceivedDevice[], ids: string[], state: RootState, status?: DeviceAuthState) =>\n devices.reduce(\n (accu, device: any) => {\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 const lastCheckIn = device.check_in_time_exact ?? device.check_in_time_rounded;\n device.isOffline = new Date(lastCheckIn) < new Date(state.app.offlineThreshold) || lastCheckIn === 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 );\ntype getGroupDevicesPayload = {\n group: string;\n page?: number;\n perPage?: number;\n shouldIncludeAllStates: boolean;\n};\nexport const getGroupDevices = createAppAsyncThunk(`${sliceName}/getGroupDevices`, async (options: getGroupDevicesPayload, { dispatch, getState }) => {\n const { group, shouldIncludeAllStates, ...remainder } = options;\n const { cleanedFilters: filterSelection } = getGroupFilters(group, getState().devices.groups);\n const { deviceAccu, total } = await dispatch(\n getDevicesByStatus({\n ...remainder,\n filterSelection,\n group,\n status: shouldIncludeAllStates ? undefined : DEVICE_STATES.accepted\n })\n ).unwrap();\n if (!group) {\n return;\n }\n const stateGroup = getState().devices.groups.byId[group];\n if (!stateGroup && !total && !deviceAccu.ids.length) {\n return;\n }\n return dispatch(\n actions.addGroup({\n group: {\n deviceIds:\n deviceAccu.ids.length === total || (stateGroup && stateGroup.deviceIds && deviceAccu.ids.length > stateGroup.deviceIds.length)\n ? deviceAccu.ids\n : stateGroup.deviceIds,\n total\n },\n groupName: group\n })\n );\n});\n\nexport const getAllGroupDevices = createAppAsyncThunk(\n `${sliceName}/getAllGroupDevices`,\n ({ group, attribute }: { attribute: string; group: string }, { 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: string[] = []) =>\n GeneralApi.post(`${inventoryApiUrlV2}/filters/search`, {\n page,\n per_page: perPage,\n filters: filterTerms,\n attributes: [...attributes, { scope: 'inventory', attribute }]\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);\n\nexport const getAllDynamicGroupDevices = createAppAsyncThunk(\n `${sliceName}/getAllDynamicGroupDevices`,\n ({ group, attribute }: { attribute: string; group: string }, { 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: string[] = []) =>\n GeneralApi.post(`${inventoryApiUrlV2}/filters/search`, {\n page,\n per_page: perPage,\n filters,\n attributes: [...attributes, { scope: 'inventory', attribute }]\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 > 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);\n\nexport const getDeviceById = createAppAsyncThunk(`${sliceName}/getDeviceById`, (id: string, { 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 log: false\n }\n ],\n [],\n getState()\n ).devicesById[id];\n dispatch(actions.receivedDevice(device));\n }\n })\n);\n\nexport const getDeviceInfo = createAppAsyncThunk(`${sliceName}/getDeviceInfo`, (deviceId: string, { dispatch, getState }) => {\n const device = getDeviceByIdSelector(getState(), deviceId) as Device;\n const { hasDeviceConfig, hasDeviceConnect, hasMonitor } = getTenantCapabilities(getState());\n const { canConfigure } = getUserCapabilities(getState());\n const integrations = getDeviceTwinIntegrations(getState());\n // Get full device identity details for single selected device\n const tasks: Promise<ReturnType<AppDispatch> | unknown>[] = [\n dispatch(getDeviceAuth(deviceId)),\n dispatch(getDeviceById(deviceId)),\n ...integrations.map(integration => dispatch(getDeviceTwin({ deviceId, integration })))\n ];\n if (hasDeviceConfig && canConfigure && (device.status === DEVICE_STATES.accepted || device.status === DEVICE_STATES.preauth)) {\n tasks.push(dispatch(getDeviceConfig(deviceId)));\n }\n if (device.status === DEVICE_STATES.accepted) {\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\n/*\n Device Auth + admission\n */\nexport const getAllDeviceCounts = createAppAsyncThunk(`${sliceName}/getAllDeviceCounts`, (_, { dispatch }) =>\n GeneralApi.get(`${inventoryApiUrlV2}/statistics`).then(({ data }) => {\n const { devices_by_status }: { devices_by_status: Record<DeviceAuthState, DeviceTierLimits> } = data;\n Object.entries(devices_by_status).map(([status, countsPerTier]) => dispatch(actions.setDevicesCountByStatus({ countsPerTier, status })));\n return;\n })\n);\n\nexport const getDeviceLimits = createAppAsyncThunk(`${sliceName}/getDeviceLimit`, (_, { dispatch }) =>\n GeneralApi.get(`${deviceAuthV2}/limits/devices`).then(res => dispatch(actions.setDeviceLimits(res.data)))\n);\n\nexport const getTestDeviceCount = createAppAsyncThunk(`${sliceName}/getTestDeviceCount`, async (_, { dispatch }) => {\n const res = await GeneralApi.post(`${inventoryApiUrlV2}/filters/search`, {\n page: 1,\n per_page: 1,\n filters: [{ scope: 'system', attribute: 'test_device', type: DEVICE_FILTERING_OPTIONS.$eq.key, value: 'true' }],\n attributes: [{ scope: 'identity', attribute: 'status' }]\n }).catch(err => commonErrorHandler(err, `Retrieving test device count failed:`, dispatch, commonErrorFallback));\n return dispatch(actions.setTestDeviceCount(Number(res.headers[headerNames.total])));\n});\n\ntype SetDeviceListStatePayload = {\n fetchAuth?: boolean;\n forceRefresh?: boolean;\n shouldSelectDevices?: boolean;\n} & Partial<DeviceListState>;\nexport const setDeviceListState = createAppAsyncThunk(\n `${sliceName}/setDeviceListState`,\n ({ shouldSelectDevices = true, forceRefresh, fetchAuth = true, ...selectionState }: SetDeviceListStatePayload, { dispatch, getState }) => {\n const currentState = getDeviceListState(getState());\n const refreshTrigger = forceRefresh ? !currentState.refreshTrigger : selectionState.refreshTrigger;\n const nextState = {\n ...currentState,\n setOnly: false,\n refreshTrigger,\n ...selectionState,\n sort: { ...currentState.sort, ...selectionState.sort }\n };\n const tasks: Promise<unknown>[] = [];\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 as SortCriteria['order'], scope: sortScope }] as SortCriteria[]) : 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 as DeviceAuthState | undefined, sortOptions: sortBy, fetchAuth }))\n .unwrap()\n .then(({ deviceAccu, total }) => {\n const devicesState: Partial<DeviceListState> = 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 if (\n currentState.page !== nextState.page ||\n currentState.perPage > nextState.perPage ||\n currentState.state !== nextState.state ||\n !deepCompare(currentState.sort, nextState.sort)\n ) {\n nextState.selection = [];\n }\n tasks.push(Promise.resolve(dispatch(actions.setDeviceListState(nextState))));\n return Promise.all(tasks);\n }\n);\n\ntype GetDevicesByStatusPayload = {\n fetchAuth: boolean;\n filterSelection: DeviceFilter[];\n group: string;\n page: number;\n perPage: number;\n selectedAttributes: DeviceSelectedAttribute[];\n selectedIssues: DeviceIssueOptionKey[];\n sortOptions: SortCriteria[];\n status: DeviceAuthState;\n};\n// get devices from inventory\nexport const getDevicesByStatus = createAppAsyncThunk(\n `${sliceName}/getDevicesByStatus`,\n async (options: Partial<GetDevicesByStatusPayload>, { 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 = getSelectedDeviceAttribute(getState())\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 const response = await GeneralApi.post(`${inventoryApiUrlV2}/filters/search`, {\n page,\n per_page: perPage,\n filters: filterTerms,\n sort: sortOptions,\n attributes\n }).catch(err => commonErrorHandler(err, `${status} devices couldn't be loaded.`, dispatch, commonErrorFallback));\n const currentState = getState();\n const deviceAccu = reduceReceivedDevices(response.data, [], currentState, status);\n let total = !applicableFilters.length ? Number(response.headers[headerNames.total]) : 0;\n if (status && currentState.devices.byStatus[status].counts.total === deviceAccu.ids.length) {\n total = deviceAccu.ids.length;\n }\n const sideEffects: Promise<unknown>[] = [Promise.resolve(dispatch(actions.receivedDevices(deviceAccu.devicesById)))];\n if (status) {\n sideEffects.push(Promise.resolve(dispatch(actions.setDevicesByStatus({ deviceIds: deviceAccu.ids, status, total }))));\n }\n // for each device, get device identity info\n const receivedDevices: Device[] = Object.values(deviceAccu.devicesById);\n if (receivedDevices.length && fetchAuth) {\n sideEffects.push(dispatch(getDevicesWithAuth(receivedDevices as { id: string }[])));\n }\n await Promise.all(sideEffects);\n return { deviceAccu, total: Number(response.headers[headerNames.total]) };\n }\n);\n\nexport const getAllDevicesByStatus = createAppAsyncThunk(\n `${sliceName}/getAllDevicesByStatus`,\n ({ status, attribute }: { attribute: string; status: DeviceAuthState }, { dispatch, getState }) => {\n const attributes = [...defaultAttributes, getIdAttribute(getState())];\n const getAllDevices = (perPage = MAX_PAGE_SIZE, page = 1, devices: string[] = []) =>\n GeneralApi.post(`${inventoryApiUrlV2}/filters/search`, {\n page,\n per_page: perPage,\n filters: mapFiltersToTerms([{ key: 'status', value: status, operator: DEVICE_FILTERING_OPTIONS.$eq.key, scope: 'identity' }]),\n attributes: [...attributes, { scope: 'inventory', attribute }]\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 return Promise.resolve();\n });\n return getAllDevices();\n }\n);\n\ntype SearchDevicesPayload = SearchState & { sortOptions: SortCriteria[] };\nexport const searchDevices = createAppAsyncThunk(\n `${sliceName}/searchDevices`,\n async (passedOptions: Partial<SearchDevicesPayload> = {}, { dispatch, getState }) => {\n const state = getState();\n const 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 const response = await GeneralApi.post(`${inventoryApiUrlV2}/filters/search`, {\n page,\n per_page: 10,\n filters: [],\n sort: sortOptions,\n text: searchTerm,\n attributes\n }).catch(err => commonErrorHandler(err, `devices couldn't be searched.`, dispatch, commonErrorFallback));\n const deviceAccu = reduceReceivedDevices(response.data, [], getState());\n dispatch(actions.receivedDevices(deviceAccu.devicesById));\n return { deviceIds: deviceAccu.ids, searchTotal: Number(response.headers[headerNames.total]) };\n }\n);\n\nconst ATTRIBUTE_LIST_CUTOFF = 100;\nconst attributeReducer = (attributes: AttributeResponse[] = []) =>\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 = createAppAsyncThunk(`${sliceName}/getDeviceAttributes`, (_, { dispatch }) =>\n GeneralApi.get(`${inventoryApiUrlV2}/filters/attributes`).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\nconst initializeDistributionData = (report, groups: Record<string, DeviceGroup>, devices: Record<string, Device>, totalDeviceCount: number) => {\n const { attribute, group = '', software = '' } = report;\n const effectiveAttribute = software ? software : attribute;\n const { deviceIds, total = 0 } = groups[group] || {};\n const relevantDevices: Device[] = deviceIds ? deviceIds.map(id => devices[id]) : Object.values(devices);\n const distributionByAttribute = relevantDevices.reduce<Record<string, number>>((accu, item) => {\n if (!item.attributes || item.status !== DEVICE_STATES.accepted) return accu;\n const attributeValue = (item.attributes[effectiveAttribute] as string) ?? '';\n if (!accu[attributeValue]) {\n accu[attributeValue] = 0;\n }\n accu[attributeValue] = accu[attributeValue] + 1;\n return accu;\n }, {});\n const distributionByAttributeSorted = Object.entries(distributionByAttribute).sort((pairA, pairB) => pairB[1] - pairA[1]);\n const items: { count: number; key: string }[] = distributionByAttributeSorted.map(([key, count]) => ({ key, count }));\n const dataCount = items.reduce<number>((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 updateReportData = createAppAsyncThunk(`${sliceName}/updateReportData`, (reportIndex: number, { dispatch, getState }) => {\n const reports = getDeviceReportsForUser(getState());\n const report = reports[reportIndex];\n const { group = '' } = report;\n const devicesById = getDevicesById(getState());\n const groups = getGroupsById(getState());\n const { accepted: acceptedDevicesCount } = getDeviceCountsByStatus(getState());\n const totalDeviceCount = groups[group] ? (groups[group].total as number) : acceptedDevicesCount;\n\n const reportsData = getDeviceReports(getState());\n const newReports = [...reportsData];\n newReports[reportIndex] = initializeDistributionData(report, groups, devicesById, totalDeviceCount);\n return Promise.resolve(dispatch(actions.setDeviceReports(newReports)));\n});\n\nexport const getReportDataWithoutBackendSupport = createAppAsyncThunk(\n `${sliceName}/getReportDataWithoutBackendSupport`,\n (reportIndex: number, { dispatch, getState }) => {\n const reports = getDeviceReportsForUser(getState());\n const report = reports[reportIndex];\n if (!report) {\n return;\n }\n const { attribute, group = '', software = '' } = report;\n const effectiveAttribute = software ? software : attribute;\n const devicesById = getDevicesById(getState());\n const acceptedDevices = getAcceptedDevices(getState());\n const { accepted: acceptedDevicesCount } = getDeviceCountsByStatus(getState());\n const groups = getGroupsById(getState());\n const { deviceIds = [], filters = [], total = 0 } = groups[group] || {};\n const relevantIds = group ? deviceIds : acceptedDevices.deviceIds;\n const hasAttributeData = relevantIds.every(id => devicesById[id]?.attributes?.[effectiveAttribute] !== undefined);\n let groupDevicesRequest = Promise.resolve({\n payload: { groupName: '', group: { deviceIds: Object.keys(devicesById), total: Object.keys(devicesById).length } }\n });\n if (group && (!(deviceIds.length && total) || deviceIds.length !== total || !deviceIds.every(id => !!devicesById[id]) || !hasAttributeData)) {\n groupDevicesRequest = filters.length\n ? dispatch(getAllDynamicGroupDevices({ group, attribute: effectiveAttribute })).unwrap()\n : dispatch(getAllGroupDevices({ group, attribute: effectiveAttribute })).unwrap();\n } else if (\n !group &&\n (acceptedDevices.deviceIds.length !== acceptedDevicesCount || !acceptedDevices.deviceIds.every(id => !!devicesById[id]) || !hasAttributeData)\n ) {\n groupDevicesRequest = dispatch(getAllDevicesByStatus({ status: DEVICE_STATES.accepted, attribute: effectiveAttribute })).unwrap();\n }\n return groupDevicesRequest.then(() => dispatch(updateReportData(reportIndex)));\n }\n);\n\nexport const getDeviceConnect = createAppAsyncThunk(`${sliceName}/getDeviceConnect`, (id: string, { dispatch }) =>\n GeneralApi.get<ConnectionState>(`${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\nconst updateTypeMap = { deploymentUpdate: 'check-update', inventoryUpdate: 'send-inventory' };\nexport const triggerDeviceUpdate = createAppAsyncThunk(`${sliceName}/triggerDeviceUpdate`, async ({ id, type }: { id: string; type: string }, { dispatch }) => {\n await GeneralApi.post(`${deviceConnect}/devices/${id}/${updateTypeMap[type] ?? updateTypeMap.deploymentUpdate}`).catch(err =>\n commonErrorHandler(err, `The request couldn't be sent.`, dispatch)\n );\n dispatch(setSnackbar('Request has been sent.'));\n await new Promise(resolve => setTimeout(resolve, TIMEOUTS.threeSeconds));\n return dispatch(getDeviceById(id));\n});\n\ntype GetSessionDetailsPayload = { deviceId: string; endDate: string; sessionId: string; startDate: string; userId: string };\nexport const getSessionDetails = createAppAsyncThunk(\n `${sliceName}/getSessionDetails`,\n ({ sessionId, deviceId, userId, startDate, endDate }: GetSessionDetailsPayload) => {\n const { start: startUnix, end: endUnix } = dateRangeToUnix(startDate, endDate);\n const createdAfter = startDate ? `&created_after=${startUnix}` : '';\n const createdBefore = endDate ? `&created_before=${endUnix}` : '';\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);\n\nexport const getDeviceFileDownloadLink = createAppAsyncThunk(\n `${sliceName}/getDeviceFileDownloadLink`,\n ({ deviceId, path }: { deviceId: string; path: string }) =>\n Promise.resolve(`${window.location.origin}${deviceConnect}/devices/${deviceId}/download?path=${encodeURIComponent(path)}`)\n);\n\nexport const deviceFileUpload = createAppAsyncThunk(\n `${sliceName}/deviceFileUpload`,\n ({ deviceId, path, file }: { deviceId: string; file: File; path: string }, { dispatch }) => {\n const 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: { progress: 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({ message: 'Upload successful', autoHideDuration: TIMEOUTS.fiveSeconds }))))\n .catch(err => {\n if (isCancel(err)) {\n return dispatch(setSnackbar({ message: 'The upload has been cancelled', autoHideDuration: TIMEOUTS.fiveSeconds }));\n }\n return commonErrorHandler(err, `Error uploading file to device.`, dispatch);\n })\n .finally(() => dispatch(cleanUpUpload(uploadId)));\n }\n);\n\nexport const getDeviceAuth = createAppAsyncThunk(`${sliceName}/getDeviceAuth`, async (id: string, { dispatch }) => {\n const receivedDevices = await dispatch(getDevicesWithAuth([{ id }])).unwrap();\n return receivedDevices?.[0];\n});\n\nexport const getDevicesWithAuth = createAppAsyncThunk(`${sliceName}/getDevicesWithAuth`, async (devices: { id: string }[], { dispatch, getState }) => {\n if (!devices.length) {\n return [] as ReceivedDevice[];\n }\n const { data: receivedDevices } = await GeneralApi.get(`${deviceAuthV2}/devices?id=${devices.map(device => device.id).join('&id=')}`).catch(err =>\n commonErrorHandler(err, `Error: ${err}`, dispatch)\n );\n const { devicesById } = reduceReceivedDevices(receivedDevices, [], getState());\n dispatch(actions.receivedDevices(devicesById));\n return receivedDevices as ReceivedDevice[];\n});\n\nconst getSnackbarMessage = (skipped: number, done: number, failed: number = 0) => {\n pluralize.addIrregularRule('its', 'their');\n const skipText = skipped\n ? `${skipped} ${pluralize('devices', skipped)} ${pluralize('have', skipped)} more than one pending authset. Expand ${pluralize(\n 'this',\n skipped\n )} ${pluralize('device', skipped)} to individually adjust ${pluralize('their', skipped)} authorization status. `\n : '';\n const failedText = failed ? `${failed} ${pluralize('device', failed)} could not be updated. You may have reached your device limit. ` : '';\n const doneText = done ? `${done} ${pluralize('device', done)} ${pluralize('was', done)} updated successfully. ` : '';\n return `${doneText}${skipText}${failedText}`;\n};\n\nexport const updateDeviceAuth = createAppAsyncThunk(\n `${sliceName}/updateDeviceAuth`,\n ({ deviceId, authId, status }: { authId: string; deviceId: string; status: Status['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 => {\n const errorContext =\n err.response?.status === 422\n ? 'Device limit reached: You have reached your limit of accepted devices.'\n : 'There was a problem updating the device authorization status:';\n return commonErrorHandler(err, errorContext, dispatch);\n })\n .then(() => Promise.resolve(dispatch(actions.maybeUpdateDevicesByStatus({ deviceId, authId }))))\n .finally(() => dispatch(setDeviceListState({ refreshTrigger: !getDeviceListState(getState()).refreshTrigger })))\n);\n\nexport const updateDevicesAuth = createAppAsyncThunk(\n `${sliceName}/updateDevicesAuth`,\n ({ deviceIds, status }: { deviceIds: string[]; status: Status['status'] }, { dispatch, getState }) => {\n let devices = getDevicesById(getState());\n const deviceIdsWithoutAuth = deviceIds.reduce<{ id: string }[]>((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 && 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, failed, count } = results.reduce(\n (accu, item) => {\n if (item.status === 'rejected') {\n if (item.reason) {\n accu.failed = accu.failed + 1;\n } else {\n accu.skipped = accu.skipped + 1;\n }\n } else {\n accu.count = accu.count + 1;\n }\n return accu;\n },\n { skipped: 0, failed: 0, count: 0 }\n );\n const message = getSnackbarMessage(skipped, count, failed);\n // break if an error occurs, display status up til this point before error message\n return dispatch(setSnackbar(message));\n });\n });\n }\n);\n\nexport const deleteAuthset = createAppAsyncThunk(\n `${sliceName}/deleteAuthset`,\n ({ deviceId, authId }: { authId: string; deviceId: string }, { 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 = createAppAsyncThunk(`${sliceName}/preauthDevice`, (authset: PreAuthSet, { dispatch, rejectWithValue }) =>\n GeneralApi.post(`${deviceAuthV2}/devices`, authset)\n .then(() =>\n Promise.resolve(dispatch(setSnackbar({ message: 'Device was successfully added to the preauthorization list', autoHideDuration: TIMEOUTS.fiveSeconds })))\n )\n .catch(err => {\n if (err.response.status === 409) {\n return rejectWithValue('A device with a matching identity data set already exists');\n }\n return commonErrorHandler(err, 'The device could not be added:', dispatch);\n })\n);\n\nexport const decommissionDevice = createAppAsyncThunk(\n `${sliceName}/decommissionDevice`,\n ({ deviceId, authId }: { authId?: string; deviceId: string }, { 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 = createAppAsyncThunk(`${sliceName}/getDeviceConfig`, (deviceId: string, { dispatch }) =>\n GeneralApi.get<DeviceConfiguration>(`${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 = createAppAsyncThunk(\n `${sliceName}/setDeviceConfig`,\n ({ deviceId, config }: { config: ManagementApiConfiguration; deviceId: string }, { 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);\ntype ApplyDeviceConfigPayload = {\n config: DeviceConfiguration;\n configDeploymentConfiguration: NewConfigurationDeployment;\n deviceId: string;\n isDefault: boolean;\n};\nexport const applyDeviceConfig = createAppAsyncThunk(\n `${sliceName}/applyDeviceConfig`,\n ({ deviceId, configDeploymentConfiguration, isDefault, config }: ApplyDeviceConfigPayload, { dispatch, getState }) =>\n GeneralApi.post<NewConfigurationDeploymentResponse>(`${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 const tasks: Promise<ReturnType<AppDispatch> | unknown>[] = [\n Promise.resolve(dispatch(actions.receivedDevice({ ...device, config: { ...device.config, deployment_id: data.deployment_id! } })))\n ];\n dispatchDelayed({ action: getSingleDeployment(data.deployment_id!), delay: TIMEOUTS.oneSecond, dispatch });\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 = createAppAsyncThunk(\n `${sliceName}/setDeviceTags`,\n ({ deviceId, tags }: { deviceId: string; tags: Record<string, string> }, { dispatch }) =>\n // to prevent tag set failures, retrieve the device & use the freshest etag we can get\n dispatch(getDeviceById(deviceId))\n .unwrap()\n .then(device => {\n const headers = device.etag ? { 'If-Match': device.etag } : {};\n const tagList = Object.entries(tags).map(([name, value]) => ({ name, value }));\n const isNameChange = tagList.some(({ name }) => name === 'name');\n return GeneralApi.put(`${inventoryApiUrl}/devices/${deviceId}/tags`, tagList, { headers })\n .catch(err => commonErrorHandler(err, `There was an error setting tags for device ${deviceId}.`, dispatch, 'Please check your connection.'))\n .then(() =>\n Promise.all([\n dispatch(actions.receivedDevice({ ...device, id: deviceId, tags })),\n dispatch(setSnackbar(`Device ${tagList.length === 1 && isNameChange ? 'name' : 'tags'} changed`))\n ])\n );\n })\n);\n\nexport const setTestDeviceStatus = createAppAsyncThunk(\n `${sliceName}/setTestDeviceStatus`,\n ({ deviceId, test_device }: { deviceId: string; test_device: boolean }, { dispatch }) =>\n GeneralApi.put(`${deviceAuthV2}/devices/${deviceId}/flags`, { test_device })\n .catch(err => commonErrorHandler(err, `There was an error setting test status for device ${deviceId}.`, dispatch, 'Please check your connection.'))\n .then(() =>\n Promise.all([\n dispatch(setSnackbar('Device updated successfully')),\n dispatch(actions.receivedDevice({ id: deviceId, flags: { test_device } })), // optimistic\n dispatch(getDeviceById(deviceId)),\n dispatch(getTestDeviceCount())\n ])\n )\n);\n\ntype DeviceTwinPayload = { deviceId: string; integration: Integration };\nexport const getDeviceTwin = createAppAsyncThunk(`${sliceName}/getDeviceTwin`, ({ deviceId, integration }: DeviceTwinPayload, { dispatch, getState }) => {\n let providerResult = {};\n return GeneralApi.get<DeviceState>(`${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\ntype SetDeviceTwinPayload = { deviceId: string; integration: Integration; settings: any };\nexport const setDeviceTwin = createAppAsyncThunk(\n `${sliceName}/setDeviceTwin`,\n ({ deviceId, integration, settings }: SetDeviceTwinPayload, { 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(\n actions.receivedDevice({ ...device, twinsByIntegration: { ...twinsByIntegration, [integration.id!]: { ...currentState, desired: settings } } })\n )\n );\n })\n);\n\nconst prepareSearchArguments = ({ filters, group, state, status }: { filters?: DeviceFilter[]; group?: string; state: RootState; status?: string }) => {\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};\ntype GetSystemDevicesPayload = { id: string; page?: number; perPage?: number; sortOptions: SortCriteria[] };\nexport const getSystemDevices = createAppAsyncThunk(`${sliceName}/getSystemDevices`, (options: GetSystemDevicesPayload, { 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 as { mender_gateway_system_id?: string };\n const filters: DeviceFilter[] = [\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(`${inventoryApiUrlV2}/filters/search`, {\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 = createAppAsyncThunk(`${sliceName}/getGatewayDevices`, (deviceId: string, { dispatch, getState }) => {\n const state = getState();\n const { attributes = {} } = getDeviceByIdSelector(state, deviceId);\n const { mender_gateway_system_id = '' } = attributes as { mender_gateway_system_id?: string };\n const filters: DeviceFilter[] = [\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(`${inventoryApiUrlV2}/filters/search`, {\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 const tasks: Promise<ReturnType<AppDispatch> | unknown>[] = ids.map(deviceId => dispatch(getDeviceInfo(deviceId)));\n tasks.push(Promise.resolve(dispatch(actions.receivedDevice({ id: deviceId, gatewayIds: ids }))));\n return Promise.all(tasks);\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.\nimport { getDemoDeviceAddress } from '@northern.tech/utils/helpers';\nimport Tracking from '@northern.tech/utils/tracking';\nimport Cookies from 'universal-cookie';\n\nimport type { OnboardingApproach } from '.';\nimport { actions, sliceName } from '.';\nimport type { OnboardingStep } from '../constants';\nimport { DEVICE_STATES, onboardingSteps as onboardingStepNames, orderedOnboardingSteps as onboardingSteps } from '../constants';\nimport { getOnboardingState as getCurrentOnboardingState, getUserCapabilities } from '../selectors';\nimport type { AppDispatch } from '../store';\nimport { createAppAsyncThunk } from '../store';\nimport { saveUserSettings } from '../thunks';\n\nconst cookies = new Cookies();\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 deviceTier = acceptedDevices.length && devicesById[acceptedDevices[0]].tier;\n let approach: OnboardingApproach | null = null;\n if (deviceType.some(type => type.startsWith('qemu'))) {\n approach = 'virtual';\n } else if (deviceType.some(type => type.startsWith('esp32')) || deviceTier === 'micro') {\n approach = 'mcu';\n } else if (deviceType.length) {\n approach = 'physical';\n }\n const progress = 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 || approach,\n progress\n };\n};\n\nexport const getOnboardingState = createAppAsyncThunk(`${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 = createAppAsyncThunk(`${sliceName}/setOnboardingDeviceType`, (value: string[] | string, { dispatch }) =>\n Promise.all([dispatch(actions.setOnboardingDeviceType(value)), dispatch(saveUserSettings({ onboarding: { deviceType: value } }))])\n);\n\nexport const setOnboardingApproach = createAppAsyncThunk(`${sliceName}/setOnboardingApproach`, (value: OnboardingApproach, { dispatch }) =>\n Promise.all([dispatch(actions.setOnboardingApproach(value)), dispatch(saveUserSettings({ onboarding: { approach: value } }))])\n);\n\nexport const setOnboardingComplete = createAppAsyncThunk(`${sliceName}/setOnboardingComplete`, (value: boolean, { dispatch }) => {\n const tasks: Promise<ReturnType<AppDispatch> | unknown>[] = [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 = createAppAsyncThunk(`${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 // since we can't advance after ONBOARDING_CANCELED, track the step manually here\n .then(() => Tracking.event({ category: 'onboarding', action: onboardingStepNames.ONBOARDING_CANCELED }))\n);\n\nexport const advanceOnboarding = createAppAsyncThunk(`${sliceName}/advanceOnboarding`, (stepId: OnboardingStep, { 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 >= onboardingSteps.findIndex(step => step === onboardingStepNames.DEPLOYMENTS_PAST_COMPLETED_FAILURE) ? true : state.complete;\n Tracking.event({ category: 'onboarding', action: stepId });\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.\nimport type {\n Tenant as BackendTenant,\n BillingInfo,\n BillingProfile,\n CardSetupData,\n ConstraintsInfo,\n Event,\n GetAuditLogsResponse,\n GetIdpSamlOrOpenIdConnectMetadataForTheTenantResponse,\n Integration,\n NewTenantTypeManagement as NewTenant,\n PreviewRequest,\n Product,\n ProductInfo,\n Subscription,\n SupportRequest,\n UpdateChildTenant\n} from '@northern.tech/types/MenderTypes';\nimport { dateRangeToUnix, deepCompare } from '@northern.tech/utils/helpers';\nimport type { AxiosResponse } from 'axios';\nimport dayjs from 'dayjs';\nimport utc from 'dayjs/plugin/utc.js';\nimport hashString from 'md5';\nimport Cookies from 'universal-cookie';\n\nimport { actions, sliceName } from '.';\nimport storeActions from '../actions';\nimport Api from '../api/general-api';\nimport type { Addon, AvailablePlans, ContentType, PaginationOptions, SortOptions } from '../constants';\nimport {\n ADDONS,\n DEVICE_LIST_DEFAULTS,\n PLANS,\n SORTING_OPTIONS,\n TENANT_LIST_DEFAULT,\n TIMEOUTS,\n auditLogsApiUrl,\n deviceAuthV2,\n headerNames,\n iotManagerBaseURL,\n locations,\n ssoIdpApiUrlv1,\n tenantadmApiUrlv1,\n tenantadmApiUrlv2\n} from '../constants';\nimport { getCurrentUser, getSpLimits, getTenantCapabilities, getTenantsList } from '../selectors';\nimport type { AppDispatch } from '../store';\nimport { commonErrorFallback, commonErrorHandler, createAppAsyncThunk } from '../store';\nimport { getDeviceLimits, setFirstLoginAfterSignup } from '../thunks';\nimport { convertToBackendSPLimits, dispatchDelayed, parseSubscriptionPreview } from '../utils';\nimport { SSO_TYPES } from './constants';\nimport { getAuditlogState, getOrganization } from './selectors';\nimport type { AuditLogSelectionState, ProductConfig, ProductPlan, ProductTier, SSOConfig, Tenant, TenantList } from './types';\n\nconst cookies = new Cookies();\n\ndayjs.extend(utc);\nconst { setAnnouncement, setSnackbar } = storeActions;\nconst { page: defaultPage, perPage: defaultPerPage } = DEVICE_LIST_DEFAULTS;\n\nexport const cancelRequest = createAppAsyncThunk(`${sliceName}/cancelRequest`, (reason: string, { 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\nconst getTierId = tierName => tierName.replace('mender_', '');\n\nconst getProductPlans = (products: ProductInfo[]) => {\n const backendPlansById = products.reduce(\n (plansById: Record<string, ProductPlan>, product: ProductInfo) => {\n const { name, prices } = product;\n const tierId = getTierId(name);\n prices.forEach(price => {\n const existing = plansById[price.plan] ?? { ...PLANS[price.plan], tierLimitsConstrains: {} };\n const tierConstraints = price.constraints\n ? { [tierId]: { min: price.constraints.min!, max: price.constraints.max!, div: price.constraints.div! } }\n : {};\n plansById[price.plan] = {\n ...existing,\n tierLimitsConstrains: {\n ...existing.tierLimitsConstrains,\n ...tierConstraints\n }\n };\n });\n return plansById;\n },\n {} as Record<string, ProductPlan>\n );\n return { ...backendPlansById, enterprise: { ...PLANS.enterprise } as ProductPlan };\n};\n\nconst getProductAddons = products =>\n products.reduce((accu: Record<string, Addon>, product: ProductInfo) => {\n const { addons = [] } = product;\n addons.forEach(addon => {\n const { name: addonName = '', prices: addonPrices = [] } = addon;\n const existingEligible = accu[addonName]?.eligible ?? [];\n const newEligible = addonPrices.map(p => p.plan);\n accu[addonName] = {\n ...ADDONS[addonName],\n eligible: [...new Set([...existingEligible, ...newEligible, PLANS.enterprise.id])]\n };\n });\n return accu;\n }, {});\n\nexport const transformProductResponse = (products: ProductInfo[]): ProductConfig => {\n const tiers: ProductTier[] = [];\n const sortedProducts = products.sort((a, b) => a.name.localeCompare(b.name));\n sortedProducts.forEach(tier => {\n const addonsSupported = Object.fromEntries((tier.addons || []).map(addon => [addon.name, addon.prices?.map(p => p.plan)])) as Record<string, string[]>;\n\n const allPlans = tier.prices.map(price => price.plan);\n\n const addonsTransposed = allPlans.reduce((acc, plan) => {\n acc[plan] = Object.entries(addonsSupported)\n .filter(([, addonSupportedPlans]) => addonSupportedPlans.includes(plan))\n .map(([addon]) => addon);\n\n return acc;\n }, {});\n\n const tierId = getTierId(tier.name);\n tiers.push({\n id: tierId,\n title: tierId,\n stripeProductName: tier.name,\n limitConstrains: Object.fromEntries(tier.prices.map(p => [p.plan, p.constraints])) as Record<string, Required<ConstraintsInfo>>,\n addons: addonsSupported,\n addonsByPlan: addonsTransposed\n });\n });\n\n const plans = getProductPlans(products);\n\n const addons = getProductAddons(products);\n\n return { plans, tiers, addons };\n};\n\nexport const getTargetLocation = (key: string) => {\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'];\n\ntype OrganizationTrialPayload = {\n email: string;\n 'g-recaptcha-response': string;\n location: keyof typeof locations;\n name: string;\n organization: string;\n password: string;\n plan: string;\n tos: boolean;\n ts?: number;\n};\nexport const createOrganizationTrial = createAppAsyncThunk(`${sliceName}/createOrganizationTrial`, async (data: OrganizationTrialPayload, { dispatch }) => {\n const { location, tos: _tos, ...trialPayload } = data;\n const { key } = locations[location];\n const targetLocation = getTargetLocation(key);\n const target = `${targetLocation}${tenantadmApiUrlv2}/tenants/trial`;\n const response = await Api.postUnauthorized(target, trialPayload).catch(err => {\n if (err.response?.status >= 400 && err.response?.status < 500) {\n dispatch(setSnackbar({ message: err.response.data.error, autoHideDuration: TIMEOUTS.fiveSeconds }));\n } else {\n // This handles \"timeouts\", \"general connectivity\" and \"500 - Internal Server Error\" errors\n dispatch(setSnackbar({ message: 'There was an error creating your account', autoHideDuration: TIMEOUTS.fiveSeconds }));\n }\n return Promise.reject(err);\n });\n //TODO: resolve the case with no response more gracefully\n //UPD: soon to be removed due to change to the subscription flow\n const { headers } = response;\n cookies.remove('oauth');\n cookies.remove('externalID');\n cookies.remove('email');\n dispatch(setFirstLoginAfterSignup(true));\n return new Promise<void>(resolve =>\n setTimeout(() => {\n window.location.assign(`${targetLocation}${headers.location || ''}`);\n return resolve();\n }, TIMEOUTS.fiveSeconds)\n );\n});\n\nexport const startCardUpdate = createAppAsyncThunk(`${sliceName}/startCardUpdate`, (_, { dispatch }) =>\n Api.post<CardSetupData>(`${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 = createAppAsyncThunk(`${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 = createAppAsyncThunk(`${sliceName}/getCurrentCard`, (_, { dispatch }) =>\n Api.get<BillingInfo>(`${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 = createAppAsyncThunk(`${sliceName}/startUpgrade`, (tenantId: string, { dispatch }) =>\n Api.post<{ secret: string }>(`${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 = createAppAsyncThunk(`${sliceName}/cancelUpgrade`, (tenantId: string) =>\n Api.post(`${tenantadmApiUrlv2}/tenants/${tenantId}/upgrade/cancel`)\n);\n\ninterface completeUpgradePayload {\n billing_profile: BillingProfile;\n plan: AvailablePlans;\n tenantId: string;\n}\nexport const completeUpgrade = createAppAsyncThunk(\n `${sliceName}/completeUpgrade`,\n ({ tenantId, plan, billing_profile }: completeUpgradePayload, { dispatch }) =>\n Api.post(`${tenantadmApiUrlv2}/tenants/${tenantId}/upgrade/complete`, { plan, billing_profile })\n .catch(err => commonErrorHandler(err, `There was an error upgrading your account:`, dispatch))\n .then(() => Promise.all([dispatch(getDeviceLimits()), dispatch(getUserOrganization())]))\n);\n\ntype AuditLogQuery = {\n detail?: { id: string } | string;\n\n endDate?: string;\n sort?: SortOptions;\n startDate?: string;\n type?: {\n queryParameter: string;\n title: string;\n value: string;\n } | null;\n user?: { id: string } | string;\n};\nconst prepareAuditlogQuery = ({\n startDate,\n endDate,\n user: userFilter,\n type,\n detail: detailFilter,\n sort = { direction: SORTING_OPTIONS.desc }\n}: AuditLogQuery) => {\n const userId = typeof userFilter === 'object' && userFilter ? userFilter.id : userFilter;\n const detail = typeof detailFilter === 'object' && detailFilter ? detailFilter.id : detailFilter;\n const { start: startUnix, end: endUnix } = dateRangeToUnix(startDate, endDate);\n const createdAfter = startDate ? `&created_after=${startUnix}` : '';\n const createdBefore = endDate ? `&created_before=${endUnix}` : '';\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\ntype GetAuditLogPayload = PaginationOptions & AuditLogQuery;\nexport const getAuditLogs = createAppAsyncThunk(`${sliceName}/getAuditLogs`, async (selectionState: GetAuditLogPayload, { dispatch, getState }) => {\n const { page, perPage } = selectionState;\n const { hasAuditlogs } = getTenantCapabilities(getState());\n if (!hasAuditlogs) {\n return;\n }\n const { data, headers } = await Api.get<GetAuditLogsResponse>(\n `${auditLogsApiUrl}/logs?page=${page}&per_page=${perPage}${prepareAuditlogQuery(selectionState)}`\n ).catch(err => commonErrorHandler(err, `There was an error retrieving audit logs:`, dispatch));\n const total = Number(headers[headerNames.total] || data.length);\n return dispatch(actions.receiveAuditLogs({ events: data, total }));\n});\n\nexport const getAuditLogsCsvLink = createAppAsyncThunk(`${sliceName}/getAuditLogsCsvLink`, (_, { getState }) =>\n Promise.resolve(`${window.location.origin}${auditLogsApiUrl}/logs/export?limit=20000${prepareAuditlogQuery(getAuditlogState(getState()))}`)\n);\n\nexport const setAuditlogsState = createAppAsyncThunk(\n `${sliceName}/setAuditlogsState`,\n (selectionState: Partial<AuditLogSelectionState>, { dispatch, getState }) => {\n const currentState = getAuditlogState(getState());\n const nextState = {\n ...currentState,\n ...selectionState,\n sort: { ...currentState.sort, ...selectionState.sort }\n };\n const tasks: Promise<ReturnType<AppDispatch>>[] = [];\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 as GetAuditLogPayload)).finally(() => dispatch(actions.setAuditLogState({ isLoading: false }))));\n }\n tasks.push(Promise.resolve(dispatch(actions.setAuditLogState(nextState))));\n return Promise.all(tasks);\n }\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 = createAppAsyncThunk(\n `${sliceName}/createTenant`,\n (selectionState: NewTenant & UpdateChildTenant & { deviceLimits: Record<string, string> }, { dispatch, getState }) => {\n const spLimits = getSpLimits(getState());\n const { deviceLimits, ...rest } = selectionState;\n const device_limits = convertToBackendSPLimits(deviceLimits, spLimits);\n return Api.post(`${tenantadmApiUrlv2}/tenants`, { ...rest, device_limits })\n .then(() => {\n dispatch(setSnackbar('Tenant was created successfully.'));\n dispatchDelayed({ action: getTenants(), delay: TIMEOUTS.oneSecond, dispatch });\n })\n .catch(err => commonErrorHandler(err, 'There was an error creating tenant', dispatch, commonErrorFallback));\n }\n);\n\nconst tenantListRetrieval = async (config): Promise<[BackendTenant[], number]> => {\n const { page, perPage } = config;\n const params = new URLSearchParams({ page, per_page: perPage, tiers: 'true' }).toString();\n const tenantList = await Api.get<BackendTenant[]>(`${tenantadmApiUrlv2}/tenants?${params}`);\n const totalCount = tenantList.headers[headerNames.total] || TENANT_LIST_DEFAULT.perPage;\n return [tenantList.data, Number(totalCount)];\n};\nexport const getTenants = createAppAsyncThunk(`${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 = createAppAsyncThunk(\n `${sliceName}/setTenantsListState`,\n async (selectionState: Partial<TenantList>, { 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);\n\ntype EditTenantArgs = {\n deviceLimits: Record<string, number>;\n id: string;\n name: string;\n};\nexport const editTenant = createAppAsyncThunk(`${sliceName}/editDeviceLimit`, ({ deviceLimits, id, name }: EditTenantArgs, { dispatch, getState }) => {\n const spLimits = getSpLimits(getState());\n const device_limits = convertToBackendSPLimits(deviceLimits, spLimits);\n return Api.put(`${tenantadmApiUrlv2}/tenants/${id}/child`, { device_limits, name })\n .catch(err => commonErrorHandler(err, `Device Limit cannot be changed`, dispatch))\n .then(() => {\n dispatch(setSnackbar('Tenant was changed successfully'));\n dispatch(getUserOrganization());\n dispatchDelayed({ action: getTenants(), delay: TIMEOUTS.oneSecond, dispatch });\n });\n});\nexport const editBillingProfile = createAppAsyncThunk(\n `${sliceName}/editBillingProfileEmail`,\n ({ billingProfile }: { billingProfile: BillingProfile }, { dispatch }) =>\n Api.patch(`${tenantadmApiUrlv2}/billing/profile`, billingProfile)\n .catch(err => commonErrorHandler(err, `Failed to change billing profile`, dispatch))\n .then(() => Promise.all([dispatch(setSnackbar('Billing Profile was changed successfully')), dispatch(getUserBilling())]))\n);\nexport const createBillingProfile = createAppAsyncThunk(\n `${sliceName}/createBillingProfileEmail`,\n ({ billingProfile }: { billingProfile: BillingProfile }, { dispatch }) =>\n Api.post(`${tenantadmApiUrlv2}/billing/profile`, billingProfile)\n .catch(err => commonErrorHandler(err, `Failed to create billing profile`, dispatch))\n .then(() => Promise.all([dispatch(setSnackbar('Billing Profile was created successfully')), dispatch(getUserBilling())]))\n);\n\nexport const removeTenant = createAppAsyncThunk(`${sliceName}/editDeviceLimit`, ({ id }: { id: string }, { dispatch }) =>\n Api.post(`${tenantadmApiUrlv2}/tenants/${id}/remove/start`)\n .catch(err => commonErrorHandler(err, `There was an error removing the tenant`, dispatch))\n .then(async () => {\n dispatch(setSnackbar('The tenant was removed successfully'));\n await dispatch(getUserOrganization()).unwrap();\n dispatchDelayed({ action: getTenants(), delay: TIMEOUTS.oneSecond, dispatch });\n })\n);\nexport const getUserOrganization = createAppAsyncThunk(`${sliceName}/getUserOrganization`, (_, { dispatch, getState }) =>\n Api.get<Tenant>(`${tenantadmApiUrlv1}/user/tenant?tiers=true`).then(res => {\n const { addons, plan, trial } = res.data;\n const { addons: currentAddons, id: currentId, plan: currentPlan, trial: currentTrial } = getOrganization(getState());\n const tasks: ReturnType<AppDispatch>[] = [dispatch(actions.setOrganization(res.data))];\n if (currentId && !deepCompare({ addons, plan, trial }, { addons: currentAddons, plan: currentPlan, trial: currentTrial })) {\n const hash = hashString(tenantDataDivergedMessage);\n const { id: currentUserId } = getCurrentUser(getState());\n cookies.remove(`${currentUserId}${hash}`);\n tasks.push(dispatch(setAnnouncement(tenantDataDivergedMessage)));\n }\n return Promise.all(tasks);\n })\n);\n\nexport const getUserBilling = createAppAsyncThunk(`${sliceName}/getUserBilling`, (_, { dispatch }) =>\n Api.get<BillingProfile>(`${tenantadmApiUrlv2}/billing/profile`)\n .catch(err => commonErrorHandler(err, 'There was an error getting your billing profile:', dispatch, commonErrorFallback))\n .then(res => dispatch(actions.setBillingProfile(res.data)))\n);\n\nexport const getUserSubscription = createAppAsyncThunk(`${sliceName}/getUserSubscription`, async (_, { dispatch }) => {\n // We need to fetch current subscription first to ensure non-stripe customers handled right\n const currentSubscription = await dispatch(getCurrentSubscription()).unwrap();\n const currentPreview = await dispatch(getBillingPreview({ preview_mode: 'next' })).unwrap();\n return dispatch(actions.setSubscription({ ...currentPreview, ...currentSubscription }));\n});\n\n//Can also be used to get current subscription when no products supplied\nexport const getBillingPreview = createAppAsyncThunk(`${sliceName}/getBillingPreview`, (order: PreviewRequest, { dispatch }) =>\n Api.post(`${tenantadmApiUrlv2}/billing/subscription/invoices/preview`, order)\n .catch(err => commonErrorHandler(err, 'There was an error getting your billing information:', dispatch, commonErrorFallback))\n .then(({ data }) => (order.preview_mode === 'recurring' ? { items: parseSubscriptionPreview(data.lines), total: data.total } : data))\n);\n\nexport const getCurrentSubscription = createAppAsyncThunk(`${sliceName}/getCurrentSubscription`, (_, { dispatch }) =>\n Api.get<Subscription>(`${tenantadmApiUrlv2}/billing/subscription`)\n .then(res => res.data)\n .catch(err => {\n if (err.response && err.response.status === 404) {\n throw new Error('Request failed with status code 404');\n }\n return commonErrorHandler(err, 'There was an error retrieving your current subscription', dispatch, commonErrorFallback);\n })\n);\nexport const getProducts = createAppAsyncThunk(`${sliceName}/getEnabledTiers`, (_, { dispatch }) =>\n Api.get<ProductInfo[]>(`${tenantadmApiUrlv2}/billing/products`)\n .catch(err => commonErrorHandler(err, 'There was an error getting Mender products:', dispatch, commonErrorFallback))\n .then(res => dispatch(actions.setProducts(transformProductResponse(res.data))))\n);\n\nexport const requestPlanUpgrade = createAppAsyncThunk(`${sliceName}/requestPlanUpgrade`, (order: { plan: string; products: Product[] }, { dispatch }) =>\n Api.post(`${tenantadmApiUrlv2}/billing/subscription`, order)\n .catch(err => commonErrorHandler(err, 'There was an error sending your request', dispatch, commonErrorFallback))\n .then(() =>\n Promise.all([new Promise(resolve => setTimeout(resolve, TIMEOUTS.threeSeconds)).then(() => dispatch(getDeviceLimits())), dispatch(getUserOrganization())])\n )\n);\n\nexport const sendSupportMessage = createAppAsyncThunk(`${sliceName}/sendSupportMessage`, (content: SupportRequest, { 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);\ninterface requestPlanChangePayload {\n content: {\n current_addons: string;\n current_plan: string;\n requested_addons: string;\n requested_plan: string;\n user_message: string;\n };\n tenantId: string;\n}\nexport const requestPlanChange = createAppAsyncThunk(\n `${sliceName}/requestPlanChange`,\n ({ content, tenantId }: requestPlanChangePayload, { dispatch, rejectWithValue }) =>\n Api.post(`${tenantadmApiUrlv2}/tenants/${tenantId}/plan`, content)\n .catch(async err => {\n await commonErrorHandler(err, 'There was an error sending your request', dispatch, commonErrorFallback);\n rejectWithValue(err);\n })\n .then(() => Promise.resolve(dispatch(setSnackbar({ message: 'Your request was sent successfully', autoHideDuration: TIMEOUTS.fiveSeconds }))))\n);\n\nexport const downloadLicenseReport = createAppAsyncThunk(`${sliceName}/downloadLicenseReport`, (_, { dispatch }) =>\n Api.get<string>(`${deviceAuthV2}/license`)\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 = createAppAsyncThunk(`${sliceName}/createIntegration`, ({ id, ...integration }: 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 = createAppAsyncThunk(`${sliceName}/changeIntegration`, ({ id, credentials }: Integration, { 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 = createAppAsyncThunk(\n `${sliceName}/deleteIntegration`,\n async ({ id, provider }: { id: string } & Integration, { dispatch, getState }) => {\n await Api.delete(`${iotManagerBaseURL}/integrations/${id}`, {}).catch(err =>\n commonErrorHandler(err, 'There was an error removing the integration', dispatch, commonErrorFallback)\n );\n const integrations = getState().organization.externalDeviceIntegrations.filter(item => provider !== item.provider);\n dispatch(setSnackbar('The integration was removed successfully'));\n dispatch(actions.receiveExternalDeviceIntegrations(integrations));\n await dispatch(getIntegrations()).unwrap();\n }\n);\n\nexport const getIntegrations = createAppAsyncThunk(`${sliceName}/getIntegrations`, (_, { dispatch, getState }) =>\n Api.get<Integration[]>(`${iotManagerBaseURL}/integrations`)\n .catch(err => commonErrorHandler(err, 'There was an error retrieving the integrations', dispatch, commonErrorFallback))\n .then(({ data }) => {\n const existingIntegrations = getState().organization.externalDeviceIntegrations;\n const integrations = data.reduce<Integration[]>((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\ntype GetWebhookEventsPayload = {\n isFollowUp?: boolean;\n page?: number;\n perPage?: number;\n};\nexport const getWebhookEvents = createAppAsyncThunk(`${sliceName}/getWebhookEvents`, (config: GetWebhookEventsPayload = {}, { dispatch, getState }) => {\n const { isFollowUp, page = defaultPage, perPage = defaultPerPage } = config;\n return Api.get<Event[]>(`${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 const tasks: Promise<ReturnType<AppDispatch> | unknown>[] = [\n Promise.resolve(\n dispatch(\n actions.receiveWebhookEvents({\n value: isFollowUp ? getState().organization.webhooks.events : data,\n total: (page - 1) * perPage + data.length\n })\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} as const;\ntype SsoConfigActionKeys = keyof typeof ssoConfigActions;\n\nconst ssoConfigActionErrorHandler = (err, type: keyof typeof ssoConfigActions) => (dispatch: AppDispatch) =>\n commonErrorHandler(err, `There was an error ${ssoConfigActions[type].error} the SSO configuration.`, dispatch, commonErrorFallback);\n\nconst ssoConfigActionSuccessHandler = (type: SsoConfigActionKeys) => (dispatch: AppDispatch) =>\n dispatch(setSnackbar(`The SSO configuration was ${ssoConfigActions[type].success} successfully`));\n\nexport const storeSsoConfig = createAppAsyncThunk(\n `${sliceName}/storeSsoConfig`,\n ({ config, contentType }: { config: string; contentType: 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 = createAppAsyncThunk(\n `${sliceName}/changeSsoConfig`,\n ({ config, contentType }: { config: SSOConfig; contentType: ContentType }, { dispatch }) =>\n Api.put(`${ssoIdpApiUrlv1}/${config.id}`, config.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 = createAppAsyncThunk(`${sliceName}/deleteSsoConfig`, ({ id }: SSOConfig, { 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 = createAppAsyncThunk(`${sliceName}/getSsoConfigById`, (config: SSOConfig, { dispatch }): Promise<SSOConfig> =>\n Api.get<string>(`${ssoIdpApiUrlv1}/${config.id}`)\n .catch(err => dispatch(ssoConfigActionErrorHandler(err, 'read')))\n .then(({ data, headers }: AxiosResponse<GetIdpSamlOrOpenIdConnectMetadataForTheTenantResponse>): Promise<SSOConfig> => {\n const sso = Object.values(SSO_TYPES).find(({ contentType }) => contentType === headers['content-type']);\n return sso\n ? Promise.resolve({ ...config, config: data, type: sso.id as unknown as SSOConfig['type'] } as SSOConfig)\n : Promise.reject('Unsupported SSO config content type.');\n })\n);\n\nexport const getSsoConfigs = createAppAsyncThunk(`${sliceName}/getSsoConfigs`, (_, { dispatch }) =>\n (Api.get<SSOConfig[]>(ssoIdpApiUrlv1) as Promise<AxiosResponse<SSOConfig[]>>)\n .catch(err => dispatch(ssoConfigActionErrorHandler(err, 'readMultiple')))\n .then(({ data }) =>\n Promise.all(data.map((config: SSOConfig) => dispatch(getSsoConfigById(config)).unwrap()))\n .then((configs: SSOConfig[]) => dispatch(actions.receiveSsoConfigs(configs)))\n .catch(err => commonErrorHandler(err, err, dispatch, ''))\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.\nimport type {\n EmailUpdateRequest,\n PendingEmailChange,\n PermissionSetWithScope,\n PersonalAccessToken,\n RolePermission,\n RolePermissionObject\n} from '@northern.tech/types/MenderTypes';\nimport { duplicateFilter, extractErrorMessage, isEmpty } from '@northern.tech/utils/helpers';\nimport { clearAllRetryTimers } from '@northern.tech/utils/retrytimer';\nimport dayjs from 'dayjs';\nimport hashString from 'md5';\nimport Cookies from 'universal-cookie';\n\nimport type { CustomColumn, GlobalSettings, User, UserSettings } from '.';\nimport { actions, sliceName } from '.';\nimport storeActions from '../actions';\nimport GeneralApi from '../api/general-api';\nimport UsersApi from '../api/users-api';\nimport { cleanUp, getSessionInfo, setSessionInfo } from '../auth';\nimport type {\n AnyPermission,\n AuditLogPermission,\n DeploymentPermission,\n GroupsPermission,\n PermissionObject,\n PermissionSet,\n PermissionSetId,\n ReadState,\n ReleasesPermission,\n Role,\n ScopedPermissionsByAreaKey,\n UiPermissionsByAreaKey,\n UiPermissionsByIdKey,\n UiPermissionsDefinition,\n UserManagementPermission\n} from '../constants';\nimport {\n ALL_RELEASES,\n APPLICATION_JSON_CONTENT_TYPE,\n APPLICATION_JWT_CONTENT_TYPE,\n PermissionTypes,\n SSO_TYPES,\n apiRoot,\n defaultPermissionSets,\n rolesById as defaultRolesById,\n emptyRole,\n emptyUiPermissions,\n maxSessionAge,\n scopedPermissionAreas,\n twoFAStates,\n uiPermissionsByArea,\n uiPermissionsById,\n useradmApiUrl,\n useradmApiUrlv2\n} from '../constants';\nimport { getHostedAnnouncement, getOnboardingState, getOrganization, getTooltipsState, getUserSettings as getUserSettingsSelector } from '../selectors';\nimport type { AppDispatch } from '../store';\nimport { commonErrorFallback, commonErrorHandler, createAppAsyncThunk } from '../store';\nimport { setOfflineThreshold } from '../thunks';\nimport { dispatchDelayed, mergePermissions, stripUndefined } from '../utils';\nimport { OWN_USER_ID, READ_STATES, USER_LOGOUT, itemUiPermissionsReducer, settingsKeys } from './constants';\nimport { getCurrentUser, getRolesById, getUsersById } from './selectors';\n\nconst cookies = new Cookies();\n\nconst { setAnnouncement, setSnackbar } = storeActions;\n\ntype ThunkPermissionSet = Record<string, PermissionSet>;\ntype CombinedPermissions = Record<string, UiPermissionsByIdKey[]>;\ntype TransformedAreaRoles = { name: PermissionSetId; scope?: { type?: string; value: string[] } }[];\n\ntype SubmittedRoleUiPermissions = {\n auditlog: AuditLogPermission[];\n deployments: DeploymentPermission[];\n groups: { disableEdit?: boolean; item: string; notFound?: boolean; uiPermissions: GroupsPermission[] }[];\n releases: { disableEdit?: boolean; item: string; notFound?: boolean; uiPermissions: ReleasesPermission[] }[];\n tenantManagement?: UserManagementPermission[];\n userManagement: UserManagementPermission[];\n};\nexport type SubmittedRole = {\n allowUserManagement?: boolean;\n description?: string;\n name: string;\n source?: Omit<SubmittedRole, 'source'>;\n uiPermissions: Partial<SubmittedRoleUiPermissions>;\n};\n\nconst handleLoginError =\n (err: Error, { token2fa: has2FA, password }: { password?: string; token2fa?: string }, rejectWithValue) =>\n () => {\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 return rejectWithValue({ error: errorMessage });\n };\n\n/*\n User management\n*/\ninterface LoginUserPayload {\n email: string;\n password?: string;\n stayLoggedIn?: boolean;\n token2fa?: string;\n}\n\nconst finalizeJwtLogin = ({ dispatch, stayLoggedIn, token }: { dispatch: AppDispatch; stayLoggedIn?: boolean; token: string }) => {\n const 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 return dispatch(getUser(OWN_USER_ID))\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\nexport const confirmOAuthLink = createAppAsyncThunk(\n `${sliceName}/confirmOAuthLink`,\n ({ stayLoggedIn, ...userData }: LoginUserPayload, { dispatch, rejectWithValue }) =>\n UsersApi.postLogin(`${useradmApiUrl}/oauth2/link`, userData)\n .catch(err => {\n cleanUp();\n return Promise.reject(dispatch(handleLoginError(err, userData, rejectWithValue)));\n })\n .then(({ text: token, contentType }) => {\n if (contentType !== APPLICATION_JWT_CONTENT_TYPE || !token) {\n return;\n }\n return finalizeJwtLogin({ token, dispatch, stayLoggedIn });\n })\n);\n\nexport const loginUser = createAppAsyncThunk(`${sliceName}/loginUser`, ({ stayLoggedIn, ...userData }: LoginUserPayload, { 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: token, 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 } = token as unknown as { id: string; kind: string };\n const type = kind.split('/')[1];\n const ssoLoginUrl = SSO_TYPES[type].getStartUrl(id);\n window.location.replace(ssoLoginUrl);\n return;\n }\n\n if (contentType !== APPLICATION_JWT_CONTENT_TYPE || !token) {\n return;\n }\n return finalizeJwtLogin({ token, dispatch, stayLoggedIn });\n })\n);\n\nexport const logoutUser = createAppAsyncThunk(`${sliceName}/logoutUser`, (_, { dispatch, getState }) => {\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 = createAppAsyncThunk(`${sliceName}/switchUserOrganization`, (tenantId: string, { getState }) => {\n if (Object.keys(getState().app.uploadsById).length) {\n return Promise.reject();\n }\n return GeneralApi.get<string>(`${useradmApiUrl}/users/tenants/${tenantId}/token`).then(({ data: token }) => {\n window.sessionStorage.setItem('tenantChanged', 'true');\n setSessionInfo({ ...getSessionInfo(), token });\n window.location.reload();\n });\n});\n\nexport const passwordResetStart = createAppAsyncThunk(`${sliceName}/passwordResetStart`, (email: string, { 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\ninterface PasswordResetPayload {\n newPassword: string;\n secretHash: string;\n}\nexport const passwordResetComplete = createAppAsyncThunk(\n `${sliceName}/passwordResetComplete`,\n ({ secretHash, newPassword }: PasswordResetPayload, { 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 = createAppAsyncThunk(`${sliceName}/verifyEmailStart`, (_, { dispatch, getState }) =>\n GeneralApi.post(`${useradmApiUrl}/auth/verify-email/start`, { email: getCurrentUser(getState()).email })\n .catch(err => commonErrorHandler(err, 'An error occured starting the email verification process:', dispatch))\n .finally(() => Promise.resolve(dispatch(getUser(OWN_USER_ID))))\n);\n\nexport const verifyEmailComplete = createAppAsyncThunk(`${sliceName}/verifyEmailComplete`, (secret_hash: string, { dispatch, rejectWithValue }) =>\n GeneralApi.post(`${useradmApiUrl}/auth/verify-email/complete`, { secret_hash })\n .catch(err => rejectWithValue({ status: err.response?.status, data: err.response?.data }))\n .finally(() => Promise.resolve(dispatch(getUser(OWN_USER_ID))))\n);\n\nexport const getPendingEmailChange = createAppAsyncThunk(`${sliceName}/getPendingEmailChange`, (_, { rejectWithValue }) =>\n GeneralApi.get<PendingEmailChange>(`${useradmApiUrl}/users/me/email-change/pending`)\n .then(({ data }) => data || null)\n .catch(e => rejectWithValue(e))\n);\n\nexport const initiateEmailChange = createAppAsyncThunk(`${sliceName}/initiateEmailChange`, (emailUpdate: EmailUpdateRequest, { dispatch }) =>\n GeneralApi.post(`${useradmApiUrl}/users/me/email-change/start`, emailUpdate).catch(err =>\n commonErrorHandler(err, 'An error occurred starting the email change process:', dispatch)\n )\n);\n\nexport const completeEmailChange = createAppAsyncThunk(`${sliceName}/completeEmailChange`, (secret_hash: string, { dispatch, rejectWithValue }) =>\n GeneralApi.post(`${useradmApiUrl}/users/email-change/complete`, { secret_hash })\n .catch(err => rejectWithValue({ status: err.response?.status, data: err.response?.data }))\n .finally(() => Promise.resolve(dispatch(getUser(OWN_USER_ID))))\n);\n\nexport const cancelEmailChange = createAppAsyncThunk(`${sliceName}/cancelEmailChange`, (_, { dispatch }) =>\n GeneralApi.post(`${useradmApiUrl}/users/me/email-change/cancel`).catch(err =>\n commonErrorHandler(err, 'An error occurred cancelling the email change request:', dispatch)\n )\n);\n\nexport const verify2FA = createAppAsyncThunk(`${sliceName}/verify2FA`, (tfaData: { token2fa: string }, { dispatch }) =>\n UsersApi.putVerifyTFA(`${useradmApiUrl}/2faverify`, tfaData)\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 = createAppAsyncThunk(`${sliceName}/getUserList`, (_, { dispatch, getState }) =>\n GeneralApi.get<User[]>(`${useradmApiUrl}/users`)\n .then(res => {\n const currentUsersById = getUsersById(getState());\n const users = res.data.reduce(\n (accu, item) => {\n accu[item.id] = {\n ...accu[item.id],\n ...item\n };\n return accu;\n },\n { ...currentUsersById }\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 = createAppAsyncThunk(`${sliceName}/getUser`, (id: string, { dispatch, rejectWithValue }) =>\n GeneralApi.get<User>(`${useradmApiUrl}/users/${id}`)\n .then(({ data: user }) =>\n Promise.all([\n dispatch(actions.receivedUser(user)),\n dispatch(setHideAnnouncement({ shouldHide: false, userId: user.id })),\n dispatch(updateUserColumnSettings({ currentUserId: user.id })),\n user\n ])\n )\n .catch(e => rejectWithValue(e))\n);\n\nexport const initializeSelf = createAppAsyncThunk(`${sliceName}/initializeSelf`, (_, { dispatch }) => dispatch(getUser(OWN_USER_ID)));\n\ninterface UpdateColumnSettingsPayload {\n columns?: CustomColumn[];\n currentUserId?: string;\n}\n\nexport const updateUserColumnSettings = createAppAsyncThunk(\n `${sliceName}/updateUserColumnSettings`,\n ({ columns, currentUserId }: UpdateColumnSettingsPayload, { dispatch, getState }) => {\n const userId = currentUserId ?? getCurrentUser(getState()).id;\n const storageKey = `${userId}-column-widths`;\n let customColumns: CustomColumn[] = [];\n if (!columns) {\n try {\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);\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} as const;\n\nconst userActionErrorHandler = (err: Error, type: keyof typeof userActions, dispatch: AppDispatch) =>\n commonErrorHandler(err, `There was an error ${userActions[type].errorMessage} the user.`, dispatch);\n\ninterface CreateUserPayload {\n email: string;\n password: string;\n shouldResetPassword?: boolean;\n sso?: boolean;\n}\n\nexport const createUser = createAppAsyncThunk(`${sliceName}/createUser`, ({ shouldResetPassword, ...userData }: CreateUserPayload, { dispatch }) =>\n GeneralApi.post(`${useradmApiUrl}/users`, { ...userData, send_reset_password: shouldResetPassword })\n .then(() => Promise.all([dispatch(getUserList()), dispatch(setSnackbar(userActions.create.successMessage))]))\n .catch(err => userActionErrorHandler(err, 'create', dispatch))\n);\n\nexport const removeUser = createAppAsyncThunk(`${sliceName}/removeUser`, (userId: string, { dispatch }) =>\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\ninterface EditUserPayload {\n current_password: string;\n email: string;\n id: string;\n password: string;\n roles?: string[];\n}\n\nexport const editUser = createAppAsyncThunk(\n `${sliceName}/editUser`,\n ({ id, email, password, current_password, roles }: EditUserPayload, { dispatch, getState }) => {\n const userData = stripUndefined({ email, password, current_password, roles });\n return GeneralApi.put(`${useradmApiUrl}/users/${id}`, userData)\n .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 .catch(err => userActionErrorHandler(err, 'edit', dispatch));\n }\n);\n\nexport const checkEmailExists = createAppAsyncThunk(`${sliceName}/checkEmailExists`, async (email: string) => {\n const response = await GeneralApi.get<{ exists?: boolean }>(`${useradmApiUrl}/users/exists?email=${encodeURIComponent(email)}`);\n return response.data.exists;\n});\n\nexport const addUserToCurrentTenant = createAppAsyncThunk(`${sliceName}/addUserToTenant`, (userId: string, { dispatch, getState }) => {\n const { id } = getOrganization(getState());\n return GeneralApi.post(`${useradmApiUrl}/users/${userId}/assign`, { tenant_ids: [id] })\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\nexport const enableUser2fa = createAppAsyncThunk(`${sliceName}/enableUser2fa`, (userId: string = OWN_USER_ID, { dispatch }) =>\n GeneralApi.post(`${useradmApiUrl}/users/${userId}/2fa/enable`)\n .catch(err => commonErrorHandler(err, `There was an error enabling Two Factor authentication for the user.`, dispatch))\n .then(() => Promise.resolve(dispatch(getUser(userId))))\n);\n\nexport const disableUser2fa = createAppAsyncThunk(`${sliceName}/disableUser2fa`, (userId: string = OWN_USER_ID, { dispatch }) =>\n GeneralApi.post(`${useradmApiUrl}/users/${userId}/2fa/disable`)\n .catch(err => commonErrorHandler(err, `There was an error disabling Two Factor authentication for the user.`, dispatch))\n .then(() => Promise.all([dispatch(getUser(userId)), dispatch(actions.receivedQrCode(null))]))\n);\n\n/* RBAC related things follow: */\nconst mapHttpPermission = (permission: RolePermissionObject) =>\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 const endpointUiPermission = endpointMatches.reduce<PermissionObject[]>((endpointAccu, endpoint) => [...endpointAccu, ...endpoint.uiPermissions], []);\n const collector = (endpointUiPermission || definition.uiPermissions)\n .reduce((permissionsAccu: AnyPermission[], 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 } as typeof emptyUiPermissions);\n }\n }\n return accu;\n },\n { ...emptyUiPermissions }\n );\n\nconst permissionActionTypes = {\n any: mapHttpPermission,\n CREATE_DEPLOYMENT: (permission: RolePermissionObject) =>\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: RolePermissionObject) =>\n permission.type === PermissionTypes.DeviceGroup\n ? {\n groups: { [permission.value]: [uiPermissionsById.connect.value] }\n }\n : {},\n VIEW_DEVICE: (permission: RolePermissionObject) =>\n permission.type === PermissionTypes.DeviceGroup\n ? {\n groups: { [permission.value]: [uiPermissionsById.read.value] }\n }\n : {}\n};\n\nconst combinePermissions = (existingPermissions: CombinedPermissions, additionalPermissions: CombinedPermissions = {}): CombinedPermissions =>\n Object.entries(additionalPermissions).reduce((accu, [name, permissions]) => {\n const maybeExistingPermissions = accu[name] || [];\n accu[name] = [...permissions, ...maybeExistingPermissions].filter(duplicateFilter);\n return accu;\n }, existingPermissions);\n\nconst tryParseCustomPermission = (permission: RolePermission) => {\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: RolePermission) => {\n const 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 = (\n permissionSetName: PermissionSetId,\n names: string[],\n scope: UiPermissionsByAreaKey,\n existingGroupsPermissions: CombinedPermissions = {}\n): Record<string, AnyPermission[]> => {\n const permission = Object.values(uiPermissionsById).find(permission => permission.permissionSets[scope] === permissionSetName)?.value as UiPermissionsByIdKey;\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: Partial<UiPermissionsDefinition>) =>\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 = [] }: Role, permissionSets: Record<string, PermissionSet>) => {\n const preliminaryResult = permission_sets_with_scope.reduce(\n (accu, permissionSet) => {\n if (!permissionSet.name) {\n return accu;\n }\n const processor = permissionSets[permissionSet.name];\n if (!processor) {\n return accu;\n }\n const scope = Object.keys(scopedPermissionAreas).find(scope => uiPermissionsByArea[scope].scope === permissionSet.scope?.type) as UiPermissionsByAreaKey;\n if (scope) {\n const result = mapPermissionSet(\n permissionSet.name as PermissionSetId,\n permissionSet.scope?.value ?? [],\n scope,\n accu.uiPermissions[scope] as CombinedPermissions\n );\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 as typeof emptyUiPermissions)\n };\n },\n { isCustom: false, uiPermissions: { ...emptyUiPermissions, groups: {}, releases: {} } }\n );\n return permissions.reduce(customPermissionHandler, preliminaryResult);\n};\n\nexport const normalizeRbacRoles = (roles: Role[], rolesById: Record<string, Role>, permissionSets: ThunkPermissionSet) =>\n roles.reduce(\n (accu, role) => {\n let normalizedPermissions: UiPermissionsDefinition;\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 = createAppAsyncThunk(`${sliceName}/getPermissionSets`, (_, { dispatch, getState }) =>\n GeneralApi.get<Omit<PermissionSet, 'result'>[]>(`${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<PermissionObject>(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: ScopedPermissionsByAreaKey[], { key, scopeType }) => {\n if (permissionSetObject.supported_scope_types?.includes(key) || permissionSetObject.supported_scope_types?.includes(scopeType)) {\n accu.push(key);\n }\n return accu;\n }, []);\n permissionSetObject = scopes.reduce<PermissionSet>((accu, scope) => {\n accu.result = {\n ...accu.result,\n [scope]: mapPermissionSet(permissionSetObject.name, [scopedPermissionAreas[scope].excessiveAccessSelector], scope) as Record<string, any[]>\n };\n return accu;\n }, permissionSetObject);\n accu[permissionSet.name] = permissionSetObject;\n return accu;\n },\n { ...getState().users.permissionSetsById }\n );\n return Promise.all([\n Promise.resolve(dispatch(actions.receivedPermissionSets(permissionSets))) as Promise<ReturnType<AppDispatch>>,\n Promise.resolve(permissionSets)\n ]);\n })\n .catch(() => console.log('Permission set retrieval failed - likely accessing a non-RBAC backend'))\n);\n\nexport const getRoles = createAppAsyncThunk(`${sliceName}/getRoles`, async (_, { dispatch, getState }) => {\n try {\n const [{ data: roles }, permissionSetResult] = await Promise.all([\n GeneralApi.get<Role[]>(`${useradmApiUrlv2}/roles?per_page=500`),\n dispatch(getPermissionSets())\n ]);\n const permissionSetTasks = permissionSetResult.payload as [unknown, unknown];\n const rolesById = normalizeRbacRoles(roles, getRolesById(getState()), permissionSetTasks[permissionSetTasks.length - 1] as ThunkPermissionSet);\n return dispatch(actions.receivedRoles(rolesById));\n } catch {\n console.log('Role retrieval failed - likely accessing a non-RBAC backend');\n } finally {\n dispatch(actions.finishedRoleInitialization(true));\n }\n});\n\nconst deriveImpliedAreaPermissions = (\n area: UiPermissionsByAreaKey,\n areaPermissions: UiPermissionsByIdKey[],\n skipPermissions: AnyPermission[] = []\n): AnyPermission[] => {\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: AnyPermission[], current) => {\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 */\n\nconst transformAreaRoleDataToScopedPermissionsSets = (\n area: ScopedPermissionsByAreaKey,\n areaPermissions: { item: string; uiPermissions: UiPermissionsByIdKey[] }[],\n excessiveAccessSelector: string\n): TransformedAreaRoles => {\n type PermissionSetObject = Record<PermissionSetId, { type?: string; value: string[] }>;\n const permissionSetObject: 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\n const skipPermissions = scopedPermissionAreas.releases.key === area && item !== ALL_RELEASES ? [uiPermissionsById.upload.value] : [];\n const impliedPermissions = deriveImpliedAreaPermissions(area, uiPermissions, skipPermissions);\n accu = impliedPermissions.reduce((itemPermissionAccu, impliedPermission): PermissionSetObject => {\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 }, {} as PermissionSetObject);\n return Object.entries(permissionSetObject).map(([name, { value, ...scope }]) => {\n if (value.includes(excessiveAccessSelector)) {\n return { name: name as PermissionSetId };\n }\n return { name: name as PermissionSetId, scope: { ...scope, value: value.filter(duplicateFilter) } };\n });\n};\n\nconst transformRoleDataToRole = (roleData: SubmittedRole, roleState: Partial<Role> = {}): { permissionSetsWithScope: PermissionSetWithScope[]; role: Role } => {\n const role = { ...roleState, ...roleData };\n const { description = '', name, uiPermissions = emptyUiPermissions } = role;\n const { maybeUiPermissions, remainderKeys } = Object.entries(emptyUiPermissions).reduce<{\n maybeUiPermissions: Partial<Record<ScopedPermissionsByAreaKey, Record<string, AnyPermission[]>>>;\n remainderKeys: UiPermissionsByAreaKey[];\n }>(\n (accu, [key, emptyPermissions]) => {\n if (!scopedPermissionAreas[key]) {\n accu.remainderKeys.push(key as UiPermissionsByAreaKey);\n } else if (uiPermissions[key]) {\n accu.maybeUiPermissions[key as ScopedPermissionsByAreaKey] = 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 as AnyPermission[]);\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 accu.push(\n ...transformAreaRoleDataToScopedPermissionsSets(\n key,\n uiPermissions[key] as unknown as { item: string; uiPermissions: UiPermissionsByIdKey[] }[],\n excessiveAccessSelector\n )\n );\n return accu;\n }, [] as TransformedAreaRoles);\n return {\n permissionSetsWithScope: [...permissionSetsWithScope, ...scopedPermissionSets],\n role: {\n ...emptyRole,\n name,\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} as const;\n\nconst roleActionErrorHandler = (err: Error, type: keyof typeof roleActions, dispatch: AppDispatch, meta?: { name: string; permissionSetsCreated: number }) => {\n let errorContext = `There was an error ${roleActions[type].errorMessage} the role.`;\n if (meta) {\n const { permissionSetsCreated, name } = meta;\n errorContext += ` Tried to ${type} role ${name} with ${permissionSetsCreated} permission sets.`;\n }\n return commonErrorHandler(err, errorContext, dispatch);\n};\n\nexport const createRole = createAppAsyncThunk(`${sliceName}/createRole`, (roleData: SubmittedRole, { 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, { permissionSetsCreated: permissionSetsWithScope.length, name: role.name }));\n});\n\nexport const editRole = createAppAsyncThunk(`${sliceName}/editRole`, (roleData: SubmittedRole, { dispatch, getState }) => {\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, { permissionSetsCreated: permissionSetsWithScope.length, name: role.name }));\n});\n\nexport const removeRole = createAppAsyncThunk(`${sliceName}/removeRole`, (roleId: string, { dispatch }) =>\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 = createAppAsyncThunk(`${sliceName}/getGlobalSettings`, async (_, { dispatch }) => {\n const {\n data: settings,\n headers: { etag }\n } = await GeneralApi.get<GlobalSettings>(`${useradmApiUrl}/settings`);\n window.sessionStorage.setItem(settingsKeys.initialized, 'true');\n await Promise.all([dispatch(actions.setGlobalSettings(settings)), dispatch(setOfflineThreshold())]);\n return { etag };\n});\n\nexport const saveGlobalSettings = createAppAsyncThunk(\n `${sliceName}/saveGlobalSettings`,\n ({ beOptimistic = false, notify = false, ...settings }: Partial<GlobalSettings>, { dispatch, getState }) => {\n if (!window.sessionStorage.getItem(settingsKeys.initialized) && !beOptimistic) {\n return;\n }\n return dispatch(getGlobalSettings())\n .unwrap()\n .then(result => {\n const updatedSettings = { ...getState().users.globalSettings, ...settings };\n if (getCurrentUser(getState()).verified) {\n updatedSettings['2fa'] = twoFAStates.enabled;\n } else {\n delete updatedSettings['2fa'];\n }\n const tasks: Promise<ReturnType<AppDispatch> | unknown>[] = [Promise.resolve(dispatch(actions.setGlobalSettings(updatedSettings)))];\n const headers = result.etag ? { 'If-Match': result.etag } : {};\n return GeneralApi.post(`${useradmApiUrl}/settings`, updatedSettings, { headers })\n .then(() => {\n if (notify) {\n tasks.push(Promise.resolve(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 return commonErrorHandler(err, `The settings couldn't be saved.`, dispatch);\n });\n });\n }\n);\n\nexport const getUserSettings = createAppAsyncThunk(`${sliceName}/getUserSettings`, async (_, { dispatch }) => {\n const {\n data: settings,\n headers: { etag }\n } = await GeneralApi.get<UserSettings>(`${useradmApiUrl}/settings/me`);\n window.sessionStorage.setItem(settingsKeys.initialized, 'true');\n dispatch(actions.setUserSettings(settings));\n return { etag };\n});\n\nexport const saveUserSettings = createAppAsyncThunk(\n `${sliceName}/saveUserSettings`,\n (settings: Partial<UserSettings> = { 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 ...settings,\n firstLoginTimestamp: userSettings.firstLoginTimestamp ?? dayjs().format(),\n onboarding: {\n ...onboardingState,\n ...settings.onboarding\n },\n tooltips: tooltipState\n };\n const headers = result.etag ? { 'If-Match': result.etag } : {};\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);\n\nexport const get2FAQRCode = createAppAsyncThunk(`${sliceName}/get2FAQRCode`, (_, { dispatch }) =>\n GeneralApi.get<{ qr: string }>(`${useradmApiUrl}/2faqr`).then(res => dispatch(actions.receivedQrCode(res.data.qr)))\n);\n\nexport const setHideAnnouncement = createAppAsyncThunk<void, { shouldHide: boolean; userId?: string }>(\n `${sliceName}/setHideAnnouncement`,\n ({ shouldHide, userId }, { dispatch, getState }) => {\n const currentUserId = userId || getCurrentUser(getState()).id;\n const announcement = getHostedAnnouncement(getState());\n const hash = announcement ? hashString(announcement) : '';\n const announceCookie = cookies.get(`${currentUserId}${hash}`);\n if (shouldHide || (hash.length && typeof announceCookie !== 'undefined')) {\n cookies.set(`${currentUserId}${hash}`, true, { maxAge: 604800 });\n dispatch(setAnnouncement(''));\n }\n }\n);\n\nexport const getTokens = createAppAsyncThunk(`${sliceName}/getTokens`, (_, { dispatch, getState }) =>\n GeneralApi.get<PersonalAccessToken[]>(`${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\nexport const generateToken = createAppAsyncThunk(\n `${sliceName}/generateToken`,\n async ({ expiresIn = ONE_YEAR, name }: { expiresIn?: number; name: string }, { dispatch }) => {\n const { data: token } = await GeneralApi.post<string>(`${useradmApiUrl}/settings/tokens`, { name, expires_in: expiresIn }).catch(err =>\n commonErrorHandler(err, 'There was an error creating the token:', dispatch)\n );\n await dispatch(getTokens());\n return token;\n }\n);\n\nexport const revokeToken = createAppAsyncThunk(`${sliceName}/revokeToken`, (token: PersonalAccessToken, { dispatch }) =>\n GeneralApi.delete(`${useradmApiUrl}/settings/tokens/${token.id}`).then(() => Promise.resolve(dispatch(getTokens())))\n);\n\nexport const setTooltipReadState = createAppAsyncThunk(\n `${sliceName}/setTooltipReadState`,\n async ({ persist, ...remainder }: { id: string; persist: boolean; readState: ReadState }, { dispatch }) => {\n dispatch(actions.setTooltipState(remainder));\n if (persist) {\n await dispatch(saveUserSettings());\n }\n }\n);\n\nexport const setAllTooltipsReadState = createAppAsyncThunk(\n `${sliceName}/toggleHelptips`,\n ({ readState = READ_STATES.read, tooltipIds }: { readState: string; tooltipIds: string[] }, { dispatch }) => {\n const updatedTips = tooltipIds.reduce((accu, id) => ({ ...accu, [id]: { readState } }), {});\n return Promise.resolve(dispatch(actions.setTooltipsState(updatedTips))).then(() => dispatch(saveUserSettings()));\n }\n);\n\ntype LogAnalysisFeedback = {\n deployment_id: string;\n device_id: string;\n useful: boolean;\n};\n\ntype ProductFeedback = {\n message: string;\n score: number;\n};\n\ntype SubmitFeedbackPayload = {\n feedback: LogAnalysisFeedback | ProductFeedback;\n formId: string;\n};\n\nexport const submitUserFeedback = createAppAsyncThunk(`${sliceName}/submitFeedback`, ({ formId, feedback }: SubmitFeedbackPayload, { dispatch }) =>\n GeneralApi.post(`${useradmApiUrlv2}/support/feedback/${formId}`, feedback).then(() => {\n if (formId === 'product') {\n const today = new Date();\n dispatch(saveUserSettings({ feedbackCollectedAt: today.toISOString().split('T')[0] }));\n dispatchDelayed({ action: actions.setShowFeedbackDialog(false), dispatch });\n }\n })\n);\n"],"mappings":"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"}