Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 9 additions & 9 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,15 @@
"type": "git",
"url": "https://github.com/PropelAuth/react"
},
"version": "2.0.21",
"version": "2.0.22",
"license": "MIT",
"keywords": [
"auth",
"react",
"user"
],
"dependencies": {
"@propelauth/javascript": "^2.0.16",
"@propelauth/javascript": "^2.0.17",
"hoist-non-react-statics": "^3.3.2",
"utility-types": "^3.10.0"
},
Expand Down
14 changes: 12 additions & 2 deletions src/AuthContext.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import {
AccessTokenForActiveOrg,
AuthenticationInfo,
RedirectToAccountOptions,
RedirectToCreateOrgOptions,
Expand All @@ -11,7 +12,11 @@ import React, { useCallback, useEffect, useReducer } from "react"
import { loadOrgSelectionFromLocalStorage } from "./hooks/useActiveOrg"
import { useClientRef, useClientRefCallback } from "./useClientRef"

interface InternalAuthState {
export interface Tokens {
getAccessTokenForOrg: (orgId: string) => Promise<AccessTokenForActiveOrg>
}

export interface InternalAuthState {
loading: boolean
authInfo: AuthenticationInfo | null

Expand All @@ -31,7 +36,7 @@ interface InternalAuthState {
getOrgPageUrl(orgId?: string, options?: RedirectToOrgPageOptions): string
getCreateOrgPageUrl(options?: RedirectToCreateOrgOptions): string
getSetupSAMLPageUrl(orgId: string, options?: RedirectToSetupSAMLPageOptions): string

tokens: Tokens
refreshAuthInfo: () => Promise<void>
defaultDisplayWhileLoading?: React.ReactElement
defaultDisplayIfLoggedOut?: React.ReactElement
Expand Down Expand Up @@ -143,6 +148,8 @@ export const AuthProvider = (props: AuthProviderProps) => {
const getCreateOrgPageUrl = useClientRefCallback(clientRef, (client) => client.getCreateOrgPageUrl)
const getSetupSAMLPageUrl = useClientRefCallback(clientRef, (client) => client.getSetupSAMLPageUrl)

const getAccessTokenForOrg = useClientRefCallback(clientRef, (client) => client.getAccessTokenForOrg)

const refreshAuthInfo = useCallback(async () => {
if (clientRef.current === null) {
return
Expand Down Expand Up @@ -177,6 +184,9 @@ export const AuthProvider = (props: AuthProviderProps) => {
getCreateOrgPageUrl,
getSetupSAMLPageUrl,
refreshAuthInfo,
tokens: {
getAccessTokenForOrg,
},
}
return <AuthContext.Provider value={value}>{props.children}</AuthContext.Provider>
}
11 changes: 9 additions & 2 deletions src/AuthContextForTesting.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import {
UserClass,
} from "@propelauth/javascript"
import React from "react"
import { AuthContext } from "./AuthContext"
import { AuthContext, InternalAuthState } from "./AuthContext"

// User information that we will hard code within the AuthProvider
export type UserInformationForTesting = {
Expand Down Expand Up @@ -39,7 +39,7 @@ export const AuthProviderForTesting = ({
}: AuthProviderForTestingProps) => {
const authInfo = getAuthInfoForTesting(userInformation)
const activeOrgFnWithDefault = activeOrgFn ? activeOrgFn : () => null
const contextValue = {
const contextValue: InternalAuthState = {
loading: !!loading,
authInfo,
logout: () => Promise.resolve(),
Expand All @@ -57,6 +57,13 @@ export const AuthProviderForTesting = ({
getSetupSAMLPageUrl: () => "",
activeOrgFn: activeOrgFnWithDefault,
refreshAuthInfo: () => Promise.resolve(),
tokens: {
getAccessTokenForOrg: () =>
Promise.resolve({
error: undefined,
accessToken: "ACCESS_TOKEN",
}),
},
}

return <AuthContext.Provider value={contextValue}>{children}</AuthContext.Provider>
Expand Down
10 changes: 8 additions & 2 deletions src/hooks/useAuthInfo.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { AccessHelper, OrgHelper, User, UserClass } from "@propelauth/javascript"
import { useContext } from "react"
import { AuthContext } from "../AuthContext"
import { AuthContext, Tokens } from "../AuthContext"

export type UseAuthInfoLoading = {
loading: true
Expand All @@ -13,6 +13,7 @@ export type UseAuthInfoLoading = {
isImpersonating: undefined
impersonatorUserId: undefined
refreshAuthInfo: () => Promise<void>
tokens: Tokens
accessTokenExpiresAtSeconds: undefined
}

Expand All @@ -27,6 +28,7 @@ export type UseAuthInfoLoggedInProps = {
isImpersonating: boolean
impersonatorUserId?: string
refreshAuthInfo: () => Promise<void>
tokens: Tokens
accessTokenExpiresAtSeconds: number
}

Expand All @@ -41,6 +43,7 @@ export type UseAuthInfoNotLoggedInProps = {
isImpersonating: false
impersonatorUserId: undefined
refreshAuthInfo: () => Promise<void>
tokens: Tokens
accessTokenExpiresAtSeconds: undefined
}

Expand All @@ -52,7 +55,7 @@ export function useAuthInfo(): UseAuthInfoProps {
throw new Error("useAuthInfo must be used within an AuthProvider or RequiredAuthProvider")
}

const { loading, authInfo, refreshAuthInfo } = context
const { loading, authInfo, refreshAuthInfo, tokens } = context
if (loading) {
return {
loading: true,
Expand All @@ -65,6 +68,7 @@ export function useAuthInfo(): UseAuthInfoProps {
isImpersonating: undefined,
impersonatorUserId: undefined,
refreshAuthInfo,
tokens,
accessTokenExpiresAtSeconds: undefined,
}
} else if (authInfo && authInfo.accessToken) {
Expand All @@ -79,6 +83,7 @@ export function useAuthInfo(): UseAuthInfoProps {
isImpersonating: !!authInfo.impersonatorUserId,
impersonatorUserId: authInfo.impersonatorUserId,
refreshAuthInfo,
tokens,
accessTokenExpiresAtSeconds: authInfo.expiresAtSeconds,
}
}
Expand All @@ -93,6 +98,7 @@ export function useAuthInfo(): UseAuthInfoProps {
isImpersonating: false,
impersonatorUserId: undefined,
refreshAuthInfo,
tokens,
accessTokenExpiresAtSeconds: undefined,
}
}
8 changes: 6 additions & 2 deletions src/withAuthInfo.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { AccessHelper, OrgHelper, User, UserClass } from "@propelauth/javascript
import hoistNonReactStatics from "hoist-non-react-statics"
import React, { useContext } from "react"
import { Subtract } from "utility-types"
import { AuthContext } from "./AuthContext"
import { AuthContext, Tokens } from "./AuthContext"

export type WithLoggedInAuthInfoProps = {
isLoggedIn: true
Expand All @@ -14,6 +14,7 @@ export type WithLoggedInAuthInfoProps = {
isImpersonating: boolean
impersonatorUserId?: string
refreshAuthInfo: () => Promise<void>
tokens: Tokens
accessTokenExpiresAtSeconds: number
}

Expand All @@ -27,6 +28,7 @@ export type WithNotLoggedInAuthInfoProps = {
isImpersonating: false
impersonatorUserId: null
refreshAuthInfo: () => Promise<void>
tokens: Tokens
accessTokenExpiresAtSeconds: null
}

Expand All @@ -48,7 +50,7 @@ export function withAuthInfo<P extends WithAuthInfoProps>(
throw new Error("withAuthInfo must be used within an AuthProvider or RequiredAuthProvider")
}

const { loading, authInfo, defaultDisplayWhileLoading, refreshAuthInfo } = context
const { loading, authInfo, defaultDisplayWhileLoading, refreshAuthInfo, tokens } = context

function displayLoading() {
if (args?.displayWhileLoading) {
Expand All @@ -73,6 +75,7 @@ export function withAuthInfo<P extends WithAuthInfoProps>(
isImpersonating: !!authInfo.impersonatorUserId,
impersonatorUserId: authInfo.impersonatorUserId,
refreshAuthInfo,
tokens,
accessTokenExpiresAtSeconds: authInfo.expiresAtSeconds,
}
return <Component {...loggedInProps} />
Expand All @@ -88,6 +91,7 @@ export function withAuthInfo<P extends WithAuthInfoProps>(
isImpersonating: false,
impersonatorUserId: null,
refreshAuthInfo,
tokens,
accessTokenExpiresAtSeconds: null,
}
return <Component {...notLoggedInProps} />
Expand Down
4 changes: 3 additions & 1 deletion src/withRequiredAuthInfo.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,8 @@ export function withRequiredAuthInfo<P extends WithLoggedInAuthInfoProps>(
throw new Error("withRequiredAuthInfo must be used within an AuthProvider or RequiredAuthProvider")
}

const { loading, authInfo, defaultDisplayIfLoggedOut, defaultDisplayWhileLoading, refreshAuthInfo } = context
const { loading, authInfo, defaultDisplayIfLoggedOut, defaultDisplayWhileLoading, refreshAuthInfo, tokens } =
context

function displayLoading() {
if (args?.displayWhileLoading) {
Expand Down Expand Up @@ -56,6 +57,7 @@ export function withRequiredAuthInfo<P extends WithLoggedInAuthInfoProps>(
isImpersonating: !!authInfo.impersonatorUserId,
impersonatorUserId: authInfo.impersonatorUserId,
refreshAuthInfo,
tokens,
accessTokenExpiresAtSeconds: authInfo.expiresAtSeconds,
}
return <Component {...loggedInProps} />
Expand Down