Skip to content

Commit be01988

Browse files
author
Itai Levi
authored
[FEAT] Active Org (#65)
* feat(accessTokenForOrg): export access token for org function where applicable * refactor: rename function * use real published JS version * feat: use JS version, use tokens interface instead of function itself * 2.0.22
1 parent 3701f74 commit be01988

File tree

7 files changed

+49
-20
lines changed

7 files changed

+49
-20
lines changed

package-lock.json

Lines changed: 9 additions & 9 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,15 @@
55
"type": "git",
66
"url": "https://github.com/PropelAuth/react"
77
},
8-
"version": "2.0.21",
8+
"version": "2.0.22",
99
"license": "MIT",
1010
"keywords": [
1111
"auth",
1212
"react",
1313
"user"
1414
],
1515
"dependencies": {
16-
"@propelauth/javascript": "^2.0.16",
16+
"@propelauth/javascript": "^2.0.17",
1717
"hoist-non-react-statics": "^3.3.2",
1818
"utility-types": "^3.10.0"
1919
},

src/AuthContext.tsx

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import {
2+
AccessTokenForActiveOrg,
23
AuthenticationInfo,
34
RedirectToAccountOptions,
45
RedirectToCreateOrgOptions,
@@ -11,7 +12,11 @@ import React, { useCallback, useEffect, useReducer } from "react"
1112
import { loadOrgSelectionFromLocalStorage } from "./hooks/useActiveOrg"
1213
import { useClientRef, useClientRefCallback } from "./useClientRef"
1314

14-
interface InternalAuthState {
15+
export interface Tokens {
16+
getAccessTokenForOrg: (orgId: string) => Promise<AccessTokenForActiveOrg>
17+
}
18+
19+
export interface InternalAuthState {
1520
loading: boolean
1621
authInfo: AuthenticationInfo | null
1722

@@ -31,7 +36,7 @@ interface InternalAuthState {
3136
getOrgPageUrl(orgId?: string, options?: RedirectToOrgPageOptions): string
3237
getCreateOrgPageUrl(options?: RedirectToCreateOrgOptions): string
3338
getSetupSAMLPageUrl(orgId: string, options?: RedirectToSetupSAMLPageOptions): string
34-
39+
tokens: Tokens
3540
refreshAuthInfo: () => Promise<void>
3641
defaultDisplayWhileLoading?: React.ReactElement
3742
defaultDisplayIfLoggedOut?: React.ReactElement
@@ -143,6 +148,8 @@ export const AuthProvider = (props: AuthProviderProps) => {
143148
const getCreateOrgPageUrl = useClientRefCallback(clientRef, (client) => client.getCreateOrgPageUrl)
144149
const getSetupSAMLPageUrl = useClientRefCallback(clientRef, (client) => client.getSetupSAMLPageUrl)
145150

151+
const getAccessTokenForOrg = useClientRefCallback(clientRef, (client) => client.getAccessTokenForOrg)
152+
146153
const refreshAuthInfo = useCallback(async () => {
147154
if (clientRef.current === null) {
148155
return
@@ -177,6 +184,9 @@ export const AuthProvider = (props: AuthProviderProps) => {
177184
getCreateOrgPageUrl,
178185
getSetupSAMLPageUrl,
179186
refreshAuthInfo,
187+
tokens: {
188+
getAccessTokenForOrg,
189+
},
180190
}
181191
return <AuthContext.Provider value={value}>{props.children}</AuthContext.Provider>
182192
}

src/AuthContextForTesting.tsx

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import {
1111
UserClass,
1212
} from "@propelauth/javascript"
1313
import React from "react"
14-
import { AuthContext } from "./AuthContext"
14+
import { AuthContext, InternalAuthState } from "./AuthContext"
1515

1616
// User information that we will hard code within the AuthProvider
1717
export type UserInformationForTesting = {
@@ -39,7 +39,7 @@ export const AuthProviderForTesting = ({
3939
}: AuthProviderForTestingProps) => {
4040
const authInfo = getAuthInfoForTesting(userInformation)
4141
const activeOrgFnWithDefault = activeOrgFn ? activeOrgFn : () => null
42-
const contextValue = {
42+
const contextValue: InternalAuthState = {
4343
loading: !!loading,
4444
authInfo,
4545
logout: () => Promise.resolve(),
@@ -57,6 +57,13 @@ export const AuthProviderForTesting = ({
5757
getSetupSAMLPageUrl: () => "",
5858
activeOrgFn: activeOrgFnWithDefault,
5959
refreshAuthInfo: () => Promise.resolve(),
60+
tokens: {
61+
getAccessTokenForOrg: () =>
62+
Promise.resolve({
63+
error: undefined,
64+
accessToken: "ACCESS_TOKEN",
65+
}),
66+
},
6067
}
6168

6269
return <AuthContext.Provider value={contextValue}>{children}</AuthContext.Provider>

src/hooks/useAuthInfo.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { AccessHelper, OrgHelper, User, UserClass } from "@propelauth/javascript"
22
import { useContext } from "react"
3-
import { AuthContext } from "../AuthContext"
3+
import { AuthContext, Tokens } from "../AuthContext"
44

55
export type UseAuthInfoLoading = {
66
loading: true
@@ -13,6 +13,7 @@ export type UseAuthInfoLoading = {
1313
isImpersonating: undefined
1414
impersonatorUserId: undefined
1515
refreshAuthInfo: () => Promise<void>
16+
tokens: Tokens
1617
accessTokenExpiresAtSeconds: undefined
1718
}
1819

@@ -27,6 +28,7 @@ export type UseAuthInfoLoggedInProps = {
2728
isImpersonating: boolean
2829
impersonatorUserId?: string
2930
refreshAuthInfo: () => Promise<void>
31+
tokens: Tokens
3032
accessTokenExpiresAtSeconds: number
3133
}
3234

@@ -41,6 +43,7 @@ export type UseAuthInfoNotLoggedInProps = {
4143
isImpersonating: false
4244
impersonatorUserId: undefined
4345
refreshAuthInfo: () => Promise<void>
46+
tokens: Tokens
4447
accessTokenExpiresAtSeconds: undefined
4548
}
4649

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

55-
const { loading, authInfo, refreshAuthInfo } = context
58+
const { loading, authInfo, refreshAuthInfo, tokens } = context
5659
if (loading) {
5760
return {
5861
loading: true,
@@ -65,6 +68,7 @@ export function useAuthInfo(): UseAuthInfoProps {
6568
isImpersonating: undefined,
6669
impersonatorUserId: undefined,
6770
refreshAuthInfo,
71+
tokens,
6872
accessTokenExpiresAtSeconds: undefined,
6973
}
7074
} else if (authInfo && authInfo.accessToken) {
@@ -79,6 +83,7 @@ export function useAuthInfo(): UseAuthInfoProps {
7983
isImpersonating: !!authInfo.impersonatorUserId,
8084
impersonatorUserId: authInfo.impersonatorUserId,
8185
refreshAuthInfo,
86+
tokens,
8287
accessTokenExpiresAtSeconds: authInfo.expiresAtSeconds,
8388
}
8489
}
@@ -93,6 +98,7 @@ export function useAuthInfo(): UseAuthInfoProps {
9398
isImpersonating: false,
9499
impersonatorUserId: undefined,
95100
refreshAuthInfo,
101+
tokens,
96102
accessTokenExpiresAtSeconds: undefined,
97103
}
98104
}

src/withAuthInfo.tsx

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { AccessHelper, OrgHelper, User, UserClass } from "@propelauth/javascript
22
import hoistNonReactStatics from "hoist-non-react-statics"
33
import React, { useContext } from "react"
44
import { Subtract } from "utility-types"
5-
import { AuthContext } from "./AuthContext"
5+
import { AuthContext, Tokens } from "./AuthContext"
66

77
export type WithLoggedInAuthInfoProps = {
88
isLoggedIn: true
@@ -14,6 +14,7 @@ export type WithLoggedInAuthInfoProps = {
1414
isImpersonating: boolean
1515
impersonatorUserId?: string
1616
refreshAuthInfo: () => Promise<void>
17+
tokens: Tokens
1718
accessTokenExpiresAtSeconds: number
1819
}
1920

@@ -27,6 +28,7 @@ export type WithNotLoggedInAuthInfoProps = {
2728
isImpersonating: false
2829
impersonatorUserId: null
2930
refreshAuthInfo: () => Promise<void>
31+
tokens: Tokens
3032
accessTokenExpiresAtSeconds: null
3133
}
3234

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

51-
const { loading, authInfo, defaultDisplayWhileLoading, refreshAuthInfo } = context
53+
const { loading, authInfo, defaultDisplayWhileLoading, refreshAuthInfo, tokens } = context
5254

5355
function displayLoading() {
5456
if (args?.displayWhileLoading) {
@@ -73,6 +75,7 @@ export function withAuthInfo<P extends WithAuthInfoProps>(
7375
isImpersonating: !!authInfo.impersonatorUserId,
7476
impersonatorUserId: authInfo.impersonatorUserId,
7577
refreshAuthInfo,
78+
tokens,
7679
accessTokenExpiresAtSeconds: authInfo.expiresAtSeconds,
7780
}
7881
return <Component {...loggedInProps} />
@@ -88,6 +91,7 @@ export function withAuthInfo<P extends WithAuthInfoProps>(
8891
isImpersonating: false,
8992
impersonatorUserId: null,
9093
refreshAuthInfo,
94+
tokens,
9195
accessTokenExpiresAtSeconds: null,
9296
}
9397
return <Component {...notLoggedInProps} />

src/withRequiredAuthInfo.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@ export function withRequiredAuthInfo<P extends WithLoggedInAuthInfoProps>(
2222
throw new Error("withRequiredAuthInfo must be used within an AuthProvider or RequiredAuthProvider")
2323
}
2424

25-
const { loading, authInfo, defaultDisplayIfLoggedOut, defaultDisplayWhileLoading, refreshAuthInfo } = context
25+
const { loading, authInfo, defaultDisplayIfLoggedOut, defaultDisplayWhileLoading, refreshAuthInfo, tokens } =
26+
context
2627

2728
function displayLoading() {
2829
if (args?.displayWhileLoading) {
@@ -56,6 +57,7 @@ export function withRequiredAuthInfo<P extends WithLoggedInAuthInfoProps>(
5657
isImpersonating: !!authInfo.impersonatorUserId,
5758
impersonatorUserId: authInfo.impersonatorUserId,
5859
refreshAuthInfo,
60+
tokens,
5961
accessTokenExpiresAtSeconds: authInfo.expiresAtSeconds,
6062
}
6163
return <Component {...loggedInProps} />

0 commit comments

Comments
 (0)