{"version":3,"file":"TenantProvider.mjs","names":["React","lazy","Suspense","useCallback","useMemo","useEffect","useContext","useUser","UserDispatchContext","useApiQuery","TenantContext","ConfigService","useAccount","MenuProvider","storeTenant","TenantTypeEnums","useTenantStore","useProductsStore","LoadingIndicator","setActiveTranslationTenant","TenantAccessDialog","then","m","default","UdpDialog","useTenantStoreSync","activeTenant","$","_c","setCurrentTenant","_temp","t0","tenantId","current","getState","currentTenant","theme","name","tenantName","tenantType","t1","t2","t3","t4","t5","TenantProvider","children","user","activeAccount","changeTenant","data","tenants","isLoading","tenantsLoading","refetch","refresh","securityV2ApiUrl","config","UNITY_PRODUCT_ID","skipTenantHeader","enabled","idTokenClaims","selectedProduct","productsLoading","tenantV2ApiUrl","idToken","hasTenantsData","Array","isArray","userHasLoaded","statusCode","undefined","currentTenantId","find","t","isProductTenant","Product","isUnityDefault","fetchProducts","handleTenantChange","tenant","contextValue","tenantsList","filteredTenantsList","shouldBlockForTenantData","Boolean","noTenantsAvailable","length","currentTenantAllowed","some","shouldShowTenantMismatchDialog","productName","state"],"sources":["../../../src/utilities/tenant/TenantProvider.jsx"],"sourcesContent":["import React, { lazy, Suspense, useCallback, useMemo, useEffect, useContext } from 'react';\nimport { useUser } from '../auth/useUser';\nimport { UserDispatchContext } from '../auth/internal';\nimport { useApiQuery } from '../useApiQuery';\nimport { TenantContext } from './tenantContext';\nimport { ConfigService } from '../../configService';\nimport { useAccount } from '@azure/msal-react';\nimport { MenuProvider } from '../menus/MenuProvider';\nimport { storeTenant } from '../storage/UnitySessionStorage';\nimport { TenantTypeEnums } from '../../enums/unitySystemEnums';\nimport { useTenantStore } from '../../stores/tenantStore';\nimport { useProductsStore } from '../../stores/productsStore';\nimport { LoadingIndicator } from '../../UI/loading/LoadingIndicator';\nimport { setActiveTranslationTenant } from '../i18n/initializeI18n';\n\n// Lazy-load the tenant dialogs — they render the stencil-based UdpDialog /\n// UdpAutocomplete components which transitively pull in udp-fluent-icon\n// (~574 KB), @fluentui/web-components, @microsoft/fast-element, etc. Tenant\n// mismatch / no-tenants paths are rare, so this whole tree should only load\n// when actually needed.\nconst TenantAccessDialog = lazy(() =>\n  import('./TenantAccessDialog').then((m) => ({ default: m.TenantAccessDialog })),\n);\nconst UdpDialog = lazy(() =>\n  import('../../UI/fluent-web-components/UdpDialog').then((m) => ({ default: m.UdpDialog })),\n);\n\nconst useTenantStoreSync = (activeTenant) => {\n  const setCurrentTenant = useTenantStore((state) => state.setCurrentTenant);\n\n  useEffect(() => {\n    if (!activeTenant?.tenantId) return;\n\n    // Tenant/User translation tiers are tenant-scoped: tell the i18n runtime\n    // which tenant is active (a change refetches the merged bundles).\n    // Fire-and-forget; self-dedupes on the same id.\n    setActiveTranslationTenant(activeTenant.tenantId);\n\n    const current = useTenantStore.getState().currentTenant;\n    const theme = activeTenant.theme ?? null;\n    const name = activeTenant.tenantName ?? null;\n    const tenantType = activeTenant.tenantType;\n\n    if (\n      current?.tenantId === activeTenant.tenantId &&\n      current?.tenantType === tenantType &&\n      (current?.name ?? null) === name &&\n      (current?.theme ?? null) === theme\n    ) {\n      return;\n    }\n\n    setCurrentTenant({\n      tenantId: activeTenant.tenantId,\n      name,\n      tenantType,\n      theme,\n    });\n  }, [\n    activeTenant?.tenantId,\n    activeTenant?.tenantName,\n    activeTenant?.tenantType,\n    activeTenant?.theme,\n    setCurrentTenant,\n  ]);\n};\n\nexport const TenantProvider = ({ children }) => {\n  const user = useUser();\n  const activeAccount = useAccount();\n\n  const { changeTenant } = useContext(UserDispatchContext);\n\n  const {\n    data: tenants,\n    isLoading: tenantsLoading,\n    refetch: refresh,\n  } = useApiQuery(\n    ConfigService.securityV2ApiUrl,\n    `user/tenants?productId=${ConfigService.config.UNITY_PRODUCT_ID}`,\n    { skipTenantHeader: true },\n    {\n      enabled: !!activeAccount?.idTokenClaims,\n    }\n  );\n\n  const { data: selectedProduct, isLoading: productsLoading } = useApiQuery(\n    ConfigService.tenantV2ApiUrl,\n    `product/${ConfigService.config.UNITY_PRODUCT_ID}`,\n    { skipTenantHeader: true },\n    {\n      enabled: !!activeAccount?.idToken,\n    }\n  );\n\n  const hasTenantsData = Array.isArray(tenants);\n  const userHasLoaded = user && user.statusCode !== undefined;\n\n  const activeTenant =\n    user?.currentTenantId && hasTenantsData\n      ? (tenants.find((t) => t.tenantId === user.currentTenantId) ?? null)\n      : null;\n\n  const isProductTenant = activeTenant?.tenantType === TenantTypeEnums.Product;\n\n  useTenantStoreSync(activeTenant);\n\n  if (selectedProduct?.isUnityDefault && activeTenant?.tenantId) {\n    useProductsStore.getState().fetchProducts(activeTenant.tenantId);\n  }\n\n  const handleTenantChange = useCallback(\n    (tenant) => {\n      if (!tenant) return;\n      storeTenant(tenant.tenantId);\n      changeTenant(tenant.tenantId);\n    },\n    [changeTenant]\n  );\n\n  // Hook moved BEFORE any early returns\n  const contextValue = useMemo(\n    () => ({\n      tenantsList: tenants ?? null,\n      filteredTenantsList: tenants ?? null,\n      activeTenant,\n      isProductTenant,\n      refresh,\n    }),\n    [tenants, activeTenant, isProductTenant, refresh]\n  );\n\n  // Only block rendering on initial load — not on background refetches\n  // when we already have data to display\n  const shouldBlockForTenantData =\n    Boolean(activeAccount) &&\n    ((tenantsLoading && !tenants) || (productsLoading && !selectedProduct));\n\n  if (shouldBlockForTenantData) {\n    return <LoadingIndicator />;\n  }\n\n  const noTenantsAvailable = hasTenantsData && tenants.length === 0 && userHasLoaded;\n\n  const currentTenantAllowed = hasTenantsData\n    ? tenants.some((t) => t.tenantId === user?.currentTenantId)\n    : false;\n\n  const shouldShowTenantMismatchDialog =\n    userHasLoaded && hasTenantsData && !noTenantsAvailable && !currentTenantAllowed;\n\n  if (noTenantsAvailable) {\n    return (\n      <Suspense fallback={<LoadingIndicator />}>\n        <UdpDialog open={true} dialogTitle=\"No Access\" type=\"alert\" showHeaderCloseButton={false}>\n          Your user does not have access to any tenants for this product. Please contact your support\n          team.\n        </UdpDialog>\n      </Suspense>\n    );\n  }\n\n  return (\n    <TenantContext.Provider value={contextValue}>\n      <MenuProvider>\n        {shouldShowTenantMismatchDialog && (\n          <Suspense fallback={<LoadingIndicator />}>\n            <TenantAccessDialog\n              open={shouldShowTenantMismatchDialog}\n              tenants={tenants}\n              onTenantChange={handleTenantChange}\n              productName={selectedProduct?.productName}\n            />\n          </Suspense>\n        )}\n        {!shouldShowTenantMismatchDialog && children}\n      </MenuProvider>\n    </TenantContext.Provider>\n  );\n};\n"],"mappings":"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"}