@civic/auth 0.7.0 → 0.7.1-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +5 -0
- package/README.md +19 -1
- package/dist/nextjs/config.d.ts +1 -0
- package/dist/nextjs/config.d.ts.map +1 -1
- package/dist/nextjs/config.js +1 -1
- package/dist/nextjs/config.js.map +1 -1
- package/dist/nextjs/hooks/useRefresh.d.ts.map +1 -1
- package/dist/nextjs/hooks/useRefresh.js +7 -1
- package/dist/nextjs/hooks/useRefresh.js.map +1 -1
- package/dist/nextjs/routeHandler.d.ts.map +1 -1
- package/dist/nextjs/routeHandler.js +7 -0
- package/dist/nextjs/routeHandler.js.map +1 -1
- package/dist/reactjs/components/SignInButton.d.ts.map +1 -1
- package/dist/reactjs/components/SignInButton.js +8 -3
- package/dist/reactjs/components/SignInButton.js.map +1 -1
- package/dist/reactjs/components/SignOutButton.d.ts.map +1 -1
- package/dist/reactjs/components/SignOutButton.js +3 -1
- package/dist/reactjs/components/SignOutButton.js.map +1 -1
- package/dist/reactjs/components/UserButton.d.ts.map +1 -1
- package/dist/reactjs/components/UserButton.js +11 -6
- package/dist/reactjs/components/UserButton.js.map +1 -1
- package/dist/reactjs/components/index.d.ts +5 -5
- package/dist/reactjs/components/index.d.ts.map +1 -1
- package/dist/reactjs/components/index.js +5 -5
- package/dist/reactjs/components/index.js.map +1 -1
- package/dist/reactjs/core/GlobalAuthManager.d.ts +120 -0
- package/dist/reactjs/core/GlobalAuthManager.d.ts.map +1 -0
- package/dist/reactjs/core/GlobalAuthManager.js +296 -0
- package/dist/reactjs/core/GlobalAuthManager.js.map +1 -0
- package/dist/reactjs/hooks/index.d.ts +2 -2
- package/dist/reactjs/hooks/index.d.ts.map +1 -1
- package/dist/reactjs/hooks/index.js +2 -2
- package/dist/reactjs/hooks/index.js.map +1 -1
- package/dist/reactjs/hooks/useToken.d.ts +13 -0
- package/dist/reactjs/hooks/useToken.d.ts.map +1 -0
- package/dist/reactjs/hooks/useToken.js +48 -0
- package/dist/reactjs/hooks/useToken.js.map +1 -0
- package/dist/reactjs/hooks/useUser.d.ts +20 -2
- package/dist/reactjs/hooks/useUser.d.ts.map +1 -1
- package/dist/reactjs/hooks/useUser.js +163 -7
- package/dist/reactjs/hooks/useUser.js.map +1 -1
- package/dist/reactjs/index.d.ts +6 -2
- package/dist/reactjs/index.d.ts.map +1 -1
- package/dist/reactjs/index.js +7 -1
- package/dist/reactjs/index.js.map +1 -1
- package/dist/reactjs/providers/CivicAuthContext.d.ts +40 -0
- package/dist/reactjs/providers/CivicAuthContext.d.ts.map +1 -0
- package/dist/reactjs/providers/CivicAuthContext.js +303 -0
- package/dist/reactjs/providers/CivicAuthContext.js.map +1 -0
- package/dist/reactjs/providers/CivicAuthProvider.d.ts +20 -4
- package/dist/reactjs/providers/CivicAuthProvider.d.ts.map +1 -1
- package/dist/reactjs/providers/CivicAuthProvider.js +46 -25
- package/dist/reactjs/providers/CivicAuthProvider.js.map +1 -1
- package/dist/reactjs/providers/index.d.ts +2 -2
- package/dist/reactjs/providers/index.d.ts.map +1 -1
- package/dist/reactjs/providers/index.js +4 -2
- package/dist/reactjs/providers/index.js.map +1 -1
- package/dist/server/ServerAuthenticationResolver.d.ts.map +1 -1
- package/dist/server/ServerAuthenticationResolver.js +28 -11
- package/dist/server/ServerAuthenticationResolver.js.map +1 -1
- package/dist/server/config.d.ts +2 -0
- package/dist/server/config.d.ts.map +1 -1
- package/dist/server/config.js.map +1 -1
- package/dist/server/login.d.ts +2 -2
- package/dist/server/login.d.ts.map +1 -1
- package/dist/server/login.js +7 -2
- package/dist/server/login.js.map +1 -1
- package/dist/services/AuthenticationService.d.ts +1 -1
- package/dist/services/AuthenticationService.d.ts.map +1 -1
- package/dist/services/AuthenticationService.js +2 -2
- package/dist/services/AuthenticationService.js.map +1 -1
- package/dist/shared/components/CivicAuthIframe.js +1 -1
- package/dist/shared/components/CivicAuthIframe.js.map +1 -1
- package/dist/shared/components/CivicAuthIframeContainer.js +2 -2
- package/dist/shared/components/CivicAuthIframeContainer.js.map +1 -1
- package/dist/shared/hooks/index.d.ts +1 -2
- package/dist/shared/hooks/index.d.ts.map +1 -1
- package/dist/shared/hooks/index.js +1 -2
- package/dist/shared/hooks/index.js.map +1 -1
- package/dist/shared/hooks/useClientTokenExchangeSession.d.ts +7 -0
- package/dist/shared/hooks/useClientTokenExchangeSession.d.ts.map +1 -0
- package/dist/shared/hooks/useClientTokenExchangeSession.js +17 -0
- package/dist/shared/hooks/useClientTokenExchangeSession.js.map +1 -0
- package/dist/shared/lib/BrowserAuthenticationRefresher.js +3 -3
- package/dist/shared/lib/BrowserAuthenticationRefresher.js.map +1 -1
- package/dist/shared/lib/types.d.ts +1 -1
- package/dist/shared/lib/types.js +1 -1
- package/dist/shared/lib/types.js.map +1 -1
- package/dist/shared/lib/util.d.ts +5 -6
- package/dist/shared/lib/util.d.ts.map +1 -1
- package/dist/shared/lib/util.js +66 -75
- package/dist/shared/lib/util.js.map +1 -1
- package/dist/shared/providers/CivicAuthConfigContext.d.ts +2 -2
- package/dist/shared/providers/CivicAuthConfigContext.d.ts.map +1 -1
- package/dist/shared/providers/CivicAuthConfigContext.js +1 -1
- package/dist/shared/providers/CivicAuthConfigContext.js.map +1 -1
- package/dist/shared/providers/TokenProvider.d.ts.map +1 -1
- package/dist/shared/providers/TokenProvider.js +4 -7
- package/dist/shared/providers/TokenProvider.js.map +1 -1
- package/dist/shared/version.d.ts +1 -1
- package/dist/shared/version.d.ts.map +1 -1
- package/dist/shared/version.js +1 -1
- package/dist/shared/version.js.map +1 -1
- package/dist/types.d.ts +2 -2
- package/dist/types.js.map +1 -1
- package/dist/utils.d.ts +8 -0
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +23 -0
- package/dist/utils.js.map +1 -1
- package/dist/vanillajs/auth/CivicAuth.d.ts +12 -0
- package/dist/vanillajs/auth/CivicAuth.d.ts.map +1 -1
- package/dist/vanillajs/auth/CivicAuth.js +88 -5
- package/dist/vanillajs/auth/CivicAuth.js.map +1 -1
- package/dist/vanillajs/auth/SessionManager.d.ts +7 -1
- package/dist/vanillajs/auth/SessionManager.d.ts.map +1 -1
- package/dist/vanillajs/auth/SessionManager.js +34 -3
- package/dist/vanillajs/auth/SessionManager.js.map +1 -1
- package/dist/vanillajs/auth/TokenRefresher.js +2 -2
- package/dist/vanillajs/auth/TokenRefresher.js.map +1 -1
- package/dist/vanillajs/auth/config/ConfigProcessor.d.ts.map +1 -1
- package/dist/vanillajs/auth/config/ConfigProcessor.js +7 -2
- package/dist/vanillajs/auth/config/ConfigProcessor.js.map +1 -1
- package/dist/vanillajs/auth/types/AuthTypes.d.ts +3 -0
- package/dist/vanillajs/auth/types/AuthTypes.d.ts.map +1 -1
- package/dist/vanillajs/auth/types/AuthTypes.js.map +1 -1
- package/dist/vanillajs/index.d.ts +2 -0
- package/dist/vanillajs/index.d.ts.map +1 -1
- package/dist/vanillajs/index.js +2 -0
- package/dist/vanillajs/index.js.map +1 -1
- package/dist/vanillajs/types/index.d.ts +1 -1
- package/dist/vanillajs/types/index.d.ts.map +1 -1
- package/dist/vanillajs/types/index.js.map +1 -1
- package/dist/vanillajs/utils/auth-utils.d.ts +14 -0
- package/dist/vanillajs/utils/auth-utils.d.ts.map +1 -1
- package/dist/vanillajs/utils/auth-utils.js +39 -0
- package/dist/vanillajs/utils/auth-utils.js.map +1 -1
- package/package.json +1 -1
- package/dist/reactjs/hooks/useClientTokenExchangeSession.d.ts +0 -3
- package/dist/reactjs/hooks/useClientTokenExchangeSession.d.ts.map +0 -1
- package/dist/reactjs/hooks/useClientTokenExchangeSession.js +0 -13
- package/dist/reactjs/hooks/useClientTokenExchangeSession.js.map +0 -1
- package/dist/reactjs/providers/AuthProvider.d.ts +0 -10
- package/dist/reactjs/providers/AuthProvider.d.ts.map +0 -1
- package/dist/reactjs/providers/AuthProvider.js +0 -79
- package/dist/reactjs/providers/AuthProvider.js.map +0 -1
- package/dist/reactjs/providers/ClientTokenExchangeSessionProvider.d.ts +0 -17
- package/dist/reactjs/providers/ClientTokenExchangeSessionProvider.d.ts.map +0 -1
- package/dist/reactjs/providers/ClientTokenExchangeSessionProvider.js +0 -190
- package/dist/reactjs/providers/ClientTokenExchangeSessionProvider.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/reactjs/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/reactjs/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAwB,MAAM,cAAc,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAyB,MAAM,eAAe,CAAC","sourcesContent":["export { useUser, type UserContextType } from \"./useUser.js\";\nexport { useToken, type TokenContextType } from \"./useToken.js\";\n"]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ForwardedTokens } from "../../types.js";
|
|
2
|
+
import type { GlobalAuthConfig } from "../core/GlobalAuthManager.js";
|
|
3
|
+
export interface TokenContextType {
|
|
4
|
+
idToken?: string | null;
|
|
5
|
+
accessToken?: string | null;
|
|
6
|
+
refreshToken?: string | null;
|
|
7
|
+
forwardedTokens?: ForwardedTokens;
|
|
8
|
+
isLoading: boolean;
|
|
9
|
+
error: Error | null;
|
|
10
|
+
}
|
|
11
|
+
declare const useToken: (config?: GlobalAuthConfig) => TokenContextType;
|
|
12
|
+
export { useToken };
|
|
13
|
+
//# sourceMappingURL=useToken.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useToken.d.ts","sourceRoot":"","sources":["../../../src/reactjs/hooks/useToken.ts"],"names":[],"mappings":"AAiCA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAErE,MAAM,WAAW,gBAAgB;IAC/B,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;CACrB;AAED,QAAA,MAAM,QAAQ,YAAa,gBAAgB,KAAG,gBAuB7C,CAAC;AAEF,OAAO,EAAE,QAAQ,EAAE,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* useToken Hook
|
|
3
|
+
*
|
|
4
|
+
* A backwards-compatible token hook that extracts token-related properties from useUser.
|
|
5
|
+
* This hook provides access to authentication tokens without user profile information.
|
|
6
|
+
*
|
|
7
|
+
* Use this hook when you:
|
|
8
|
+
* - Only need access to tokens (idToken, accessToken, refreshToken, forwardedTokens)
|
|
9
|
+
* - Want to maintain backwards compatibility with existing code
|
|
10
|
+
* - Don't need user profile information
|
|
11
|
+
*
|
|
12
|
+
* This hook supports the same authentication patterns as useUser with automatic fallback:
|
|
13
|
+
* 1. Provider-based (legacy): Uses CivicAuthProvider or CivicNextAuthProvider
|
|
14
|
+
* 2. Provider-free (modern): Direct configuration via useToken(config)
|
|
15
|
+
*
|
|
16
|
+
* Usage Examples:
|
|
17
|
+
*
|
|
18
|
+
* // With provider (existing approach)
|
|
19
|
+
* <CivicAuthProvider clientId="..." config={{ oauthServer: "..." }}>
|
|
20
|
+
* const { accessToken, idToken, forwardedTokens } = useToken();
|
|
21
|
+
* </CivicAuthProvider>
|
|
22
|
+
*
|
|
23
|
+
* // Without provider (new approach) - direct configuration
|
|
24
|
+
* const { accessToken, idToken, refreshToken } = useToken({
|
|
25
|
+
* clientId: "your-client-id",
|
|
26
|
+
* config: { oauthServer: "https://auth.civic.com/oauth/" },
|
|
27
|
+
* displayMode: "iframe",
|
|
28
|
+
* scopes: ["openid", "profile", "email"]
|
|
29
|
+
* });
|
|
30
|
+
*/
|
|
31
|
+
"use client";
|
|
32
|
+
import { useMemo } from "react";
|
|
33
|
+
import { useUser } from "./useUser.js";
|
|
34
|
+
const useToken = (config) => {
|
|
35
|
+
// Leverage the existing useUser hook which handles all the fallback logic
|
|
36
|
+
const { idToken, accessToken, refreshToken, forwardedTokens, isLoading, error, } = useUser(config);
|
|
37
|
+
// Return only token-related properties for backwards compatibility
|
|
38
|
+
return useMemo(() => ({
|
|
39
|
+
idToken,
|
|
40
|
+
accessToken,
|
|
41
|
+
refreshToken,
|
|
42
|
+
forwardedTokens,
|
|
43
|
+
isLoading,
|
|
44
|
+
error,
|
|
45
|
+
}), [idToken, accessToken, refreshToken, forwardedTokens, isLoading, error]);
|
|
46
|
+
};
|
|
47
|
+
export { useToken };
|
|
48
|
+
//# sourceMappingURL=useToken.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useToken.js","sourceRoot":"","sources":["../../../src/reactjs/hooks/useToken.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,YAAY,CAAC;AACb,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAChC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAavC,MAAM,QAAQ,GAAG,CAAC,MAAyB,EAAoB,EAAE;IAC/D,0EAA0E;IAC1E,MAAM,EACJ,OAAO,EACP,WAAW,EACX,YAAY,EACZ,eAAe,EACf,SAAS,EACT,KAAK,GACN,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAEpB,mEAAmE;IACnE,OAAO,OAAO,CACZ,GAAG,EAAE,CAAC,CAAC;QACL,OAAO;QACP,WAAW;QACX,YAAY;QACZ,eAAe;QACf,SAAS;QACT,KAAK;KACN,CAAC,EACF,CAAC,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,eAAe,EAAE,SAAS,EAAE,KAAK,CAAC,CACxE,CAAC;AACJ,CAAC,CAAC;AAEF,OAAO,EAAE,QAAQ,EAAE,CAAC","sourcesContent":["/**\n * useToken Hook\n *\n * A backwards-compatible token hook that extracts token-related properties from useUser.\n * This hook provides access to authentication tokens without user profile information.\n *\n * Use this hook when you:\n * - Only need access to tokens (idToken, accessToken, refreshToken, forwardedTokens)\n * - Want to maintain backwards compatibility with existing code\n * - Don't need user profile information\n *\n * This hook supports the same authentication patterns as useUser with automatic fallback:\n * 1. Provider-based (legacy): Uses CivicAuthProvider or CivicNextAuthProvider\n * 2. Provider-free (modern): Direct configuration via useToken(config)\n *\n * Usage Examples:\n *\n * // With provider (existing approach)\n * <CivicAuthProvider clientId=\"...\" config={{ oauthServer: \"...\" }}>\n * const { accessToken, idToken, forwardedTokens } = useToken();\n * </CivicAuthProvider>\n *\n * // Without provider (new approach) - direct configuration\n * const { accessToken, idToken, refreshToken } = useToken({\n * clientId: \"your-client-id\",\n * config: { oauthServer: \"https://auth.civic.com/oauth/\" },\n * displayMode: \"iframe\",\n * scopes: [\"openid\", \"profile\", \"email\"]\n * });\n */\n\"use client\";\nimport { useMemo } from \"react\";\nimport { useUser } from \"./useUser.js\";\nimport type { ForwardedTokens } from \"../../types.js\";\nimport type { GlobalAuthConfig } from \"../core/GlobalAuthManager.js\";\n\nexport interface TokenContextType {\n idToken?: string | null;\n accessToken?: string | null;\n refreshToken?: string | null;\n forwardedTokens?: ForwardedTokens;\n isLoading: boolean;\n error: Error | null;\n}\n\nconst useToken = (config?: GlobalAuthConfig): TokenContextType => {\n // Leverage the existing useUser hook which handles all the fallback logic\n const {\n idToken,\n accessToken,\n refreshToken,\n forwardedTokens,\n isLoading,\n error,\n } = useUser(config);\n\n // Return only token-related properties for backwards compatibility\n return useMemo(\n () => ({\n idToken,\n accessToken,\n refreshToken,\n forwardedTokens,\n isLoading,\n error,\n }),\n [idToken, accessToken, refreshToken, forwardedTokens, isLoading, error],\n );\n};\n\nexport { useToken };\n"]}
|
|
@@ -1,4 +1,22 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
1
|
+
import type { User, ForwardedTokens } from "../../types.js";
|
|
2
|
+
import type { AuthStatus } from "../../types.js";
|
|
3
|
+
import type { DisplayMode } from "../../types.js";
|
|
4
|
+
import { type GlobalAuthConfig } from "../core/GlobalAuthManager.js";
|
|
5
|
+
export interface UserContextType<T extends Record<string, unknown> = Record<string, never>> {
|
|
6
|
+
user: User<T> | null;
|
|
7
|
+
idToken?: string | null;
|
|
8
|
+
accessToken?: string | null;
|
|
9
|
+
refreshToken?: string | null;
|
|
10
|
+
forwardedTokens?: ForwardedTokens;
|
|
11
|
+
isLoading: boolean;
|
|
12
|
+
authStatus: AuthStatus;
|
|
13
|
+
error: Error | null;
|
|
14
|
+
signIn: () => Promise<{
|
|
15
|
+
user: User<T>;
|
|
16
|
+
}>;
|
|
17
|
+
signOut: () => Promise<void>;
|
|
18
|
+
displayMode?: DisplayMode;
|
|
19
|
+
}
|
|
20
|
+
declare const useUser: <T extends Record<string, unknown> = Record<string, never>>(config?: GlobalAuthConfig) => UserContextType<T>;
|
|
3
21
|
export { useUser };
|
|
4
22
|
//# sourceMappingURL=useUser.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useUser.d.ts","sourceRoot":"","sources":["../../../src/reactjs/hooks/useUser.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"useUser.d.ts","sourceRoot":"","sources":["../../../src/reactjs/hooks/useUser.ts"],"names":[],"mappings":"AAyCA,OAAO,KAAK,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAC5D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAEL,KAAK,gBAAgB,EAEtB,MAAM,8BAA8B,CAAC;AAGtC,MAAM,WAAW,eAAe,CAC9B,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC;IAEzD,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,UAAU,CAAC;IACvB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,MAAM,EAAE,MAAM,OAAO,CAAC;QAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAA;KAAE,CAAC,CAAC;IACzC,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B;AAED,QAAA,MAAM,OAAO,GAAI,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,mCACvC,gBAAgB,KACxB,eAAe,CAAC,CAAC,CA2InB,CAAC;AAEF,OAAO,EAAE,OAAO,EAAE,CAAC"}
|
|
@@ -1,12 +1,168 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* useUser Hook
|
|
3
|
+
*
|
|
4
|
+
* A comprehensive user session hook that provides full user data including profile information,
|
|
5
|
+
* authentication tokens, and authentication state. Supports generic typing for custom user data.
|
|
6
|
+
*
|
|
7
|
+
* Use this hook when you:
|
|
8
|
+
* - Need access to user profile information (user object)
|
|
9
|
+
* - Need authentication tokens (JWT, access, refresh tokens)
|
|
10
|
+
* - Are working with custom user data types
|
|
11
|
+
* - Need comprehensive user session data
|
|
12
|
+
* - Want backward compatibility with legacy UserContext
|
|
13
|
+
*
|
|
14
|
+
* This hook supports two authentication patterns with automatic fallback:
|
|
15
|
+
* 1. Provider-based (legacy): Uses CivicAuthProvider or CivicNextAuthProvider
|
|
16
|
+
* 2. Provider-free (modern): Direct configuration via useUser(config)
|
|
17
|
+
*
|
|
18
|
+
* Usage Examples:
|
|
19
|
+
*
|
|
20
|
+
* // With provider (existing approach - NextJS/React providers)
|
|
21
|
+
* <CivicAuthProvider clientId="..." config={{ oauthServer: "..." }}>
|
|
22
|
+
* const { user, isLoading, signIn } = useUser();
|
|
23
|
+
* </CivicAuthProvider>
|
|
24
|
+
*
|
|
25
|
+
* // Without provider (new approach) - direct configuration
|
|
26
|
+
* const { user, authStatus, signOut } = useUser({
|
|
27
|
+
* clientId: "your-client-id",
|
|
28
|
+
* config: { oauthServer: "https://auth.civic.com/oauth/" },
|
|
29
|
+
* displayMode: "iframe", // or "redirect", "popup", etc.
|
|
30
|
+
* scopes: ["openid", "profile", "email"],
|
|
31
|
+
* onSignIn: (error) => console.log("Sign in completed", error),
|
|
32
|
+
* onSignOut: () => console.log("Sign out completed")
|
|
33
|
+
* });
|
|
34
|
+
*
|
|
35
|
+
* // Generic typing for custom user data
|
|
36
|
+
* interface CustomUser { customField: string; }
|
|
37
|
+
* const { user } = useUser<CustomUser>(); // user will be User<CustomUser> | null
|
|
38
|
+
*/
|
|
1
39
|
"use client";
|
|
2
|
-
import { useContext } from "react";
|
|
3
|
-
import { UserContext
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
40
|
+
import { useContext, useState, useEffect, useCallback, useMemo } from "react";
|
|
41
|
+
import { UserContext } from "../../shared/providers/UserProvider.js";
|
|
42
|
+
import { GlobalAuthManager, } from "../core/GlobalAuthManager.js";
|
|
43
|
+
import { extractTokensFromSession } from "../../vanillajs/utils/auth-utils.js";
|
|
44
|
+
const useUser = (config) => {
|
|
45
|
+
// Always call context hooks unconditionally (rules of hooks)
|
|
46
|
+
const sharedContext = useContext(UserContext);
|
|
47
|
+
// State for global manager approach
|
|
48
|
+
const [globalState, setGlobalState] = useState(null);
|
|
49
|
+
// Determine which approach to use
|
|
50
|
+
const hasProviderContext = sharedContext;
|
|
51
|
+
const shouldUseGlobal = !hasProviderContext;
|
|
52
|
+
// Initialize global manager if no provider context
|
|
53
|
+
useEffect(() => {
|
|
54
|
+
if (!shouldUseGlobal)
|
|
55
|
+
return;
|
|
56
|
+
const manager = GlobalAuthManager.getInstance();
|
|
57
|
+
// If config is provided, initialize with it
|
|
58
|
+
if (config) {
|
|
59
|
+
const initializeAuth = async () => {
|
|
60
|
+
try {
|
|
61
|
+
await manager.initialize(config);
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
console.error("Failed to initialize auth:", error);
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
initializeAuth();
|
|
68
|
+
}
|
|
69
|
+
// Subscribe to state changes
|
|
70
|
+
const unsubscribe = manager.subscribe((newState) => {
|
|
71
|
+
setGlobalState(newState);
|
|
72
|
+
});
|
|
73
|
+
// Get current state
|
|
74
|
+
setGlobalState(manager.getState());
|
|
75
|
+
return unsubscribe;
|
|
76
|
+
}, [shouldUseGlobal, config]);
|
|
77
|
+
// Global manager sign in/out functions
|
|
78
|
+
const globalSignIn = useCallback(async () => {
|
|
79
|
+
const manager = GlobalAuthManager.getInstance();
|
|
80
|
+
await manager.signIn();
|
|
81
|
+
// Get the user after sign in
|
|
82
|
+
const state = manager.getState();
|
|
83
|
+
if (!state.user) {
|
|
84
|
+
throw new Error("Authentication succeeded but no user was returned");
|
|
85
|
+
}
|
|
86
|
+
return { user: state.user };
|
|
87
|
+
}, []);
|
|
88
|
+
const globalSignOut = useCallback(async () => {
|
|
89
|
+
const manager = GlobalAuthManager.getInstance();
|
|
90
|
+
await manager.signOut();
|
|
91
|
+
}, []);
|
|
92
|
+
// Extract tokens from global state
|
|
93
|
+
const globalTokens = useMemo(() => {
|
|
94
|
+
return extractTokensFromSession(globalState?.session || null);
|
|
95
|
+
}, [globalState?.session]);
|
|
96
|
+
// Create wrapper functions for different signIn signatures
|
|
97
|
+
const wrapSharedSignIn = useCallback(async () => {
|
|
98
|
+
if (sharedContext) {
|
|
99
|
+
await sharedContext.signIn(); // This returns void
|
|
100
|
+
// Get user from context after sign in
|
|
101
|
+
if (sharedContext.user) {
|
|
102
|
+
return { user: sharedContext.user };
|
|
103
|
+
}
|
|
104
|
+
// We don't return a user yet in nextjs until the next refactor
|
|
105
|
+
return { user: null };
|
|
106
|
+
}
|
|
107
|
+
throw new Error("Shared context not available");
|
|
108
|
+
}, [sharedContext]);
|
|
109
|
+
// ========================================================================
|
|
110
|
+
// FALLBACK PRIORITY SYSTEM - Two authentication context approaches
|
|
111
|
+
// ========================================================================
|
|
112
|
+
// 1. DEPRECATED UserContext (ACTIVE - Used by NextJS)
|
|
113
|
+
// Framework-agnostic shared context from UserProvider
|
|
114
|
+
// Location: shared/providers/UserProvider.tsx
|
|
115
|
+
// Usage: NextJS example uses CivicNextAuthProvider → UserProvider → UserContext
|
|
116
|
+
if (sharedContext) {
|
|
117
|
+
return {
|
|
118
|
+
user: sharedContext.user,
|
|
119
|
+
idToken: sharedContext.idToken,
|
|
120
|
+
accessToken: sharedContext.accessToken,
|
|
121
|
+
refreshToken: undefined, // Not available in shared context
|
|
122
|
+
forwardedTokens: sharedContext.forwardedTokens,
|
|
123
|
+
isLoading: sharedContext.isLoading,
|
|
124
|
+
authStatus: sharedContext.authStatus,
|
|
125
|
+
error: sharedContext.error,
|
|
126
|
+
signIn: wrapSharedSignIn,
|
|
127
|
+
signOut: sharedContext.signOut,
|
|
128
|
+
displayMode: sharedContext.displayMode,
|
|
129
|
+
};
|
|
8
130
|
}
|
|
9
|
-
|
|
131
|
+
// 2. GlobalAuthManager (MODERN - Provider-free approach)
|
|
132
|
+
// Singleton-based state management, eliminates need for React providers
|
|
133
|
+
// Location: reactjs/core/GlobalAuthManager.ts
|
|
134
|
+
// Usage: React example uses CivicAuthProvider → GlobalAuthManager internally
|
|
135
|
+
// Can also be used directly: useUser({ clientId: "...", config: {...} })
|
|
136
|
+
if (globalState) {
|
|
137
|
+
return {
|
|
138
|
+
user: globalState.user,
|
|
139
|
+
idToken: globalTokens.idToken,
|
|
140
|
+
accessToken: globalTokens.accessToken,
|
|
141
|
+
refreshToken: globalTokens.refreshToken,
|
|
142
|
+
forwardedTokens: globalTokens.forwardedTokens,
|
|
143
|
+
isLoading: globalState.isLoading,
|
|
144
|
+
authStatus: globalState.authStatus,
|
|
145
|
+
error: globalState.error,
|
|
146
|
+
signIn: globalSignIn,
|
|
147
|
+
signOut: globalSignOut,
|
|
148
|
+
displayMode: globalState.displayMode,
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
// If no context and no global state, provide default loading state
|
|
152
|
+
// This happens when CivicAuthProvider is present but GlobalAuthManager hasn't initialized yet
|
|
153
|
+
return {
|
|
154
|
+
user: null,
|
|
155
|
+
idToken: null,
|
|
156
|
+
accessToken: null,
|
|
157
|
+
refreshToken: null,
|
|
158
|
+
forwardedTokens: undefined,
|
|
159
|
+
isLoading: true,
|
|
160
|
+
authStatus: "unauthenticated",
|
|
161
|
+
error: null,
|
|
162
|
+
signIn: globalSignIn,
|
|
163
|
+
signOut: globalSignOut,
|
|
164
|
+
displayMode: config?.displayMode,
|
|
165
|
+
};
|
|
10
166
|
};
|
|
11
167
|
export { useUser };
|
|
12
168
|
//# sourceMappingURL=useUser.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useUser.js","sourceRoot":"","sources":["../../../src/reactjs/hooks/useUser.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AACb,OAAO,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AACnC,OAAO,EACL,WAAW,GAEZ,MAAM,oCAAoC,CAAC;AAE5C,MAAM,OAAO,GAAG,GAEQ,EAAE;IACxB,MAAM,OAAO,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC;IAExC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAChE,CAAC;IAED,OAAO,OAA6B,CAAC;AACvC,CAAC,CAAC;AAEF,OAAO,EAAE,OAAO,EAAE,CAAC","sourcesContent":["\"use client\";\nimport { useContext } from \"react\";\nimport {\n UserContext,\n type UserContextType,\n} from \"@/shared/providers/UserProvider.js\";\n\nconst useUser = <\n T extends Record<string, unknown> = Record<string, never>,\n>(): UserContextType<T> => {\n const context = useContext(UserContext);\n\n if (!context) {\n throw new Error(\"useUser must be used within a UserProvider\");\n }\n\n return context as UserContextType<T>;\n};\n\nexport { useUser };\n"]}
|
|
1
|
+
{"version":3,"file":"useUser.js","sourceRoot":"","sources":["../../../src/reactjs/hooks/useUser.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * useUser Hook\n *\n * A comprehensive user session hook that provides full user data including profile information,\n * authentication tokens, and authentication state. Supports generic typing for custom user data.\n *\n * Use this hook when you:\n * - Need access to user profile information (user object)\n * - Need authentication tokens (JWT, access, refresh tokens)\n * - Are working with custom user data types\n * - Need comprehensive user session data\n * - Want backward compatibility with legacy UserContext\n *\n * This hook supports two authentication patterns with automatic fallback:\n * 1. Provider-based (legacy): Uses CivicAuthProvider or CivicNextAuthProvider\n * 2. Provider-free (modern): Direct configuration via useUser(config)\n *\n * Usage Examples:\n *\n * // With provider (existing approach - NextJS/React providers)\n * <CivicAuthProvider clientId=\"...\" config={{ oauthServer: \"...\" }}>\n * const { user, isLoading, signIn } = useUser();\n * </CivicAuthProvider>\n *\n * // Without provider (new approach) - direct configuration\n * const { user, authStatus, signOut } = useUser({\n * clientId: \"your-client-id\",\n * config: { oauthServer: \"https://auth.civic.com/oauth/\" },\n * displayMode: \"iframe\", // or \"redirect\", \"popup\", etc.\n * scopes: [\"openid\", \"profile\", \"email\"],\n * onSignIn: (error) => console.log(\"Sign in completed\", error),\n * onSignOut: () => console.log(\"Sign out completed\")\n * });\n *\n * // Generic typing for custom user data\n * interface CustomUser { customField: string; }\n * const { user } = useUser<CustomUser>(); // user will be User<CustomUser> | null\n */\n\"use client\";\nimport { useContext, useState, useEffect, useCallback, useMemo } from \"react\";\nimport { UserContext } from \"../../shared/providers/UserProvider.js\";\nimport type { User, ForwardedTokens } from \"../../types.js\";\nimport type { AuthStatus } from \"../../types.js\";\nimport type { DisplayMode } from \"../../types.js\";\nimport {\n GlobalAuthManager,\n type GlobalAuthConfig,\n type GlobalAuthState,\n} from \"../core/GlobalAuthManager.js\";\nimport { extractTokensFromSession } from \"../../vanillajs/utils/auth-utils.js\";\n\nexport interface UserContextType<\n T extends Record<string, unknown> = Record<string, never>,\n> {\n user: User<T> | null;\n idToken?: string | null;\n accessToken?: string | null;\n refreshToken?: string | null;\n forwardedTokens?: ForwardedTokens;\n isLoading: boolean;\n authStatus: AuthStatus;\n error: Error | null;\n signIn: () => Promise<{ user: User<T> }>;\n signOut: () => Promise<void>;\n displayMode?: DisplayMode;\n}\n\nconst useUser = <T extends Record<string, unknown> = Record<string, never>>(\n config?: GlobalAuthConfig,\n): UserContextType<T> => {\n // Always call context hooks unconditionally (rules of hooks)\n const sharedContext = useContext(UserContext);\n\n // State for global manager approach\n const [globalState, setGlobalState] = useState<GlobalAuthState | null>(null);\n\n // Determine which approach to use\n const hasProviderContext = sharedContext;\n const shouldUseGlobal = !hasProviderContext;\n\n // Initialize global manager if no provider context\n useEffect(() => {\n if (!shouldUseGlobal) return;\n\n const manager = GlobalAuthManager.getInstance();\n\n // If config is provided, initialize with it\n if (config) {\n const initializeAuth = async () => {\n try {\n await manager.initialize(config);\n } catch (error) {\n console.error(\"Failed to initialize auth:\", error);\n }\n };\n initializeAuth();\n }\n\n // Subscribe to state changes\n const unsubscribe = manager.subscribe((newState) => {\n setGlobalState(newState);\n });\n\n // Get current state\n setGlobalState(manager.getState());\n\n return unsubscribe;\n }, [shouldUseGlobal, config]);\n\n // Global manager sign in/out functions\n const globalSignIn = useCallback(async () => {\n const manager = GlobalAuthManager.getInstance();\n await manager.signIn();\n\n // Get the user after sign in\n const state = manager.getState();\n if (!state.user) {\n throw new Error(\"Authentication succeeded but no user was returned\");\n }\n\n return { user: state.user as User<T> };\n }, []);\n\n const globalSignOut = useCallback(async () => {\n const manager = GlobalAuthManager.getInstance();\n await manager.signOut();\n }, []);\n\n // Extract tokens from global state\n const globalTokens = useMemo(() => {\n return extractTokensFromSession(globalState?.session || null);\n }, [globalState?.session]);\n\n // Create wrapper functions for different signIn signatures\n const wrapSharedSignIn = useCallback(async (): Promise<{ user: User<T> }> => {\n if (sharedContext) {\n await sharedContext.signIn(); // This returns void\n // Get user from context after sign in\n if (sharedContext.user) {\n return { user: sharedContext.user as User<T> };\n }\n\n // We don't return a user yet in nextjs until the next refactor\n return { user: null as unknown as User<T> };\n }\n throw new Error(\"Shared context not available\");\n }, [sharedContext]);\n\n // ========================================================================\n // FALLBACK PRIORITY SYSTEM - Two authentication context approaches\n // ========================================================================\n\n // 1. DEPRECATED UserContext (ACTIVE - Used by NextJS)\n // Framework-agnostic shared context from UserProvider\n // Location: shared/providers/UserProvider.tsx\n // Usage: NextJS example uses CivicNextAuthProvider → UserProvider → UserContext\n if (sharedContext) {\n return {\n user: sharedContext.user as User<T> | null,\n idToken: sharedContext.idToken,\n accessToken: sharedContext.accessToken,\n refreshToken: undefined, // Not available in shared context\n forwardedTokens: sharedContext.forwardedTokens,\n isLoading: sharedContext.isLoading,\n authStatus: sharedContext.authStatus,\n error: sharedContext.error,\n signIn: wrapSharedSignIn,\n signOut: sharedContext.signOut,\n displayMode: sharedContext.displayMode,\n };\n }\n\n // 2. GlobalAuthManager (MODERN - Provider-free approach)\n // Singleton-based state management, eliminates need for React providers\n // Location: reactjs/core/GlobalAuthManager.ts\n // Usage: React example uses CivicAuthProvider → GlobalAuthManager internally\n // Can also be used directly: useUser({ clientId: \"...\", config: {...} })\n if (globalState) {\n return {\n user: globalState.user as User<T> | null,\n idToken: globalTokens.idToken,\n accessToken: globalTokens.accessToken,\n refreshToken: globalTokens.refreshToken,\n forwardedTokens: globalTokens.forwardedTokens,\n isLoading: globalState.isLoading,\n authStatus: globalState.authStatus as AuthStatus,\n error: globalState.error,\n signIn: globalSignIn,\n signOut: globalSignOut,\n displayMode: globalState.displayMode,\n };\n }\n\n // If no context and no global state, provide default loading state\n // This happens when CivicAuthProvider is present but GlobalAuthManager hasn't initialized yet\n return {\n user: null,\n idToken: null,\n accessToken: null,\n refreshToken: null,\n forwardedTokens: undefined,\n isLoading: true,\n authStatus: \"unauthenticated\" as AuthStatus,\n error: null,\n signIn: globalSignIn,\n signOut: globalSignOut,\n displayMode: config?.displayMode,\n };\n};\n\nexport { useUser };\n"]}
|
package/dist/reactjs/index.d.ts
CHANGED
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
export * from "../reactjs/hooks/index.js";
|
|
2
|
-
export {
|
|
3
|
-
export type {
|
|
2
|
+
export { GlobalAuthManager } from "../reactjs/core/GlobalAuthManager.js";
|
|
3
|
+
export type { GlobalAuthConfig, GlobalAuthState, } from "../reactjs/core/GlobalAuthManager.js";
|
|
4
|
+
export { CivicAuthProvider, type CivicAuthProviderProps, } from "../reactjs/providers/CivicAuthProvider.js";
|
|
5
|
+
export { useCivicAuthContext } from "../reactjs/providers/CivicAuthContext.js";
|
|
4
6
|
export { CivicAuthIframeContainer } from "../shared/components/CivicAuthIframeContainer.js";
|
|
7
|
+
export type { CivicAuthContextType, AuthStatusEnum, } from "../reactjs/providers/CivicAuthContext.js";
|
|
8
|
+
export type { UserContextType } from "../reactjs/hooks/index.js";
|
|
5
9
|
export { UserButton, SignInButton, SignOutButton, } from "../reactjs/components/index.js";
|
|
6
10
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/reactjs/index.ts"],"names":[],"mappings":"AAMA,cAAc,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/reactjs/index.ts"],"names":[],"mappings":"AAMA,cAAc,0BAA0B,CAAC;AAGzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AACxE,YAAY,EACV,gBAAgB,EAChB,eAAe,GAChB,MAAM,qCAAqC,CAAC;AAG7C,OAAO,EACL,iBAAiB,EACjB,KAAK,sBAAsB,GAC5B,MAAM,0CAA0C,CAAC;AAGlD,OAAO,EAAE,mBAAmB,EAAE,MAAM,yCAAyC,CAAC;AAC9E,OAAO,EAAE,wBAAwB,EAAE,MAAM,iDAAiD,CAAC;AAE3F,YAAY,EACV,oBAAoB,EACpB,cAAc,GACf,MAAM,yCAAyC,CAAC;AAGjD,YAAY,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAGhE,OAAO,EACL,UAAU,EACV,YAAY,EACZ,aAAa,GACd,MAAM,+BAA+B,CAAC"}
|
package/dist/reactjs/index.js
CHANGED
|
@@ -4,7 +4,13 @@
|
|
|
4
4
|
import { printVersion } from "../shared/index.js";
|
|
5
5
|
printVersion();
|
|
6
6
|
export * from "../reactjs/hooks/index.js";
|
|
7
|
-
|
|
7
|
+
// Global auth manager for advanced usage
|
|
8
|
+
export { GlobalAuthManager } from "../reactjs/core/GlobalAuthManager.js";
|
|
9
|
+
// Provider-based approach (for apps that prefer providers)
|
|
10
|
+
export { CivicAuthProvider, } from "../reactjs/providers/CivicAuthProvider.js";
|
|
11
|
+
// Export new context and hook for advanced usage
|
|
12
|
+
export { useCivicAuthContext } from "../reactjs/providers/CivicAuthContext.js";
|
|
8
13
|
export { CivicAuthIframeContainer } from "../shared/components/CivicAuthIframeContainer.js";
|
|
14
|
+
// Export our VanillaJS-based components
|
|
9
15
|
export { UserButton, SignInButton, SignOutButton, } from "../reactjs/components/index.js";
|
|
10
16
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/reactjs/index.ts"],"names":[],"mappings":"AAAA,gDAAgD;AAChD,gHAAgH;AAChH,kGAAkG;AAClG,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,YAAY,EAAE,CAAC;AAEf,cAAc,0BAA0B,CAAC;AACzC,OAAO,EACL,iBAAiB,GAElB,MAAM,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/reactjs/index.ts"],"names":[],"mappings":"AAAA,gDAAgD;AAChD,gHAAgH;AAChH,kGAAkG;AAClG,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,YAAY,EAAE,CAAC;AAEf,cAAc,0BAA0B,CAAC;AAEzC,yCAAyC;AACzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AAMxE,2DAA2D;AAC3D,OAAO,EACL,iBAAiB,GAElB,MAAM,0CAA0C,CAAC;AAElD,iDAAiD;AACjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,yCAAyC,CAAC;AAC9E,OAAO,EAAE,wBAAwB,EAAE,MAAM,iDAAiD,CAAC;AAU3F,wCAAwC;AACxC,OAAO,EACL,UAAU,EACV,YAAY,EACZ,aAAa,GACd,MAAM,+BAA+B,CAAC","sourcesContent":["// These are the default exports of the project.\n// They are limited by design to ensure that the public API does not expose any internal implementation details.\n// Do not change this without thinking carefully about the impact on the client-facing public API.\nimport { printVersion } from \"@/shared/index.js\";\nprintVersion();\n\nexport * from \"@/reactjs/hooks/index.js\";\n\n// Global auth manager for advanced usage\nexport { GlobalAuthManager } from \"@/reactjs/core/GlobalAuthManager.js\";\nexport type {\n GlobalAuthConfig,\n GlobalAuthState,\n} from \"@/reactjs/core/GlobalAuthManager.js\";\n\n// Provider-based approach (for apps that prefer providers)\nexport {\n CivicAuthProvider,\n type CivicAuthProviderProps,\n} from \"@/reactjs/providers/CivicAuthProvider.js\";\n\n// Export new context and hook for advanced usage\nexport { useCivicAuthContext } from \"@/reactjs/providers/CivicAuthContext.js\";\nexport { CivicAuthIframeContainer } from \"@/shared/components/CivicAuthIframeContainer.js\";\n// Export new context types\nexport type {\n CivicAuthContextType,\n AuthStatusEnum,\n} from \"@/reactjs/providers/CivicAuthContext.js\";\n\n// Export types\nexport type { UserContextType } from \"@/reactjs/hooks/index.js\";\n\n// Export our VanillaJS-based components\nexport {\n UserButton,\n SignInButton,\n SignOutButton,\n} from \"@/reactjs/components/index.js\";\n"]}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import type { ReactNode } from "react";
|
|
3
|
+
import { CivicAuth, type Session, type User } from "../../vanillajs/index.js";
|
|
4
|
+
import type { DisplayMode, ForwardedTokens } from "../../types.js";
|
|
5
|
+
export type AuthStatusEnum = "authenticated" | "unauthenticated" | "authenticating" | "error" | "signing_out";
|
|
6
|
+
export interface CivicAuthContextType {
|
|
7
|
+
auth: CivicAuth | null;
|
|
8
|
+
user: User | null;
|
|
9
|
+
session: Session | null;
|
|
10
|
+
isLoading: boolean;
|
|
11
|
+
authStatus: AuthStatusEnum;
|
|
12
|
+
error: Error | null;
|
|
13
|
+
idToken?: string;
|
|
14
|
+
accessToken?: string;
|
|
15
|
+
refreshToken?: string;
|
|
16
|
+
forwardedTokens?: ForwardedTokens;
|
|
17
|
+
signIn: () => Promise<{
|
|
18
|
+
user: User;
|
|
19
|
+
}>;
|
|
20
|
+
signOut: () => Promise<void>;
|
|
21
|
+
displayMode?: DisplayMode;
|
|
22
|
+
}
|
|
23
|
+
declare const CivicAuthContext: React.Context<CivicAuthContextType | null>;
|
|
24
|
+
export interface CivicAuthContextProviderProps {
|
|
25
|
+
children: ReactNode;
|
|
26
|
+
clientId: string;
|
|
27
|
+
redirectUrl?: string;
|
|
28
|
+
oauthServerBaseUrl?: string;
|
|
29
|
+
scopes?: string[];
|
|
30
|
+
displayMode?: DisplayMode;
|
|
31
|
+
iframeDisplayMode?: "modal" | "embedded";
|
|
32
|
+
onSignIn?: (error?: Error) => void;
|
|
33
|
+
onSignOut?: () => void;
|
|
34
|
+
nonce?: string;
|
|
35
|
+
authProcessTimeout?: number;
|
|
36
|
+
}
|
|
37
|
+
export declare const CivicAuthContextProvider: React.FC<CivicAuthContextProviderProps>;
|
|
38
|
+
export declare const useCivicAuthContext: () => CivicAuthContextType;
|
|
39
|
+
export { CivicAuthContext };
|
|
40
|
+
//# sourceMappingURL=CivicAuthContext.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CivicAuthContext.d.ts","sourceRoot":"","sources":["../../../src/reactjs/providers/CivicAuthContext.tsx"],"names":[],"mappings":"AACA,OAAO,KAQN,MAAM,OAAO,CAAC;AACf,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,EACL,SAAS,EAET,KAAK,OAAO,EACZ,KAAK,IAAI,EACV,MAAM,0BAA0B,CAAC;AAElC,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAQnE,MAAM,MAAM,cAAc,GACtB,eAAe,GACf,iBAAiB,GACjB,gBAAgB,GAChB,OAAO,GACP,aAAa,CAAC;AAElB,MAAM,WAAW,oBAAoB;IAEnC,IAAI,EAAE,SAAS,GAAG,IAAI,CAAC;IAGvB,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IAClB,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IAGxB,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,cAAc,CAAC;IAC3B,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IAGpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,eAAe,CAAC;IAGlC,MAAM,EAAE,MAAM,OAAO,CAAC;QAAE,IAAI,EAAE,IAAI,CAAA;KAAE,CAAC,CAAC;IACtC,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAG7B,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B;AAED,QAAA,MAAM,gBAAgB,4CAAmD,CAAC;AAE1E,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,EAAE,SAAS,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,iBAAiB,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;IACzC,QAAQ,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,KAAK,IAAI,CAAC;IACnC,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,eAAO,MAAM,wBAAwB,EAAE,KAAK,CAAC,EAAE,CAC7C,6BAA6B,CA8V9B,CAAC;AAEF,eAAO,MAAM,mBAAmB,QAAO,oBAQtC,CAAC;AAEF,OAAO,EAAE,gBAAgB,EAAE,CAAC"}
|