CI / changes (push) Successful in 6s
CI / commitlint (push) Skipped
CI / openapi (push) Successful in 27s
CI / web (push) Successful in 51s
CI / go (push) Successful in 2m19s
CI / bird2 (push) Successful in 13s
CI / release (push) Successful in 4m24s
Added support for portal JWT authentication, enabling single sign-on (SSO) capabilities. Updated the application to handle JWT claims for user permissions and roles, enhancing security and access control. Refactored relevant components and API routes to accommodate the new authentication flow, ensuring a seamless user experience. Updated documentation to reflect the new authentication requirements and configurations. Co-authored-by: Cursor <[email protected]>
46 lines
1.4 KiB
TypeScript
46 lines
1.4 KiB
TypeScript
import { useMemo } from 'react'
|
|
import { useQuery } from '@tanstack/react-query'
|
|
|
|
import {
|
|
DEFAULT_APP_SWITCHER_CONFIG,
|
|
getAppUrl as getAppUrlFromConfig,
|
|
type AppSwitcherConfig,
|
|
} from '@/lib/app-switcher-config'
|
|
import { appSwitcherQueryOptions } from '@/queries/app-switcher'
|
|
import { getClaims, isAuthEnabled } from '@/lib/auth'
|
|
|
|
/**
|
|
* Portal-first switcher: tries `/api/v1/app-switcher` and filters entries by
|
|
* the current JWT `apps` claim; falls back to `VITE_APP_SWITCHER`/defaults
|
|
* when auth-portal is disabled or unavailable.
|
|
*/
|
|
export function useAppSwitcherConfig(): {
|
|
config: AppSwitcherConfig
|
|
isLoading: boolean
|
|
} {
|
|
const authOn = isAuthEnabled()
|
|
const { data, isLoading } = useQuery({
|
|
...appSwitcherQueryOptions(),
|
|
enabled: authOn,
|
|
})
|
|
const claims = getClaims()
|
|
|
|
const config = useMemo<AppSwitcherConfig>(() => {
|
|
const raw = data ?? DEFAULT_APP_SWITCHER_CONFIG
|
|
if (!authOn) return raw
|
|
const allowed = claims?.apps
|
|
if (!allowed?.length) return raw
|
|
const set = new Set(allowed)
|
|
const apps = raw.apps.filter((a) => set.has(a.id))
|
|
if (!apps.length) return raw
|
|
return { ...raw, apps }
|
|
}, [data, authOn, claims?.apps])
|
|
|
|
return { config, isLoading: authOn && isLoading }
|
|
}
|
|
|
|
export function useAppUrl(appId: string): string | undefined {
|
|
const { config } = useAppSwitcherConfig()
|
|
return getAppUrlFromConfig(appId, config ?? DEFAULT_APP_SWITCHER_CONFIG)
|
|
}
|