@northern.tech/store 0.36.2 → 0.37.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 (144) hide show
  1. package/dist/actions.d.cts +2 -1
  2. package/dist/actions.d.ts +2 -1
  3. package/dist/api/general-api.cjs +3 -3
  4. package/dist/api/general-api.cjs.map +1 -1
  5. package/dist/api/users-api.cjs +2 -2
  6. package/dist/api/users-api.cjs.map +1 -1
  7. package/dist/api/users-api.js.map +1 -1
  8. package/dist/appSlice/index.cjs +1 -0
  9. package/dist/appSlice/index.cjs.map +1 -1
  10. package/dist/appSlice/index.js +1 -0
  11. package/dist/appSlice/index.js.map +1 -1
  12. package/dist/appSlice/selectors.cjs +2 -4
  13. package/dist/appSlice/selectors.cjs.map +1 -1
  14. package/dist/appSlice/selectors.d.cts +4 -51
  15. package/dist/appSlice/selectors.d.ts +4 -51
  16. package/dist/appSlice/selectors.js +3 -4
  17. package/dist/appSlice/selectors.js.map +1 -1
  18. package/dist/appSlice/thunks.d.cts +1 -1
  19. package/dist/appSlice/thunks.d.ts +1 -1
  20. package/dist/auth.cjs +2 -2
  21. package/dist/auth.cjs.map +1 -1
  22. package/dist/auth.js.map +1 -1
  23. package/dist/commonSelectors.cjs +2 -2
  24. package/dist/commonSelectors.cjs.map +1 -1
  25. package/dist/commonSelectors.d.cts +10 -2
  26. package/dist/commonSelectors.d.ts +10 -2
  27. package/dist/commonSelectors.js.map +1 -1
  28. package/dist/constants.cjs.map +1 -1
  29. package/dist/constants.js.map +1 -1
  30. package/dist/deploymentsSlice/index.cjs.map +1 -1
  31. package/dist/deploymentsSlice/index.js.map +1 -1
  32. package/dist/deploymentsSlice/selectors.cjs.map +1 -1
  33. package/dist/deploymentsSlice/selectors.d.cts +2 -2
  34. package/dist/deploymentsSlice/selectors.d.ts +2 -2
  35. package/dist/deploymentsSlice/selectors.js.map +1 -1
  36. package/dist/deploymentsSlice/thunks.cjs +1 -0
  37. package/dist/deploymentsSlice/thunks.d.cts +9 -4
  38. package/dist/deploymentsSlice/thunks.d.ts +9 -4
  39. package/dist/deploymentsSlice/thunks.js +2 -2
  40. package/dist/devicesSlice/index.cjs +4 -0
  41. package/dist/devicesSlice/index.cjs.map +1 -1
  42. package/dist/devicesSlice/index.d.cts +1 -1
  43. package/dist/devicesSlice/index.d.ts +1 -1
  44. package/dist/devicesSlice/index.js +4 -0
  45. package/dist/devicesSlice/index.js.map +1 -1
  46. package/dist/devicesSlice/mocks.d.cts +1 -0
  47. package/dist/devicesSlice/mocks.d.ts +1 -0
  48. package/dist/devicesSlice/selectors.cjs +2 -0
  49. package/dist/devicesSlice/selectors.cjs.map +1 -1
  50. package/dist/devicesSlice/selectors.d.cts +4 -3
  51. package/dist/devicesSlice/selectors.d.ts +4 -3
  52. package/dist/devicesSlice/selectors.js +2 -1
  53. package/dist/devicesSlice/selectors.js.map +1 -1
  54. package/dist/devicesSlice/thunks.cjs +2 -0
  55. package/dist/devicesSlice/thunks.d.cts +68 -3
  56. package/dist/devicesSlice/thunks.d.ts +68 -3
  57. package/dist/devicesSlice/thunks.js +2 -2
  58. package/dist/{index-CPdMUfRr.d.ts → index-BqJuhvO_.d.ts} +4 -1
  59. package/dist/{index-DbfM03Gj.d.cts → index-Doc_1P_Y.d.cts} +4 -1
  60. package/dist/liststatehook.cjs.map +1 -1
  61. package/dist/liststatehook.js.map +1 -1
  62. package/dist/locationutils.cjs.map +1 -1
  63. package/dist/locationutils.d.cts +1 -1
  64. package/dist/locationutils.d.ts +1 -1
  65. package/dist/locationutils.js.map +1 -1
  66. package/dist/monitorSlice/index.cjs.map +1 -1
  67. package/dist/monitorSlice/index.js.map +1 -1
  68. package/dist/monitorSlice/mocks.cjs.map +1 -1
  69. package/dist/monitorSlice/mocks.js.map +1 -1
  70. package/dist/monitorSlice/selectors.d.cts +1 -1
  71. package/dist/monitorSlice/selectors.d.ts +1 -1
  72. package/dist/monitorSlice/thunks.cjs.map +1 -1
  73. package/dist/monitorSlice/thunks.d.cts +2 -2
  74. package/dist/monitorSlice/thunks.d.ts +2 -2
  75. package/dist/monitorSlice/thunks.js.map +1 -1
  76. package/dist/onboardingSlice/index.cjs.map +1 -1
  77. package/dist/onboardingSlice/mocks.cjs.map +1 -1
  78. package/dist/onboardingSlice/selectors.d.cts +1 -1
  79. package/dist/onboardingSlice/selectors.d.ts +1 -1
  80. package/dist/onboardingSlice/thunks.d.cts +1 -1
  81. package/dist/onboardingSlice/thunks.d.ts +1 -1
  82. package/dist/organizationSlice/index.cjs.map +1 -1
  83. package/dist/organizationSlice/selectors.cjs.map +1 -1
  84. package/dist/organizationSlice/selectors.d.cts +2 -2
  85. package/dist/organizationSlice/selectors.d.ts +2 -2
  86. package/dist/organizationSlice/selectors.js.map +1 -1
  87. package/dist/organizationSlice/thunks.d.cts +4 -41
  88. package/dist/organizationSlice/thunks.d.ts +4 -41
  89. package/dist/releasesSlice/index.cjs.map +1 -1
  90. package/dist/releasesSlice/selectors.cjs.map +1 -1
  91. package/dist/releasesSlice/selectors.d.cts +2 -2
  92. package/dist/releasesSlice/selectors.d.ts +2 -2
  93. package/dist/releasesSlice/selectors.js.map +1 -1
  94. package/dist/releasesSlice/thunks.cjs +39 -16
  95. package/dist/releasesSlice/thunks.cjs.map +1 -1
  96. package/dist/releasesSlice/thunks.d.cts +3 -9
  97. package/dist/releasesSlice/thunks.d.ts +3 -9
  98. package/dist/releasesSlice/thunks.js +38 -15
  99. package/dist/releasesSlice/thunks.js.map +1 -1
  100. package/dist/selectors.cjs +1 -1
  101. package/dist/selectors.d.cts +3 -3
  102. package/dist/selectors.d.ts +3 -3
  103. package/dist/selectors.js +3 -3
  104. package/dist/sockethook.cjs +3 -3
  105. package/dist/sockethook.cjs.map +1 -1
  106. package/dist/sockethook.js.map +1 -1
  107. package/dist/{store-Co2ptTSm.d.ts → store-BzrMxxAO.d.ts} +112 -4
  108. package/dist/{store-Dd0Y2JCN.d.cts → store-xV2zaXAc.d.cts} +112 -4
  109. package/dist/store.cjs.map +1 -1
  110. package/dist/store.d.cts +1 -2
  111. package/dist/store.d.ts +1 -2
  112. package/dist/store.js.map +1 -1
  113. package/dist/storehooks.cjs +5 -4
  114. package/dist/storehooks.cjs.map +1 -1
  115. package/dist/storehooks.d.cts +1 -1
  116. package/dist/storehooks.d.ts +1 -1
  117. package/dist/storehooks.js +1 -0
  118. package/dist/storehooks.js.map +1 -1
  119. package/dist/thunks.cjs +85 -25
  120. package/dist/thunks.cjs.map +1 -1
  121. package/dist/thunks.d.cts +3 -3
  122. package/dist/thunks.d.ts +3 -3
  123. package/dist/thunks.js +76 -19
  124. package/dist/thunks.js.map +1 -1
  125. package/dist/useDeploymentDevice.cjs +2 -2
  126. package/dist/useDeploymentDevice.cjs.map +1 -1
  127. package/dist/useDeploymentDevice.js.map +1 -1
  128. package/dist/usersSlice/index.cjs.map +1 -1
  129. package/dist/usersSlice/selectors.cjs.map +1 -1
  130. package/dist/usersSlice/selectors.d.cts +2 -2
  131. package/dist/usersSlice/selectors.d.ts +2 -2
  132. package/dist/usersSlice/selectors.js.map +1 -1
  133. package/dist/usersSlice/thunks.d.cts +1 -1
  134. package/dist/usersSlice/thunks.d.ts +1 -1
  135. package/dist/utils.cjs +2 -0
  136. package/dist/utils.cjs.map +1 -1
  137. package/dist/utils.d.cts +2 -2
  138. package/dist/utils.d.ts +2 -2
  139. package/dist/utils.js +3 -2
  140. package/dist/utils.js.map +1 -1
  141. package/package.json +4 -4
  142. package/dist/utils-C_9XEfi_.d.ts +0 -104
  143. package/dist/utils-DbXmZmGq.d.cts +0 -104
  144. /package/dist/{chunk-D6vf50IK.cjs → rolldown-runtime-D6vf50IK.cjs} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"storehooks.js","names":["storeActions","getOnboardingStateSelector","getDevicesByStatusSelector","getUserSettingsSelector","getGlobalSettingsSelector","getUserSettings","getGlobalSettings","getDevicesByStatus","getOnboardingState"],"sources":["../src/storehooks.ts"],"sourcesContent":["// Copyright 2024 Northern.tech AS\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport { useCallback, useEffect, useRef, useState } from 'react';\n\nimport { extractErrorMessage } from '@northern.tech/utils/helpers';\nimport dayjs from 'dayjs';\nimport durationDayJs from 'dayjs/plugin/duration.js';\nimport Cookies from 'universal-cookie';\n\nimport storeActions from './actions';\nimport { getSessionInfo } from './auth';\nimport { DEPLOYMENT_STATES, DEVICE_STATES, TIMEOUTS, timeUnits } from './constants';\nimport type { DeviceSliceType } from './devicesSlice';\nimport {\n getDevicesByStatus as getDevicesByStatusSelector,\n getFeatures,\n getGlobalSettings as getGlobalSettingsSelector,\n getIsEnterprise,\n getIsServiceProvider,\n getOfflineThresholdSettings,\n getOnboardingState as getOnboardingStateSelector,\n getSortedFilteringAttributes,\n getUserCapabilities,\n getUserSettings as getUserSettingsSelector\n} from './selectors';\nimport { createAppAsyncThunk, useAppDispatch, useAppSelector } from './store';\nimport type { AppDispatch } from './store';\nimport {\n getAllDeviceCounts,\n getDeploymentsByStatus,\n getDeviceAttributes,\n getDeviceById,\n getDeviceLimits,\n getDevicesByStatus,\n getDynamicGroups,\n getGlobalSettings,\n getGroups,\n getIntegrations,\n getOnboardingState,\n getReleases,\n getRoles,\n getUserOrganization,\n getUserSettings,\n saveGlobalSettings,\n saveUserSettings\n} from './thunks';\nimport type { UserSettings, UserSliceType } from './usersSlice';\nimport { stringToBoolean } from './utils';\n\nconst cookies = new Cookies();\ndayjs.extend(durationDayJs);\n\nconst { setDeviceListState, setFirstLoginAfterSignup, setTooltipsState, setShowStartupNotification } = storeActions;\n\nconst featureFlags = [\n 'hasAiEnabled',\n 'hasAuditlogs',\n 'hasMultitenancy',\n 'hasDeltaProgress',\n 'hasDeviceConfig',\n 'hasDeviceConnect',\n 'hasFeedbackEnabled',\n 'hasManifestsEnabled',\n 'hasMonitor',\n 'hasMCUEnabled',\n 'isEnterprise'\n] as const;\n\nconst environmentDatas = [\n 'commit',\n 'feedbackProbability',\n 'hostAddress',\n 'hostedAnnouncement',\n 'recaptchaSiteKey',\n 'sentry',\n 'stripeAPIKey',\n 'trackerCode'\n] as const;\n\ntype VersionInfo = {\n docsVersion?: string;\n version?: string;\n};\n\ntype FeatureFlagsState = Record<string, boolean>;\n\nexport const parseEnvironmentInfo = createAppAsyncThunk(`app/parseEnvironmentInfo`, (_, { dispatch, getState }) => {\n const state = getState();\n let onboardingComplete = getOnboardingStateSelector(state).complete || !!JSON.parse(window.localStorage.getItem('onboardingComplete') ?? 'false');\n let demoArtifactPort = 85;\n let environmentData: Record<string, unknown> = {};\n let environmentFeatures: FeatureFlagsState = {};\n let versionInfo: VersionInfo = {};\n const mender_environment = window.mender_environment;\n if (mender_environment) {\n const { features = {}, demoArtifactPort: port, disableOnboarding, version } = mender_environment;\n demoArtifactPort = Number(port) || demoArtifactPort;\n const appState = state.app;\n environmentData = environmentDatas.reduce((accu, flag) => ({ ...accu, [flag]: mender_environment[flag] || appState[flag as keyof typeof appState] }), {});\n environmentFeatures = {\n ...featureFlags.reduce<FeatureFlagsState>((accu, flag) => ({ ...accu, [flag]: stringToBoolean(features[flag]) }), {}),\n isHosted: stringToBoolean(features.isHosted) || window.location.hostname.includes('hosted.mender.io')\n };\n onboardingComplete = !environmentFeatures.isHosted || stringToBoolean(disableOnboarding) || onboardingComplete;\n versionInfo = {\n docsVersion: isNaN(parseInt(version.charAt(0))) ? '' : version.split('.').slice(0, 2).join('.'),\n version\n };\n }\n return Promise.all([\n dispatch(storeActions.successfullyLoggedIn(getSessionInfo())),\n dispatch(storeActions.setOnboardingComplete(onboardingComplete)),\n dispatch(storeActions.setDemoArtifactPort(demoArtifactPort)),\n dispatch(storeActions.setFeatures(environmentFeatures)),\n dispatch(storeActions.setVersionInformation(versionInfo)),\n dispatch(storeActions.setEnvironmentData(environmentData))\n ]);\n});\n\ntype OnboardingState = {\n complete?: boolean;\n showTips?: boolean | null;\n};\n\ntype MaybeAddOnboardingTasksParams = {\n devicesByStatus: DeviceSliceType['byStatus'];\n dispatch: AppDispatch;\n onboardingState: OnboardingState;\n tasks: Promise<unknown>[];\n};\n\nconst maybeAddOnboardingTasks = ({ devicesByStatus, dispatch, onboardingState, tasks }: MaybeAddOnboardingTasksParams): Promise<unknown>[] => {\n if (!onboardingState.showTips || onboardingState.complete) {\n return tasks;\n }\n // try to retrieve full device details for onboarding devices to ensure ips etc. are available\n // we only load the first few/ 20 devices, as it is possible the onboarding is left dangling\n // and a lot of devices are present and we don't want to flood the backend for this\n return devicesByStatus[DEVICE_STATES.accepted].deviceIds.reduce<Promise<unknown>[]>((accu, id) => {\n accu.push(dispatch(getDeviceById(id)));\n return accu;\n }, tasks);\n};\n\nexport const useAppInit = (userId: string | undefined): { coreInitDone: boolean } => {\n const dispatch = useAppDispatch();\n const [coreInitDone, setCoreInitDone] = useState(false);\n const isEnterprise = useAppSelector(getIsEnterprise);\n const { hasMultitenancy, isHosted } = useAppSelector(getFeatures);\n const devicesByStatus = useAppSelector(getDevicesByStatusSelector);\n const onboardingState = useAppSelector(getOnboardingStateSelector);\n const { columnSelection = [], trackingConsentGiven: hasTrackingEnabled, tooltips = {} } = useAppSelector(getUserSettingsSelector);\n const { canManageUsers } = useAppSelector(getUserCapabilities);\n const { interval, intervalUnit } = useAppSelector(getOfflineThresholdSettings);\n const { id_attribute } = useAppSelector(getGlobalSettingsSelector);\n const { identityAttributes } = useAppSelector(getSortedFilteringAttributes);\n const isServiceProvider = useAppSelector(getIsServiceProvider);\n const coreInitRunning = useRef(false);\n const fullInitRunning = useRef(false);\n\n const retrieveCoreData = useCallback((): Promise<unknown[]> => {\n const tasks: Promise<unknown>[] = [\n dispatch(parseEnvironmentInfo()).unwrap(),\n dispatch(getUserSettings()).unwrap(),\n dispatch(getGlobalSettings()).unwrap(),\n Promise.resolve(dispatch(setFirstLoginAfterSignup(stringToBoolean(cookies.get('firstLoginAfterSignup')))))\n ];\n const multitenancy = hasMultitenancy || isHosted || isEnterprise;\n if (multitenancy) {\n tasks.push(dispatch(getUserOrganization()).unwrap());\n }\n return Promise.all(tasks);\n }, [dispatch, hasMultitenancy, isHosted, isEnterprise]);\n\n const retrieveAppData = useCallback((): Promise<unknown[] | unknown> => {\n if (isServiceProvider) {\n return Promise.resolve(dispatch(getRoles()));\n }\n const tasks: Promise<unknown>[] = [\n dispatch(getDeviceAttributes()),\n dispatch(getDeploymentsByStatus({ status: DEPLOYMENT_STATES.finished, shouldSelect: false })),\n dispatch(getDeploymentsByStatus({ status: DEPLOYMENT_STATES.inprogress })),\n dispatch(getDevicesByStatus({ status: DEVICE_STATES.accepted })),\n dispatch(getDevicesByStatus({ status: DEVICE_STATES.pending })),\n dispatch(getDevicesByStatus({ status: DEVICE_STATES.preauth })),\n dispatch(getDevicesByStatus({ status: DEVICE_STATES.rejected })),\n dispatch(getDynamicGroups()),\n dispatch(getGroups()),\n dispatch(getIntegrations()),\n dispatch(getReleases()),\n dispatch(getAllDeviceCounts()).unwrap()\n ];\n if (hasMultitenancy) {\n tasks.push(dispatch(getDeviceLimits()));\n tasks.push(dispatch(getRoles()));\n }\n return Promise.all(tasks);\n }, [dispatch, hasMultitenancy, isServiceProvider]);\n\n const interpretAppData = useCallback((): Promise<unknown[]> => {\n const settings: Partial<UserSettings> = {};\n if (cookies.get('_ga') && typeof hasTrackingEnabled === 'undefined') {\n settings.trackingConsentGiven = true;\n }\n let tasks: Promise<unknown>[] = [\n Promise.resolve(dispatch(setDeviceListState({ selectedAttributes: columnSelection.map(column => ({ attribute: column.key, scope: column.scope })) }))),\n Promise.resolve(dispatch(setTooltipsState(tooltips as UserSliceType['tooltips']['byId']))), // tooltips read state is primarily trusted from the redux store, except on app init - here user settings are the reference\n dispatch(saveUserSettings(settings)).unwrap()\n ];\n // checks if user id is set and if cookie for helptips exists for that user\n tasks = maybeAddOnboardingTasks({ devicesByStatus, dispatch, tasks, onboardingState });\n\n if (canManageUsers && intervalUnit && intervalUnit !== timeUnits.days) {\n const duration = dayjs.duration(interval, intervalUnit as keyof typeof timeUnits);\n const days = duration.asDays();\n if (days < 1) {\n tasks.push(Promise.resolve(setTimeout(() => dispatch(setShowStartupNotification(true)), TIMEOUTS.fiveSeconds)));\n } else {\n const roundedDays = Math.max(1, Math.round(days));\n tasks.push(dispatch(saveGlobalSettings({ offlineThreshold: { interval: roundedDays, intervalUnit: timeUnits.days } })));\n }\n }\n\n // the following is used as a migration and initialization of the stored identity attribute\n // changing the default device attribute to the first non-deviceId attribute, unless a stored\n // id attribute setting exists\n const identityOptions = identityAttributes.filter(attribute => !['id', 'Device ID', 'status'].includes(attribute));\n if (!id_attribute && identityOptions.length) {\n tasks.push(dispatch(saveGlobalSettings({ id_attribute: { attribute: identityOptions[0], scope: 'identity' } })));\n } else if (typeof id_attribute === 'string') {\n // Legacy migration path: id_attribute used to be a plain string\n let attribute: string = id_attribute;\n if (attribute === 'Device ID') {\n attribute = 'id';\n }\n tasks.push(dispatch(saveGlobalSettings({ id_attribute: { attribute, scope: 'identity' } })));\n }\n tasks.push(Promise.resolve(dispatch(storeActions.setAppInitDone())));\n return Promise.all(tasks);\n }, [\n columnSelection,\n dispatch,\n identityAttributes,\n hasTrackingEnabled,\n canManageUsers,\n devicesByStatus,\n id_attribute,\n interval,\n intervalUnit,\n onboardingState,\n tooltips\n ]);\n\n const initializeAppData = useCallback(\n (): Promise<unknown> =>\n retrieveAppData()\n .then(interpretAppData)\n // this is allowed to fail if no user information are available\n .catch(err => console.log(extractErrorMessage(err)))\n .then(() => dispatch(getOnboardingState())),\n [dispatch, retrieveAppData, interpretAppData]\n );\n\n useEffect(() => {\n if (!userId || coreInitRunning.current) {\n return;\n }\n coreInitRunning.current = true;\n retrieveCoreData().then(() => setCoreInitDone(true));\n }, [userId, retrieveCoreData]);\n\n useEffect(() => {\n if (fullInitRunning.current || !coreInitDone) {\n return;\n }\n fullInitRunning.current = true;\n initializeAppData();\n }, [initializeAppData, coreInitDone]);\n\n return { coreInitDone };\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"storehooks.js","names":["storeActions","getOnboardingStateSelector","getDevicesByStatusSelector","getUserSettingsSelector","getGlobalSettingsSelector","getUserSettings","getGlobalSettings","getDevicesByStatus","getOnboardingState"],"sources":["../src/storehooks.ts"],"sourcesContent":["// Copyright 2024 Northern.tech AS\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport { useCallback, useEffect, useRef, useState } from 'react';\n\nimport { extractErrorMessage } from '@northern.tech/utils/helpers';\nimport dayjs from 'dayjs';\nimport durationDayJs from 'dayjs/plugin/duration.js';\nimport Cookies from 'universal-cookie';\n\nimport storeActions from './actions';\nimport { getSessionInfo } from './auth';\nimport { DEPLOYMENT_STATES, DEVICE_STATES, TIMEOUTS, timeUnits } from './constants';\nimport type { DeviceSliceType } from './devicesSlice';\nimport {\n getDevicesByStatus as getDevicesByStatusSelector,\n getFeatures,\n getGlobalSettings as getGlobalSettingsSelector,\n getIsEnterprise,\n getIsServiceProvider,\n getOfflineThresholdSettings,\n getOnboardingState as getOnboardingStateSelector,\n getSortedFilteringAttributes,\n getUserCapabilities,\n getUserSettings as getUserSettingsSelector\n} from './selectors';\nimport { createAppAsyncThunk, useAppDispatch, useAppSelector } from './store';\nimport type { AppDispatch } from './store';\nimport {\n getAllDeviceCounts,\n getDeploymentsByStatus,\n getDeviceAttributes,\n getDeviceById,\n getDeviceLimits,\n getDevicesByStatus,\n getDynamicGroups,\n getGlobalSettings,\n getGroups,\n getIntegrations,\n getOnboardingState,\n getReleases,\n getRoles,\n getUserOrganization,\n getUserSettings,\n saveGlobalSettings,\n saveUserSettings\n} from './thunks';\nimport type { UserSettings, UserSliceType } from './usersSlice';\nimport { stringToBoolean } from './utils';\n\nconst cookies = new Cookies();\ndayjs.extend(durationDayJs);\n\nconst { setDeviceListState, setFirstLoginAfterSignup, setTooltipsState, setShowStartupNotification } = storeActions;\n\nconst featureFlags = [\n 'hasAiEnabled',\n 'hasAuditlogs',\n 'hasMultitenancy',\n 'hasDeltaProgress',\n 'hasDeviceConfig',\n 'hasDeviceConnect',\n 'hasDeviceFlags',\n 'hasFeedbackEnabled',\n 'hasManifestsEnabled',\n 'hasMonitor',\n 'hasMCUEnabled',\n 'isEnterprise'\n] as const;\n\nconst environmentDatas = [\n 'commit',\n 'feedbackProbability',\n 'hostAddress',\n 'hostedAnnouncement',\n 'recaptchaSiteKey',\n 'sentry',\n 'stripeAPIKey',\n 'trackerCode'\n] as const;\n\ntype VersionInfo = {\n docsVersion?: string;\n version?: string;\n};\n\ntype FeatureFlagsState = Record<string, boolean>;\n\nexport const parseEnvironmentInfo = createAppAsyncThunk(`app/parseEnvironmentInfo`, (_, { dispatch, getState }) => {\n const state = getState();\n let onboardingComplete = getOnboardingStateSelector(state).complete || !!JSON.parse(window.localStorage.getItem('onboardingComplete') ?? 'false');\n let demoArtifactPort = 85;\n let environmentData: Record<string, unknown> = {};\n let environmentFeatures: FeatureFlagsState = {};\n let versionInfo: VersionInfo = {};\n const mender_environment = window.mender_environment;\n if (mender_environment) {\n const { features = {}, demoArtifactPort: port, disableOnboarding, version } = mender_environment;\n demoArtifactPort = Number(port) || demoArtifactPort;\n const appState = state.app;\n environmentData = environmentDatas.reduce((accu, flag) => ({ ...accu, [flag]: mender_environment[flag] || appState[flag as keyof typeof appState] }), {});\n environmentFeatures = {\n ...featureFlags.reduce<FeatureFlagsState>((accu, flag) => ({ ...accu, [flag]: stringToBoolean(features[flag]) }), {}),\n isHosted: stringToBoolean(features.isHosted) || window.location.hostname.includes('hosted.mender.io')\n };\n onboardingComplete = !environmentFeatures.isHosted || stringToBoolean(disableOnboarding) || onboardingComplete;\n versionInfo = {\n docsVersion: isNaN(parseInt(version.charAt(0))) ? '' : version.split('.').slice(0, 2).join('.'),\n version\n };\n }\n return Promise.all([\n dispatch(storeActions.successfullyLoggedIn(getSessionInfo())),\n dispatch(storeActions.setOnboardingComplete(onboardingComplete)),\n dispatch(storeActions.setDemoArtifactPort(demoArtifactPort)),\n dispatch(storeActions.setFeatures(environmentFeatures)),\n dispatch(storeActions.setVersionInformation(versionInfo)),\n dispatch(storeActions.setEnvironmentData(environmentData))\n ]);\n});\n\ntype OnboardingState = {\n complete?: boolean;\n showTips?: boolean | null;\n};\n\ntype MaybeAddOnboardingTasksParams = {\n devicesByStatus: DeviceSliceType['byStatus'];\n dispatch: AppDispatch;\n onboardingState: OnboardingState;\n tasks: Promise<unknown>[];\n};\n\nconst maybeAddOnboardingTasks = ({ devicesByStatus, dispatch, onboardingState, tasks }: MaybeAddOnboardingTasksParams): Promise<unknown>[] => {\n if (!onboardingState.showTips || onboardingState.complete) {\n return tasks;\n }\n // try to retrieve full device details for onboarding devices to ensure ips etc. are available\n // we only load the first few/ 20 devices, as it is possible the onboarding is left dangling\n // and a lot of devices are present and we don't want to flood the backend for this\n return devicesByStatus[DEVICE_STATES.accepted].deviceIds.reduce<Promise<unknown>[]>((accu, id) => {\n accu.push(dispatch(getDeviceById(id)));\n return accu;\n }, tasks);\n};\n\nexport const useAppInit = (userId: string | undefined): { coreInitDone: boolean } => {\n const dispatch = useAppDispatch();\n const [coreInitDone, setCoreInitDone] = useState(false);\n const isEnterprise = useAppSelector(getIsEnterprise);\n const { hasMultitenancy, isHosted } = useAppSelector(getFeatures);\n const devicesByStatus = useAppSelector(getDevicesByStatusSelector);\n const onboardingState = useAppSelector(getOnboardingStateSelector);\n const { columnSelection = [], trackingConsentGiven: hasTrackingEnabled, tooltips = {} } = useAppSelector(getUserSettingsSelector);\n const { canManageUsers } = useAppSelector(getUserCapabilities);\n const { interval, intervalUnit } = useAppSelector(getOfflineThresholdSettings);\n const { id_attribute } = useAppSelector(getGlobalSettingsSelector);\n const { identityAttributes } = useAppSelector(getSortedFilteringAttributes);\n const isServiceProvider = useAppSelector(getIsServiceProvider);\n const coreInitRunning = useRef(false);\n const fullInitRunning = useRef(false);\n\n const retrieveCoreData = useCallback((): Promise<unknown[]> => {\n const tasks: Promise<unknown>[] = [\n dispatch(parseEnvironmentInfo()).unwrap(),\n dispatch(getUserSettings()).unwrap(),\n dispatch(getGlobalSettings()).unwrap(),\n Promise.resolve(dispatch(setFirstLoginAfterSignup(stringToBoolean(cookies.get('firstLoginAfterSignup')))))\n ];\n const multitenancy = hasMultitenancy || isHosted || isEnterprise;\n if (multitenancy) {\n tasks.push(dispatch(getUserOrganization()).unwrap());\n }\n return Promise.all(tasks);\n }, [dispatch, hasMultitenancy, isHosted, isEnterprise]);\n\n const retrieveAppData = useCallback((): Promise<unknown[] | unknown> => {\n if (isServiceProvider) {\n return Promise.resolve(dispatch(getRoles()));\n }\n const tasks: Promise<unknown>[] = [\n dispatch(getDeviceAttributes()),\n dispatch(getDeploymentsByStatus({ status: DEPLOYMENT_STATES.finished, shouldSelect: false })),\n dispatch(getDeploymentsByStatus({ status: DEPLOYMENT_STATES.inprogress })),\n dispatch(getDevicesByStatus({ status: DEVICE_STATES.accepted })),\n dispatch(getDevicesByStatus({ status: DEVICE_STATES.pending })),\n dispatch(getDevicesByStatus({ status: DEVICE_STATES.preauth })),\n dispatch(getDevicesByStatus({ status: DEVICE_STATES.rejected })),\n dispatch(getDynamicGroups()),\n dispatch(getGroups()),\n dispatch(getIntegrations()),\n dispatch(getReleases()),\n dispatch(getAllDeviceCounts()).unwrap()\n ];\n if (hasMultitenancy) {\n tasks.push(dispatch(getDeviceLimits()));\n tasks.push(dispatch(getRoles()));\n }\n return Promise.all(tasks);\n }, [dispatch, hasMultitenancy, isServiceProvider]);\n\n const interpretAppData = useCallback((): Promise<unknown[]> => {\n const settings: Partial<UserSettings> = {};\n if (cookies.get('_ga') && typeof hasTrackingEnabled === 'undefined') {\n settings.trackingConsentGiven = true;\n }\n let tasks: Promise<unknown>[] = [\n Promise.resolve(dispatch(setDeviceListState({ selectedAttributes: columnSelection.map(column => ({ attribute: column.key, scope: column.scope })) }))),\n Promise.resolve(dispatch(setTooltipsState(tooltips as UserSliceType['tooltips']['byId']))), // tooltips read state is primarily trusted from the redux store, except on app init - here user settings are the reference\n dispatch(saveUserSettings(settings)).unwrap()\n ];\n // checks if user id is set and if cookie for helptips exists for that user\n tasks = maybeAddOnboardingTasks({ devicesByStatus, dispatch, tasks, onboardingState });\n\n if (canManageUsers && intervalUnit && intervalUnit !== timeUnits.days) {\n const duration = dayjs.duration(interval, intervalUnit as keyof typeof timeUnits);\n const days = duration.asDays();\n if (days < 1) {\n tasks.push(Promise.resolve(setTimeout(() => dispatch(setShowStartupNotification(true)), TIMEOUTS.fiveSeconds)));\n } else {\n const roundedDays = Math.max(1, Math.round(days));\n tasks.push(dispatch(saveGlobalSettings({ offlineThreshold: { interval: roundedDays, intervalUnit: timeUnits.days } })));\n }\n }\n\n // the following is used as a migration and initialization of the stored identity attribute\n // changing the default device attribute to the first non-deviceId attribute, unless a stored\n // id attribute setting exists\n const identityOptions = identityAttributes.filter(attribute => !['id', 'Device ID', 'status'].includes(attribute));\n if (!id_attribute && identityOptions.length) {\n tasks.push(dispatch(saveGlobalSettings({ id_attribute: { attribute: identityOptions[0], scope: 'identity' } })));\n } else if (typeof id_attribute === 'string') {\n // Legacy migration path: id_attribute used to be a plain string\n let attribute: string = id_attribute;\n if (attribute === 'Device ID') {\n attribute = 'id';\n }\n tasks.push(dispatch(saveGlobalSettings({ id_attribute: { attribute, scope: 'identity' } })));\n }\n tasks.push(Promise.resolve(dispatch(storeActions.setAppInitDone())));\n return Promise.all(tasks);\n }, [\n columnSelection,\n dispatch,\n identityAttributes,\n hasTrackingEnabled,\n canManageUsers,\n devicesByStatus,\n id_attribute,\n interval,\n intervalUnit,\n onboardingState,\n tooltips\n ]);\n\n const initializeAppData = useCallback(\n (): Promise<unknown> =>\n retrieveAppData()\n .then(interpretAppData)\n // this is allowed to fail if no user information are available\n .catch(err => console.log(extractErrorMessage(err)))\n .then(() => dispatch(getOnboardingState())),\n [dispatch, retrieveAppData, interpretAppData]\n );\n\n useEffect(() => {\n if (!userId || coreInitRunning.current) {\n return;\n }\n coreInitRunning.current = true;\n retrieveCoreData().then(() => setCoreInitDone(true));\n }, [userId, retrieveCoreData]);\n\n useEffect(() => {\n if (fullInitRunning.current || !coreInitDone) {\n return;\n }\n fullInitRunning.current = true;\n initializeAppData();\n }, [initializeAppData, coreInitDone]);\n\n return { coreInitDone };\n};\n"],"mappings":"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"}
package/dist/thunks.cjs CHANGED
@@ -1,5 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_chunk = require("./chunk-D6vf50IK.cjs");
2
+ const require_rolldown_runtime = require("./rolldown-runtime-D6vf50IK.cjs");
3
3
  const require_appSlice_constants = require("./appSlice/constants.cjs");
4
4
  const require_onboardingSlice_constants = require("./onboardingSlice/constants.cjs");
5
5
  const require_releasesSlice_constants = require("./releasesSlice/constants.cjs");
@@ -27,22 +27,22 @@ const require_api_users_api = require("./api/users-api.cjs");
27
27
  let react_jsx_runtime = require("react/jsx-runtime");
28
28
  let _northern_tech_utils_helpers = require("@northern.tech/utils/helpers");
29
29
  let universal_cookie = require("universal-cookie");
30
- universal_cookie = require_chunk.__toESM(universal_cookie, 1);
30
+ universal_cookie = require_rolldown_runtime.__toESM(universal_cookie, 1);
31
31
  let dayjs = require("dayjs");
32
- dayjs = require_chunk.__toESM(dayjs, 1);
32
+ dayjs = require_rolldown_runtime.__toESM(dayjs, 1);
33
33
  let react_router = require("react-router");
34
34
  let _northern_tech_utils_tracking = require("@northern.tech/utils/tracking");
35
- _northern_tech_utils_tracking = require_chunk.__toESM(_northern_tech_utils_tracking, 1);
35
+ _northern_tech_utils_tracking = require_rolldown_runtime.__toESM(_northern_tech_utils_tracking, 1);
36
36
  let validator = require("validator");
37
- validator = require_chunk.__toESM(validator, 1);
37
+ validator = require_rolldown_runtime.__toESM(validator, 1);
38
38
  let axios = require("axios");
39
39
  let pluralize = require("pluralize");
40
- pluralize = require_chunk.__toESM(pluralize);
40
+ pluralize = require_rolldown_runtime.__toESM(pluralize, 1);
41
41
  let uuid = require("uuid");
42
42
  let dayjs_plugin_utc_js = require("dayjs/plugin/utc.js");
43
- dayjs_plugin_utc_js = require_chunk.__toESM(dayjs_plugin_utc_js, 1);
43
+ dayjs_plugin_utc_js = require_rolldown_runtime.__toESM(dayjs_plugin_utc_js, 1);
44
44
  let md5 = require("md5");
45
- md5 = require_chunk.__toESM(md5, 1);
45
+ md5 = require_rolldown_runtime.__toESM(md5, 1);
46
46
  let _northern_tech_utils_retrytimer = require("@northern.tech/utils/retrytimer");
47
47
  let _northern_tech_utils_constants = require("@northern.tech/utils/constants");
48
48
  //#region src/appSlice/thunks.ts
@@ -108,6 +108,13 @@ const { isUUID } = validator.default;
108
108
  const { receivedDevice, setSnackbar: setSnackbar$3 } = require_actions;
109
109
  const { page: defaultPage$2, perPage: defaultPerPage$2 } = _northern_tech_utils_constants.DEVICE_LIST_DEFAULTS;
110
110
  const deriveDeploymentGroup = ({ filter, group, groups = [], name }) => group || groups.length === 1 && !isUUID(name) ? groups[0] : filter?.name;
111
+ const decodeDeploymentName = (name) => {
112
+ try {
113
+ return decodeURIComponent(name);
114
+ } catch {
115
+ return name;
116
+ }
117
+ };
111
118
  const transformDeployments = (deployments, deploymentsById) => deployments.sort((0, _northern_tech_utils_helpers.customSort)(true, "created")).reduce((accu, item) => {
112
119
  const filter = item.filter;
113
120
  let deployment = {
@@ -119,7 +126,7 @@ const transformDeployments = (deployments, deploymentsById) => deployments.sort(
119
126
  name: filter.name ?? filter.id,
120
127
  filters: require_utils.mapTermsToFilters(filter.terms)
121
128
  } : void 0,
122
- name: decodeURIComponent(item.name)
129
+ name: decodeDeploymentName(item.name)
123
130
  };
124
131
  deployment = {
125
132
  ...deployment,
@@ -891,6 +898,23 @@ const getAllDeviceCounts = require_store.createAppAsyncThunk(`${require_devicesS
891
898
  })));
892
899
  }));
893
900
  const getDeviceLimits = require_store.createAppAsyncThunk(`${require_devicesSlice_index.sliceName}/getDeviceLimit`, (_, { dispatch }) => require_api_general_api.default.get(`${_northern_tech_utils_constants.deviceAuthV2}/limits/devices`).then((res) => dispatch(require_devicesSlice_index.actions.setDeviceLimits(res.data))));
901
+ const getTestDeviceCount = require_store.createAppAsyncThunk(`${require_devicesSlice_index.sliceName}/getTestDeviceCount`, async (_, { dispatch }) => {
902
+ const res = await require_api_general_api.default.post(`${_northern_tech_utils_constants.inventoryApiUrlV2}/filters/search`, {
903
+ page: 1,
904
+ per_page: 1,
905
+ filters: [{
906
+ scope: "system",
907
+ attribute: "test_device",
908
+ type: _northern_tech_utils_constants.DEVICE_FILTERING_OPTIONS.$eq.key,
909
+ value: "true"
910
+ }],
911
+ attributes: [{
912
+ scope: "identity",
913
+ attribute: "status"
914
+ }]
915
+ }).catch((err) => require_store.commonErrorHandler(err, `Retrieving test device count failed:`, dispatch, require_store.commonErrorFallback));
916
+ return dispatch(require_devicesSlice_index.actions.setTestDeviceCount(Number(res.headers[_northern_tech_utils_constants.headerNames.total])));
917
+ });
894
918
  const setDeviceListState = require_store.createAppAsyncThunk(`${require_devicesSlice_index.sliceName}/setDeviceListState`, ({ shouldSelectDevices = true, forceRefresh, fetchAuth = true, ...selectionState }, { dispatch, getState }) => {
895
919
  const currentState = require_devicesSlice_selectors.getDeviceListState(getState());
896
920
  const refreshTrigger = forceRefresh ? !currentState.refreshTrigger : selectionState.refreshTrigger;
@@ -1058,7 +1082,7 @@ const initializeDistributionData = (report, groups, devices, totalDeviceCount) =
1058
1082
  const { deviceIds, total = 0 } = groups[group] || {};
1059
1083
  const distributionByAttribute = (deviceIds ? deviceIds.map((id) => devices[id]) : Object.values(devices)).reduce((accu, item) => {
1060
1084
  if (!item.attributes || item.status !== _northern_tech_utils_constants.DEVICE_STATES.accepted) return accu;
1061
- const attributeValue = item.attributes[effectiveAttribute];
1085
+ const attributeValue = item.attributes[effectiveAttribute] ?? "";
1062
1086
  if (!accu[attributeValue]) accu[attributeValue] = 0;
1063
1087
  accu[attributeValue] = accu[attributeValue] + 1;
1064
1088
  return accu;
@@ -1095,6 +1119,7 @@ const getReportDataWithoutBackendSupport = require_store.createAppAsyncThunk(`${
1095
1119
  const acceptedDevices = require_devicesSlice_selectors.getAcceptedDevices(getState());
1096
1120
  const { accepted: acceptedDevicesCount } = require_devicesSlice_selectors.getDeviceCountsByStatus(getState());
1097
1121
  const { deviceIds = [], filters = [], total = 0 } = require_devicesSlice_selectors.getGroupsById(getState())[group] || {};
1122
+ const hasAttributeData = (group ? deviceIds : acceptedDevices.deviceIds).every((id) => devicesById[id]?.attributes?.[effectiveAttribute] !== void 0);
1098
1123
  let groupDevicesRequest = Promise.resolve({ payload: {
1099
1124
  groupName: "",
1100
1125
  group: {
@@ -1102,14 +1127,14 @@ const getReportDataWithoutBackendSupport = require_store.createAppAsyncThunk(`${
1102
1127
  total: Object.keys(devicesById).length
1103
1128
  }
1104
1129
  } });
1105
- if (group && (!(deviceIds.length && total) || deviceIds.length !== total || !deviceIds.every((id) => !!devicesById[id]))) groupDevicesRequest = filters.length ? dispatch(getAllDynamicGroupDevices({
1130
+ if (group && (!(deviceIds.length && total) || deviceIds.length !== total || !deviceIds.every((id) => !!devicesById[id]) || !hasAttributeData)) groupDevicesRequest = filters.length ? dispatch(getAllDynamicGroupDevices({
1106
1131
  group,
1107
1132
  attribute: effectiveAttribute
1108
1133
  })).unwrap() : dispatch(getAllGroupDevices({
1109
1134
  group,
1110
1135
  attribute: effectiveAttribute
1111
1136
  })).unwrap();
1112
- else if (!group && (acceptedDevices.deviceIds.length !== acceptedDevicesCount || !acceptedDevices.deviceIds.every((id) => !!devicesById[id]))) groupDevicesRequest = dispatch(getAllDevicesByStatus({
1137
+ else if (!group && (acceptedDevices.deviceIds.length !== acceptedDevicesCount || !acceptedDevices.deviceIds.every((id) => !!devicesById[id]) || !hasAttributeData)) groupDevicesRequest = dispatch(getAllDevicesByStatus({
1113
1138
  status: _northern_tech_utils_constants.DEVICE_STATES.accepted,
1114
1139
  attribute: effectiveAttribute
1115
1140
  })).unwrap();
@@ -1254,7 +1279,12 @@ const applyDeviceConfig = require_store.createAppAsyncThunk(`${require_devicesSl
1254
1279
  ...device.config,
1255
1280
  deployment_id: data.deployment_id
1256
1281
  }
1257
- }))), new Promise((resolve) => setTimeout(() => resolve(dispatch(getSingleDeployment(data.deployment_id))), require_constants.TIMEOUTS.oneSecond))];
1282
+ })))];
1283
+ require_utils.dispatchDelayed({
1284
+ action: getSingleDeployment(data.deployment_id),
1285
+ delay: require_constants.TIMEOUTS.oneSecond,
1286
+ dispatch
1287
+ });
1258
1288
  if (isDefault && canManageUsers) {
1259
1289
  const { previous } = require_usersSlice_selectors.getGlobalSettings(getState()).defaultDeviceConfig ?? {};
1260
1290
  tasks.push(dispatch(saveGlobalSettings({ defaultDeviceConfig: {
@@ -1277,6 +1307,15 @@ const setDeviceTags = require_store.createAppAsyncThunk(`${require_devicesSlice_
1277
1307
  tags
1278
1308
  })), dispatch(setSnackbar$2(`Device ${tagList.length === 1 && isNameChange ? "name" : "tags"} changed`))]));
1279
1309
  }));
1310
+ const setTestDeviceStatus = require_store.createAppAsyncThunk(`${require_devicesSlice_index.sliceName}/setTestDeviceStatus`, ({ deviceId, test_device }, { dispatch }) => require_api_general_api.default.put(`${_northern_tech_utils_constants.deviceAuthV2}/devices/${deviceId}/flags`, { test_device }).catch((err) => require_store.commonErrorHandler(err, `There was an error setting test status for device ${deviceId}.`, dispatch, "Please check your connection.")).then(() => Promise.all([
1311
+ dispatch(setSnackbar$2("Device updated successfully")),
1312
+ dispatch(require_devicesSlice_index.actions.receivedDevice({
1313
+ id: deviceId,
1314
+ flags: { test_device }
1315
+ })),
1316
+ dispatch(getDeviceById(deviceId)),
1317
+ dispatch(getTestDeviceCount())
1318
+ ])));
1280
1319
  const getDeviceTwin = require_store.createAppAsyncThunk(`${require_devicesSlice_index.sliceName}/getDeviceTwin`, ({ deviceId, integration }, { dispatch, getState }) => {
1281
1320
  let providerResult = {};
1282
1321
  return require_api_general_api.default.get(`${_northern_tech_utils_constants.iotManagerBaseURL}/devices/${deviceId}/state`).then(({ data }) => {
@@ -1711,7 +1750,14 @@ const addTenant = require_store.createAppAsyncThunk(`${require_organizationSlice
1711
1750
  return require_api_general_api.default.post(`${_northern_tech_utils_constants.tenantadmApiUrlv2}/tenants`, {
1712
1751
  ...rest,
1713
1752
  device_limits
1714
- }).then(() => Promise.all([dispatch(setSnackbar$1("Tenant was created successfully.")), new Promise((resolve) => setTimeout(() => resolve(dispatch(getTenants())), require_constants.TIMEOUTS.oneSecond))])).catch((err) => require_store.commonErrorHandler(err, "There was an error creating tenant", dispatch, require_store.commonErrorFallback));
1753
+ }).then(() => {
1754
+ dispatch(setSnackbar$1("Tenant was created successfully."));
1755
+ require_utils.dispatchDelayed({
1756
+ action: getTenants(),
1757
+ delay: require_constants.TIMEOUTS.oneSecond,
1758
+ dispatch
1759
+ });
1760
+ }).catch((err) => require_store.commonErrorHandler(err, "There was an error creating tenant", dispatch, require_store.commonErrorFallback));
1715
1761
  });
1716
1762
  const tenantListRetrieval = async (config) => {
1717
1763
  const { page, perPage } = config;
@@ -1754,19 +1800,27 @@ const editTenant = require_store.createAppAsyncThunk(`${require_organizationSlic
1754
1800
  return require_api_general_api.default.put(`${_northern_tech_utils_constants.tenantadmApiUrlv2}/tenants/${id}/child`, {
1755
1801
  device_limits,
1756
1802
  name
1757
- }).catch((err) => require_store.commonErrorHandler(err, `Device Limit cannot be changed`, dispatch)).then(() => Promise.all([
1758
- dispatch(setSnackbar$1("Tenant was changed successfully")),
1759
- dispatch(getUserOrganization()),
1760
- new Promise((resolve) => setTimeout(() => resolve(dispatch(getTenants())), require_constants.TIMEOUTS.oneSecond))
1761
- ]));
1803
+ }).catch((err) => require_store.commonErrorHandler(err, `Device Limit cannot be changed`, dispatch)).then(() => {
1804
+ dispatch(setSnackbar$1("Tenant was changed successfully"));
1805
+ dispatch(getUserOrganization());
1806
+ require_utils.dispatchDelayed({
1807
+ action: getTenants(),
1808
+ delay: require_constants.TIMEOUTS.oneSecond,
1809
+ dispatch
1810
+ });
1811
+ });
1762
1812
  });
1763
1813
  const editBillingProfile = require_store.createAppAsyncThunk(`${require_organizationSlice_index.sliceName}/editBillingProfileEmail`, ({ billingProfile }, { dispatch }) => require_api_general_api.default.patch(`${_northern_tech_utils_constants.tenantadmApiUrlv2}/billing/profile`, billingProfile).catch((err) => require_store.commonErrorHandler(err, `Failed to change billing profile`, dispatch)).then(() => Promise.all([dispatch(setSnackbar$1("Billing Profile was changed successfully")), dispatch(getUserBilling())])));
1764
1814
  const createBillingProfile = require_store.createAppAsyncThunk(`${require_organizationSlice_index.sliceName}/createBillingProfileEmail`, ({ billingProfile }, { dispatch }) => require_api_general_api.default.post(`${_northern_tech_utils_constants.tenantadmApiUrlv2}/billing/profile`, billingProfile).catch((err) => require_store.commonErrorHandler(err, `Failed to create billing profile`, dispatch)).then(() => Promise.all([dispatch(setSnackbar$1("Billing Profile was created successfully")), dispatch(getUserBilling())])));
1765
- const removeTenant = require_store.createAppAsyncThunk(`${require_organizationSlice_index.sliceName}/editDeviceLimit`, ({ id }, { dispatch }) => require_api_general_api.default.post(`${_northern_tech_utils_constants.tenantadmApiUrlv2}/tenants/${id}/remove/start`).catch((err) => require_store.commonErrorHandler(err, `There was an error removing the tenant`, dispatch)).then(() => Promise.all([
1766
- dispatch(setSnackbar$1("The tenant was removed successfully")),
1767
- dispatch(getUserOrganization()),
1768
- new Promise((resolve) => setTimeout(() => resolve(dispatch(getTenants())), require_constants.TIMEOUTS.oneSecond))
1769
- ])));
1815
+ const removeTenant = require_store.createAppAsyncThunk(`${require_organizationSlice_index.sliceName}/editDeviceLimit`, ({ id }, { dispatch }) => require_api_general_api.default.post(`${_northern_tech_utils_constants.tenantadmApiUrlv2}/tenants/${id}/remove/start`).catch((err) => require_store.commonErrorHandler(err, `There was an error removing the tenant`, dispatch)).then(async () => {
1816
+ dispatch(setSnackbar$1("The tenant was removed successfully"));
1817
+ await dispatch(getUserOrganization()).unwrap();
1818
+ require_utils.dispatchDelayed({
1819
+ action: getTenants(),
1820
+ delay: require_constants.TIMEOUTS.oneSecond,
1821
+ dispatch
1822
+ });
1823
+ }));
1770
1824
  const getUserOrganization = require_store.createAppAsyncThunk(`${require_organizationSlice_index.sliceName}/getUserOrganization`, (_, { dispatch, getState }) => require_api_general_api.default.get(`${_northern_tech_utils_constants.tenantadmApiUrlv1}/user/tenant?tiers=true`).then((res) => {
1771
1825
  const { addons, plan, trial } = res.data;
1772
1826
  const { addons: currentAddons, id: currentId, plan: currentPlan, trial: currentTrial } = require_organizationSlice_selectors.getOrganization(getState());
@@ -2465,7 +2519,10 @@ const setAllTooltipsReadState = require_store.createAppAsyncThunk(`${require_use
2465
2519
  const submitUserFeedback = require_store.createAppAsyncThunk(`${require_usersSlice_index.sliceName}/submitFeedback`, ({ formId, feedback }, { dispatch }) => require_api_general_api.default.post(`${_northern_tech_utils_constants.useradmApiUrlv2}/support/feedback/${formId}`, feedback).then(() => {
2466
2520
  if (formId === "product") {
2467
2521
  dispatch(saveUserSettings({ feedbackCollectedAt: (/* @__PURE__ */ new Date()).toISOString().split("T")[0] }));
2468
- setTimeout(() => dispatch(require_usersSlice_index.actions.setShowFeedbackDialog(false)), require_constants.TIMEOUTS.threeSeconds);
2522
+ require_utils.dispatchDelayed({
2523
+ action: require_usersSlice_index.actions.setShowFeedbackDialog(false),
2524
+ dispatch
2525
+ });
2469
2526
  }
2470
2527
  }));
2471
2528
  //#endregion
@@ -2573,6 +2630,7 @@ exports.getSsoConfigs = getSsoConfigs;
2573
2630
  exports.getSystemDevices = getSystemDevices;
2574
2631
  exports.getTargetLocation = getTargetLocation;
2575
2632
  exports.getTenants = getTenants;
2633
+ exports.getTestDeviceCount = getTestDeviceCount;
2576
2634
  exports.getTokens = getTokens;
2577
2635
  exports.getUpdateTypes = require_releasesSlice_thunks.getUpdateTypes;
2578
2636
  exports.getUser = getUser;
@@ -2635,6 +2693,7 @@ exports.setSearchState = setSearchState;
2635
2693
  exports.setSingleReleaseTags = require_releasesSlice_thunks.setSingleReleaseTags;
2636
2694
  exports.setSoftwareListState = require_releasesSlice_thunks.setSoftwareListState;
2637
2695
  exports.setTenantsListState = setTenantsListState;
2696
+ exports.setTestDeviceStatus = setTestDeviceStatus;
2638
2697
  exports.setTooltipReadState = setTooltipReadState;
2639
2698
  exports.startCardUpdate = startCardUpdate;
2640
2699
  exports.startUpgrade = startUpgrade;
@@ -2642,6 +2701,7 @@ exports.storeSsoConfig = storeSsoConfig;
2642
2701
  exports.submitUserFeedback = submitUserFeedback;
2643
2702
  exports.switchUserOrganization = switchUserOrganization;
2644
2703
  exports.tenantDataDivergedMessage = tenantDataDivergedMessage;
2704
+ exports.transformDeployments = transformDeployments;
2645
2705
  exports.transformProductResponse = transformProductResponse;
2646
2706
  exports.triggerDeviceUpdate = triggerDeviceUpdate;
2647
2707
  exports.updateDeploymentControlMap = updateDeploymentControlMap;