@civic/auth 0.9.6-beta.1 → 0.10.0-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.
Files changed (223) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/dist/nextjs/actions.d.ts +12 -0
  3. package/dist/nextjs/actions.d.ts.map +1 -0
  4. package/dist/nextjs/actions.js +26 -0
  5. package/dist/nextjs/actions.js.map +1 -0
  6. package/dist/nextjs/config.d.ts +2 -0
  7. package/dist/nextjs/config.d.ts.map +1 -1
  8. package/dist/nextjs/config.js +3 -2
  9. package/dist/nextjs/config.js.map +1 -1
  10. package/dist/nextjs/cookies.d.ts.map +1 -1
  11. package/dist/nextjs/cookies.js +45 -3
  12. package/dist/nextjs/cookies.js.map +1 -1
  13. package/dist/nextjs/hooks/useInitialAuthConfig.d.ts +31 -0
  14. package/dist/nextjs/hooks/useInitialAuthConfig.d.ts.map +1 -0
  15. package/dist/nextjs/hooks/useInitialAuthConfig.js +113 -0
  16. package/dist/nextjs/hooks/useInitialAuthConfig.js.map +1 -0
  17. package/dist/nextjs/index.d.ts +1 -0
  18. package/dist/nextjs/index.d.ts.map +1 -1
  19. package/dist/nextjs/index.js +13 -3
  20. package/dist/nextjs/index.js.map +1 -1
  21. package/dist/nextjs/providers/NextAuthProvider.d.ts +6 -7
  22. package/dist/nextjs/providers/NextAuthProvider.d.ts.map +1 -1
  23. package/dist/nextjs/providers/NextAuthProvider.js +19 -138
  24. package/dist/nextjs/providers/NextAuthProvider.js.map +1 -1
  25. package/dist/nextjs/providers/NextAuthProviderClient.d.ts +11 -0
  26. package/dist/nextjs/providers/NextAuthProviderClient.d.ts.map +1 -0
  27. package/dist/nextjs/providers/NextAuthProviderClient.js +62 -0
  28. package/dist/nextjs/providers/NextAuthProviderClient.js.map +1 -0
  29. package/dist/nextjs/providers/ServerUserContext.d.ts +2 -0
  30. package/dist/nextjs/providers/ServerUserContext.d.ts.map +1 -0
  31. package/dist/nextjs/providers/ServerUserContext.js +5 -0
  32. package/dist/nextjs/providers/ServerUserContext.js.map +1 -0
  33. package/dist/nextjs/routeHandler.d.ts.map +1 -1
  34. package/dist/nextjs/routeHandler.js +240 -341
  35. package/dist/nextjs/routeHandler.js.map +1 -1
  36. package/dist/react-router-7/components/UserButton.js +1 -1
  37. package/dist/react-router-7/components/UserButton.js.map +1 -1
  38. package/dist/react-router-7/routeHandler.d.ts.map +1 -1
  39. package/dist/react-router-7/routeHandler.js +1 -0
  40. package/dist/react-router-7/routeHandler.js.map +1 -1
  41. package/dist/react-router-7/useUser.d.ts.map +1 -1
  42. package/dist/react-router-7/useUser.js +13 -2
  43. package/dist/react-router-7/useUser.js.map +1 -1
  44. package/dist/reactjs/components/ButtonContentOrLoader.d.ts.map +1 -1
  45. package/dist/reactjs/components/ButtonContentOrLoader.js +1 -3
  46. package/dist/reactjs/components/ButtonContentOrLoader.js.map +1 -1
  47. package/dist/reactjs/components/CivicAuthIframeContainer.d.ts +2 -0
  48. package/dist/reactjs/components/CivicAuthIframeContainer.d.ts.map +1 -0
  49. package/dist/reactjs/components/CivicAuthIframeContainer.js +26 -0
  50. package/dist/reactjs/components/CivicAuthIframeContainer.js.map +1 -0
  51. package/dist/reactjs/components/SignInButton.d.ts.map +1 -1
  52. package/dist/reactjs/components/SignInButton.js +11 -1
  53. package/dist/reactjs/components/SignInButton.js.map +1 -1
  54. package/dist/reactjs/components/UserButton.d.ts +9 -2
  55. package/dist/reactjs/components/UserButton.d.ts.map +1 -1
  56. package/dist/reactjs/components/UserButton.js +41 -9
  57. package/dist/reactjs/components/UserButton.js.map +1 -1
  58. package/dist/reactjs/components/index.d.ts +1 -0
  59. package/dist/reactjs/components/index.d.ts.map +1 -1
  60. package/dist/reactjs/components/index.js +1 -0
  61. package/dist/reactjs/components/index.js.map +1 -1
  62. package/dist/reactjs/core/GlobalAuthManager.d.ts +26 -0
  63. package/dist/reactjs/core/GlobalAuthManager.d.ts.map +1 -1
  64. package/dist/reactjs/core/GlobalAuthManager.js +76 -5
  65. package/dist/reactjs/core/GlobalAuthManager.js.map +1 -1
  66. package/dist/reactjs/hooks/useUser.d.ts +19 -2
  67. package/dist/reactjs/hooks/useUser.d.ts.map +1 -1
  68. package/dist/reactjs/hooks/useUser.js +95 -7
  69. package/dist/reactjs/hooks/useUser.js.map +1 -1
  70. package/dist/reactjs/index.d.ts +1 -2
  71. package/dist/reactjs/index.d.ts.map +1 -1
  72. package/dist/reactjs/index.js +1 -2
  73. package/dist/reactjs/index.js.map +1 -1
  74. package/dist/server/ServerAuthenticationResolver.d.ts.map +1 -1
  75. package/dist/server/ServerAuthenticationResolver.js +18 -0
  76. package/dist/server/ServerAuthenticationResolver.js.map +1 -1
  77. package/dist/server/index.d.ts +1 -1
  78. package/dist/server/index.d.ts.map +1 -1
  79. package/dist/server/index.js.map +1 -1
  80. package/dist/server/logout.d.ts.map +1 -1
  81. package/dist/server/logout.js +11 -2
  82. package/dist/server/logout.js.map +1 -1
  83. package/dist/server/session.d.ts +51 -0
  84. package/dist/server/session.d.ts.map +1 -1
  85. package/dist/server/session.js +296 -17
  86. package/dist/server/session.js.map +1 -1
  87. package/dist/shared/components/SVGLoading.js +1 -1
  88. package/dist/shared/components/SVGLoading.js.map +1 -1
  89. package/dist/shared/components/UserButtonPresentation.d.ts.map +1 -0
  90. package/dist/shared/components/UserButtonPresentation.js.map +1 -0
  91. package/dist/shared/hooks/index.d.ts +1 -2
  92. package/dist/shared/hooks/index.d.ts.map +1 -1
  93. package/dist/shared/hooks/index.js +1 -2
  94. package/dist/shared/hooks/index.js.map +1 -1
  95. package/dist/shared/hooks/useBfcacheHandler.d.ts +23 -0
  96. package/dist/shared/hooks/useBfcacheHandler.d.ts.map +1 -0
  97. package/dist/shared/hooks/useBfcacheHandler.js +65 -0
  98. package/dist/shared/hooks/useBfcacheHandler.js.map +1 -0
  99. package/dist/shared/index.d.ts +1 -0
  100. package/dist/shared/index.d.ts.map +1 -1
  101. package/dist/shared/index.js +1 -0
  102. package/dist/shared/index.js.map +1 -1
  103. package/dist/shared/lib/util.d.ts +32 -0
  104. package/dist/shared/lib/util.d.ts.map +1 -1
  105. package/dist/shared/lib/util.js +79 -0
  106. package/dist/shared/lib/util.js.map +1 -1
  107. package/dist/shared/providers/AuthStatusContext.d.ts.map +1 -1
  108. package/dist/shared/providers/AuthStatusContext.js +2 -1
  109. package/dist/shared/providers/AuthStatusContext.js.map +1 -1
  110. package/dist/shared/providers/CivicAuthConfigContext.d.ts +2 -1
  111. package/dist/shared/providers/CivicAuthConfigContext.d.ts.map +1 -1
  112. package/dist/shared/providers/CivicAuthConfigContext.js +5 -2
  113. package/dist/shared/providers/CivicAuthConfigContext.js.map +1 -1
  114. package/dist/shared/providers/types.d.ts +1 -0
  115. package/dist/shared/providers/types.d.ts.map +1 -1
  116. package/dist/shared/providers/types.js.map +1 -1
  117. package/dist/shared/utils/locationChange.d.ts +34 -0
  118. package/dist/shared/utils/locationChange.d.ts.map +1 -0
  119. package/dist/shared/utils/locationChange.js +28 -0
  120. package/dist/shared/utils/locationChange.js.map +1 -0
  121. package/dist/shared/version.d.ts +1 -1
  122. package/dist/shared/version.d.ts.map +1 -1
  123. package/dist/shared/version.js +1 -1
  124. package/dist/shared/version.js.map +1 -1
  125. package/dist/vanillajs/auth/AuthenticationEvents.d.ts +10 -1
  126. package/dist/vanillajs/auth/AuthenticationEvents.d.ts.map +1 -1
  127. package/dist/vanillajs/auth/AuthenticationEvents.js +29 -0
  128. package/dist/vanillajs/auth/AuthenticationEvents.js.map +1 -1
  129. package/dist/vanillajs/auth/BackendAuthenticationRefresher.d.ts.map +1 -1
  130. package/dist/vanillajs/auth/BackendAuthenticationRefresher.js +2 -2
  131. package/dist/vanillajs/auth/BackendAuthenticationRefresher.js.map +1 -1
  132. package/dist/vanillajs/auth/CivicAuth.d.ts +32 -0
  133. package/dist/vanillajs/auth/CivicAuth.d.ts.map +1 -1
  134. package/dist/vanillajs/auth/CivicAuth.js +270 -55
  135. package/dist/vanillajs/auth/CivicAuth.js.map +1 -1
  136. package/dist/vanillajs/auth/SessionManager.d.ts +3 -2
  137. package/dist/vanillajs/auth/SessionManager.d.ts.map +1 -1
  138. package/dist/vanillajs/auth/SessionManager.js +33 -7
  139. package/dist/vanillajs/auth/SessionManager.js.map +1 -1
  140. package/dist/vanillajs/auth/config/ConfigProcessor.d.ts.map +1 -1
  141. package/dist/vanillajs/auth/config/ConfigProcessor.js +2 -14
  142. package/dist/vanillajs/auth/config/ConfigProcessor.js.map +1 -1
  143. package/dist/vanillajs/auth/handlers/IframeAuthHandler.d.ts.map +1 -1
  144. package/dist/vanillajs/auth/handlers/IframeAuthHandler.js +64 -11
  145. package/dist/vanillajs/auth/handlers/IframeAuthHandler.js.map +1 -1
  146. package/dist/vanillajs/auth/handlers/MessageHandler.d.ts.map +1 -1
  147. package/dist/vanillajs/auth/handlers/MessageHandler.js +4 -1
  148. package/dist/vanillajs/auth/handlers/MessageHandler.js.map +1 -1
  149. package/dist/vanillajs/auth/handlers/PopupHandler.d.ts.map +1 -1
  150. package/dist/vanillajs/auth/handlers/PopupHandler.js +3 -1
  151. package/dist/vanillajs/auth/handlers/PopupHandler.js.map +1 -1
  152. package/dist/vanillajs/auth/types/AuthTypes.d.ts +11 -1
  153. package/dist/vanillajs/auth/types/AuthTypes.d.ts.map +1 -1
  154. package/dist/vanillajs/auth/types/AuthTypes.js.map +1 -1
  155. package/dist/vanillajs/iframe/IframeManager.d.ts +22 -1
  156. package/dist/vanillajs/iframe/IframeManager.d.ts.map +1 -1
  157. package/dist/vanillajs/iframe/IframeManager.js +184 -22
  158. package/dist/vanillajs/iframe/IframeManager.js.map +1 -1
  159. package/dist/vanillajs/types/index.d.ts +1 -1
  160. package/dist/vanillajs/types/index.d.ts.map +1 -1
  161. package/dist/vanillajs/types/index.js +1 -1
  162. package/dist/vanillajs/types/index.js.map +1 -1
  163. package/dist/vanillajs/ui/LoadingComponents.d.ts +4 -0
  164. package/dist/vanillajs/ui/LoadingComponents.d.ts.map +1 -1
  165. package/dist/vanillajs/ui/LoadingComponents.js +51 -1
  166. package/dist/vanillajs/ui/LoadingComponents.js.map +1 -1
  167. package/package.json +3 -3
  168. package/dist/nextjs/hooks/index.d.ts +0 -2
  169. package/dist/nextjs/hooks/index.d.ts.map +0 -1
  170. package/dist/nextjs/hooks/index.js +0 -2
  171. package/dist/nextjs/hooks/index.js.map +0 -1
  172. package/dist/nextjs/hooks/usePrevious.d.ts +0 -2
  173. package/dist/nextjs/hooks/usePrevious.d.ts.map +0 -1
  174. package/dist/nextjs/hooks/usePrevious.js +0 -9
  175. package/dist/nextjs/hooks/usePrevious.js.map +0 -1
  176. package/dist/nextjs/hooks/useUserCookie.d.ts +0 -9
  177. package/dist/nextjs/hooks/useUserCookie.d.ts.map +0 -1
  178. package/dist/nextjs/hooks/useUserCookie.js +0 -109
  179. package/dist/nextjs/hooks/useUserCookie.js.map +0 -1
  180. package/dist/react-router-7/components/UserButtonPresentation.d.ts.map +0 -1
  181. package/dist/react-router-7/components/UserButtonPresentation.js.map +0 -1
  182. package/dist/shared/components/BlockDisplay.d.ts +0 -6
  183. package/dist/shared/components/BlockDisplay.d.ts.map +0 -1
  184. package/dist/shared/components/BlockDisplay.js +0 -30
  185. package/dist/shared/components/BlockDisplay.js.map +0 -1
  186. package/dist/shared/components/CivicAuthIframe.d.ts +0 -10
  187. package/dist/shared/components/CivicAuthIframe.d.ts.map +0 -1
  188. package/dist/shared/components/CivicAuthIframe.js +0 -49
  189. package/dist/shared/components/CivicAuthIframe.js.map +0 -1
  190. package/dist/shared/components/CivicAuthIframeContainer.d.ts +0 -15
  191. package/dist/shared/components/CivicAuthIframeContainer.d.ts.map +0 -1
  192. package/dist/shared/components/CivicAuthIframeContainer.js +0 -177
  193. package/dist/shared/components/CivicAuthIframeContainer.js.map +0 -1
  194. package/dist/shared/components/CivicAuthLogoutIframeContainer.d.ts +0 -6
  195. package/dist/shared/components/CivicAuthLogoutIframeContainer.d.ts.map +0 -1
  196. package/dist/shared/components/CivicAuthLogoutIframeContainer.js +0 -51
  197. package/dist/shared/components/CivicAuthLogoutIframeContainer.js.map +0 -1
  198. package/dist/shared/components/IFrameAndLoading.d.ts +0 -7
  199. package/dist/shared/components/IFrameAndLoading.d.ts.map +0 -1
  200. package/dist/shared/components/IFrameAndLoading.js +0 -66
  201. package/dist/shared/components/IFrameAndLoading.js.map +0 -1
  202. package/dist/shared/hooks/useAuth.d.ts +0 -3
  203. package/dist/shared/hooks/useAuth.d.ts.map +0 -1
  204. package/dist/shared/hooks/useAuth.js +0 -12
  205. package/dist/shared/hooks/useAuth.js.map +0 -1
  206. package/dist/shared/hooks/useIframe.d.ts +0 -3
  207. package/dist/shared/hooks/useIframe.d.ts.map +0 -1
  208. package/dist/shared/hooks/useIframe.js +0 -13
  209. package/dist/shared/hooks/useIframe.js.map +0 -1
  210. package/dist/shared/hooks/useIsInIframe.d.ts +0 -7
  211. package/dist/shared/hooks/useIsInIframe.d.ts.map +0 -1
  212. package/dist/shared/hooks/useIsInIframe.js +0 -23
  213. package/dist/shared/hooks/useIsInIframe.js.map +0 -1
  214. package/dist/shared/hooks/useSignIn.d.ts +0 -20
  215. package/dist/shared/hooks/useSignIn.d.ts.map +0 -1
  216. package/dist/shared/hooks/useSignIn.js +0 -358
  217. package/dist/shared/hooks/useSignIn.js.map +0 -1
  218. package/dist/shared/providers/IframeProvider.d.ts +0 -28
  219. package/dist/shared/providers/IframeProvider.d.ts.map +0 -1
  220. package/dist/shared/providers/IframeProvider.js +0 -64
  221. package/dist/shared/providers/IframeProvider.js.map +0 -1
  222. /package/dist/{react-router-7 → shared}/components/UserButtonPresentation.d.ts +0 -0
  223. /package/dist/{react-router-7 → shared}/components/UserButtonPresentation.js +0 -0
@@ -1,139 +1,20 @@
1
- "use client";
2
- import { jsx as _jsx, jsxs as _jsxs } from "@emotion/react/jsx-runtime";
3
- /**
4
- * A very small context provider for the user object - it takes the user object from the cookie and provides it to the app.
5
- */
6
- import React, { startTransition, useCallback, useEffect, useRef, useState, useMemo, } from "react";
7
- import { resolveAuthConfig, } from "../../nextjs/config.js";
8
- import { resolveCallbackUrl } from "../../nextjs/utils.js";
9
- import { ConfidentialClientPKCEConsumer } from "../../services/PKCE.js";
10
- import { UserProvider } from "../../shared/providers/UserProvider.js";
11
- import { useUserCookie } from "../../nextjs/hooks/useUserCookie.js";
12
- import { CivicAuthConfigProvider } from "../../shared/providers/CivicAuthConfigContext.js";
13
- import { SessionProvider } from "../../shared/providers/SessionProvider.js";
14
- import { IframeProvider } from "../../shared/providers/IframeProvider.js";
15
- import { TokenProvider } from "../../shared/providers/TokenProvider.js";
16
- import { useSignIn } from "../../shared/hooks/useSignIn.js";
17
- import { useCivicAuthConfig } from "../../shared/hooks/useCivicAuthConfig.js";
18
- import { IFrameAndLoading } from "../../shared/components/IFrameAndLoading.js";
19
- import { BlockDisplay } from "../../shared/components/BlockDisplay.js";
20
- import { LoadingIcon } from "../../shared/components/LoadingIcon.js";
21
- import { useIframe } from "../../shared/hooks/useIframe.js";
22
- import { useIsInIframe } from "../../shared/hooks/useIsInIframe.js";
23
- import { AuthStatus } from "../../types.js";
24
- import { useRefresh } from "../../nextjs/hooks/useRefresh.js";
25
- import { useCurrentUrl, useSession } from "../../shared/hooks/index.js";
26
- import { BrowserCookieStorage } from "../../shared/index.js";
27
- import { getIframeRef } from "../../shared/lib/iframeUtils.js";
28
- import { AuthStatusProvider } from "../../shared/providers/AuthStatusContext.js";
29
- import { useIsClient } from "usehooks-ts";
30
- import { useRouter } from "next/navigation.js";
31
- const CivicNextAuthTokenProviderInternal = ({ children, displayMode = "iframe", user, fetchUser, ...props }) => {
32
- const { iframeMode, resolvedConfig } = props;
33
- const { iframeRef, setIframeIsVisible, isIframeMounted, setIframeMounted } = useIframe();
34
- const civicAuthConfig = useCivicAuthConfig();
35
- const { challengeUrl } = resolvedConfig;
36
- const pkceConsumer = new ConfidentialClientPKCEConsumer(challengeUrl, resolvedConfig.basePath);
37
- const { data: session } = useSession();
38
- const currentUrl = useCurrentUrl();
39
- useEffect(() => {
40
- if (session?.authenticated) {
41
- setIframeMounted(false);
42
- // the session is authenticated, so don't show the login iframe
43
- setIframeIsVisible(false);
44
- return;
45
- }
46
- }, [session?.authenticated, setIframeIsVisible, setIframeMounted]);
47
- const postSignOut = useCallback(async () => {
48
- // user is signed out, manually update the user from cookies to not wait for polling
49
- // Small delay to ensure server-side cookies are cleared first
50
- setTimeout(() => {
51
- fetchUser();
52
- }, 150);
53
- await props?.onSignOut?.();
54
- }, [fetchUser, props]);
55
- // Memoize storage to prevent recreation on every render
56
- const storage = useMemo(() => new BrowserCookieStorage(), []);
57
- const { signIn, startSignIn, signOut, authStatus } = useSignIn({
58
- postSignOut,
59
- pkceConsumer,
60
- displayMode,
61
- });
62
- const { error: refreshError } = useRefresh();
63
- useEffect(() => {
64
- const ref = getIframeRef(iframeRef?.current, true);
65
- if (isIframeMounted &&
66
- civicAuthConfig &&
67
- !session?.authenticated &&
68
- ref &&
69
- authStatus === AuthStatus.UNAUTHENTICATED &&
70
- displayMode === "iframe" &&
71
- !currentUrl?.includes("code=")) {
72
- startSignIn();
73
- }
74
- // eslint-disable-next-line react-hooks/exhaustive-deps
75
- }, [
76
- isIframeMounted,
77
- currentUrl,
78
- iframeMode,
79
- iframeRef,
80
- civicAuthConfig,
81
- session?.authenticated,
82
- authStatus,
83
- startSignIn,
84
- displayMode,
85
- ]);
86
- useEffect(() => {
87
- if (refreshError) {
88
- console.error("Error refreshing token, signing out...", refreshError);
89
- signOut();
90
- }
91
- }, [refreshError, signOut]);
92
- // if the SDK loads in an iframe, we show the loading spinner as the iframe
93
- // will be waiting to be minimized
94
- const isInIframe = useIsInIframe();
95
- // we need this as server-side rendering will not have a window object
96
- // and will throw an error if we try to access it
97
- const isClient = useIsClient();
98
- return !isClient ? null : (_jsx(TokenProvider, { children: _jsxs(UserProvider, { storage: storage, user: user, signOut: signOut, signIn: signIn, displayMode: displayMode, authStatus: authStatus, children: [_jsx(IFrameAndLoading, { error: null, isLoading: isInIframe }), isInIframe && (_jsx(BlockDisplay, { children: _jsx(LoadingIcon, {}) })), children] }) }));
99
- };
100
- const CivicNextAuthProviderInternal = ({ children, ...props }) => {
101
- const { user, idToken, fetchUser, isLoading, userChanged } = useUserCookie();
102
- const hasRunRef = useRef(false);
103
- const router = useRouter();
104
- // if there are any changes in the user object, we need to refresh the page
105
- // to handle both login and logout cases. We use a 'hasRun' ref to prevent
106
- // the refresh from running multiple times in a row
107
- useEffect(() => {
108
- if (userChanged) {
109
- if (!hasRunRef.current) {
110
- hasRunRef.current = true;
111
- startTransition(() => {
112
- router.refresh();
113
- });
114
- }
115
- }
116
- else {
117
- hasRunRef.current = false;
118
- }
119
- }, [userChanged, router]);
120
- const session = {
121
- authenticated: !!user,
122
- idToken,
123
- };
124
- return (_jsx(SessionProvider, { data: session, isLoading: isLoading, children: _jsx(CivicNextAuthTokenProviderInternal, { ...props, user: user, idToken: idToken, fetchUser: fetchUser, isLoading: isLoading, children: children }) }));
125
- };
126
- const CivicNextAuthProvider = ({ children, ...props }) => {
127
- const resolvedConfig = resolveAuthConfig();
128
- const { clientId, oauthServer, callbackUrl, loginSuccessUrl, challengeUrl, logoutUrl, refreshUrl, logoutCallbackUrl, } = resolvedConfig;
129
- const [redirectUrl, setRedirectUrl] = useState("");
130
- useEffect(() => {
131
- if (typeof globalThis.window !== "undefined") {
132
- const appUrl = globalThis.window.location.origin;
133
- setRedirectUrl(resolveCallbackUrl(resolvedConfig, appUrl));
134
- }
135
- }, [callbackUrl, resolvedConfig]);
136
- return (_jsx(CivicAuthConfigProvider, { oauthServer: oauthServer, clientId: clientId, loginSuccessUrl: loginSuccessUrl, redirectUrl: redirectUrl, logoutRedirectUrl: logoutCallbackUrl, nonce: props?.nonce, challengeUrl: challengeUrl, refreshUrl: refreshUrl, logoutUrl: logoutUrl, logoutCallbackUrl: logoutCallbackUrl, autoRedirect: resolvedConfig.autoRedirect, framework: "nextjs", children: _jsx(AuthStatusProvider, { children: _jsx(IframeProvider, { iframeMode: props.iframeMode, children: _jsx(CivicNextAuthProviderInternal, { ...props, resolvedConfig: resolvedConfig, children: children }) }) }) }));
137
- };
138
- export { CivicNextAuthProvider };
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ /** @jsxImportSource react */
3
+ import React from "react";
4
+ import { getUser } from "../../nextjs/index.js";
5
+ import { CivicNextAuthProviderClient } from "./NextAuthProviderClient.js";
6
+ // Server component that reads user data and passes it to client component
7
+ export async function CivicNextAuthProvider({ children, ...props }) {
8
+ // Read user data server-side to prevent hydration mismatch
9
+ let serverUser = null;
10
+ try {
11
+ serverUser = await getUser();
12
+ }
13
+ catch (error) {
14
+ // If server-side user reading fails, just use null
15
+ console.warn("Failed to read user server-side:", error);
16
+ serverUser = null;
17
+ }
18
+ return (_jsx(CivicNextAuthProviderClient, { serverUser: serverUser, ...props, children: children }));
19
+ }
139
20
  //# sourceMappingURL=NextAuthProvider.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"NextAuthProvider.js","sourceRoot":"","sources":["../../../src/nextjs/providers/NextAuthProvider.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AACb;;GAEG;AACH,OAAO,KAAK,EAAE,EACZ,eAAe,EACf,WAAW,EACX,SAAS,EACT,MAAM,EACN,QAAQ,EACR,OAAO,GACR,MAAM,OAAO,CAAC;AACf,OAAO,EACL,iBAAiB,GAElB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,8BAA8B,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAE,uBAAuB,EAAE,MAAM,8CAA8C,CAAC;AACvF,OAAO,EAAE,eAAe,EAAE,MAAM,uCAAuC,CAAC;AACxE,OAAO,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AACpE,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sCAAsC,CAAC;AAC1E,OAAO,EAAE,gBAAgB,EAAE,MAAM,yCAAyC,CAAC;AAC3E,OAAO,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAC;AACnE,OAAO,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAC;AACjE,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAExD,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAE,UAAU,EAAiC,MAAM,YAAY,CAAC;AACvE,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AAC7E,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAoB/C,MAAM,kCAAkC,GAAG,CAEzC,EACA,QAAQ,EACR,WAAW,GAAG,QAAQ,EACtB,IAAI,EACJ,SAAS,EACT,GAAG,KAAK,EACuC,EAAE,EAAE;IACnD,MAAM,EAAE,UAAU,EAAE,cAAc,EAAE,GAAG,KAAK,CAAC;IAC7C,MAAM,EAAE,SAAS,EAAE,kBAAkB,EAAE,eAAe,EAAE,gBAAgB,EAAE,GACxE,SAAS,EAAE,CAAC;IACd,MAAM,eAAe,GAAG,kBAAkB,EAAE,CAAC;IAC7C,MAAM,EAAE,YAAY,EAAE,GAAG,cAAc,CAAC;IACxC,MAAM,YAAY,GAAG,IAAI,8BAA8B,CACrD,YAAY,EACZ,cAAc,CAAC,QAAQ,CACxB,CAAC;IACF,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,UAAU,EAAE,CAAC;IACvC,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;IAEnC,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,OAAO,EAAE,aAAa,EAAE,CAAC;YAC3B,gBAAgB,CAAC,KAAK,CAAC,CAAC;YACxB,+DAA+D;YAC/D,kBAAkB,CAAC,KAAK,CAAC,CAAC;YAC1B,OAAO;QACT,CAAC;IACH,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,gBAAgB,CAAC,CAAC,CAAC;IAEnE,MAAM,WAAW,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QACzC,oFAAoF;QACpF,8DAA8D;QAC9D,UAAU,CAAC,GAAG,EAAE;YACd,SAAS,EAAE,CAAC;QACd,CAAC,EAAE,GAAG,CAAC,CAAC;QAER,MAAM,KAAK,EAAE,SAAS,EAAE,EAAE,CAAC;IAC7B,CAAC,EAAE,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;IAEvB,wDAAwD;IACxD,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,oBAAoB,EAAE,EAAE,EAAE,CAAC,CAAC;IAE9D,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,SAAS,CAAC;QAC7D,WAAW;QACX,YAAY;QACZ,WAAW;KACZ,CAAC,CAAC;IAEH,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,UAAU,EAAE,CAAC;IAE7C,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,GAAG,GAAG,YAAY,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QACnD,IACE,eAAe;YACf,eAAe;YACf,CAAC,OAAO,EAAE,aAAa;YACvB,GAAG;YACH,UAAU,KAAK,UAAU,CAAC,eAAe;YACzC,WAAW,KAAK,QAAQ;YACxB,CAAC,UAAU,EAAE,QAAQ,CAAC,OAAO,CAAC,EAC9B,CAAC;YACD,WAAW,EAAE,CAAC;QAChB,CAAC;QACD,uDAAuD;IACzD,CAAC,EAAE;QACD,eAAe;QACf,UAAU;QACV,UAAU;QACV,SAAS;QACT,eAAe;QACf,OAAO,EAAE,aAAa;QACtB,UAAU;QACV,WAAW;QACX,WAAW;KACZ,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,YAAY,EAAE,CAAC;YACjB,OAAO,CAAC,KAAK,CAAC,wCAAwC,EAAE,YAAY,CAAC,CAAC;YACtE,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC,EAAE,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC;IAE5B,2EAA2E;IAC3E,kCAAkC;IAClC,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;IACnC,sEAAsE;IACtE,iDAAiD;IACjD,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAC/B,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CACxB,KAAC,aAAa,cACZ,MAAC,YAAY,IACX,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,WAAW,EACxB,UAAU,EAAE,UAAU,aAEtB,KAAC,gBAAgB,IAAC,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,GAAI,EACvD,UAAU,IAAI,CACb,KAAC,YAAY,cACX,KAAC,WAAW,KAAG,GACF,CAChB,EACA,QAAQ,IACI,GACD,CACjB,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,6BAA6B,GAAG,CAAC,EACrC,QAAQ,EACR,GAAG,KAAK,EAC2B,EAAE,EAAE;IACvC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,aAAa,EAAE,CAAC;IAC7E,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAChC,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAE3B,2EAA2E;IAC3E,0EAA0E;IAC1E,mDAAmD;IACnD,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,WAAW,EAAE,CAAC;YAChB,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;gBACvB,SAAS,CAAC,OAAO,GAAG,IAAI,CAAC;gBACzB,eAAe,CAAC,GAAG,EAAE;oBACnB,MAAM,CAAC,OAAO,EAAE,CAAC;gBACnB,CAAC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;aAAM,CAAC;YACN,SAAS,CAAC,OAAO,GAAG,KAAK,CAAC;QAC5B,CAAC;IACH,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC;IAE1B,MAAM,OAAO,GAAG;QACd,aAAa,EAAE,CAAC,CAAC,IAAI;QACrB,OAAO;KACR,CAAC;IAEF,OAAO,CACL,KAAC,eAAe,IAAC,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,YAClD,KAAC,kCAAkC,OAC7B,KAAK,EACT,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,SAAS,EACpB,SAAS,EAAE,SAAS,YAEnB,QAAQ,GAC0B,GACrB,CACnB,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,qBAAqB,GAAG,CAAC,EAC7B,QAAQ,EACR,GAAG,KAAK,EACmB,EAAE,EAAE;IAC/B,MAAM,cAAc,GAAG,iBAAiB,EAAE,CAAC;IAC3C,MAAM,EACJ,QAAQ,EACR,WAAW,EACX,WAAW,EACX,eAAe,EACf,YAAY,EACZ,SAAS,EACT,UAAU,EACV,iBAAiB,GAClB,GAAG,cAAc,CAAC;IACnB,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAS,EAAE,CAAC,CAAC;IAE3D,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,OAAO,UAAU,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;YAC7C,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;YACjD,cAAc,CAAC,kBAAkB,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC,EAAE,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC,CAAC;IAElC,OAAO,CACL,KAAC,uBAAuB,IACtB,WAAW,EAAE,WAAW,EACxB,QAAQ,EAAE,QAAQ,EAClB,eAAe,EAAE,eAAe,EAChC,WAAW,EAAE,WAAW,EACxB,iBAAiB,EAAE,iBAAiB,EACpC,KAAK,EAAE,KAAK,EAAE,KAAK,EACnB,YAAY,EAAE,YAAY,EAC1B,UAAU,EAAE,UAAU,EACtB,SAAS,EAAE,SAAS,EACpB,iBAAiB,EAAE,iBAAiB,EACpC,YAAY,EAAE,cAAc,CAAC,YAAY,EACzC,SAAS,EAAC,QAAQ,YAElB,KAAC,kBAAkB,cACjB,KAAC,cAAc,IAAC,UAAU,EAAE,KAAK,CAAC,UAAU,YAC1C,KAAC,6BAA6B,OACxB,KAAK,EACT,cAAc,EAAE,cAAc,YAE7B,QAAQ,GACqB,GACjB,GACE,GACG,CAC3B,CAAC;AACJ,CAAC,CAAC;AAEF,OAAO,EAAE,qBAAqB,EAAmC,CAAC","sourcesContent":["\"use client\";\n/**\n * A very small context provider for the user object - it takes the user object from the cookie and provides it to the app.\n */\nimport React, {\n startTransition,\n useCallback,\n useEffect,\n useRef,\n useState,\n useMemo,\n} from \"react\";\nimport {\n resolveAuthConfig,\n type AuthConfigWithDefaults,\n} from \"@/nextjs/config.js\";\nimport { resolveCallbackUrl } from \"@/nextjs/utils.js\";\nimport { ConfidentialClientPKCEConsumer } from \"@/services/PKCE.js\";\nimport { UserProvider } from \"@/shared/providers/UserProvider.js\";\nimport { useUserCookie } from \"@/nextjs/hooks/useUserCookie.js\";\nimport { CivicAuthConfigProvider } from \"@/shared/providers/CivicAuthConfigContext.js\";\nimport { SessionProvider } from \"@/shared/providers/SessionProvider.js\";\nimport { IframeProvider } from \"@/shared/providers/IframeProvider.js\";\nimport { TokenProvider } from \"@/shared/providers/TokenProvider.js\";\nimport { useSignIn } from \"@/shared/hooks/useSignIn.js\";\nimport { useCivicAuthConfig } from \"@/shared/hooks/useCivicAuthConfig.js\";\nimport { IFrameAndLoading } from \"@/shared/components/IFrameAndLoading.js\";\nimport { BlockDisplay } from \"@/shared/components/BlockDisplay.js\";\nimport { LoadingIcon } from \"@/shared/components/LoadingIcon.js\";\nimport { useIframe } from \"@/shared/hooks/useIframe.js\";\nimport type { AuthProviderProps } from \"@/shared/providers/types.js\";\nimport { useIsInIframe } from \"@/shared/hooks/useIsInIframe.js\";\nimport { AuthStatus, type UnknownObject, type User } from \"@/types.js\";\nimport { useRefresh } from \"@/nextjs/hooks/useRefresh.js\";\nimport { useCurrentUrl, useSession } from \"@/shared/hooks/index.js\";\nimport { BrowserCookieStorage } from \"@/shared/index.js\";\nimport { getIframeRef } from \"@/shared/lib/iframeUtils.js\";\nimport { AuthStatusProvider } from \"@/shared/providers/AuthStatusContext.js\";\nimport { useIsClient } from \"usehooks-ts\";\nimport { useRouter } from \"next/navigation.js\";\n\ntype CivicNextAuthTokenProviderInternalProps<TUser extends UnknownObject> =\n NextCivicAuthProviderInternalProps & {\n isLoading: boolean;\n idToken?: string;\n user: User<TUser> | null;\n fetchUser: () => void;\n };\ntype NextCivicAuthProviderInternalProps = Omit<\n AuthProviderProps,\n \"clientId\"\n> & {\n resolvedConfig: AuthConfigWithDefaults;\n};\ntype NextCivicAuthProviderProps = Omit<\n NextCivicAuthProviderInternalProps,\n \"clientId\" | \"resolvedConfig\" | \"redirectUrl\"\n>;\n\nconst CivicNextAuthTokenProviderInternal = <\n TUser extends UnknownObject = UnknownObject,\n>({\n children,\n displayMode = \"iframe\",\n user,\n fetchUser,\n ...props\n}: CivicNextAuthTokenProviderInternalProps<TUser>) => {\n const { iframeMode, resolvedConfig } = props;\n const { iframeRef, setIframeIsVisible, isIframeMounted, setIframeMounted } =\n useIframe();\n const civicAuthConfig = useCivicAuthConfig();\n const { challengeUrl } = resolvedConfig;\n const pkceConsumer = new ConfidentialClientPKCEConsumer(\n challengeUrl,\n resolvedConfig.basePath,\n );\n const { data: session } = useSession();\n const currentUrl = useCurrentUrl();\n\n useEffect(() => {\n if (session?.authenticated) {\n setIframeMounted(false);\n // the session is authenticated, so don't show the login iframe\n setIframeIsVisible(false);\n return;\n }\n }, [session?.authenticated, setIframeIsVisible, setIframeMounted]);\n\n const postSignOut = useCallback(async () => {\n // user is signed out, manually update the user from cookies to not wait for polling\n // Small delay to ensure server-side cookies are cleared first\n setTimeout(() => {\n fetchUser();\n }, 150);\n\n await props?.onSignOut?.();\n }, [fetchUser, props]);\n\n // Memoize storage to prevent recreation on every render\n const storage = useMemo(() => new BrowserCookieStorage(), []);\n\n const { signIn, startSignIn, signOut, authStatus } = useSignIn({\n postSignOut,\n pkceConsumer,\n displayMode,\n });\n\n const { error: refreshError } = useRefresh();\n\n useEffect(() => {\n const ref = getIframeRef(iframeRef?.current, true);\n if (\n isIframeMounted &&\n civicAuthConfig &&\n !session?.authenticated &&\n ref &&\n authStatus === AuthStatus.UNAUTHENTICATED &&\n displayMode === \"iframe\" &&\n !currentUrl?.includes(\"code=\")\n ) {\n startSignIn();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n isIframeMounted,\n currentUrl,\n iframeMode,\n iframeRef,\n civicAuthConfig,\n session?.authenticated,\n authStatus,\n startSignIn,\n displayMode,\n ]);\n\n useEffect(() => {\n if (refreshError) {\n console.error(\"Error refreshing token, signing out...\", refreshError);\n signOut();\n }\n }, [refreshError, signOut]);\n\n // if the SDK loads in an iframe, we show the loading spinner as the iframe\n // will be waiting to be minimized\n const isInIframe = useIsInIframe();\n // we need this as server-side rendering will not have a window object\n // and will throw an error if we try to access it\n const isClient = useIsClient();\n return !isClient ? null : (\n <TokenProvider>\n <UserProvider\n storage={storage}\n user={user}\n signOut={signOut}\n signIn={signIn}\n displayMode={displayMode}\n authStatus={authStatus}\n >\n <IFrameAndLoading error={null} isLoading={isInIframe} />\n {isInIframe && (\n <BlockDisplay>\n <LoadingIcon />\n </BlockDisplay>\n )}\n {children}\n </UserProvider>\n </TokenProvider>\n );\n};\n\nconst CivicNextAuthProviderInternal = ({\n children,\n ...props\n}: NextCivicAuthProviderInternalProps) => {\n const { user, idToken, fetchUser, isLoading, userChanged } = useUserCookie();\n const hasRunRef = useRef(false);\n const router = useRouter();\n\n // if there are any changes in the user object, we need to refresh the page\n // to handle both login and logout cases. We use a 'hasRun' ref to prevent\n // the refresh from running multiple times in a row\n useEffect(() => {\n if (userChanged) {\n if (!hasRunRef.current) {\n hasRunRef.current = true;\n startTransition(() => {\n router.refresh();\n });\n }\n } else {\n hasRunRef.current = false;\n }\n }, [userChanged, router]);\n\n const session = {\n authenticated: !!user,\n idToken,\n };\n\n return (\n <SessionProvider data={session} isLoading={isLoading}>\n <CivicNextAuthTokenProviderInternal\n {...props}\n user={user}\n idToken={idToken}\n fetchUser={fetchUser}\n isLoading={isLoading}\n >\n {children}\n </CivicNextAuthTokenProviderInternal>\n </SessionProvider>\n );\n};\n\nconst CivicNextAuthProvider = ({\n children,\n ...props\n}: NextCivicAuthProviderProps) => {\n const resolvedConfig = resolveAuthConfig();\n const {\n clientId,\n oauthServer,\n callbackUrl,\n loginSuccessUrl,\n challengeUrl,\n logoutUrl,\n refreshUrl,\n logoutCallbackUrl,\n } = resolvedConfig;\n const [redirectUrl, setRedirectUrl] = useState<string>(\"\");\n\n useEffect(() => {\n if (typeof globalThis.window !== \"undefined\") {\n const appUrl = globalThis.window.location.origin;\n setRedirectUrl(resolveCallbackUrl(resolvedConfig, appUrl));\n }\n }, [callbackUrl, resolvedConfig]);\n\n return (\n <CivicAuthConfigProvider\n oauthServer={oauthServer}\n clientId={clientId}\n loginSuccessUrl={loginSuccessUrl}\n redirectUrl={redirectUrl}\n logoutRedirectUrl={logoutCallbackUrl}\n nonce={props?.nonce}\n challengeUrl={challengeUrl}\n refreshUrl={refreshUrl}\n logoutUrl={logoutUrl}\n logoutCallbackUrl={logoutCallbackUrl}\n autoRedirect={resolvedConfig.autoRedirect}\n framework=\"nextjs\"\n >\n <AuthStatusProvider>\n <IframeProvider iframeMode={props.iframeMode}>\n <CivicNextAuthProviderInternal\n {...props}\n resolvedConfig={resolvedConfig}\n >\n {children}\n </CivicNextAuthProviderInternal>\n </IframeProvider>\n </AuthStatusProvider>\n </CivicAuthConfigProvider>\n );\n};\n\nexport { CivicNextAuthProvider, type NextCivicAuthProviderProps };\n"]}
1
+ {"version":3,"file":"NextAuthProvider.js","sourceRoot":"","sources":["../../../src/nextjs/providers/NextAuthProvider.tsx"],"names":[],"mappings":";AAAA,6BAA6B;AAC7B,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAG5C,OAAO,EAAE,2BAA2B,EAAE,MAAM,6BAA6B,CAAC;AAI1E,0EAA0E;AAC1E,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,EAC1C,QAAQ,EACR,GAAG,KAAK,EAIT;IACC,2DAA2D;IAC3D,IAAI,UAAU,GAAgB,IAAI,CAAC;IACnC,IAAI,CAAC;QACH,UAAU,GAAG,MAAM,OAAO,EAAE,CAAC;IAC/B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,mDAAmD;QACnD,OAAO,CAAC,IAAI,CAAC,kCAAkC,EAAE,KAAK,CAAC,CAAC;QACxD,UAAU,GAAG,IAAI,CAAC;IACpB,CAAC;IAED,OAAO,CACL,KAAC,2BAA2B,IAAC,UAAU,EAAE,UAAU,KAAM,KAAK,YAC3D,QAAQ,GACmB,CAC/B,CAAC;AACJ,CAAC","sourcesContent":["/** @jsxImportSource react */\nimport React from \"react\";\nimport { getUser } from \"@/nextjs/index.js\";\nimport type { User } from \"@/types.js\";\nimport type { AuthProviderProps } from \"@/shared/providers/types.js\";\nimport { CivicNextAuthProviderClient } from \"./NextAuthProviderClient.js\";\n\ntype NextCivicAuthProviderProps = Omit<AuthProviderProps, \"clientId\">;\n\n// Server component that reads user data and passes it to client component\nexport async function CivicNextAuthProvider({\n children,\n ...props\n}: NextCivicAuthProviderProps & {\n redirectOnLogin?: string;\n redirectOnLogout?: string;\n}) {\n // Read user data server-side to prevent hydration mismatch\n let serverUser: User | null = null;\n try {\n serverUser = await getUser();\n } catch (error) {\n // If server-side user reading fails, just use null\n console.warn(\"Failed to read user server-side:\", error);\n serverUser = null;\n }\n\n return (\n <CivicNextAuthProviderClient serverUser={serverUser} {...props}>\n {children}\n </CivicNextAuthProviderClient>\n );\n}\n\n// Export the type for external use\nexport type { NextCivicAuthProviderProps };\n"]}
@@ -0,0 +1,11 @@
1
+ import type { AuthProviderProps } from "../../shared/providers/types.js";
2
+ import type { User } from "../../types.js";
3
+ type NextCivicAuthProviderProps = Omit<AuthProviderProps, "clientId">;
4
+ export interface CivicNextAuthProviderClientProps extends NextCivicAuthProviderProps {
5
+ serverUser: User | null;
6
+ redirectOnLogin?: string;
7
+ redirectOnLogout?: string;
8
+ }
9
+ export declare const CivicNextAuthProviderClient: ({ children, serverUser, ...props }: CivicNextAuthProviderClientProps) => import("react/jsx-runtime").JSX.Element;
10
+ export {};
11
+ //# sourceMappingURL=NextAuthProviderClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NextAuthProviderClient.d.ts","sourceRoot":"","sources":["../../../src/nextjs/providers/NextAuthProviderClient.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAErE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAGvC,KAAK,0BAA0B,GAAG,IAAI,CAAC,iBAAiB,EAAE,UAAU,CAAC,CAAC;AAEtE,MAAM,WAAW,gCACf,SAAQ,0BAA0B;IAClC,UAAU,EAAE,IAAI,GAAG,IAAI,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAID,eAAO,MAAM,2BAA2B,uCAIrC,gCAAgC,4CA8ElC,CAAC"}
@@ -0,0 +1,62 @@
1
+ /** @jsxImportSource react */
2
+ "use client";
3
+ import { jsx as _jsx } from "react/jsx-runtime";
4
+ /**
5
+ * Client component for NextAuth provider that receives server-provided user data
6
+ */
7
+ import { resolveAuthConfig } from "../../nextjs/config.js";
8
+ import { GlobalAuthManager } from "../../reactjs/core/GlobalAuthManager.js";
9
+ import { AuthStatusProvider } from "../../shared/providers/AuthStatusContext.js";
10
+ import { CivicAuthConfigProvider } from "../../shared/providers/CivicAuthConfigContext.js";
11
+ import { ServerUserContext } from "./ServerUserContext.js";
12
+ import { useInitialAuthConfig } from "../../nextjs/hooks/useInitialAuthConfig.js";
13
+ import { useEffect } from "react";
14
+ import { useRouter } from "next/navigation.js";
15
+ // Context to provide server user data immediately to useUser hook
16
+ export const CivicNextAuthProviderClient = ({ children, serverUser, ...props }) => {
17
+ const router = useRouter();
18
+ const resolvedConfig = resolveAuthConfig();
19
+ const { clientId, oauthServer, loginSuccessUrl, challengeUrl, refreshUrl, logoutCallbackUrl, } = resolvedConfig;
20
+ // Initialize GlobalAuthManager synchronously with server user data
21
+ // This ensures the server user is available immediately when useUser() is called
22
+ const { initialConfig } = useInitialAuthConfig({
23
+ displayMode: props.displayMode,
24
+ iframeMode: props.iframeMode,
25
+ serverUser: serverUser,
26
+ nonce: props.nonce,
27
+ targetContainerElement: props.targetContainerElement,
28
+ oauthServer: oauthServer,
29
+ loginSuccessUrl: loginSuccessUrl,
30
+ onUrlChange: (url, source) => {
31
+ // Handle different URL change sources
32
+ switch (source) {
33
+ case "login":
34
+ console.log(`[NextAuthProvider] Authentication redirect: ${url}`);
35
+ window.location.href = url;
36
+ break;
37
+ case "login_app":
38
+ console.log(`[NextAuthProvider] Login app redirect: ${url}`);
39
+ window.location.href = url;
40
+ break;
41
+ default:
42
+ console.log(`[NextAuthProvider] Navigating to: ${url} (source: ${source || "unknown"})`);
43
+ router.push(url);
44
+ }
45
+ },
46
+ });
47
+ // Initialize auth manager with server-provided data
48
+ useEffect(() => {
49
+ const initialize = async () => {
50
+ try {
51
+ const manager = GlobalAuthManager.getInstance();
52
+ await manager.initialize(initialConfig);
53
+ }
54
+ catch (error) {
55
+ console.error("[NextAuthProvider] Failed to initialize auth manager:", error);
56
+ }
57
+ };
58
+ initialize();
59
+ }, [initialConfig, router]);
60
+ return (_jsx(ServerUserContext.Provider, { value: serverUser, children: _jsx(CivicAuthConfigProvider, { oauthServer: oauthServer, clientId: clientId, loginSuccessUrl: loginSuccessUrl, logoutRedirectUrl: logoutCallbackUrl, nonce: props?.nonce, challengeUrl: challengeUrl, refreshUrl: refreshUrl, displayMode: props.displayMode, autoRedirect: resolvedConfig.autoRedirect, framework: "nextjs", children: _jsx(AuthStatusProvider, { children: children }) }) }));
61
+ };
62
+ //# sourceMappingURL=NextAuthProviderClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NextAuthProviderClient.js","sourceRoot":"","sources":["../../../src/nextjs/providers/NextAuthProviderClient.tsx"],"names":[],"mappings":"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","sourcesContent":["/** @jsxImportSource react */\n\"use client\";\n\n/**\n * Client component for NextAuth provider that receives server-provided user data\n */\nimport { resolveAuthConfig } from \"@/nextjs/config.js\";\nimport { GlobalAuthManager } from \"@/reactjs/core/GlobalAuthManager.js\";\nimport { AuthStatusProvider } from \"@/shared/providers/AuthStatusContext.js\";\nimport { CivicAuthConfigProvider } from \"@/shared/providers/CivicAuthConfigContext.js\";\nimport { ServerUserContext } from \"./ServerUserContext.js\";\nimport { useInitialAuthConfig } from \"@/nextjs/hooks/useInitialAuthConfig.js\";\nimport type { AuthProviderProps } from \"@/shared/providers/types.js\";\nimport { useEffect } from \"react\";\nimport type { User } from \"@/types.js\";\nimport { useRouter } from \"next/navigation.js\";\n\ntype NextCivicAuthProviderProps = Omit<AuthProviderProps, \"clientId\">;\n\nexport interface CivicNextAuthProviderClientProps\n extends NextCivicAuthProviderProps {\n serverUser: User | null;\n redirectOnLogin?: string;\n redirectOnLogout?: string;\n}\n\n// Context to provide server user data immediately to useUser hook\n\nexport const CivicNextAuthProviderClient = ({\n children,\n serverUser,\n ...props\n}: CivicNextAuthProviderClientProps) => {\n const router = useRouter();\n const resolvedConfig = resolveAuthConfig();\n const {\n clientId,\n oauthServer,\n loginSuccessUrl,\n challengeUrl,\n refreshUrl,\n logoutCallbackUrl,\n } = resolvedConfig;\n\n // Initialize GlobalAuthManager synchronously with server user data\n // This ensures the server user is available immediately when useUser() is called\n const { initialConfig } = useInitialAuthConfig({\n displayMode: props.displayMode,\n iframeMode: props.iframeMode,\n serverUser: serverUser,\n nonce: props.nonce,\n targetContainerElement: props.targetContainerElement,\n oauthServer: oauthServer,\n loginSuccessUrl: loginSuccessUrl,\n onUrlChange: (url: string, source?: string) => {\n // Handle different URL change sources\n switch (source) {\n case \"login\":\n console.log(`[NextAuthProvider] Authentication redirect: ${url}`);\n window.location.href = url;\n break;\n case \"login_app\":\n console.log(`[NextAuthProvider] Login app redirect: ${url}`);\n window.location.href = url;\n break;\n default:\n console.log(\n `[NextAuthProvider] Navigating to: ${url} (source: ${source || \"unknown\"})`,\n );\n router.push(url);\n }\n },\n });\n\n // Initialize auth manager with server-provided data\n useEffect(() => {\n const initialize = async () => {\n try {\n const manager = GlobalAuthManager.getInstance();\n\n await manager.initialize(initialConfig);\n } catch (error) {\n console.error(\n \"[NextAuthProvider] Failed to initialize auth manager:\",\n error,\n );\n }\n };\n\n initialize();\n }, [initialConfig, router]);\n\n return (\n <ServerUserContext.Provider value={serverUser}>\n <CivicAuthConfigProvider\n oauthServer={oauthServer}\n clientId={clientId}\n loginSuccessUrl={loginSuccessUrl}\n logoutRedirectUrl={logoutCallbackUrl}\n nonce={props?.nonce}\n challengeUrl={challengeUrl}\n refreshUrl={refreshUrl}\n displayMode={props.displayMode}\n autoRedirect={resolvedConfig.autoRedirect}\n framework=\"nextjs\"\n >\n <AuthStatusProvider>{children}</AuthStatusProvider>\n </CivicAuthConfigProvider>\n </ServerUserContext.Provider>\n );\n};\n"]}
@@ -0,0 +1,2 @@
1
+ export declare const ServerUserContext: import("react").Context<import("../../types.js").BaseUser | null>;
2
+ //# sourceMappingURL=ServerUserContext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ServerUserContext.d.ts","sourceRoot":"","sources":["../../../src/nextjs/providers/ServerUserContext.tsx"],"names":[],"mappings":"AAMA,eAAO,MAAM,iBAAiB,+DAAmC,CAAC"}
@@ -0,0 +1,5 @@
1
+ /** @jsxImportSource react */
2
+ "use client";
3
+ import { createContext } from "react";
4
+ export const ServerUserContext = createContext(null);
5
+ //# sourceMappingURL=ServerUserContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ServerUserContext.js","sourceRoot":"","sources":["../../../src/nextjs/providers/ServerUserContext.tsx"],"names":[],"mappings":"AAAA,6BAA6B;AAC7B,YAAY,CAAC;AAEb,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAGtC,MAAM,CAAC,MAAM,iBAAiB,GAAG,aAAa,CAAc,IAAI,CAAC,CAAC","sourcesContent":["/** @jsxImportSource react */\n\"use client\";\n\nimport { createContext } from \"react\";\nimport type { User } from \"@/types.js\";\n\nexport const ServerUserContext = createContext<User | null>(null);\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"routeHandler.d.ts","sourceRoot":"","sources":["../../src/nextjs/routeHandler.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,UAAU,EAA0B,MAAM,oBAAoB,CAAC;AAW7E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAqb9C,wBAAsB,YAAY,CAChC,OAAO,EAAE,WAAW,EACpB,MAAM,EAAE,UAAU,GACjB,OAAO,CAAC,YAAY,CAAC,CA4CvB;AAwDD,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,WAAW,EACpB,MAAM,EAAE,UAAU,GACjB,OAAO,CAAC,YAAY,CAAC,CAwBvB;AAED;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,OAAO,iCAEF,WAAW,KAAG,OAAO,CAAC,YAAY,CAkCjD,CAAC"}
1
+ {"version":3,"file":"routeHandler.d.ts","sourceRoot":"","sources":["../../src/nextjs/routeHandler.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAKrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAoR9C,wBAAsB,YAAY,CAChC,OAAO,EAAE,WAAW,EACpB,MAAM,EAAE,UAAU,GACjB,OAAO,CAAC,YAAY,CAAC,CA2EvB;AAED,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,WAAW,EACpB,MAAM,EAAE,UAAU,GACjB,OAAO,CAAC,YAAY,CAAC,CA2DvB;AAED;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,OAAO,iCAEF,WAAW,KAAG,OAAO,CAAC,YAAY,CAqCjD,CAAC"}