Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 | 1x 1x 1x 1x 5x 5x 5x 5x 5x 5x 5x 5x 5x 5x 5x 5x 4x 1x 5x 4x 4x 5x 1x 1x 1x 5x 6x 6x 5x 11x 5x 6x 5x 1x | import * as React from 'react'
import { User, UserManager, UserManagerSettings } from 'oidc-client'
import RedirectToAuth from '../RedirectToAuth'
export interface IAuthenticatorContext {
signOut: () => void
user: User | null
userManager: UserManager | null
}
const DEFAULT_CONTEXT: IAuthenticatorContext = {
signOut: () => {},
user: null,
userManager: null
}
const AuthenticatorContext = React.createContext<IAuthenticatorContext>(
DEFAULT_CONTEXT
)
export interface IAuthenticatorState {
isFetchingUser: boolean
context: {
signOut: () => void
user: User | null
userManager: UserManager
}
}
export interface IMakeAuthenticatorParams {
placeholderComponent?: React.ReactNode
userManager?: UserManager
}
function makeAuthenticator({
userManager,
placeholderComponent
}: IMakeAuthenticatorParams) {
return <Props extends {}>(WrappedComponent: React.ReactNode) => {
return class Authenticator extends React.Component<
Props,
IAuthenticatorState
> {
public userManager: UserManager
constructor(props: Props) {
super(props)
const um = userManager
this.userManager = um
this.state = {
context: {
signOut: this.signOut,
user: null,
userManager: um
},
isFetchingUser: true
}
}
public componentDidMount() {
this.getUser()
}
public getUser = () => {
this.userManager
.getUser()
.then(user => this.storeUser(user))
.catch(() => this.setState({ isFetchingUser: false }))
}
public storeUser = (user: User) => {
Eif (user) {
this.setState(({ context }) => ({
context: { ...context, user },
isFetchingUser: false
}))
} else {
this.setState(({ context }) => ({
context: { ...context, user: null },
isFetchingUser: false
}))
}
}
public signOut = () => {
this.userManager.removeUser()
this.setState(({ context }) => ({
context: { ...context, user: null },
isFetchingUser: false
}))
this.userManager.signoutRedirect()
}
public isValid = () => {
const { user } = this.state.context
return !!(user && !user.expired)
}
public render() {
if (this.state.isFetchingUser) {
return placeholderComponent || null
}
return this.isValid() ? (
<AuthenticatorContext.Provider value={this.state.context}>
{WrappedComponent}
</AuthenticatorContext.Provider>
) : (
<RedirectToAuth
userManager={this.userManager}
onSilentSuccess={this.storeUser}
>
{placeholderComponent}
</RedirectToAuth>
)
}
}
}
}
export { AuthenticatorContext, makeAuthenticator }
|