@northern.tech/store 0.18.0 → 0.19.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (106) hide show
  1. package/dist/actions.js +6 -6
  2. package/dist/api/general-api.cjs +13 -9
  3. package/dist/api/general-api.cjs.map +1 -1
  4. package/dist/api/general-api.js +3 -3
  5. package/dist/api/users-api.cjs +13 -9
  6. package/dist/api/users-api.cjs.map +1 -1
  7. package/dist/api/users-api.js +4 -4
  8. package/dist/appSlice/index.js +1 -1
  9. package/dist/appSlice/mocks.js +1 -1
  10. package/dist/appSlice/thunks.cjs +42 -19
  11. package/dist/appSlice/thunks.cjs.map +1 -1
  12. package/dist/appSlice/thunks.js +18 -18
  13. package/dist/auth.cjs +7 -9
  14. package/dist/auth.cjs.map +1 -1
  15. package/dist/auth.js +2 -2
  16. package/dist/{chunk-6UO33KLN.js → chunk-C3EMLDPU.js} +5 -5
  17. package/dist/{chunk-EFFRZCDN.js → chunk-FUGCLQ5L.js} +23 -23
  18. package/dist/{chunk-C5QK6HH6.js → chunk-GBXG2XBY.js} +5 -5
  19. package/dist/{chunk-5M6EUVNO.js → chunk-IRQRV552.js} +8 -2
  20. package/dist/chunk-IRQRV552.js.map +1 -0
  21. package/dist/{chunk-CXBQKY7F.js → chunk-KJHHSYGP.js} +14 -14
  22. package/dist/{chunk-PFWOM36E.js → chunk-MZ5NRW3K.js} +38 -17
  23. package/dist/{chunk-PFWOM36E.js.map → chunk-MZ5NRW3K.js.map} +1 -1
  24. package/dist/{chunk-BX2CTAJO.js → chunk-QFYYTAYD.js} +11 -11
  25. package/dist/{chunk-FDSMCFV5.js → chunk-UVTLZV34.js} +8 -10
  26. package/dist/chunk-UVTLZV34.js.map +1 -0
  27. package/dist/{chunk-Y3DJIMEN.js → chunk-XJLZK4QY.js} +3 -3
  28. package/dist/commonConstants.js +1 -1
  29. package/dist/commonSelectors.cjs +31 -0
  30. package/dist/commonSelectors.cjs.map +1 -1
  31. package/dist/commonSelectors.d.cts +147 -1
  32. package/dist/commonSelectors.d.ts +147 -1
  33. package/dist/commonSelectors.js +8 -6
  34. package/dist/constants.js +1 -1
  35. package/dist/deploymentsSlice/constants.js +1 -1
  36. package/dist/deploymentsSlice/index.js +1 -1
  37. package/dist/deploymentsSlice/mocks.js +1 -1
  38. package/dist/deploymentsSlice/selectors.js +1 -1
  39. package/dist/deploymentsSlice/thunks.cjs +42 -19
  40. package/dist/deploymentsSlice/thunks.cjs.map +1 -1
  41. package/dist/deploymentsSlice/thunks.js +18 -18
  42. package/dist/devicesSlice/constants.js +1 -1
  43. package/dist/devicesSlice/index.js +1 -1
  44. package/dist/devicesSlice/mocks.js +1 -1
  45. package/dist/devicesSlice/selectors.js +1 -1
  46. package/dist/devicesSlice/thunks.cjs +42 -19
  47. package/dist/devicesSlice/thunks.cjs.map +1 -1
  48. package/dist/devicesSlice/thunks.js +18 -18
  49. package/dist/liststatehook.js +1 -1
  50. package/dist/locationutils.js +1 -1
  51. package/dist/monitorSlice/index.js +1 -1
  52. package/dist/monitorSlice/mocks.js +1 -1
  53. package/dist/monitorSlice/thunks.cjs +32 -9
  54. package/dist/monitorSlice/thunks.cjs.map +1 -1
  55. package/dist/monitorSlice/thunks.js +15 -15
  56. package/dist/onboardingSlice/thunks.cjs +45 -22
  57. package/dist/onboardingSlice/thunks.cjs.map +1 -1
  58. package/dist/onboardingSlice/thunks.js +18 -18
  59. package/dist/organizationSlice/constants.js +1 -1
  60. package/dist/organizationSlice/index.js +1 -1
  61. package/dist/organizationSlice/mocks.js +1 -1
  62. package/dist/organizationSlice/selectors.js +1 -1
  63. package/dist/organizationSlice/thunks.cjs +50 -27
  64. package/dist/organizationSlice/thunks.cjs.map +1 -1
  65. package/dist/organizationSlice/thunks.js +18 -18
  66. package/dist/releasesSlice/index.js +1 -1
  67. package/dist/releasesSlice/mocks.js +1 -1
  68. package/dist/releasesSlice/selectors.js +1 -1
  69. package/dist/releasesSlice/thunks.cjs +32 -9
  70. package/dist/releasesSlice/thunks.cjs.map +1 -1
  71. package/dist/releasesSlice/thunks.js +15 -15
  72. package/dist/selectors.cjs +29 -0
  73. package/dist/selectors.cjs.map +1 -1
  74. package/dist/selectors.d.cts +1 -1
  75. package/dist/selectors.d.ts +1 -1
  76. package/dist/selectors.js +44 -42
  77. package/dist/sockethook.js +1 -1
  78. package/dist/store.cjs +7 -9
  79. package/dist/store.cjs.map +1 -1
  80. package/dist/store.js +8 -8
  81. package/dist/storehooks.cjs +60 -37
  82. package/dist/storehooks.cjs.map +1 -1
  83. package/dist/storehooks.js +20 -20
  84. package/dist/thunks.cjs +53 -30
  85. package/dist/thunks.cjs.map +1 -1
  86. package/dist/thunks.js +18 -18
  87. package/dist/useDeploymentDevice.cjs +42 -19
  88. package/dist/useDeploymentDevice.cjs.map +1 -1
  89. package/dist/useDeploymentDevice.js +18 -18
  90. package/dist/usersSlice/constants.js +1 -1
  91. package/dist/usersSlice/index.js +1 -1
  92. package/dist/usersSlice/mocks.js +1 -1
  93. package/dist/usersSlice/selectors.js +1 -1
  94. package/dist/usersSlice/thunks.cjs +42 -19
  95. package/dist/usersSlice/thunks.cjs.map +1 -1
  96. package/dist/usersSlice/thunks.js +18 -18
  97. package/dist/utils.js +1 -1
  98. package/package.json +1 -1
  99. package/dist/chunk-5M6EUVNO.js.map +0 -1
  100. package/dist/chunk-FDSMCFV5.js.map +0 -1
  101. /package/dist/{chunk-6UO33KLN.js.map → chunk-C3EMLDPU.js.map} +0 -0
  102. /package/dist/{chunk-EFFRZCDN.js.map → chunk-FUGCLQ5L.js.map} +0 -0
  103. /package/dist/{chunk-C5QK6HH6.js.map → chunk-GBXG2XBY.js.map} +0 -0
  104. /package/dist/{chunk-CXBQKY7F.js.map → chunk-KJHHSYGP.js.map} +0 -0
  105. /package/dist/{chunk-BX2CTAJO.js.map → chunk-QFYYTAYD.js.map} +0 -0
  106. /package/dist/{chunk-Y3DJIMEN.js.map → chunk-XJLZK4QY.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/commonSelectors.ts"],"sourcesContent":["// Copyright 2024 Northern.tech AS\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// @ts-nocheck\nimport { attributeDuplicateFilter, getDemoDeviceAddress as getDemoDeviceAddressHelper } from '@northern.tech/utils/helpers';\nimport { createSelector } from '@reduxjs/toolkit';\n\nimport { ADDONS, PLANS, defaultReports } from './appSlice/constants';\nimport { getFeatures, getSearchedDevices } from './appSlice/selectors';\nimport { DEVICE_LIST_MAXIMUM_LENGTH, UNGROUPED_GROUP } from './commonConstants';\nimport {\n ALL_DEVICES,\n ATTRIBUTE_SCOPES,\n DEVICE_ISSUE_OPTIONS,\n inventoryApiUrlV2,\n reportingApiUrl,\n rolesById,\n rolesByName,\n serviceProviderRolesById,\n uiPermissionsById\n} from './constants';\nimport { getDeploymentsById, getDeploymentsSelectionState, getSelectedDeploymentDeviceIds } from './deploymentsSlice/selectors';\nimport { getDeviceById, getDevicesById, getFilteringAttributes, getGroupsById, getListedDevices } from './devicesSlice/selectors';\nimport { getIssueCountsByType } from './monitorSlice/selectors';\nimport { onboardingSteps } from './onboardingSlice/constants';\nimport { getOnboarding } from './onboardingSlice/selectors';\nimport { getAuditLogEntry, getIsServiceProvider, getOrganization } from './organizationSlice/selectors';\nimport { getReleasesById } from './releasesSlice/selectors';\nimport { getCurrentUser, getGlobalSettings, getRolesById, getRolesList, getUserSettings } from './usersSlice/selectors';\nimport { listItemMapper, mapUserRolesToUiPermissions } from './utils';\n\nexport const getIsEnterprise = createSelector(\n [getOrganization, getFeatures],\n ({ plan = PLANS.os.id }, { isEnterprise, isHosted }) => isEnterprise || (isHosted && plan === PLANS.enterprise.id)\n);\n\nexport const getAttrsEndpoint = createSelector([getFeatures], ({ hasReporting }) =>\n hasReporting ? `${reportingApiUrl}/devices/search/attributes` : `${inventoryApiUrlV2}/filters/attributes`\n);\nexport const getSearchEndpoint = createSelector([getFeatures], ({ hasReporting }) =>\n hasReporting ? `${reportingApiUrl}/devices/search` : `${inventoryApiUrlV2}/filters/search`\n);\n\nexport const getUserRoles = createSelector([getCurrentUser, getRolesById, getIsEnterprise], (currentUser, rolesById, isEnterprise) => {\n const isAdmin = currentUser.roles?.length ? currentUser.roles.some(role => role === rolesByName.admin) : !isEnterprise;\n const uiPermissions = isAdmin ? mapUserRolesToUiPermissions([rolesByName.admin], rolesById) : mapUserRolesToUiPermissions(currentUser.roles || [], rolesById);\n return { isAdmin, uiPermissions };\n});\n\nconst hasPermission = (thing, permission) => Object.values(thing).some(permissions => permissions.includes(permission));\n\nexport const getUserCapabilities = createSelector([getUserRoles, getIsServiceProvider], ({ uiPermissions }, isServiceProvider) => {\n const canManageReleases = hasPermission(uiPermissions.releases, uiPermissionsById.manage.value);\n const canReadReleases = canManageReleases || hasPermission(uiPermissions.releases, uiPermissionsById.read.value);\n const canUploadReleases = canManageReleases || hasPermission(uiPermissions.releases, uiPermissionsById.upload.value);\n\n const canAuditlog = uiPermissions.auditlog.includes(uiPermissionsById.read.value);\n\n const canReadUsers = uiPermissions.userManagement.includes(uiPermissionsById.read.value);\n const canManageUsers = uiPermissions.userManagement.includes(uiPermissionsById.manage.value);\n\n const canReadDevices = hasPermission(uiPermissions.groups, uiPermissionsById.read.value);\n const canWriteDevices = Object.values(uiPermissions.groups).some(\n groupPermissions => groupPermissions.includes(uiPermissionsById.read.value) && groupPermissions.length > 1\n );\n const canTroubleshoot = hasPermission(uiPermissions.groups, uiPermissionsById.connect.value);\n const canManageDevices = hasPermission(uiPermissions.groups, uiPermissionsById.manage.value);\n const canConfigure = hasPermission(uiPermissions.groups, uiPermissionsById.configure.value);\n\n const canDeploy = uiPermissions.deployments.includes(uiPermissionsById.deploy.value) || hasPermission(uiPermissions.groups, uiPermissionsById.deploy.value);\n const canReadDeployments = uiPermissions.deployments.includes(uiPermissionsById.read.value);\n\n return {\n canAuditlog,\n canConfigure,\n canDeploy,\n canManageDevices,\n canManageReleases,\n canManageUsers,\n canReadDeployments,\n canReadDevices,\n canReadReleases,\n canReadUsers,\n canTroubleshoot,\n canUploadReleases,\n canWriteDevices,\n groupsPermissions: uiPermissions.groups,\n releasesPermissions: uiPermissions.releases,\n SPTenant: isServiceProvider\n };\n});\n\nexport const getTenantCapabilities = createSelector(\n [getFeatures, getOrganization, getIsEnterprise],\n (\n {\n hasAuditlogs: isAuditlogEnabled,\n hasDeviceConfig: isDeviceConfigEnabled,\n hasDeviceConnect: isDeviceConnectEnabled,\n hasMonitor: isMonitorEnabled,\n isHosted\n },\n { addons = [], plan = PLANS.os.id },\n isEnterprise\n ) => {\n const canDelta = isEnterprise || plan === PLANS.professional.id;\n const hasAuditlogs = isAuditlogEnabled && isEnterprise;\n const hasDeviceConfig = addons.some(addon => addon.name === ADDONS.configure.id && addon.enabled) || (isDeviceConfigEnabled && !isHosted);\n const hasDeviceConnect = addons.some(addon => addon.name === ADDONS.troubleshoot.id && addon.enabled) || (isDeviceConnectEnabled && !isHosted);\n const hasMonitor = isMonitorEnabled && addons.some(addon => addon.name === ADDONS.monitor.id && addon.enabled);\n return {\n canDelta,\n canRetry: canDelta,\n canSchedule: canDelta,\n hasAuditlogs,\n hasDeviceConfig,\n hasDeviceConnect,\n hasFullFiltering: canDelta,\n hasMonitor,\n isEnterprise,\n plan\n };\n }\n);\n\nexport const getFilterAttributes = createSelector(\n [getGlobalSettings, getFilteringAttributes],\n ({ previousFilters }, { identityAttributes, inventoryAttributes, systemAttributes, tagAttributes }) => {\n const deviceNameAttribute = { key: 'name', value: 'Name', scope: ATTRIBUTE_SCOPES.tags, category: ATTRIBUTE_SCOPES.tags, priority: 1 };\n const deviceIdAttribute = { key: 'id', value: 'Device ID', scope: ATTRIBUTE_SCOPES.identity, category: ATTRIBUTE_SCOPES.identity, priority: 1 };\n const checkInAttribute = { key: 'check_in_time', value: 'Latest activity', scope: ATTRIBUTE_SCOPES.system, category: ATTRIBUTE_SCOPES.system, priority: 4 };\n const updateAttribute = { ...checkInAttribute, key: 'updated_ts', value: 'Last inventory update' };\n const firstRequestAttribute = { key: 'created_ts', value: 'First request', scope: ATTRIBUTE_SCOPES.system, category: ATTRIBUTE_SCOPES.system, priority: 4 };\n const attributes = [\n ...previousFilters.map(item => ({\n ...item,\n value: deviceIdAttribute.key === item.key ? deviceIdAttribute.value : item.key,\n category: 'recently used',\n priority: 0\n })),\n deviceNameAttribute,\n deviceIdAttribute,\n ...identityAttributes.map(item => ({ key: item, value: item, scope: ATTRIBUTE_SCOPES.identity, category: ATTRIBUTE_SCOPES.identity, priority: 1 })),\n ...inventoryAttributes.map(item => ({ key: item, value: item, scope: ATTRIBUTE_SCOPES.inventory, category: ATTRIBUTE_SCOPES.inventory, priority: 2 })),\n ...tagAttributes.map(item => ({ key: item, value: item, scope: ATTRIBUTE_SCOPES.tags, category: ATTRIBUTE_SCOPES.tags, priority: 3 })),\n checkInAttribute,\n updateAttribute,\n firstRequestAttribute,\n ...systemAttributes.map(item => ({ key: item, value: item, scope: ATTRIBUTE_SCOPES.system, category: ATTRIBUTE_SCOPES.system, priority: 4 }))\n ];\n return attributeDuplicateFilter(attributes, 'key');\n }\n);\n\nexport const getOnboardingState = createSelector([getOnboarding, getUserSettings], ({ complete, progress, showTips, ...remainder }, { onboarding = {} }) => ({\n ...remainder,\n ...onboarding,\n complete: onboarding.complete || complete,\n progress:\n Object.keys(onboardingSteps).findIndex(step => step === progress) > Object.keys(onboardingSteps).findIndex(step => step === onboarding.progress)\n ? progress\n : onboarding.progress,\n showTips: !onboarding.showTips ? onboarding.showTips : showTips\n}));\n\nexport const getDemoDeviceAddress = createSelector([getDevicesById, getOnboarding], (devicesById, { approach, demoArtifactPort }) => {\n const demoDeviceAddress = `http://${getDemoDeviceAddressHelper(Object.values(devicesById), approach)}`;\n return demoArtifactPort ? `${demoDeviceAddress}:${demoArtifactPort}` : demoDeviceAddress;\n});\n\nexport const getDeviceConfigDeployment = createSelector([getDeviceById, getDeploymentsById], (device, deploymentsById) => {\n const { config = {} } = device;\n const { deployment_id: configDeploymentId } = config;\n const deviceConfigDeployment = deploymentsById[configDeploymentId] || {};\n return { device, deviceConfigDeployment };\n});\n\nexport const getDeploymentRelease = createSelector(\n [getDeploymentsById, getDeploymentsSelectionState, getReleasesById],\n (deploymentsById, { selectedId }, releasesById) => {\n const deployment = deploymentsById[selectedId] || {};\n return deployment.artifact_name && releasesById[deployment.artifact_name] ? releasesById[deployment.artifact_name] : { device_types_compatible: [] };\n }\n);\n\nexport const getSelectedDeploymentData = createSelector(\n [getDeploymentsById, getDeploymentsSelectionState, getDevicesById, getSelectedDeploymentDeviceIds],\n (deploymentsById, { selectedId }, devicesById, selectedDeviceIds) => {\n const deployment = deploymentsById[selectedId] ?? {};\n const { devices = {} } = deployment;\n return {\n deployment,\n selectedDevices: selectedDeviceIds.map(deviceId => ({ ...devicesById[deviceId], ...devices[deviceId] }))\n };\n }\n);\n\nexport const getAvailableIssueOptionsByType = createSelector(\n [getFeatures, getTenantCapabilities, getIssueCountsByType],\n ({ hasReporting }, { hasFullFiltering, hasMonitor }, issueCounts) =>\n Object.values(DEVICE_ISSUE_OPTIONS).reduce((accu, { isCategory, key, needsFullFiltering, needsMonitor, needsReporting, title }) => {\n if (isCategory || (needsReporting && !hasReporting) || (needsFullFiltering && !hasFullFiltering) || (needsMonitor && !hasMonitor)) {\n return accu;\n }\n accu[key] = { count: issueCounts[key].filtered, key, title };\n return accu;\n }, {})\n);\n\nexport const getGroupNames = createSelector([getGroupsById, getUserRoles], (groupsById, { uiPermissions }) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { [UNGROUPED_GROUP.id]: ungrouped, ...groups } = groupsById;\n return Object.keys(\n Object.entries(groups).reduce((accu, [groupName, group]) => {\n if (group.filterId || uiPermissions.groups[ALL_DEVICES]) {\n accu[groupName] = group;\n }\n return accu;\n }, uiPermissions.groups)\n ).sort();\n});\n\nexport const getDeviceReportsForUser = createSelector(\n [getUserSettings, getCurrentUser, getGlobalSettings, getDevicesById],\n ({ reports }, { id: currentUserId }, globalSettings, devicesById) =>\n reports || globalSettings[`${currentUserId}-reports`] || (Object.keys(devicesById).length ? defaultReports : [])\n);\n\nconst listTypeDeviceIdMap = {\n deviceList: getListedDevices,\n search: getSearchedDevices\n};\nconst deviceMapDefault = { defaultObject: { auth_sets: [] }, cutOffSize: DEVICE_LIST_MAXIMUM_LENGTH };\nconst getDeviceMappingDefaults = () => deviceMapDefault;\n\nexport const getMappedDevicesList = createSelector(\n [getDevicesById, (state, listType) => listTypeDeviceIdMap[listType](state), getDeviceMappingDefaults],\n listItemMapper\n);\n\nexport const getAuditlogDevice = createSelector([getAuditLogEntry, getDevicesById], (auditlogEvent, devicesById) => {\n let auditlogDevice = {};\n if (auditlogEvent) {\n const { object = {} } = auditlogEvent;\n const { device = {}, id, type } = object;\n auditlogDevice = type === 'device' ? { id, ...device } : auditlogDevice;\n }\n return { ...auditlogDevice, ...devicesById[auditlogDevice.id] };\n});\n\nexport const getRelevantRoles = createSelector([getOrganization, getRolesList], ({ service_provider }, roles) => {\n if (service_provider) {\n return roles.reduce((accu, role) => {\n if (rolesById[role.value]) {\n return accu;\n }\n accu.push(role);\n return accu;\n }, Object.values(serviceProviderRolesById));\n }\n return Object.keys(rolesById)\n .reverse()\n .reduce((accu, key) => {\n const index = accu.findIndex(({ value }) => value === key);\n accu = [accu[index], ...accu.filter((item, itemIndex) => index !== itemIndex)];\n return accu;\n }, roles);\n});\n"],"mappings":"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","names":["rolesById"]}
1
+ {"version":3,"sources":["../src/commonSelectors.ts"],"sourcesContent":["// Copyright 2024 Northern.tech AS\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// @ts-nocheck\nimport { attributeDuplicateFilter, getDemoDeviceAddress as getDemoDeviceAddressHelper } from '@northern.tech/utils/helpers';\nimport { createSelector } from '@reduxjs/toolkit';\nimport dayjs from 'dayjs';\n\nimport { ADDONS, PLANS, defaultReports } from './appSlice/constants';\nimport { getFeatures, getSearchedDevices } from './appSlice/selectors';\nimport { DEVICE_LIST_MAXIMUM_LENGTH, UNGROUPED_GROUP } from './commonConstants';\nimport {\n ALL_DEVICES,\n ATTRIBUTE_SCOPES,\n DEVICE_ISSUE_OPTIONS,\n inventoryApiUrlV2,\n reportingApiUrl,\n rolesById,\n rolesByName,\n serviceProviderRolesById,\n uiPermissionsById\n} from './constants';\nimport { getDeploymentsById, getDeploymentsSelectionState, getSelectedDeploymentDeviceIds } from './deploymentsSlice/selectors';\nimport { getDeviceById, getDevicesById, getFilteringAttributes, getGroupsById, getListedDevices } from './devicesSlice/selectors';\nimport { getIssueCountsByType } from './monitorSlice/selectors';\nimport { onboardingSteps } from './onboardingSlice/constants';\nimport { getOnboarding } from './onboardingSlice/selectors';\nimport { getAuditLogEntry, getIsServiceProvider, getOrganization } from './organizationSlice/selectors';\nimport { getReleasesById } from './releasesSlice/selectors';\nimport {\n getCurrentUser,\n getGlobalSettings,\n getHas2FA,\n getRolesById,\n getRolesList,\n getSecurityAlertDismissedTimestamp,\n getUserSettings,\n getUserSettingsInitialized\n} from './usersSlice/selectors';\nimport { listItemMapper, mapUserRolesToUiPermissions } from './utils';\n\nexport const getIsEnterprise = createSelector(\n [getOrganization, getFeatures],\n ({ plan = PLANS.os.id }, { isEnterprise, isHosted }) => isEnterprise || (isHosted && plan === PLANS.enterprise.id)\n);\n\nexport const getAttrsEndpoint = createSelector([getFeatures], ({ hasReporting }) =>\n hasReporting ? `${reportingApiUrl}/devices/search/attributes` : `${inventoryApiUrlV2}/filters/attributes`\n);\nexport const getSearchEndpoint = createSelector([getFeatures], ({ hasReporting }) =>\n hasReporting ? `${reportingApiUrl}/devices/search` : `${inventoryApiUrlV2}/filters/search`\n);\n\nexport const getUserRoles = createSelector([getCurrentUser, getRolesById, getIsEnterprise], (currentUser, rolesById, isEnterprise) => {\n const isAdmin = currentUser.roles?.length ? currentUser.roles.some(role => role === rolesByName.admin) : !isEnterprise;\n const uiPermissions = isAdmin ? mapUserRolesToUiPermissions([rolesByName.admin], rolesById) : mapUserRolesToUiPermissions(currentUser.roles || [], rolesById);\n return { isAdmin, uiPermissions };\n});\n\nconst hasPermission = (thing, permission) => Object.values(thing).some(permissions => permissions.includes(permission));\n\nexport const getUserCapabilities = createSelector([getUserRoles, getIsServiceProvider], ({ uiPermissions }, isServiceProvider) => {\n const canManageReleases = hasPermission(uiPermissions.releases, uiPermissionsById.manage.value);\n const canReadReleases = canManageReleases || hasPermission(uiPermissions.releases, uiPermissionsById.read.value);\n const canUploadReleases = canManageReleases || hasPermission(uiPermissions.releases, uiPermissionsById.upload.value);\n\n const canAuditlog = uiPermissions.auditlog.includes(uiPermissionsById.read.value);\n\n const canReadUsers = uiPermissions.userManagement.includes(uiPermissionsById.read.value);\n const canManageUsers = uiPermissions.userManagement.includes(uiPermissionsById.manage.value);\n\n const canReadDevices = hasPermission(uiPermissions.groups, uiPermissionsById.read.value);\n const canWriteDevices = Object.values(uiPermissions.groups).some(\n groupPermissions => groupPermissions.includes(uiPermissionsById.read.value) && groupPermissions.length > 1\n );\n const canTroubleshoot = hasPermission(uiPermissions.groups, uiPermissionsById.connect.value);\n const canManageDevices = hasPermission(uiPermissions.groups, uiPermissionsById.manage.value);\n const canConfigure = hasPermission(uiPermissions.groups, uiPermissionsById.configure.value);\n\n const canDeploy = uiPermissions.deployments.includes(uiPermissionsById.deploy.value) || hasPermission(uiPermissions.groups, uiPermissionsById.deploy.value);\n const canReadDeployments = uiPermissions.deployments.includes(uiPermissionsById.read.value);\n\n return {\n canAuditlog,\n canConfigure,\n canDeploy,\n canManageDevices,\n canManageReleases,\n canManageUsers,\n canReadDeployments,\n canReadDevices,\n canReadReleases,\n canReadUsers,\n canTroubleshoot,\n canUploadReleases,\n canWriteDevices,\n groupsPermissions: uiPermissions.groups,\n releasesPermissions: uiPermissions.releases,\n SPTenant: isServiceProvider\n };\n});\n\nexport const getTenantCapabilities = createSelector(\n [getFeatures, getOrganization, getIsEnterprise],\n (\n {\n hasAuditlogs: isAuditlogEnabled,\n hasDeviceConfig: isDeviceConfigEnabled,\n hasDeviceConnect: isDeviceConnectEnabled,\n hasMonitor: isMonitorEnabled,\n isHosted\n },\n { addons = [], plan = PLANS.os.id },\n isEnterprise\n ) => {\n const canDelta = isEnterprise || plan === PLANS.professional.id;\n const hasAuditlogs = isAuditlogEnabled && isEnterprise;\n const hasDeviceConfig = addons.some(addon => addon.name === ADDONS.configure.id && addon.enabled) || (isDeviceConfigEnabled && !isHosted);\n const hasDeviceConnect = addons.some(addon => addon.name === ADDONS.troubleshoot.id && addon.enabled) || (isDeviceConnectEnabled && !isHosted);\n const hasMonitor = isMonitorEnabled && addons.some(addon => addon.name === ADDONS.monitor.id && addon.enabled);\n return {\n canDelta,\n canRetry: canDelta,\n canSchedule: canDelta,\n hasAuditlogs,\n hasDeviceConfig,\n hasDeviceConnect,\n hasFullFiltering: canDelta,\n hasMonitor,\n isEnterprise,\n plan\n };\n }\n);\n\nexport const getFilterAttributes = createSelector(\n [getGlobalSettings, getFilteringAttributes],\n ({ previousFilters }, { identityAttributes, inventoryAttributes, systemAttributes, tagAttributes }) => {\n const deviceNameAttribute = { key: 'name', value: 'Name', scope: ATTRIBUTE_SCOPES.tags, category: ATTRIBUTE_SCOPES.tags, priority: 1 };\n const deviceIdAttribute = { key: 'id', value: 'Device ID', scope: ATTRIBUTE_SCOPES.identity, category: ATTRIBUTE_SCOPES.identity, priority: 1 };\n const checkInAttribute = { key: 'check_in_time', value: 'Latest activity', scope: ATTRIBUTE_SCOPES.system, category: ATTRIBUTE_SCOPES.system, priority: 4 };\n const updateAttribute = { ...checkInAttribute, key: 'updated_ts', value: 'Last inventory update' };\n const firstRequestAttribute = { key: 'created_ts', value: 'First request', scope: ATTRIBUTE_SCOPES.system, category: ATTRIBUTE_SCOPES.system, priority: 4 };\n const attributes = [\n ...previousFilters.map(item => ({\n ...item,\n value: deviceIdAttribute.key === item.key ? deviceIdAttribute.value : item.key,\n category: 'recently used',\n priority: 0\n })),\n deviceNameAttribute,\n deviceIdAttribute,\n ...identityAttributes.map(item => ({ key: item, value: item, scope: ATTRIBUTE_SCOPES.identity, category: ATTRIBUTE_SCOPES.identity, priority: 1 })),\n ...inventoryAttributes.map(item => ({ key: item, value: item, scope: ATTRIBUTE_SCOPES.inventory, category: ATTRIBUTE_SCOPES.inventory, priority: 2 })),\n ...tagAttributes.map(item => ({ key: item, value: item, scope: ATTRIBUTE_SCOPES.tags, category: ATTRIBUTE_SCOPES.tags, priority: 3 })),\n checkInAttribute,\n updateAttribute,\n firstRequestAttribute,\n ...systemAttributes.map(item => ({ key: item, value: item, scope: ATTRIBUTE_SCOPES.system, category: ATTRIBUTE_SCOPES.system, priority: 4 }))\n ];\n return attributeDuplicateFilter(attributes, 'key');\n }\n);\n\nexport const getOnboardingState = createSelector([getOnboarding, getUserSettings], ({ complete, progress, showTips, ...remainder }, { onboarding = {} }) => ({\n ...remainder,\n ...onboarding,\n complete: onboarding.complete || complete,\n progress:\n Object.keys(onboardingSteps).findIndex(step => step === progress) > Object.keys(onboardingSteps).findIndex(step => step === onboarding.progress)\n ? progress\n : onboarding.progress,\n showTips: !onboarding.showTips ? onboarding.showTips : showTips\n}));\n\nexport const getDemoDeviceAddress = createSelector([getDevicesById, getOnboarding], (devicesById, { approach, demoArtifactPort }) => {\n const demoDeviceAddress = `http://${getDemoDeviceAddressHelper(Object.values(devicesById), approach)}`;\n return demoArtifactPort ? `${demoDeviceAddress}:${demoArtifactPort}` : demoDeviceAddress;\n});\n\nexport const getDeviceConfigDeployment = createSelector([getDeviceById, getDeploymentsById], (device, deploymentsById) => {\n const { config = {} } = device;\n const { deployment_id: configDeploymentId } = config;\n const deviceConfigDeployment = deploymentsById[configDeploymentId] || {};\n return { device, deviceConfigDeployment };\n});\n\nexport const getDeploymentRelease = createSelector(\n [getDeploymentsById, getDeploymentsSelectionState, getReleasesById],\n (deploymentsById, { selectedId }, releasesById) => {\n const deployment = deploymentsById[selectedId] || {};\n return deployment.artifact_name && releasesById[deployment.artifact_name] ? releasesById[deployment.artifact_name] : { device_types_compatible: [] };\n }\n);\n\nexport const getSelectedDeploymentData = createSelector(\n [getDeploymentsById, getDeploymentsSelectionState, getDevicesById, getSelectedDeploymentDeviceIds],\n (deploymentsById, { selectedId }, devicesById, selectedDeviceIds) => {\n const deployment = deploymentsById[selectedId] ?? {};\n const { devices = {} } = deployment;\n return {\n deployment,\n selectedDevices: selectedDeviceIds.map(deviceId => ({ ...devicesById[deviceId], ...devices[deviceId] }))\n };\n }\n);\n\nexport const getAvailableIssueOptionsByType = createSelector(\n [getFeatures, getTenantCapabilities, getIssueCountsByType],\n ({ hasReporting }, { hasFullFiltering, hasMonitor }, issueCounts) =>\n Object.values(DEVICE_ISSUE_OPTIONS).reduce((accu, { isCategory, key, needsFullFiltering, needsMonitor, needsReporting, title }) => {\n if (isCategory || (needsReporting && !hasReporting) || (needsFullFiltering && !hasFullFiltering) || (needsMonitor && !hasMonitor)) {\n return accu;\n }\n accu[key] = { count: issueCounts[key].filtered, key, title };\n return accu;\n }, {})\n);\n\nexport const getGroupNames = createSelector([getGroupsById, getUserRoles], (groupsById, { uiPermissions }) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { [UNGROUPED_GROUP.id]: ungrouped, ...groups } = groupsById;\n return Object.keys(\n Object.entries(groups).reduce((accu, [groupName, group]) => {\n if (group.filterId || uiPermissions.groups[ALL_DEVICES]) {\n accu[groupName] = group;\n }\n return accu;\n }, uiPermissions.groups)\n ).sort();\n});\n\nexport const getDeviceReportsForUser = createSelector(\n [getUserSettings, getCurrentUser, getGlobalSettings, getDevicesById],\n ({ reports }, { id: currentUserId }, globalSettings, devicesById) =>\n reports || globalSettings[`${currentUserId}-reports`] || (Object.keys(devicesById).length ? defaultReports : [])\n);\n\nconst listTypeDeviceIdMap = {\n deviceList: getListedDevices,\n search: getSearchedDevices\n};\nconst deviceMapDefault = { defaultObject: { auth_sets: [] }, cutOffSize: DEVICE_LIST_MAXIMUM_LENGTH };\nconst getDeviceMappingDefaults = () => deviceMapDefault;\n\nexport const getMappedDevicesList = createSelector(\n [getDevicesById, (state, listType) => listTypeDeviceIdMap[listType](state), getDeviceMappingDefaults],\n listItemMapper\n);\n\nexport const getAuditlogDevice = createSelector([getAuditLogEntry, getDevicesById], (auditlogEvent, devicesById) => {\n let auditlogDevice = {};\n if (auditlogEvent) {\n const { object = {} } = auditlogEvent;\n const { device = {}, id, type } = object;\n auditlogDevice = type === 'device' ? { id, ...device } : auditlogDevice;\n }\n return { ...auditlogDevice, ...devicesById[auditlogDevice.id] };\n});\n\nexport const getRelevantRoles = createSelector([getOrganization, getRolesList], ({ service_provider }, roles) => {\n if (service_provider) {\n return roles.reduce((accu, role) => {\n if (rolesById[role.value]) {\n return accu;\n }\n accu.push(role);\n return accu;\n }, Object.values(serviceProviderRolesById));\n }\n return Object.keys(rolesById)\n .reverse()\n .reduce((accu, key) => {\n const index = accu.findIndex(({ value }) => value === key);\n accu = [accu[index], ...accu.filter((item, itemIndex) => index !== itemIndex)];\n return accu;\n }, roles);\n});\n\nexport const getShowSecurityAlert = createSelector(\n [getCurrentUser, getHas2FA, getFeatures, getIsEnterprise, getUserSettingsInitialized, getSecurityAlertDismissedTimestamp],\n (currentUser, has2FA, features, isEnterprise, settingsInitialized, dismissedTimestamp) => {\n const isHosted = features?.isHosted;\n const canHave2FA = isEnterprise || isHosted;\n if (!currentUser || !settingsInitialized || has2FA || !canHave2FA) {\n return false;\n }\n\n if (dismissedTimestamp === null) {\n return true;\n }\n\n const today = dayjs();\n const dismissedMonthAgo = today.diff(dismissedTimestamp, 'months');\n\n return dismissedMonthAgo > 0;\n }\n);\n"],"mappings":"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","names":["rolesById"]}
@@ -1,27 +1,27 @@
1
+ import {
2
+ actions as actions8
3
+ } from "./chunk-YR65C62H.js";
4
+ import {
5
+ actions as actions3
6
+ } from "./chunk-VODRLEDP.js";
1
7
  import {
2
8
  actions as actions7
3
9
  } from "./chunk-TRKA7XYU.js";
4
10
  import {
5
- actions as actions8
6
- } from "./chunk-YR65C62H.js";
11
+ actions as actions5
12
+ } from "./chunk-CQXDAXQF.js";
7
13
  import {
8
14
  actions as actions6
9
15
  } from "./chunk-VCEFZTWS.js";
10
16
  import {
11
17
  actions as actions4
12
18
  } from "./chunk-PVCHKW35.js";
13
- import {
14
- actions as actions5
15
- } from "./chunk-CQXDAXQF.js";
16
- import {
17
- actions as actions2
18
- } from "./chunk-OLKM53RL.js";
19
19
  import {
20
20
  actions
21
21
  } from "./chunk-6WJI4MOP.js";
22
22
  import {
23
- actions as actions3
24
- } from "./chunk-VODRLEDP.js";
23
+ actions as actions2
24
+ } from "./chunk-OLKM53RL.js";
25
25
 
26
26
  // src/actions.ts
27
27
  var actions_default = {
@@ -38,4 +38,4 @@ var actions_default = {
38
38
  export {
39
39
  actions_default
40
40
  };
41
- //# sourceMappingURL=chunk-BX2CTAJO.js.map
41
+ //# sourceMappingURL=chunk-QFYYTAYD.js.map
@@ -14,19 +14,17 @@ var getSessionInfo = () => {
14
14
  sessionInfo = JSON.parse(window.localStorage.getItem("JWT") ?? "");
15
15
  } catch {
16
16
  }
17
+ const jwtTokenFromCookie = cookies.get("JWT", { doNotParse: true }) ?? "";
18
+ if (jwtTokenFromCookie) {
19
+ setSessionInfo({ token: jwtTokenFromCookie });
20
+ cookies.remove("JWT");
21
+ cookies.remove("JWT", { path: "/" });
22
+ return { token: jwtTokenFromCookie, expiresAt: void 0 };
23
+ }
17
24
  if (sessionInfo.expiresAt && new Date(sessionInfo.expiresAt) < /* @__PURE__ */ new Date()) {
18
25
  cleanUp();
19
26
  return { ...emptySession };
20
27
  }
21
- if (!sessionInfo.token) {
22
- const jwtTokenFromCookie = cookies.get("JWT", { doNotParse: true }) ?? "";
23
- if (jwtTokenFromCookie) {
24
- setSessionInfo({ token: jwtTokenFromCookie });
25
- sessionInfo.token = jwtTokenFromCookie;
26
- cookies.remove("JWT");
27
- cookies.remove("JWT", { path: "/" });
28
- }
29
- }
30
28
  sessionInfo.token = sessionInfo.token || "";
31
29
  tokenCache = sessionInfo.token;
32
30
  return sessionInfo;
@@ -67,4 +65,4 @@ export {
67
65
  cleanUp,
68
66
  updateMaxAge
69
67
  };
70
- //# sourceMappingURL=chunk-FDSMCFV5.js.map
68
+ //# sourceMappingURL=chunk-UVTLZV34.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/auth.ts"],"sourcesContent":["// Copyright 2016 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 Cookies from 'universal-cookie';\n\nimport { TIMEOUTS, maxSessionAge } from './constants';\nimport type { UserSession } from './usersSlice';\n\nconst cookies = new Cookies();\n\nconst emptySession = Object.freeze({ token: '', expiresAt: undefined }) as Readonly<UserSession>;\n\nlet tokenCache = '';\n\nexport const getSessionInfo = (): UserSession => {\n let sessionInfo = { ...emptySession } as UserSession;\n try {\n sessionInfo = JSON.parse(window.localStorage.getItem('JWT') ?? '');\n } catch {\n // most likely not logged in - nothing to do here\n }\n\n // check for cookie first to handles sso login while an old/expired token may still exist in cache/ localStorage\n const jwtTokenFromCookie = cookies.get('JWT', { doNotParse: true }) ?? '';\n if (jwtTokenFromCookie) {\n setSessionInfo({ token: jwtTokenFromCookie });\n cookies.remove('JWT');\n cookies.remove('JWT', { path: '/' });\n return { token: jwtTokenFromCookie, expiresAt: undefined };\n }\n if (sessionInfo.expiresAt && new Date(sessionInfo.expiresAt) < new Date()) {\n cleanUp();\n return { ...emptySession };\n }\n sessionInfo.token = sessionInfo.token || '';\n tokenCache = sessionInfo.token;\n return sessionInfo;\n};\n\nexport const getToken = () => (tokenCache ? tokenCache : getSessionInfo().token);\n\nexport const setSessionInfo = ({ token, expiresAt }: UserSession) => {\n tokenCache = token;\n window.localStorage.setItem('JWT', JSON.stringify({ token, expiresAt }));\n};\n\nexport const cleanUp = () => {\n tokenCache = '';\n cookies.remove('JWT');\n cookies.remove('JWT', { path: '/' });\n window.localStorage.removeItem('JWT');\n window.localStorage.removeItem('oauth');\n};\n\nexport const updateMaxAge = ({ expiresAt, token }) => {\n const oAuthExpiration = Number(window.localStorage.getItem('oauth'));\n let updateWithOAuth = false;\n if (oAuthExpiration) {\n const soon = Date.now() + maxSessionAge * TIMEOUTS.oneSecond;\n updateWithOAuth = oAuthExpiration <= soon;\n if (updateWithOAuth) {\n window.localStorage.removeItem('oauth');\n }\n }\n if (token && expiresAt && (!oAuthExpiration || updateWithOAuth)) {\n const expiration = new Date();\n expiration.setSeconds(expiration.getSeconds() + maxSessionAge);\n setSessionInfo({ token, expiresAt: expiration.toISOString() });\n }\n};\n"],"mappings":";;;;;;AAaA,OAAO,aAAa;AAKpB,IAAM,UAAU,IAAI,QAAQ;AAE5B,IAAM,eAAe,OAAO,OAAO,EAAE,OAAO,IAAI,WAAW,OAAU,CAAC;AAEtE,IAAI,aAAa;AAEV,IAAM,iBAAiB,MAAmB;AAC/C,MAAI,cAAc,EAAE,GAAG,aAAa;AACpC,MAAI;AACF,kBAAc,KAAK,MAAM,OAAO,aAAa,QAAQ,KAAK,KAAK,EAAE;AAAA,EACnE,QAAQ;AAAA,EAER;AAGA,QAAM,qBAAqB,QAAQ,IAAI,OAAO,EAAE,YAAY,KAAK,CAAC,KAAK;AACvE,MAAI,oBAAoB;AACtB,mBAAe,EAAE,OAAO,mBAAmB,CAAC;AAC5C,YAAQ,OAAO,KAAK;AACpB,YAAQ,OAAO,OAAO,EAAE,MAAM,IAAI,CAAC;AACnC,WAAO,EAAE,OAAO,oBAAoB,WAAW,OAAU;AAAA,EAC3D;AACA,MAAI,YAAY,aAAa,IAAI,KAAK,YAAY,SAAS,IAAI,oBAAI,KAAK,GAAG;AACzE,YAAQ;AACR,WAAO,EAAE,GAAG,aAAa;AAAA,EAC3B;AACA,cAAY,QAAQ,YAAY,SAAS;AACzC,eAAa,YAAY;AACzB,SAAO;AACT;AAEO,IAAM,WAAW,MAAO,aAAa,aAAa,eAAe,EAAE;AAEnE,IAAM,iBAAiB,CAAC,EAAE,OAAO,UAAU,MAAmB;AACnE,eAAa;AACb,SAAO,aAAa,QAAQ,OAAO,KAAK,UAAU,EAAE,OAAO,UAAU,CAAC,CAAC;AACzE;AAEO,IAAM,UAAU,MAAM;AAC3B,eAAa;AACb,UAAQ,OAAO,KAAK;AACpB,UAAQ,OAAO,OAAO,EAAE,MAAM,IAAI,CAAC;AACnC,SAAO,aAAa,WAAW,KAAK;AACpC,SAAO,aAAa,WAAW,OAAO;AACxC;AAEO,IAAM,eAAe,CAAC,EAAE,WAAW,MAAM,MAAM;AACpD,QAAM,kBAAkB,OAAO,OAAO,aAAa,QAAQ,OAAO,CAAC;AACnE,MAAI,kBAAkB;AACtB,MAAI,iBAAiB;AACnB,UAAM,OAAO,KAAK,IAAI,IAAI,gBAAgB,SAAS;AACnD,sBAAkB,mBAAmB;AACrC,QAAI,iBAAiB;AACnB,aAAO,aAAa,WAAW,OAAO;AAAA,IACxC;AAAA,EACF;AACA,MAAI,SAAS,cAAc,CAAC,mBAAmB,kBAAkB;AAC/D,UAAM,aAAa,oBAAI,KAAK;AAC5B,eAAW,WAAW,WAAW,WAAW,IAAI,aAAa;AAC7D,mBAAe,EAAE,OAAO,WAAW,WAAW,YAAY,EAAE,CAAC;AAAA,EAC/D;AACF;","names":[]}
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  commonRequestConfig
3
- } from "./chunk-5M6EUVNO.js";
3
+ } from "./chunk-IRQRV552.js";
4
4
  import {
5
5
  getToken
6
- } from "./chunk-FDSMCFV5.js";
6
+ } from "./chunk-UVTLZV34.js";
7
7
 
8
8
  // src/api/users-api.ts
9
9
  import axios from "axios";
@@ -22,4 +22,4 @@ var users_api_default = Api;
22
22
  export {
23
23
  users_api_default
24
24
  };
25
- //# sourceMappingURL=chunk-Y3DJIMEN.js.map
25
+ //# sourceMappingURL=chunk-XJLZK4QY.js.map
@@ -12,8 +12,8 @@ import {
12
12
  timeUnits
13
13
  } from "./chunk-WWED74SG.js";
14
14
  import "./chunk-2DYA3X77.js";
15
- import "./chunk-FAJ3I2UQ.js";
16
15
  import "./chunk-ZKAH3APE.js";
16
+ import "./chunk-FAJ3I2UQ.js";
17
17
  import "./chunk-EL672W25.js";
18
18
  export {
19
19
  DEVICE_LIST_MAXIMUM_LENGTH,
@@ -1,7 +1,9 @@
1
1
  "use strict";
2
+ var __create = Object.create;
2
3
  var __defProp = Object.defineProperty;
3
4
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
5
  var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
5
7
  var __hasOwnProp = Object.prototype.hasOwnProperty;
6
8
  var __export = (target, all) => {
7
9
  for (var name in all)
@@ -15,6 +17,14 @@ var __copyProps = (to, from, except, desc) => {
15
17
  }
16
18
  return to;
17
19
  };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
18
28
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
29
 
20
30
  // src/commonSelectors.ts
@@ -35,6 +45,7 @@ __export(commonSelectors_exports, {
35
45
  getRelevantRoles: () => getRelevantRoles,
36
46
  getSearchEndpoint: () => getSearchEndpoint,
37
47
  getSelectedDeploymentData: () => getSelectedDeploymentData,
48
+ getShowSecurityAlert: () => getShowSecurityAlert,
38
49
  getTenantCapabilities: () => getTenantCapabilities,
39
50
  getUserCapabilities: () => getUserCapabilities,
40
51
  getUserRoles: () => getUserRoles
@@ -42,6 +53,7 @@ __export(commonSelectors_exports, {
42
53
  module.exports = __toCommonJS(commonSelectors_exports);
43
54
  var import_helpers4 = require("@northern.tech/utils/helpers");
44
55
  var import_toolkit7 = require("@reduxjs/toolkit");
56
+ var import_dayjs = __toESM(require("dayjs"), 1);
45
57
 
46
58
  // src/appSlice/constants.ts
47
59
  var import_icons_material = require("@mui/icons-material");
@@ -990,6 +1002,7 @@ var emptyObject = {};
990
1002
  var getRolesById = (state) => state.users.rolesById;
991
1003
  var getTooltipsById = (state) => state.users.tooltips.byId;
992
1004
  var getGlobalSettings = (state) => state.users.globalSettings;
1005
+ var getUserSettingsInitialized = (state) => state.users.userSettingsInitialized;
993
1006
  var getCurrentUserId = (state) => state.users.currentUser;
994
1007
  var getUsersById = (state) => state.users.byId;
995
1008
  var getUsersList = (0, import_toolkit6.createSelector)([getUsersById], (usersById) => Object.values(usersById));
@@ -1027,6 +1040,7 @@ var getOfflineThresholdSettings = (0, import_toolkit6.createSelector)([getGlobal
1027
1040
  intervalUnit: offlineThreshold?.intervalUnit || DEVICE_ONLINE_CUTOFF.intervalName
1028
1041
  }));
1029
1042
  var getRolesList = (0, import_toolkit6.createSelector)([getRolesById], (rolesById2) => Object.entries(rolesById2).map(([value, role]) => ({ value, ...role })));
1043
+ var getSecurityAlertDismissedTimestamp = (state) => state.users.userSettings.securityAlertDismissedTimestamp;
1030
1044
 
1031
1045
  // src/commonSelectors.ts
1032
1046
  var getIsEnterprise = (0, import_toolkit7.createSelector)(
@@ -1233,6 +1247,22 @@ var getRelevantRoles = (0, import_toolkit7.createSelector)([getOrganization, get
1233
1247
  return accu;
1234
1248
  }, roles);
1235
1249
  });
1250
+ var getShowSecurityAlert = (0, import_toolkit7.createSelector)(
1251
+ [getCurrentUser, getHas2FA, getFeatures, getIsEnterprise, getUserSettingsInitialized, getSecurityAlertDismissedTimestamp],
1252
+ (currentUser, has2FA, features, isEnterprise, settingsInitialized, dismissedTimestamp) => {
1253
+ const isHosted = features?.isHosted;
1254
+ const canHave2FA = isEnterprise || isHosted;
1255
+ if (!currentUser || !settingsInitialized || has2FA || !canHave2FA) {
1256
+ return false;
1257
+ }
1258
+ if (dismissedTimestamp === null) {
1259
+ return true;
1260
+ }
1261
+ const today = (0, import_dayjs.default)();
1262
+ const dismissedMonthAgo = today.diff(dismissedTimestamp, "months");
1263
+ return dismissedMonthAgo > 0;
1264
+ }
1265
+ );
1236
1266
  // Annotate the CommonJS export names for ESM import in node:
1237
1267
  0 && (module.exports = {
1238
1268
  getAttrsEndpoint,
@@ -1250,6 +1280,7 @@ var getRelevantRoles = (0, import_toolkit7.createSelector)([getOrganization, get
1250
1280
  getRelevantRoles,
1251
1281
  getSearchEndpoint,
1252
1282
  getSelectedDeploymentData,
1283
+ getShowSecurityAlert,
1253
1284
  getTenantCapabilities,
1254
1285
  getUserCapabilities,
1255
1286
  getUserRoles