Skip to content
Merged
59 changes: 59 additions & 0 deletions web/oss/src/components/Layout/AuthUpgradeHost.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
import {useCallback, useEffect} from "react"

import {useAtom, useAtomValue, useSetAtom} from "jotai"

import {
AUTH_UPGRADE_IDENTITIES_KEY,
AUTH_UPGRADE_ORG_KEY,
authUpgradeAtom,
resetAuthUpgradeState,
} from "@/oss/state/org/authUpgrade"
import {orgsAtom, selectedOrgIdAtom} from "@/oss/state/org/selectors/org"
import {authFlowAtom} from "@/oss/state/session"

import AuthUpgradeModal from "../Sidebar/components/AuthUpgradeModal"

/**
* App-level host for the org auth-upgrade prompt. The org switcher (or any future entry point)
* only sets `authUpgradeAtom`; this component owns rendering and teardown so the flow no longer
* lives inside the sidebar selector.
*/
const AuthUpgradeHost = () => {
const [{open, orgId, detail}, setAuthUpgrade] = useAtom(authUpgradeAtom)
const selectedOrgId = useAtomValue(selectedOrgIdAtom)
const orgs = useAtomValue(orgsAtom)
const setAuthFlow = useSetAtom(authFlowAtom)

const organizationName = Array.isArray(orgs)
? orgs.find((org) => org.id === orgId)?.name
: undefined

const close = useCallback(() => {
setAuthUpgrade(resetAuthUpgradeState())
setAuthFlow("authed")
if (typeof window !== "undefined") {
window.localStorage.removeItem(AUTH_UPGRADE_ORG_KEY)
window.localStorage.removeItem(AUTH_UPGRADE_IDENTITIES_KEY)
}
}, [setAuthFlow, setAuthUpgrade])

// The upgrade succeeded once the selected org becomes the org we prompted for.
useEffect(() => {
if (open && orgId && selectedOrgId && orgId === selectedOrgId) {
close()
}
}, [close, open, orgId, selectedOrgId])

if (!open) return null

return (
<AuthUpgradeModal
open={open}
organizationName={organizationName}
detail={detail}
onCancel={close}
/>
)
}

export default AuthUpgradeHost
2 changes: 2 additions & 0 deletions web/oss/src/components/Layout/Layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ import type {SidebarView} from "../Sidebar/types"

import BreadcrumbContainer from "./assets/Breadcrumbs"
import {useStyles} from "./assets/styles"
import AuthUpgradeHost from "./AuthUpgradeHost"
import ErrorFallback from "./ErrorFallback"
import PostHogThemeCapture from "./PostHogThemeCapture"
import {SidebarIsland} from "./SidebarIsland"
Expand Down Expand Up @@ -306,6 +307,7 @@ const AppWithVariants = memo(
return.
</p>
</Modal>
<AuthUpgradeHost />
{project?.is_demo && (
<>
<div className="fixed top-0 left-0 right-0 z-[9999] flex items-center justify-center gap-1.5 h-[38px] bg-[var(--ag-c-1C2C3D)] text-white text-sm font-medium">
Expand Down
15 changes: 3 additions & 12 deletions web/oss/src/components/Sidebar/components/AuthUpgradeModal.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -21,21 +21,12 @@ import {getAgentaWebUrl} from "@/oss/lib/helpers/api"
import {getEffectiveAuthConfig} from "@/oss/lib/helpers/dynamicEnv"
import {isBackendAvailabilityIssue} from "@/oss/lib/helpers/errorHandler"
import {AuthErrorMsgType} from "@/oss/lib/Types"
import type {AuthUpgradeDetail} from "@/oss/state/org/authUpgrade"
import {useProfileData} from "@/oss/state/profile"

const {Text} = Typography
export type {AuthUpgradeDetail}

export interface AuthUpgradeDetail {
message?: string
required_methods?: string[]
session_identities?: string[]
user_identities?: string[]
sso_providers?: {
id: string
slug: string
third_party_id?: string
}[]
}
const {Text} = Typography

interface AuthUpgradeModalProps {
open: boolean
Expand Down
Loading
Loading