@civic/auth 0.11.3-alpha.0 → 0.11.3-beta.0
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/dist/reactjs/core/GlobalAuthManager.d.ts.map +1 -1
- package/dist/reactjs/core/GlobalAuthManager.js +0 -6
- package/dist/reactjs/core/GlobalAuthManager.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/vanillajs/auth/CivicAuth.d.ts.map +1 -1
- package/dist/vanillajs/auth/CivicAuth.js +0 -4
- package/dist/vanillajs/auth/CivicAuth.js.map +1 -1
- package/package.json +5 -5
- package/dist/nextjs/NextClientAuthenticationRefresher.d.ts +0 -8
- package/dist/nextjs/NextClientAuthenticationRefresher.d.ts.map +0 -1
- package/dist/nextjs/NextClientAuthenticationRefresher.js +0 -24
- package/dist/nextjs/NextClientAuthenticationRefresher.js.map +0 -1
- package/dist/nextjs/NextServerAuthenticationRefresherImpl.d.ts +0 -12
- package/dist/nextjs/NextServerAuthenticationRefresherImpl.d.ts.map +0 -1
- package/dist/nextjs/NextServerAuthenticationRefresherImpl.js +0 -25
- package/dist/nextjs/NextServerAuthenticationRefresherImpl.js.map +0 -1
- package/dist/nextjs/hooks/useRefresh.d.ts +0 -5
- package/dist/nextjs/hooks/useRefresh.d.ts.map +0 -1
- package/dist/nextjs/hooks/useRefresh.js +0 -57
- package/dist/nextjs/hooks/useRefresh.js.map +0 -1
- package/dist/react-router-7/auth-loader.d.ts +0 -18
- package/dist/react-router-7/auth-loader.d.ts.map +0 -1
- package/dist/react-router-7/auth-loader.js +0 -36
- package/dist/react-router-7/auth-loader.js.map +0 -1
- package/dist/reactjs/providers/CivicAuthContext.d.ts +0 -44
- package/dist/reactjs/providers/CivicAuthContext.d.ts.map +0 -1
- package/dist/reactjs/providers/CivicAuthContext.js +0 -313
- package/dist/reactjs/providers/CivicAuthContext.js.map +0 -1
- package/dist/shared/hooks/useCivicAuthConfig.d.ts +0 -3
- package/dist/shared/hooks/useCivicAuthConfig.d.ts.map +0 -1
- package/dist/shared/hooks/useCivicAuthConfig.js +0 -10
- package/dist/shared/hooks/useCivicAuthConfig.js.map +0 -1
- package/dist/shared/hooks/useClientTokenExchangeSession.d.ts +0 -7
- package/dist/shared/hooks/useClientTokenExchangeSession.d.ts.map +0 -1
- package/dist/shared/hooks/useClientTokenExchangeSession.js +0 -17
- package/dist/shared/hooks/useClientTokenExchangeSession.js.map +0 -1
- package/dist/shared/hooks/useCurrentUrl.d.ts +0 -3
- package/dist/shared/hooks/useCurrentUrl.d.ts.map +0 -1
- package/dist/shared/hooks/useCurrentUrl.js +0 -24
- package/dist/shared/hooks/useCurrentUrl.js.map +0 -1
- package/dist/shared/hooks/useOAuthEndpoints.d.ts +0 -4
- package/dist/shared/hooks/useOAuthEndpoints.d.ts.map +0 -1
- package/dist/shared/hooks/useOAuthEndpoints.js +0 -14
- package/dist/shared/hooks/useOAuthEndpoints.js.map +0 -1
- package/dist/shared/hooks/useRefresh.d.ts +0 -6
- package/dist/shared/hooks/useRefresh.d.ts.map +0 -1
- package/dist/shared/hooks/useRefresh.js +0 -47
- package/dist/shared/hooks/useRefresh.js.map +0 -1
- package/dist/shared/hooks/useSession.d.ts +0 -3
- package/dist/shared/hooks/useSession.d.ts.map +0 -1
- package/dist/shared/hooks/useSession.js +0 -13
- package/dist/shared/hooks/useSession.js.map +0 -1
- package/dist/shared/hooks/useToken.d.ts +0 -3
- package/dist/shared/hooks/useToken.d.ts.map +0 -1
- package/dist/shared/hooks/useToken.js +0 -12
- package/dist/shared/hooks/useToken.js.map +0 -1
- package/dist/shared/hooks/useWindowFocused.d.ts +0 -5
- package/dist/shared/hooks/useWindowFocused.d.ts.map +0 -1
- package/dist/shared/hooks/useWindowFocused.js +0 -21
- package/dist/shared/hooks/useWindowFocused.js.map +0 -1
- package/dist/shared/providers/CivicAuthConfigContext.d.ts +0 -25
- package/dist/shared/providers/CivicAuthConfigContext.d.ts.map +0 -1
- package/dist/shared/providers/CivicAuthConfigContext.js +0 -66
- package/dist/shared/providers/CivicAuthConfigContext.js.map +0 -1
- package/dist/shared/providers/SessionProvider.d.ts +0 -19
- package/dist/shared/providers/SessionProvider.d.ts.map +0 -1
- package/dist/shared/providers/SessionProvider.js +0 -25
- package/dist/shared/providers/SessionProvider.js.map +0 -1
- package/dist/shared/providers/TokenProvider.d.ts +0 -17
- package/dist/shared/providers/TokenProvider.d.ts.map +0 -1
- package/dist/shared/providers/TokenProvider.js +0 -31
- package/dist/shared/providers/TokenProvider.js.map +0 -1
- package/dist/shared/providers/UserProvider.d.ts +0 -26
- package/dist/shared/providers/UserProvider.d.ts.map +0 -1
- package/dist/shared/providers/UserProvider.js +0 -64
- package/dist/shared/providers/UserProvider.js.map +0 -1
- package/dist/tsconfig.tsbuildinfo +0 -1
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { AuthenticationRefresherImpl } from "../shared/lib/AuthenticationRefresherImpl.js";
|
|
2
|
-
import type { Endpoints, OIDCTokenResponseBody } from "../types.js";
|
|
3
|
-
import type { AuthConfig } from "../server/config.js";
|
|
4
|
-
import type { CookieStorage } from "../server/index.js";
|
|
5
|
-
export declare class NextServerAuthenticationRefresherImpl extends AuthenticationRefresherImpl {
|
|
6
|
-
endpointOverrides?: Partial<Endpoints> | undefined;
|
|
7
|
-
storage: CookieStorage | undefined;
|
|
8
|
-
constructor(authConfig: AuthConfig, storage: CookieStorage, onError: (error: Error) => Promise<void>, endpointOverrides?: Partial<Endpoints> | undefined);
|
|
9
|
-
storeTokens(tokenResponseBody: OIDCTokenResponseBody | null): Promise<void>;
|
|
10
|
-
static build(authConfig: AuthConfig, storage: CookieStorage, onError: (error: Error) => Promise<void>, endpointOverrides?: Partial<Endpoints>): Promise<NextServerAuthenticationRefresherImpl>;
|
|
11
|
-
}
|
|
12
|
-
//# sourceMappingURL=NextServerAuthenticationRefresherImpl.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"NextServerAuthenticationRefresherImpl.d.ts","sourceRoot":"","sources":["../../src/nextjs/NextServerAuthenticationRefresherImpl.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,MAAM,6CAA6C,CAAC;AAC1F,OAAO,KAAK,EAAE,SAAS,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACnE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAErD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD,qBAAa,qCAAsC,SAAQ,2BAA2B;IAMzE,iBAAiB,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC;IALxC,OAAO,EAAE,aAAa,GAAG,SAAS,CAAC;gBAE1C,UAAU,EAAE,UAAU,EACtB,OAAO,EAAE,aAAa,EACtB,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,OAAO,CAAC,IAAI,CAAC,EAC/B,iBAAiB,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,YAAA;IAMlC,WAAW,CACxB,iBAAiB,EAAE,qBAAqB,GAAG,IAAI,GAC9C,OAAO,CAAC,IAAI,CAAC;WAQM,KAAK,CACzB,UAAU,EAAE,UAAU,EACtB,OAAO,EAAE,aAAa,EACtB,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,OAAO,CAAC,IAAI,CAAC,EACxC,iBAAiB,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,GACrC,OAAO,CAAC,qCAAqC,CAAC;CAWlD"}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import { AuthenticationRefresherImpl } from "../shared/lib/AuthenticationRefresherImpl.js";
|
|
2
|
-
import { storeServerTokens } from "../shared/lib/util.js";
|
|
3
|
-
export class NextServerAuthenticationRefresherImpl extends AuthenticationRefresherImpl {
|
|
4
|
-
endpointOverrides;
|
|
5
|
-
storage;
|
|
6
|
-
constructor(authConfig, storage, onError, endpointOverrides) {
|
|
7
|
-
super(authConfig, storage, onError, endpointOverrides);
|
|
8
|
-
this.endpointOverrides = endpointOverrides;
|
|
9
|
-
this.storage = storage;
|
|
10
|
-
}
|
|
11
|
-
async storeTokens(tokenResponseBody) {
|
|
12
|
-
if (!this.storage)
|
|
13
|
-
throw new Error("No storage available");
|
|
14
|
-
// For null tokenResponseBody, we skip storage since tokens might be managed elsewhere (e.g., HTTP-only cookies)
|
|
15
|
-
if (!tokenResponseBody)
|
|
16
|
-
return;
|
|
17
|
-
await storeServerTokens(this.storage, tokenResponseBody);
|
|
18
|
-
}
|
|
19
|
-
static async build(authConfig, storage, onError, endpointOverrides) {
|
|
20
|
-
const refresher = new NextServerAuthenticationRefresherImpl(authConfig, storage, onError, endpointOverrides);
|
|
21
|
-
await refresher.init();
|
|
22
|
-
return refresher;
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
//# sourceMappingURL=NextServerAuthenticationRefresherImpl.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"NextServerAuthenticationRefresherImpl.js","sourceRoot":"","sources":["../../src/nextjs/NextServerAuthenticationRefresherImpl.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,MAAM,6CAA6C,CAAC;AAG1F,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAGzD,MAAM,OAAO,qCAAsC,SAAQ,2BAA2B;IAMzE;IALF,OAAO,CAA4B;IAC5C,YACE,UAAsB,EACtB,OAAsB,EACtB,OAAwC,EAC/B,iBAAsC;QAE/C,KAAK,CAAC,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,iBAAiB,CAAC,CAAC;QAF9C,sBAAiB,GAAjB,iBAAiB,CAAqB;QAG/C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAEQ,KAAK,CAAC,WAAW,CACxB,iBAA+C;QAE/C,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAC3D,gHAAgH;QAChH,IAAI,CAAC,iBAAiB;YAAE,OAAO;QAE/B,MAAM,iBAAiB,CAAC,IAAI,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;IAC3D,CAAC;IAED,MAAM,CAAU,KAAK,CAAC,KAAK,CACzB,UAAsB,EACtB,OAAsB,EACtB,OAAwC,EACxC,iBAAsC;QAEtC,MAAM,SAAS,GAAG,IAAI,qCAAqC,CACzD,UAAU,EACV,OAAO,EACP,OAAO,EACP,iBAAiB,CAClB,CAAC;QACF,MAAM,SAAS,CAAC,IAAI,EAAE,CAAC;QAEvB,OAAO,SAAS,CAAC;IACnB,CAAC;CACF","sourcesContent":["import { AuthenticationRefresherImpl } from \"@/shared/lib/AuthenticationRefresherImpl.js\";\nimport type { Endpoints, OIDCTokenResponseBody } from \"@/types.js\";\nimport type { AuthConfig } from \"@/server/config.js\";\nimport { storeServerTokens } from \"@/shared/lib/util.js\";\nimport type { CookieStorage } from \"@/server/index.js\";\n\nexport class NextServerAuthenticationRefresherImpl extends AuthenticationRefresherImpl {\n override storage: CookieStorage | undefined;\n constructor(\n authConfig: AuthConfig,\n storage: CookieStorage,\n onError: (error: Error) => Promise<void>,\n override endpointOverrides?: Partial<Endpoints>,\n ) {\n super(authConfig, storage, onError, endpointOverrides);\n this.storage = storage;\n }\n\n override async storeTokens(\n tokenResponseBody: OIDCTokenResponseBody | null,\n ): Promise<void> {\n if (!this.storage) throw new Error(\"No storage available\");\n // For null tokenResponseBody, we skip storage since tokens might be managed elsewhere (e.g., HTTP-only cookies)\n if (!tokenResponseBody) return;\n\n await storeServerTokens(this.storage, tokenResponseBody);\n }\n\n static override async build(\n authConfig: AuthConfig,\n storage: CookieStorage,\n onError: (error: Error) => Promise<void>,\n endpointOverrides?: Partial<Endpoints>,\n ): Promise<NextServerAuthenticationRefresherImpl> {\n const refresher = new NextServerAuthenticationRefresherImpl(\n authConfig,\n storage,\n onError,\n endpointOverrides,\n );\n await refresher.init();\n\n return refresher;\n }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useRefresh.d.ts","sourceRoot":"","sources":["../../../src/nextjs/hooks/useRefresh.ts"],"names":[],"mappings":"AAOA,QAAA,MAAM,UAAU;;CAwDf,CAAC;AAEF,OAAO,EAAE,UAAU,EAAE,CAAC"}
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
import { useCivicAuthConfig } from "../../shared/hooks/useCivicAuthConfig.js";
|
|
2
|
-
import { useEffect, useState } from "react";
|
|
3
|
-
import { BrowserCookieStorage } from "../../shared/index.js";
|
|
4
|
-
import { resolveAuthConfig } from "../config.js";
|
|
5
|
-
import { NextClientAuthenticationRefresher } from "../NextClientAuthenticationRefresher.js";
|
|
6
|
-
import { useSession } from "../../shared/hooks/useSession.js";
|
|
7
|
-
const useRefresh = () => {
|
|
8
|
-
const [error, setError] = useState();
|
|
9
|
-
const { data: session } = useSession();
|
|
10
|
-
const authConfig = useCivicAuthConfig();
|
|
11
|
-
// setup token autorefresh
|
|
12
|
-
const [refresher, setRefresher] = useState(undefined);
|
|
13
|
-
useEffect(() => {
|
|
14
|
-
if (!authConfig)
|
|
15
|
-
return;
|
|
16
|
-
const abortController = new AbortController();
|
|
17
|
-
const currentRefresher = refresher;
|
|
18
|
-
const config = resolveAuthConfig(authConfig ?? {});
|
|
19
|
-
const storage = new BrowserCookieStorage(config.cookies.tokens.access_token);
|
|
20
|
-
const onError = async (error) => {
|
|
21
|
-
console.error("Error refreshing token", error);
|
|
22
|
-
refresher?.clearAutorefresh();
|
|
23
|
-
setError(error);
|
|
24
|
-
};
|
|
25
|
-
NextClientAuthenticationRefresher.build({ ...authConfig }, storage, onError)
|
|
26
|
-
.then((newRefresher) => {
|
|
27
|
-
if (abortController.signal.aborted)
|
|
28
|
-
return;
|
|
29
|
-
currentRefresher?.clearAutorefresh();
|
|
30
|
-
setRefresher(newRefresher);
|
|
31
|
-
})
|
|
32
|
-
.catch((error) => {
|
|
33
|
-
if (abortController.signal.aborted)
|
|
34
|
-
return;
|
|
35
|
-
setError(error);
|
|
36
|
-
});
|
|
37
|
-
return () => {
|
|
38
|
-
abortController.abort();
|
|
39
|
-
currentRefresher?.clearAutorefresh();
|
|
40
|
-
};
|
|
41
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
42
|
-
}, [authConfig]); // Only depend on what actually changes
|
|
43
|
-
useEffect(() => {
|
|
44
|
-
if (session?.authenticated) {
|
|
45
|
-
refresher?.setupAutorefresh();
|
|
46
|
-
}
|
|
47
|
-
else {
|
|
48
|
-
refresher?.clearAutorefresh();
|
|
49
|
-
}
|
|
50
|
-
return () => refresher?.clearAutorefresh();
|
|
51
|
-
}, [refresher, session?.authenticated]);
|
|
52
|
-
return {
|
|
53
|
-
error,
|
|
54
|
-
};
|
|
55
|
-
};
|
|
56
|
-
export { useRefresh };
|
|
57
|
-
//# sourceMappingURL=useRefresh.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useRefresh.js","sourceRoot":"","sources":["../../../src/nextjs/hooks/useRefresh.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,sCAAsC,CAAC;AAC1E,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC5C,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,iCAAiC,EAAE,MAAM,yCAAyC,CAAC;AAC5F,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAE1D,MAAM,UAAU,GAAG,GAAG,EAAE;IACtB,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,EAAS,CAAC;IAC5C,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,UAAU,EAAE,CAAC;IACvC,MAAM,UAAU,GAAG,kBAAkB,EAAE,CAAC;IAExC,0BAA0B;IAC1B,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAExC,SAAS,CAAC,CAAC;IAEb,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,UAAU;YAAE,OAAO;QACxB,MAAM,eAAe,GAAG,IAAI,eAAe,EAAE,CAAC;QAC9C,MAAM,gBAAgB,GAAG,SAAS,CAAC;QACnC,MAAM,MAAM,GAAG,iBAAiB,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC;QACnD,MAAM,OAAO,GAAG,IAAI,oBAAoB,CACtC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,YAAY,CACnC,CAAC;QACF,MAAM,OAAO,GAAG,KAAK,EAAE,KAAY,EAAE,EAAE;YACrC,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,KAAK,CAAC,CAAC;YAC/C,SAAS,EAAE,gBAAgB,EAAE,CAAC;YAC9B,QAAQ,CAAC,KAAK,CAAC,CAAC;QAClB,CAAC,CAAC;QAEF,iCAAiC,CAAC,KAAK,CAAC,EAAE,GAAG,UAAU,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC;aACzE,IAAI,CAAC,CAAC,YAAY,EAAE,EAAE;YACrB,IAAI,eAAe,CAAC,MAAM,CAAC,OAAO;gBAAE,OAAO;YAE3C,gBAAgB,EAAE,gBAAgB,EAAE,CAAC;YACrC,YAAY,CAAC,YAAY,CAAC,CAAC;QAC7B,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,KAAY,EAAE,EAAE;YACtB,IAAI,eAAe,CAAC,MAAM,CAAC,OAAO;gBAAE,OAAO;YAC3C,QAAQ,CAAC,KAAK,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;QAEL,OAAO,GAAG,EAAE;YACV,eAAe,CAAC,KAAK,EAAE,CAAC;YACxB,gBAAgB,EAAE,gBAAgB,EAAE,CAAC;QACvC,CAAC,CAAC;QACF,uDAAuD;IACzD,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,uCAAuC;IAEzD,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,OAAO,EAAE,aAAa,EAAE,CAAC;YAC3B,SAAS,EAAE,gBAAgB,EAAE,CAAC;QAChC,CAAC;aAAM,CAAC;YACN,SAAS,EAAE,gBAAgB,EAAE,CAAC;QAChC,CAAC;QAED,OAAO,GAAG,EAAE,CAAC,SAAS,EAAE,gBAAgB,EAAE,CAAC;IAC7C,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC;IAExC,OAAO;QACL,KAAK;KACN,CAAC;AACJ,CAAC,CAAC;AAEF,OAAO,EAAE,UAAU,EAAE,CAAC","sourcesContent":["import { useCivicAuthConfig } from \"@/shared/hooks/useCivicAuthConfig.js\";\nimport { useEffect, useState } from \"react\";\nimport { BrowserCookieStorage } from \"@/shared/index.js\";\nimport { resolveAuthConfig } from \"../config.js\";\nimport { NextClientAuthenticationRefresher } from \"../NextClientAuthenticationRefresher.js\";\nimport { useSession } from \"@/shared/hooks/useSession.js\";\n\nconst useRefresh = () => {\n const [error, setError] = useState<Error>();\n const { data: session } = useSession();\n const authConfig = useCivicAuthConfig();\n\n // setup token autorefresh\n const [refresher, setRefresher] = useState<\n NextClientAuthenticationRefresher | undefined\n >(undefined);\n\n useEffect(() => {\n if (!authConfig) return;\n const abortController = new AbortController();\n const currentRefresher = refresher;\n const config = resolveAuthConfig(authConfig ?? {});\n const storage = new BrowserCookieStorage(\n config.cookies.tokens.access_token,\n );\n const onError = async (error: Error) => {\n console.error(\"Error refreshing token\", error);\n refresher?.clearAutorefresh();\n setError(error);\n };\n\n NextClientAuthenticationRefresher.build({ ...authConfig }, storage, onError)\n .then((newRefresher) => {\n if (abortController.signal.aborted) return;\n\n currentRefresher?.clearAutorefresh();\n setRefresher(newRefresher);\n })\n .catch((error: Error) => {\n if (abortController.signal.aborted) return;\n setError(error);\n });\n\n return () => {\n abortController.abort();\n currentRefresher?.clearAutorefresh();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [authConfig]); // Only depend on what actually changes\n\n useEffect(() => {\n if (session?.authenticated) {\n refresher?.setupAutorefresh();\n } else {\n refresher?.clearAutorefresh();\n }\n\n return () => refresher?.clearAutorefresh();\n }, [refresher, session?.authenticated]);\n\n return {\n error,\n };\n};\n\nexport { useRefresh };\n"]}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import type { LoaderFunctionArgs } from "react-router";
|
|
2
|
-
/**
|
|
3
|
-
* React Router loader function to read auth cookies on the server
|
|
4
|
-
* Use this in your route definitions to preload auth data
|
|
5
|
-
*/
|
|
6
|
-
export declare function authLoader({ request }: LoaderFunctionArgs): Promise<{
|
|
7
|
-
auth: {
|
|
8
|
-
idToken: string | null;
|
|
9
|
-
accessToken: string | null;
|
|
10
|
-
refreshToken: string | null;
|
|
11
|
-
user: any;
|
|
12
|
-
};
|
|
13
|
-
}>;
|
|
14
|
-
/**
|
|
15
|
-
* HOC to wrap your route component with auth data
|
|
16
|
-
*/
|
|
17
|
-
export declare function withAuthLoader(Component: React.ComponentType<any>): (props: any) => Component;
|
|
18
|
-
//# sourceMappingURL=auth-loader.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"auth-loader.d.ts","sourceRoot":"","sources":["../../src/react-router-7/auth-loader.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAGvD;;;GAGG;AACH,wBAAsB,UAAU,CAAC,EAAE,OAAO,EAAE,EAAE,kBAAkB;;;;;;;GAmB/D;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,WACpB,GAAG,KAKrC,SAAS,CAEpB"}
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
import { ReactRouterCookieStorage } from "./cookies.js";
|
|
2
|
-
/**
|
|
3
|
-
* React Router loader function to read auth cookies on the server
|
|
4
|
-
* Use this in your route definitions to preload auth data
|
|
5
|
-
*/
|
|
6
|
-
export async function authLoader({ request }) {
|
|
7
|
-
const storage = new ReactRouterCookieStorage(request);
|
|
8
|
-
// Read auth tokens from cookies
|
|
9
|
-
const [idToken, accessToken, refreshToken, user] = await Promise.all([
|
|
10
|
-
storage.get("id_token"),
|
|
11
|
-
storage.get("access_token"),
|
|
12
|
-
storage.get("refresh_token"),
|
|
13
|
-
storage.get("user"),
|
|
14
|
-
]);
|
|
15
|
-
return {
|
|
16
|
-
auth: {
|
|
17
|
-
idToken,
|
|
18
|
-
accessToken,
|
|
19
|
-
refreshToken,
|
|
20
|
-
user: user ? JSON.parse(user) : null,
|
|
21
|
-
},
|
|
22
|
-
};
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* HOC to wrap your route component with auth data
|
|
26
|
-
*/
|
|
27
|
-
export function withAuthLoader(Component) {
|
|
28
|
-
return function AuthWrappedComponent(props) {
|
|
29
|
-
// Access auth data from loader
|
|
30
|
-
const { auth } = props.loaderData || {};
|
|
31
|
-
// Pass auth data to the component
|
|
32
|
-
return { ...props };
|
|
33
|
-
authData = { auth } / > ;
|
|
34
|
-
};
|
|
35
|
-
}
|
|
36
|
-
//# sourceMappingURL=auth-loader.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"auth-loader.js","sourceRoot":"","sources":["../../src/react-router-7/auth-loader.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAC;AAExD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,EAAE,OAAO,EAAsB;IAC9D,MAAM,OAAO,GAAG,IAAI,wBAAwB,CAAC,OAAO,CAAC,CAAC;IAEtD,gCAAgC;IAChC,MAAM,CAAC,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,IAAI,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACnE,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC;KACpB,CAAC,CAAC;IAEH,OAAO;QACL,IAAI,EAAE;YACJ,OAAO;YACP,WAAW;YACX,YAAY;YACZ,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI;SACrC;KACF,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,SAAmC;IAChE,OAAO,SAAS,oBAAoB,CAAC,KAAU;QAC7C,+BAA+B;QAC/B,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC,UAAU,IAAI,EAAE,CAAC;QAExC,kCAAkC;QAClC,OAAkB,EAAC,GAAG,KAAK,EAAC,CAAA;QAAC,QAAQ,GAAC,EAAC,IAAI,EAAC,GAAE,GAAC,CAAC;IAClD,CAAC,CAAC;AACJ,CAAC","sourcesContent":["import type { LoaderFunctionArgs } from \"react-router\";\nimport { ReactRouterCookieStorage } from \"./cookies.js\";\n\n/**\n * React Router loader function to read auth cookies on the server\n * Use this in your route definitions to preload auth data\n */\nexport async function authLoader({ request }: LoaderFunctionArgs) {\n const storage = new ReactRouterCookieStorage(request);\n \n // Read auth tokens from cookies\n const [idToken, accessToken, refreshToken, user] = await Promise.all([\n storage.get(\"id_token\"),\n storage.get(\"access_token\"),\n storage.get(\"refresh_token\"),\n storage.get(\"user\"),\n ]);\n\n return {\n auth: {\n idToken,\n accessToken,\n refreshToken,\n user: user ? JSON.parse(user) : null,\n },\n };\n}\n\n/**\n * HOC to wrap your route component with auth data\n */\nexport function withAuthLoader(Component: React.ComponentType<any>) {\n return function AuthWrappedComponent(props: any) {\n // Access auth data from loader\n const { auth } = props.loaderData || {};\n \n // Pass auth data to the component\n return <Component {...props} authData={auth} />;\n };\n}"]}
|
|
@@ -1,44 +0,0 @@
|
|
|
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
|
-
isAuthenticationPreloaded: () => boolean;
|
|
22
|
-
setPreloadEnabled: (enabled: boolean) => void;
|
|
23
|
-
getPreloadEnabled: () => boolean;
|
|
24
|
-
displayMode?: DisplayMode;
|
|
25
|
-
}
|
|
26
|
-
declare const CivicAuthContext: React.Context<CivicAuthContextType | null>;
|
|
27
|
-
export interface CivicAuthContextProviderProps {
|
|
28
|
-
children: ReactNode;
|
|
29
|
-
clientId: string;
|
|
30
|
-
redirectUrl?: string;
|
|
31
|
-
oauthServerBaseUrl?: string;
|
|
32
|
-
scopes?: string[];
|
|
33
|
-
displayMode?: DisplayMode;
|
|
34
|
-
iframeDisplayMode?: "modal" | "embedded";
|
|
35
|
-
onSignIn?: (error?: Error) => void;
|
|
36
|
-
onSignOut?: () => void;
|
|
37
|
-
nonce?: string;
|
|
38
|
-
authProcessTimeout?: number;
|
|
39
|
-
preloadIframe?: boolean;
|
|
40
|
-
}
|
|
41
|
-
export declare const CivicAuthContextProvider: React.FC<CivicAuthContextProviderProps>;
|
|
42
|
-
export declare const useCivicAuthContext: () => CivicAuthContextType;
|
|
43
|
-
export { CivicAuthContext };
|
|
44
|
-
//# sourceMappingURL=CivicAuthContext.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
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;AASnE,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,yBAAyB,EAAE,MAAM,OAAO,CAAC;IACzC,iBAAiB,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAC9C,iBAAiB,EAAE,MAAM,OAAO,CAAC;IAGjC,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;IAC5B,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,eAAO,MAAM,wBAAwB,EAAE,KAAK,CAAC,EAAE,CAC7C,6BAA6B,CA+W9B,CAAC;AAEF,eAAO,MAAM,mBAAmB,QAAO,oBAQtC,CAAC;AAEF,OAAO,EAAE,gBAAgB,EAAE,CAAC"}
|
|
@@ -1,313 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
import { jsx as _jsx } from "@emotion/react/jsx-runtime";
|
|
3
|
-
import React, { createContext, useContext, useEffect, useState, useCallback, useMemo, useRef, } from "react";
|
|
4
|
-
import { CivicAuth, AuthEvent, } from "../../vanillajs/index.js";
|
|
5
|
-
import { AuthenticationEvents } from "../../vanillajs/auth/AuthenticationEvents.js";
|
|
6
|
-
import { extractTokensFromSession } from "../../vanillajs/utils/auth-utils.js";
|
|
7
|
-
import { DEFAULT_AUTH_PROCESS_TIMEOUT } from "../../vanillajs/auth/types/AuthTypes.js";
|
|
8
|
-
const CivicAuthContext = createContext(null);
|
|
9
|
-
export const CivicAuthContextProvider = ({ children, clientId, redirectUrl, oauthServerBaseUrl = "https://auth.civic.com/oauth/", scopes = ["openid", "profile", "email", "offline_access"], displayMode = "iframe", iframeDisplayMode = "modal", onSignIn, onSignOut, nonce, authProcessTimeout = DEFAULT_AUTH_PROCESS_TIMEOUT, preloadIframe, }) => {
|
|
10
|
-
const [auth, setAuth] = useState(null);
|
|
11
|
-
const [user, setUser] = useState(null);
|
|
12
|
-
const [session, setSession] = useState(null);
|
|
13
|
-
const [isLoading, setIsLoading] = useState(true);
|
|
14
|
-
const [authStatus, setAuthStatus] = useState("unauthenticated");
|
|
15
|
-
const [error, setError] = useState(null);
|
|
16
|
-
// Track initialization to prevent double-execution in React StrictMode
|
|
17
|
-
const initializationRef = useRef({
|
|
18
|
-
isInitializing: false,
|
|
19
|
-
isInitialized: false,
|
|
20
|
-
});
|
|
21
|
-
useEffect(() => {
|
|
22
|
-
let isMounted = true;
|
|
23
|
-
// Prevent double initialization in React StrictMode
|
|
24
|
-
if (initializationRef.current.isInitializing ||
|
|
25
|
-
initializationRef.current.isInitialized) {
|
|
26
|
-
// `[CivicAuthContext] Skipping initialization ${initId} - already initializing/initialized`,
|
|
27
|
-
return;
|
|
28
|
-
}
|
|
29
|
-
// Capture ref value at effect setup time for cleanup
|
|
30
|
-
const initializationState = initializationRef.current;
|
|
31
|
-
initializationRef.current.isInitializing = true;
|
|
32
|
-
const refreshUserAndSession = async () => {
|
|
33
|
-
if (!auth)
|
|
34
|
-
return;
|
|
35
|
-
try {
|
|
36
|
-
const currentSession = await auth.getCurrentSession();
|
|
37
|
-
const currentUser = await auth.getCurrentUser();
|
|
38
|
-
if (isMounted) {
|
|
39
|
-
setSession(currentSession);
|
|
40
|
-
setUser(currentUser);
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
catch (err) {
|
|
44
|
-
if (isMounted) {
|
|
45
|
-
const sessionError = err instanceof Error ? err : new Error("Failed to get session");
|
|
46
|
-
setError(sessionError);
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
};
|
|
50
|
-
const initializeAuth = async () => {
|
|
51
|
-
try {
|
|
52
|
-
const events = new AuthenticationEvents();
|
|
53
|
-
// Set up event listeners
|
|
54
|
-
events.on(AuthEvent.SIGN_IN_STARTED, () => {
|
|
55
|
-
if (isMounted) {
|
|
56
|
-
setIsLoading(true);
|
|
57
|
-
setAuthStatus("authenticating");
|
|
58
|
-
setError(null);
|
|
59
|
-
}
|
|
60
|
-
});
|
|
61
|
-
events.on(AuthEvent.SIGN_IN_COMPLETE, () => {
|
|
62
|
-
if (isMounted) {
|
|
63
|
-
setIsLoading(false);
|
|
64
|
-
setAuthStatus("authenticated");
|
|
65
|
-
setError(null);
|
|
66
|
-
onSignIn?.();
|
|
67
|
-
}
|
|
68
|
-
});
|
|
69
|
-
events.on(AuthEvent.SIGN_IN_ERROR, (event) => {
|
|
70
|
-
if (isMounted) {
|
|
71
|
-
setIsLoading(false);
|
|
72
|
-
setAuthStatus("error");
|
|
73
|
-
const errorDetail = event?.detail || "Authentication failed";
|
|
74
|
-
const authError = new Error(errorDetail);
|
|
75
|
-
setError(authError);
|
|
76
|
-
onSignIn?.(authError);
|
|
77
|
-
}
|
|
78
|
-
});
|
|
79
|
-
events.on(AuthEvent.SIGN_OUT_STARTED, () => {
|
|
80
|
-
if (isMounted) {
|
|
81
|
-
setIsLoading(true);
|
|
82
|
-
setAuthStatus("signing_out");
|
|
83
|
-
setError(null);
|
|
84
|
-
}
|
|
85
|
-
});
|
|
86
|
-
events.on(AuthEvent.SIGN_OUT_COMPLETE, () => {
|
|
87
|
-
if (isMounted) {
|
|
88
|
-
setIsLoading(false);
|
|
89
|
-
setAuthStatus("unauthenticated");
|
|
90
|
-
setUser(null);
|
|
91
|
-
setSession(null);
|
|
92
|
-
setError(null);
|
|
93
|
-
onSignOut?.();
|
|
94
|
-
}
|
|
95
|
-
});
|
|
96
|
-
events.on(AuthEvent.USER_SESSION_CHANGED, () => {
|
|
97
|
-
if (isMounted) {
|
|
98
|
-
refreshUserAndSession();
|
|
99
|
-
}
|
|
100
|
-
});
|
|
101
|
-
const authInstance = await CivicAuth.create({
|
|
102
|
-
clientId,
|
|
103
|
-
redirectUrl: redirectUrl ||
|
|
104
|
-
`${window.location.origin}${window.location.pathname}`,
|
|
105
|
-
oauthServerBaseUrl,
|
|
106
|
-
scopes,
|
|
107
|
-
displayMode,
|
|
108
|
-
iframeDisplayMode,
|
|
109
|
-
nonce,
|
|
110
|
-
authProcessTimeout,
|
|
111
|
-
preloadIframe,
|
|
112
|
-
events,
|
|
113
|
-
});
|
|
114
|
-
if (isMounted) {
|
|
115
|
-
setAuth(authInstance);
|
|
116
|
-
// Mark initialization as complete
|
|
117
|
-
initializationRef.current.isInitializing = false;
|
|
118
|
-
initializationRef.current.isInitialized = true;
|
|
119
|
-
// Check initial auth state
|
|
120
|
-
const isAuthenticated = await authInstance.isAuthenticated();
|
|
121
|
-
if (isAuthenticated) {
|
|
122
|
-
setAuthStatus("authenticated");
|
|
123
|
-
await refreshUserAndSession();
|
|
124
|
-
}
|
|
125
|
-
else {
|
|
126
|
-
setAuthStatus("unauthenticated");
|
|
127
|
-
// Note: Preloading is now handled automatically by CivicAuth based on config.preloadIframe
|
|
128
|
-
}
|
|
129
|
-
// Mark initialization as complete
|
|
130
|
-
setIsLoading(false);
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
catch (err) {
|
|
134
|
-
console.error(err);
|
|
135
|
-
if (isMounted) {
|
|
136
|
-
const initError = err instanceof Error ? err : new Error("Failed to initialize auth");
|
|
137
|
-
setError(initError);
|
|
138
|
-
setAuthStatus("error");
|
|
139
|
-
setIsLoading(false); // Stop loading even on error
|
|
140
|
-
// Mark initialization as failed
|
|
141
|
-
initializationRef.current.isInitializing = false;
|
|
142
|
-
// Don't mark as initialized on error so it can be retried
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
};
|
|
146
|
-
initializeAuth();
|
|
147
|
-
return () => {
|
|
148
|
-
isMounted = false;
|
|
149
|
-
// Reset initialization guards to allow remount to reinitialize
|
|
150
|
-
// This is necessary for React StrictMode compatibility
|
|
151
|
-
if (initializationState.isInitializing) {
|
|
152
|
-
initializationState.isInitializing = false;
|
|
153
|
-
initializationState.isInitialized = false;
|
|
154
|
-
}
|
|
155
|
-
if (auth) {
|
|
156
|
-
auth.destroy();
|
|
157
|
-
}
|
|
158
|
-
};
|
|
159
|
-
// Refresh user and session when auth instance changes
|
|
160
|
-
/*
|
|
161
|
-
* Intentionally omitting dependencies to prevent infinite loops.
|
|
162
|
-
* Adding auth, onSignIn, onSignOut, and scopes to the dependency array would cause
|
|
163
|
-
* the effect to re-run whenever these values change, which could lead to unnecessary
|
|
164
|
-
* re-renders and potential infinite loops since the effect updates state that might
|
|
165
|
-
* trigger re-renders of parent components.
|
|
166
|
-
*
|
|
167
|
-
* IMPORTANT: redirectUrl is intentionally omitted to prevent re-initialization
|
|
168
|
-
* during OAuth callback when URL parameters change, which would cause
|
|
169
|
-
* "invalid_grant" errors due to authorization code reuse.
|
|
170
|
-
*/
|
|
171
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
172
|
-
}, [
|
|
173
|
-
clientId,
|
|
174
|
-
oauthServerBaseUrl,
|
|
175
|
-
displayMode,
|
|
176
|
-
iframeDisplayMode,
|
|
177
|
-
nonce,
|
|
178
|
-
authProcessTimeout,
|
|
179
|
-
preloadIframe,
|
|
180
|
-
]);
|
|
181
|
-
// This is on load to get the user and session
|
|
182
|
-
useEffect(() => {
|
|
183
|
-
if (auth && authStatus === "authenticated") {
|
|
184
|
-
const refreshUserAndSession = async () => {
|
|
185
|
-
try {
|
|
186
|
-
const currentSession = await auth.getCurrentSession();
|
|
187
|
-
const currentUser = await auth.getCurrentUser();
|
|
188
|
-
setSession(currentSession);
|
|
189
|
-
setUser(currentUser);
|
|
190
|
-
}
|
|
191
|
-
catch (err) {
|
|
192
|
-
const sessionError = err instanceof Error ? err : new Error("Failed to get session");
|
|
193
|
-
setError(sessionError);
|
|
194
|
-
}
|
|
195
|
-
};
|
|
196
|
-
refreshUserAndSession();
|
|
197
|
-
}
|
|
198
|
-
}, [auth, authStatus]);
|
|
199
|
-
const signIn = useCallback(async () => {
|
|
200
|
-
if (!auth) {
|
|
201
|
-
// If auth is still loading, provide a more helpful error
|
|
202
|
-
if (isLoading) {
|
|
203
|
-
throw new Error("Authentication is still initializing, please wait...");
|
|
204
|
-
}
|
|
205
|
-
throw new Error("Auth not initialized");
|
|
206
|
-
}
|
|
207
|
-
try {
|
|
208
|
-
const { user } = await auth.startAuthentication();
|
|
209
|
-
// Refresh user and session after successful authentication
|
|
210
|
-
const currentSession = await auth.getCurrentSession();
|
|
211
|
-
setSession(currentSession);
|
|
212
|
-
setUser(user ?? null);
|
|
213
|
-
// Ensure we have a user to return
|
|
214
|
-
if (!user) {
|
|
215
|
-
throw new Error("Authentication succeeded but no user was returned");
|
|
216
|
-
}
|
|
217
|
-
// Return the user object
|
|
218
|
-
return { user };
|
|
219
|
-
}
|
|
220
|
-
catch (err) {
|
|
221
|
-
const signInError = err instanceof Error ? err : new Error("Sign in failed");
|
|
222
|
-
setError(signInError);
|
|
223
|
-
throw signInError;
|
|
224
|
-
}
|
|
225
|
-
}, [auth, isLoading]);
|
|
226
|
-
const signOut = useCallback(async () => {
|
|
227
|
-
if (!auth) {
|
|
228
|
-
// If auth is still loading, provide a more helpful error
|
|
229
|
-
if (isLoading) {
|
|
230
|
-
throw new Error("Authentication is still initializing, please wait...");
|
|
231
|
-
}
|
|
232
|
-
throw new Error("Auth not initialized");
|
|
233
|
-
}
|
|
234
|
-
try {
|
|
235
|
-
await auth.logout();
|
|
236
|
-
setUser(null);
|
|
237
|
-
setSession(null);
|
|
238
|
-
}
|
|
239
|
-
catch (err) {
|
|
240
|
-
const signOutError = err instanceof Error ? err : new Error("Sign out failed");
|
|
241
|
-
setError(signOutError);
|
|
242
|
-
throw signOutError;
|
|
243
|
-
}
|
|
244
|
-
}, [auth, isLoading]);
|
|
245
|
-
const isAuthenticationPreloaded = useCallback(() => {
|
|
246
|
-
return auth?.isAuthenticationPreloaded() ?? false;
|
|
247
|
-
}, [auth]);
|
|
248
|
-
const setPreloadEnabled = useCallback((enabled) => {
|
|
249
|
-
if (!auth) {
|
|
250
|
-
throw new Error("Auth not initialized");
|
|
251
|
-
}
|
|
252
|
-
auth.setPreloadEnabled(enabled);
|
|
253
|
-
}, [auth]);
|
|
254
|
-
const getPreloadEnabled = useCallback(() => {
|
|
255
|
-
return auth?.getPreloadEnabled() ?? true;
|
|
256
|
-
}, [auth]);
|
|
257
|
-
// Extract tokens from session
|
|
258
|
-
const idToken = session?.idToken;
|
|
259
|
-
const accessToken = session?.accessToken;
|
|
260
|
-
const refreshToken = session?.refreshToken;
|
|
261
|
-
// Extract forwardedTokens from session's ID token
|
|
262
|
-
const forwardedTokens = useMemo(() => {
|
|
263
|
-
if (!session)
|
|
264
|
-
return undefined;
|
|
265
|
-
const tokens = extractTokensFromSession(session);
|
|
266
|
-
return tokens.forwardedTokens;
|
|
267
|
-
}, [session]);
|
|
268
|
-
const contextValue = useMemo(() => ({
|
|
269
|
-
auth,
|
|
270
|
-
user,
|
|
271
|
-
session,
|
|
272
|
-
isLoading,
|
|
273
|
-
authStatus,
|
|
274
|
-
error,
|
|
275
|
-
idToken,
|
|
276
|
-
accessToken,
|
|
277
|
-
refreshToken,
|
|
278
|
-
forwardedTokens,
|
|
279
|
-
signIn,
|
|
280
|
-
signOut,
|
|
281
|
-
isAuthenticationPreloaded,
|
|
282
|
-
setPreloadEnabled,
|
|
283
|
-
getPreloadEnabled,
|
|
284
|
-
displayMode,
|
|
285
|
-
}), [
|
|
286
|
-
auth,
|
|
287
|
-
user,
|
|
288
|
-
session,
|
|
289
|
-
isLoading,
|
|
290
|
-
authStatus,
|
|
291
|
-
error,
|
|
292
|
-
idToken,
|
|
293
|
-
accessToken,
|
|
294
|
-
refreshToken,
|
|
295
|
-
forwardedTokens,
|
|
296
|
-
signIn,
|
|
297
|
-
signOut,
|
|
298
|
-
isAuthenticationPreloaded,
|
|
299
|
-
setPreloadEnabled,
|
|
300
|
-
getPreloadEnabled,
|
|
301
|
-
displayMode,
|
|
302
|
-
]);
|
|
303
|
-
return (_jsx(CivicAuthContext.Provider, { value: contextValue, children: children }));
|
|
304
|
-
};
|
|
305
|
-
export const useCivicAuthContext = () => {
|
|
306
|
-
const context = useContext(CivicAuthContext);
|
|
307
|
-
if (!context) {
|
|
308
|
-
throw new Error("useCivicAuthContext must be used within a CivicAuthContextProvider");
|
|
309
|
-
}
|
|
310
|
-
return context;
|
|
311
|
-
};
|
|
312
|
-
export { CivicAuthContext };
|
|
313
|
-
//# sourceMappingURL=CivicAuthContext.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"CivicAuthContext.js","sourceRoot":"","sources":["../../../src/reactjs/providers/CivicAuthContext.tsx"],"names":[],"mappings":"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","sourcesContent":["\"use client\";\nimport React, {\n createContext,\n useContext,\n useEffect,\n useState,\n useCallback,\n useMemo,\n useRef,\n} from \"react\";\nimport type { ReactNode } from \"react\";\nimport {\n CivicAuth,\n AuthEvent,\n type Session,\n type User,\n} from \"../../vanillajs/index.js\";\nimport { AuthenticationEvents } from \"../../vanillajs/auth/AuthenticationEvents.js\";\nimport type { DisplayMode, ForwardedTokens } from \"../../types.js\";\nimport { extractTokensFromSession } from \"../../vanillajs/utils/auth-utils.js\";\nimport { DEFAULT_AUTH_PROCESS_TIMEOUT } from \"../../vanillajs/auth/types/AuthTypes.js\";\n\n// Event payload interfaces\ninterface SignInErrorEvent {\n detail: string;\n}\n\nexport type AuthStatusEnum =\n | \"authenticated\"\n | \"unauthenticated\"\n | \"authenticating\"\n | \"error\"\n | \"signing_out\";\n\nexport interface CivicAuthContextType {\n // Core auth instance\n auth: CivicAuth | null;\n\n // User and session state\n user: User | null;\n session: Session | null;\n\n // Auth state\n isLoading: boolean;\n authStatus: AuthStatusEnum;\n error: Error | null;\n\n // Tokens\n idToken?: string;\n accessToken?: string;\n refreshToken?: string;\n forwardedTokens?: ForwardedTokens;\n\n // Auth methods\n signIn: () => Promise<{ user: User }>;\n signOut: () => Promise<void>;\n\n // Preloading methods\n isAuthenticationPreloaded: () => boolean;\n setPreloadEnabled: (enabled: boolean) => void;\n getPreloadEnabled: () => boolean;\n\n // Config\n displayMode?: DisplayMode;\n}\n\nconst CivicAuthContext = createContext<CivicAuthContextType | null>(null);\n\nexport interface CivicAuthContextProviderProps {\n children: ReactNode;\n clientId: string;\n redirectUrl?: string;\n oauthServerBaseUrl?: string;\n scopes?: string[];\n displayMode?: DisplayMode;\n iframeDisplayMode?: \"modal\" | \"embedded\";\n onSignIn?: (error?: Error) => void;\n onSignOut?: () => void;\n nonce?: string;\n authProcessTimeout?: number;\n preloadIframe?: boolean;\n}\n\nexport const CivicAuthContextProvider: React.FC<\n CivicAuthContextProviderProps\n> = ({\n children,\n clientId,\n redirectUrl,\n oauthServerBaseUrl = \"https://auth.civic.com/oauth/\",\n scopes = [\"openid\", \"profile\", \"email\", \"offline_access\"],\n displayMode = \"iframe\",\n iframeDisplayMode = \"modal\",\n onSignIn,\n onSignOut,\n nonce,\n authProcessTimeout = DEFAULT_AUTH_PROCESS_TIMEOUT,\n preloadIframe,\n}) => {\n const [auth, setAuth] = useState<CivicAuth | null>(null);\n const [user, setUser] = useState<User | null>(null);\n const [session, setSession] = useState<Session | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [authStatus, setAuthStatus] =\n useState<AuthStatusEnum>(\"unauthenticated\");\n const [error, setError] = useState<Error | null>(null);\n\n // Track initialization to prevent double-execution in React StrictMode\n const initializationRef = useRef<{\n isInitializing: boolean;\n isInitialized: boolean;\n }>({\n isInitializing: false,\n isInitialized: false,\n });\n\n useEffect(() => {\n let isMounted = true;\n\n // Prevent double initialization in React StrictMode\n if (\n initializationRef.current.isInitializing ||\n initializationRef.current.isInitialized\n ) {\n // `[CivicAuthContext] Skipping initialization ${initId} - already initializing/initialized`,\n\n return;\n }\n\n // Capture ref value at effect setup time for cleanup\n const initializationState = initializationRef.current;\n\n initializationRef.current.isInitializing = true;\n\n const refreshUserAndSession = async () => {\n if (!auth) return;\n\n try {\n const currentSession = await auth.getCurrentSession();\n const currentUser = await auth.getCurrentUser();\n\n if (isMounted) {\n setSession(currentSession);\n setUser(currentUser);\n }\n } catch (err) {\n if (isMounted) {\n const sessionError =\n err instanceof Error ? err : new Error(\"Failed to get session\");\n setError(sessionError);\n }\n }\n };\n\n const initializeAuth = async () => {\n try {\n const events = new AuthenticationEvents();\n\n // Set up event listeners\n events.on(AuthEvent.SIGN_IN_STARTED, () => {\n if (isMounted) {\n setIsLoading(true);\n setAuthStatus(\"authenticating\");\n setError(null);\n }\n });\n\n events.on(AuthEvent.SIGN_IN_COMPLETE, () => {\n if (isMounted) {\n setIsLoading(false);\n setAuthStatus(\"authenticated\");\n setError(null);\n onSignIn?.();\n }\n });\n\n events.on(AuthEvent.SIGN_IN_ERROR, (event?: SignInErrorEvent) => {\n if (isMounted) {\n setIsLoading(false);\n setAuthStatus(\"error\");\n const errorDetail = event?.detail || \"Authentication failed\";\n const authError = new Error(errorDetail);\n setError(authError);\n onSignIn?.(authError);\n }\n });\n\n events.on(AuthEvent.SIGN_OUT_STARTED, () => {\n if (isMounted) {\n setIsLoading(true);\n setAuthStatus(\"signing_out\");\n setError(null);\n }\n });\n\n events.on(AuthEvent.SIGN_OUT_COMPLETE, () => {\n if (isMounted) {\n setIsLoading(false);\n setAuthStatus(\"unauthenticated\");\n setUser(null);\n setSession(null);\n setError(null);\n onSignOut?.();\n }\n });\n\n events.on(AuthEvent.USER_SESSION_CHANGED, () => {\n if (isMounted) {\n refreshUserAndSession();\n }\n });\n\n const authInstance = await CivicAuth.create({\n clientId,\n redirectUrl:\n redirectUrl ||\n `${window.location.origin}${window.location.pathname}`,\n oauthServerBaseUrl,\n scopes,\n displayMode,\n iframeDisplayMode,\n nonce,\n authProcessTimeout,\n preloadIframe,\n events,\n });\n\n if (isMounted) {\n setAuth(authInstance);\n\n // Mark initialization as complete\n initializationRef.current.isInitializing = false;\n initializationRef.current.isInitialized = true;\n\n // Check initial auth state\n const isAuthenticated = await authInstance.isAuthenticated();\n if (isAuthenticated) {\n setAuthStatus(\"authenticated\");\n await refreshUserAndSession();\n } else {\n setAuthStatus(\"unauthenticated\");\n\n // Note: Preloading is now handled automatically by CivicAuth based on config.preloadIframe\n }\n\n // Mark initialization as complete\n setIsLoading(false);\n }\n } catch (err) {\n console.error(err);\n if (isMounted) {\n const initError =\n err instanceof Error ? err : new Error(\"Failed to initialize auth\");\n setError(initError);\n setAuthStatus(\"error\");\n setIsLoading(false); // Stop loading even on error\n\n // Mark initialization as failed\n initializationRef.current.isInitializing = false;\n // Don't mark as initialized on error so it can be retried\n }\n }\n };\n\n initializeAuth();\n\n return () => {\n isMounted = false;\n\n // Reset initialization guards to allow remount to reinitialize\n // This is necessary for React StrictMode compatibility\n if (initializationState.isInitializing) {\n initializationState.isInitializing = false;\n initializationState.isInitialized = false;\n }\n\n if (auth) {\n auth.destroy();\n }\n };\n // Refresh user and session when auth instance changes\n /*\n * Intentionally omitting dependencies to prevent infinite loops.\n * Adding auth, onSignIn, onSignOut, and scopes to the dependency array would cause\n * the effect to re-run whenever these values change, which could lead to unnecessary\n * re-renders and potential infinite loops since the effect updates state that might\n * trigger re-renders of parent components.\n *\n * IMPORTANT: redirectUrl is intentionally omitted to prevent re-initialization\n * during OAuth callback when URL parameters change, which would cause\n * \"invalid_grant\" errors due to authorization code reuse.\n */\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n clientId,\n oauthServerBaseUrl,\n displayMode,\n iframeDisplayMode,\n nonce,\n authProcessTimeout,\n preloadIframe,\n ]);\n\n // This is on load to get the user and session\n useEffect(() => {\n if (auth && authStatus === \"authenticated\") {\n const refreshUserAndSession = async () => {\n try {\n const currentSession = await auth.getCurrentSession();\n const currentUser = await auth.getCurrentUser();\n setSession(currentSession);\n setUser(currentUser);\n } catch (err) {\n const sessionError =\n err instanceof Error ? err : new Error(\"Failed to get session\");\n setError(sessionError);\n }\n };\n\n refreshUserAndSession();\n }\n }, [auth, authStatus]);\n\n const signIn = useCallback(async () => {\n if (!auth) {\n // If auth is still loading, provide a more helpful error\n if (isLoading) {\n throw new Error(\"Authentication is still initializing, please wait...\");\n }\n throw new Error(\"Auth not initialized\");\n }\n\n try {\n const { user } = await auth.startAuthentication();\n\n // Refresh user and session after successful authentication\n const currentSession = await auth.getCurrentSession();\n\n setSession(currentSession);\n setUser(user ?? null);\n\n // Ensure we have a user to return\n if (!user) {\n throw new Error(\"Authentication succeeded but no user was returned\");\n }\n\n // Return the user object\n return { user };\n } catch (err) {\n const signInError =\n err instanceof Error ? err : new Error(\"Sign in failed\");\n setError(signInError);\n throw signInError;\n }\n }, [auth, isLoading]);\n\n const signOut = useCallback(async () => {\n if (!auth) {\n // If auth is still loading, provide a more helpful error\n if (isLoading) {\n throw new Error(\"Authentication is still initializing, please wait...\");\n }\n throw new Error(\"Auth not initialized\");\n }\n\n try {\n await auth.logout();\n setUser(null);\n setSession(null);\n } catch (err) {\n const signOutError =\n err instanceof Error ? err : new Error(\"Sign out failed\");\n setError(signOutError);\n throw signOutError;\n }\n }, [auth, isLoading]);\n\n const isAuthenticationPreloaded = useCallback(() => {\n return auth?.isAuthenticationPreloaded() ?? false;\n }, [auth]);\n\n const setPreloadEnabled = useCallback(\n (enabled: boolean) => {\n if (!auth) {\n throw new Error(\"Auth not initialized\");\n }\n auth.setPreloadEnabled(enabled);\n },\n [auth],\n );\n\n const getPreloadEnabled = useCallback(() => {\n return auth?.getPreloadEnabled() ?? true;\n }, [auth]);\n\n // Extract tokens from session\n const idToken = session?.idToken;\n const accessToken = session?.accessToken;\n const refreshToken = session?.refreshToken;\n\n // Extract forwardedTokens from session's ID token\n const forwardedTokens = useMemo(() => {\n if (!session) return undefined;\n const tokens = extractTokensFromSession(session);\n return tokens.forwardedTokens;\n }, [session]);\n\n const contextValue: CivicAuthContextType = useMemo(\n () => ({\n auth,\n user,\n session,\n isLoading,\n authStatus,\n error,\n idToken,\n accessToken,\n refreshToken,\n forwardedTokens,\n signIn,\n signOut,\n isAuthenticationPreloaded,\n setPreloadEnabled,\n getPreloadEnabled,\n displayMode,\n }),\n [\n auth,\n user,\n session,\n isLoading,\n authStatus,\n error,\n idToken,\n accessToken,\n refreshToken,\n forwardedTokens,\n signIn,\n signOut,\n isAuthenticationPreloaded,\n setPreloadEnabled,\n getPreloadEnabled,\n displayMode,\n ],\n );\n\n return (\n <CivicAuthContext.Provider value={contextValue}>\n {children}\n </CivicAuthContext.Provider>\n );\n};\n\nexport const useCivicAuthContext = (): CivicAuthContextType => {\n const context = useContext(CivicAuthContext);\n if (!context) {\n throw new Error(\n \"useCivicAuthContext must be used within a CivicAuthContextProvider\",\n );\n }\n return context;\n};\n\nexport { CivicAuthContext };\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useCivicAuthConfig.d.ts","sourceRoot":"","sources":["../../../src/shared/hooks/useCivicAuthConfig.ts"],"names":[],"mappings":"AAKA,QAAA,MAAM,kBAAkB,uCAGvB,CAAC;AAEF,OAAO,EAAE,kBAAkB,EAAE,CAAC"}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
import { useContext } from "react";
|
|
3
|
-
import { CivicAuthConfigContext } from "../../shared/providers/CivicAuthConfigContext.js";
|
|
4
|
-
// TokenProvider will use this internal context to access Config
|
|
5
|
-
const useCivicAuthConfig = () => {
|
|
6
|
-
const context = useContext(CivicAuthConfigContext);
|
|
7
|
-
return context;
|
|
8
|
-
};
|
|
9
|
-
export { useCivicAuthConfig };
|
|
10
|
-
//# sourceMappingURL=useCivicAuthConfig.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useCivicAuthConfig.js","sourceRoot":"","sources":["../../../src/shared/hooks/useCivicAuthConfig.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AACb,OAAO,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AACnC,OAAO,EAAE,sBAAsB,EAAE,MAAM,8CAA8C,CAAC;AAEtF,gEAAgE;AAChE,MAAM,kBAAkB,GAAG,GAAG,EAAE;IAC9B,MAAM,OAAO,GAAG,UAAU,CAAC,sBAAsB,CAAC,CAAC;IACnD,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC;AAEF,OAAO,EAAE,kBAAkB,EAAE,CAAC","sourcesContent":["\"use client\";\nimport { useContext } from \"react\";\nimport { CivicAuthConfigContext } from \"@/shared/providers/CivicAuthConfigContext.js\";\n\n// TokenProvider will use this internal context to access Config\nconst useCivicAuthConfig = () => {\n const context = useContext(CivicAuthConfigContext);\n return context;\n};\n\nexport { useCivicAuthConfig };\n"]}
|