2023-12-21 07:26:42 -06:00
import React , { useEffect } from 'react' ;
import { connect , ConnectedProps } from 'react-redux' ;
import { NavModelItem } from '@grafana/data' ;
2024-02-29 10:41:08 -06:00
import { Badge , Stack , Text } from '@grafana/ui' ;
2023-12-21 07:26:42 -06:00
import { Page } from 'app/core/components/Page/Page' ;
import { GrafanaRouteComponentProps } from 'app/core/navigation/types' ;
import { StoreState } from '../../types' ;
import { ProviderConfigForm } from './ProviderConfigForm' ;
2024-02-08 06:33:47 -06:00
import { UIMap } from './constants' ;
2023-12-21 07:26:42 -06:00
import { loadProviders } from './state/actions' ;
import { SSOProvider } from './types' ;
const getPageNav = ( config? : SSOProvider ) : NavModelItem = > {
if ( ! config ) {
return {
text : 'Authentication' ,
subTitle : 'Configure authentication providers' ,
icon : 'shield' ,
id : 'authentication' ,
} ;
}
2024-02-08 06:33:47 -06:00
const providerDisplayName = UIMap [ config . provider ] [ 1 ] || config . provider . toUpperCase ( ) ;
2023-12-21 07:26:42 -06:00
return {
2024-02-08 06:33:47 -06:00
text : providerDisplayName || '' ,
subTitle : ` To configure ${ providerDisplayName } OAuth2 you must register your application with ${ providerDisplayName } . The provider will generate a Client ID and Client Secret for you to use. ` ,
2023-12-21 07:26:42 -06:00
icon : config.settings.icon || 'shield' ,
id : config.provider ,
} ;
} ;
interface RouteProps extends GrafanaRouteComponentProps < { provider : string } > { }
function mapStateToProps ( state : StoreState , props : RouteProps ) {
const { isLoading , providers } = state . authConfig ;
const { provider } = props . match . params ;
const config = providers . find ( ( config ) = > config . provider === provider ) ;
return {
config ,
isLoading ,
provider ,
} ;
}
const mapDispatchToProps = {
loadProviders ,
} ;
const connector = connect ( mapStateToProps , mapDispatchToProps ) ;
export type Props = ConnectedProps < typeof connector > ;
/ * *
* Separate the Page logic from the Content logic for easier testing .
* /
export const ProviderConfigPage = ( { config , loadProviders , isLoading , provider } : Props ) = > {
const pageNav = getPageNav ( config ) ;
useEffect ( ( ) = > {
loadProviders ( provider ) ;
} , [ loadProviders , provider ] ) ;
if ( ! config ) {
return null ;
}
return (
2024-02-29 10:41:08 -06:00
< Page
navId = "authentication"
pageNav = { pageNav }
renderTitle = { ( title ) = > (
< Stack gap = { 2 } alignItems = "center" >
< Text variant = { 'h1' } > { title } < / Text >
< Badge
text = { config . settings . enabled ? 'Enabled' : 'Not enabled' }
color = { config . settings . enabled ? 'green' : 'blue' }
icon = { config . settings . enabled ? 'check' : undefined }
/ >
< / Stack >
) }
>
2023-12-21 07:26:42 -06:00
< ProviderConfigForm config = { config } isLoading = { isLoading } provider = { provider } / >
< / Page >
) ;
} ;
export default connector ( ProviderConfigPage ) ;