@schemavaults/auth-react-provider 0.6.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/README.md +3 -0
- package/dist/auth-provider/auth-middleware-manager.d.ts +4 -0
- package/dist/auth-provider/auth-middleware-manager.js +39 -0
- package/dist/auth-provider/auth-middleware-manager.js.map +1 -0
- package/dist/auth-provider/auth-provider-props.d.ts +20 -0
- package/dist/auth-provider/auth-provider-props.js +2 -0
- package/dist/auth-provider/auth-provider-props.js.map +1 -0
- package/dist/auth-provider/auth-provider.d.ts +16 -0
- package/dist/auth-provider/auth-provider.js +159 -0
- package/dist/auth-provider/auth-provider.js.map +1 -0
- package/dist/auth-provider/index.d.ts +3 -0
- package/dist/auth-provider/index.js +3 -0
- package/dist/auth-provider/index.js.map +1 -0
- package/dist/constants/DefaultPkceAuthorizeRedirectPath.d.ts +2 -0
- package/dist/constants/DefaultPkceAuthorizeRedirectPath.js +3 -0
- package/dist/constants/DefaultPkceAuthorizeRedirectPath.js.map +1 -0
- package/dist/constants/DefaultSuccessfulAuthenticationRedirectPath.d.ts +2 -0
- package/dist/constants/DefaultSuccessfulAuthenticationRedirectPath.js +3 -0
- package/dist/constants/DefaultSuccessfulAuthenticationRedirectPath.js.map +1 -0
- package/dist/contexts/app-environment-context.d.ts +2 -0
- package/dist/contexts/app-environment-context.js +4 -0
- package/dist/contexts/app-environment-context.js.map +1 -0
- package/dist/contexts/auth-client-context.d.ts +15 -0
- package/dist/contexts/auth-client-context.js +11 -0
- package/dist/contexts/auth-client-context.js.map +1 -0
- package/dist/hooks/index.d.ts +20 -0
- package/dist/hooks/index.js +11 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/use-admin.d.ts +2 -0
- package/dist/hooks/use-admin.js +8 -0
- package/dist/hooks/use-admin.js.map +1 -0
- package/dist/hooks/use-app-environment.d.ts +4 -0
- package/dist/hooks/use-app-environment.js +73 -0
- package/dist/hooks/use-app-environment.js.map +1 -0
- package/dist/hooks/use-auth-client-initialization.d.ts +18 -0
- package/dist/hooks/use-auth-client-initialization.js +72 -0
- package/dist/hooks/use-auth-client-initialization.js.map +1 -0
- package/dist/hooks/use-auth-client-middleware.d.ts +13 -0
- package/dist/hooks/use-auth-client-middleware.js +90 -0
- package/dist/hooks/use-auth-client-middleware.js.map +1 -0
- package/dist/hooks/use-auth-client-state-watcher.d.ts +10 -0
- package/dist/hooks/use-auth-client-state-watcher.js +84 -0
- package/dist/hooks/use-auth-client-state-watcher.js.map +1 -0
- package/dist/hooks/use-auth.d.ts +3 -0
- package/dist/hooks/use-auth.js +9 -0
- package/dist/hooks/use-auth.js.map +1 -0
- package/dist/hooks/use-current-user.d.ts +3 -0
- package/dist/hooks/use-current-user.js +51 -0
- package/dist/hooks/use-current-user.js.map +1 -0
- package/dist/hooks/use-debug.d.ts +4 -0
- package/dist/hooks/use-debug.js +32 -0
- package/dist/hooks/use-debug.js.map +1 -0
- package/dist/hooks/use-effect-if-authenticated.d.ts +4 -0
- package/dist/hooks/use-effect-if-authenticated.js +18 -0
- package/dist/hooks/use-effect-if-authenticated.js.map +1 -0
- package/dist/hooks/use-is-client-execution-environment.d.ts +2 -0
- package/dist/hooks/use-is-client-execution-environment.js +21 -0
- package/dist/hooks/use-is-client-execution-environment.js.map +1 -0
- package/dist/hooks/use-logout-effect.d.ts +7 -0
- package/dist/hooks/use-logout-effect.js +88 -0
- package/dist/hooks/use-logout-effect.js.map +1 -0
- package/dist/hooks/use-start-login-oauth-pkce-flow.d.ts +4 -0
- package/dist/hooks/use-start-login-oauth-pkce-flow.js +110 -0
- package/dist/hooks/use-start-login-oauth-pkce-flow.js.map +1 -0
- package/dist/hooks/use-start-register-oauth-pkce-flow.d.ts +4 -0
- package/dist/hooks/use-start-register-oauth-pkce-flow.js +109 -0
- package/dist/hooks/use-start-register-oauth-pkce-flow.js.map +1 -0
- package/dist/hooks/use-trade-authorization-code-for-tokens.d.ts +15 -0
- package/dist/hooks/use-trade-authorization-code-for-tokens.js +232 -0
- package/dist/hooks/use-trade-authorization-code-for-tokens.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/UiToastFn.d.ts +8 -0
- package/dist/lib/UiToastFn.js +2 -0
- package/dist/lib/UiToastFn.js.map +1 -0
- package/dist/lib/UserData.d.ts +2 -0
- package/dist/lib/UserData.js +2 -0
- package/dist/lib/UserData.js.map +1 -0
- package/dist/lib/auth-client-factory.d.ts +43 -0
- package/dist/lib/auth-client-factory.js +98 -0
- package/dist/lib/auth-client-factory.js.map +1 -0
- package/dist/lib/get-app-environment-on-client-based-on-window-href.d.ts +3 -0
- package/dist/lib/get-app-environment-on-client-based-on-window-href.js +39 -0
- package/dist/lib/get-app-environment-on-client-based-on-window-href.js.map +1 -0
- package/dist/lib/get-app-environment-on-client.d.ts +2 -0
- package/dist/lib/get-app-environment-on-client.js +33 -0
- package/dist/lib/get-app-environment-on-client.js.map +1 -0
- package/dist/lib/getPkceAuthorizeUri.d.ts +9 -0
- package/dist/lib/getPkceAuthorizeUri.js +15 -0
- package/dist/lib/getPkceAuthorizeUri.js.map +1 -0
- package/dist/lib/getSuccessfulAuthenticationRedirectUri.d.ts +9 -0
- package/dist/lib/getSuccessfulAuthenticationRedirectUri.js +12 -0
- package/dist/lib/getSuccessfulAuthenticationRedirectUri.js.map +1 -0
- package/dist/lib/isClientRuntime.d.ts +1 -0
- package/dist/lib/isClientRuntime.js +13 -0
- package/dist/lib/isClientRuntime.js.map +1 -0
- package/dist/lib/react-auth-client-adapter.d.ts +40 -0
- package/dist/lib/react-auth-client-adapter.js +405 -0
- package/dist/lib/react-auth-client-adapter.js.map +1 -0
- package/dist/subproviders/app-environment-provider.d.ts +8 -0
- package/dist/subproviders/app-environment-provider.js +25 -0
- package/dist/subproviders/app-environment-provider.js.map +1 -0
- package/dist/subproviders/initialized-auth-client-provider.d.ts +6 -0
- package/dist/subproviders/initialized-auth-client-provider.js +12 -0
- package/dist/subproviders/initialized-auth-client-provider.js.map +1 -0
- package/dist/types/IReactAuthClientSdkAdapterInitOptions.d.ts +7 -0
- package/dist/types/IReactAuthClientSdkAdapterInitOptions.js +2 -0
- package/dist/types/IReactAuthClientSdkAdapterInitOptions.js.map +1 -0
- package/dist/types/UiToastFn.d.ts +8 -0
- package/dist/types/UiToastFn.js +2 -0
- package/dist/types/UiToastFn.js.map +1 -0
- package/dist/types/UserData.d.ts +2 -0
- package/dist/types/UserData.js +2 -0
- package/dist/types/UserData.js.map +1 -0
- package/dist/types/hook-status.d.ts +14 -0
- package/dist/types/hook-status.js +5 -0
- package/dist/types/hook-status.js.map +1 -0
- package/package.json +52 -0
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { AuthMiddleware, determineAuthStatus, } from "@schemavaults/auth-common";
|
|
3
|
+
import { useAuthClientStateWatcher, } from "./use-auth-client-state-watcher";
|
|
4
|
+
import { useAppEnvironment, } from "./use-app-environment";
|
|
5
|
+
import { useDebugWithSpecifiedBooleanOrLookupDefault } from "./use-debug";
|
|
6
|
+
export function useAuthClientMiddleware(opts) {
|
|
7
|
+
const environment = useAppEnvironment();
|
|
8
|
+
const debug = useDebugWithSpecifiedBooleanOrLookupDefault(environment, opts.debug);
|
|
9
|
+
async function onAuthStateChangedRunMiddleware({ auth, debug, }) {
|
|
10
|
+
console.assert(!!window, "'window' should be defined here-- but it's not! ");
|
|
11
|
+
if (!opts.authMiddlewareRules) {
|
|
12
|
+
throw new Error("[onAuthStateChangedRunMiddleware] authMiddlewareRules is required.");
|
|
13
|
+
}
|
|
14
|
+
if (!opts.path) {
|
|
15
|
+
throw new Error("[onAuthStateChangedRunMiddleware] path is required.");
|
|
16
|
+
}
|
|
17
|
+
if (auth) {
|
|
18
|
+
// Load feature support
|
|
19
|
+
if (typeof auth.supports !== 'function') {
|
|
20
|
+
throw new TypeError("Auth client does not implement 'supports' method for feature checking");
|
|
21
|
+
}
|
|
22
|
+
// Initalize token sources list to fill
|
|
23
|
+
const token_sources = [];
|
|
24
|
+
// Check for HTTP-only refresh token support
|
|
25
|
+
if (auth.supports('http-only-refresh-token') && auth.hasHttpOnlyRefreshToken()) {
|
|
26
|
+
token_sources.push({
|
|
27
|
+
type: "refresh",
|
|
28
|
+
token: "AS_HTTP_ONLY_COOKIE",
|
|
29
|
+
sourceHint: "Auth client believes it has an HTTP-only refresh token cookie",
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
else if (!auth.supports('http-only-refresh-token')) {
|
|
33
|
+
const refreshToken = auth.getRefreshTokenFromCache();
|
|
34
|
+
let refresh_token = undefined;
|
|
35
|
+
if (refreshToken && refreshToken.exp > Date.now()) {
|
|
36
|
+
refresh_token = refreshToken.token;
|
|
37
|
+
}
|
|
38
|
+
if (typeof refresh_token === "string") {
|
|
39
|
+
token_sources.push({
|
|
40
|
+
type: "refresh",
|
|
41
|
+
token: refresh_token,
|
|
42
|
+
sourceHint: "Refresh token",
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
let user_data = undefined;
|
|
47
|
+
if (auth.currentUser) {
|
|
48
|
+
user_data = auth.currentUser ?? undefined;
|
|
49
|
+
}
|
|
50
|
+
const authStatus = await determineAuthStatus({
|
|
51
|
+
token_sources,
|
|
52
|
+
user_data,
|
|
53
|
+
client_type: "client",
|
|
54
|
+
debug,
|
|
55
|
+
});
|
|
56
|
+
if (debug) {
|
|
57
|
+
console.log(`[onAuthStateChangedRunMiddleware]` +
|
|
58
|
+
" " +
|
|
59
|
+
`Running auth middleware after Auth SDK state change, on path ${opts.path}, with rules: `, opts.authMiddlewareRules);
|
|
60
|
+
}
|
|
61
|
+
const authorize_uri = opts.authorize_uri;
|
|
62
|
+
const authMiddlewareResult = AuthMiddleware({
|
|
63
|
+
path: opts.path,
|
|
64
|
+
authStatus,
|
|
65
|
+
rules: opts.authMiddlewareRules,
|
|
66
|
+
authedOnUnauthedRouteRedirectTo: opts.authed_on_unauthed_redirect_uri,
|
|
67
|
+
unauthedOnAuthedRouteRedirectTo: opts.unauthed_on_authed_redirect_uri,
|
|
68
|
+
authorize_uri,
|
|
69
|
+
successful_logout_redirect_uri: opts.successful_logout_redirect_uri,
|
|
70
|
+
environment,
|
|
71
|
+
});
|
|
72
|
+
if (debug) {
|
|
73
|
+
console.log(`[onAuthStateChangedRunMiddleware] Auth SDK State Change Event Auth middleware result: `, authMiddlewareResult);
|
|
74
|
+
}
|
|
75
|
+
if (authMiddlewareResult.redirect) {
|
|
76
|
+
if (debug) {
|
|
77
|
+
console.log(`[onAuthStateChangedRunMiddleware] ` +
|
|
78
|
+
`Redirecting to: ${authMiddlewareResult.redirectTo} (from ${window.location.origin} @ ${opts.path})`);
|
|
79
|
+
}
|
|
80
|
+
opts.router.push(authMiddlewareResult.redirectTo);
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
useAuthClientStateWatcher({
|
|
86
|
+
onAuthStateChanged: onAuthStateChangedRunMiddleware,
|
|
87
|
+
debug,
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=use-auth-client-middleware.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-auth-client-middleware.js","sourceRoot":"","sources":["../../src/hooks/use-auth-client-middleware.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ISchemaVaultsAuthClient } from "@schemavaults/auth-client-sdk";
|
|
2
|
+
export interface OnAuthStateChangedHandlerInput {
|
|
3
|
+
auth: ISchemaVaultsAuthClient;
|
|
4
|
+
debug: boolean;
|
|
5
|
+
}
|
|
6
|
+
export type UseAuthClientStateWatcherOptions = {
|
|
7
|
+
onAuthStateChanged: (opts: OnAuthStateChangedHandlerInput) => Promise<void>;
|
|
8
|
+
debug?: boolean;
|
|
9
|
+
};
|
|
10
|
+
export declare function useAuthClientStateWatcher({ onAuthStateChanged, ...opts }: UseAuthClientStateWatcherOptions): void;
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useEffect } from "react";
|
|
3
|
+
import { useAuth } from "./use-auth";
|
|
4
|
+
import { useAppEnvironment, } from "./use-app-environment";
|
|
5
|
+
import { useDebugWithSpecifiedBooleanOrLookupDefault } from "./use-debug";
|
|
6
|
+
export function useAuthClientStateWatcher({ onAuthStateChanged, ...opts }) {
|
|
7
|
+
const auth = useAuth();
|
|
8
|
+
const environment = useAppEnvironment();
|
|
9
|
+
const debug = useDebugWithSpecifiedBooleanOrLookupDefault(environment, opts.debug);
|
|
10
|
+
// Attach an auth-state change listener to the auth client
|
|
11
|
+
useEffect(() => {
|
|
12
|
+
if (!auth.ready) {
|
|
13
|
+
if (debug) {
|
|
14
|
+
console.log("[useAuthClientStateWatcher] Auth client not ready, skipping...");
|
|
15
|
+
}
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
async function handleAuthSDKStateChangeEvent() {
|
|
19
|
+
if (debug) {
|
|
20
|
+
console.log("[useAuthClientStateWatcher] Auth SDK state changed.");
|
|
21
|
+
}
|
|
22
|
+
try {
|
|
23
|
+
if (!auth.ready) {
|
|
24
|
+
throw new Error("Cannot handle auth SDK state change event when auth client is not initialized");
|
|
25
|
+
}
|
|
26
|
+
const authClient = auth.client.current;
|
|
27
|
+
if (!authClient) {
|
|
28
|
+
if (debug) {
|
|
29
|
+
console.warn("[useAuthClientStateWatcher] Auth client is null.");
|
|
30
|
+
}
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
try {
|
|
34
|
+
if (debug) {
|
|
35
|
+
console.log("[useAuthClientStateWatcher] Calling onAuthStateChanged() with auth client: ", authClient);
|
|
36
|
+
}
|
|
37
|
+
await onAuthStateChanged({
|
|
38
|
+
auth: authClient,
|
|
39
|
+
debug,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
catch (e) {
|
|
43
|
+
console.error("There was an error running the onAuthStateChanged callback passed to useAuthClientStateWatcher: ", e);
|
|
44
|
+
throw new Error("There was an error running the onAuthStateChanged callback passed to useAuthClientStateWatcher!");
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
catch (e) {
|
|
48
|
+
console.error("[useAuthClientStateWatcher] Error handling auth SDK state change event: ", e);
|
|
49
|
+
}
|
|
50
|
+
} // end of handleAuthSDKStateChangeEvent
|
|
51
|
+
const authClientRef = auth.client;
|
|
52
|
+
if (authClientRef.current) {
|
|
53
|
+
if (debug) {
|
|
54
|
+
console.log("[useAuthClientStateWatcher] Adding auth state change listener...");
|
|
55
|
+
}
|
|
56
|
+
let listener_id;
|
|
57
|
+
try {
|
|
58
|
+
const new_listener_id = authClientRef.current.onAuthStateChanged(handleAuthSDKStateChangeEvent);
|
|
59
|
+
if (typeof new_listener_id !== "string") {
|
|
60
|
+
throw new Error(`Expected to receive a unique listener ID string after setting up onAuthStateChanged listener, but received type: ${typeof new_listener_id}`);
|
|
61
|
+
}
|
|
62
|
+
listener_id = new_listener_id;
|
|
63
|
+
}
|
|
64
|
+
catch (e) {
|
|
65
|
+
console.error("[useAuthClientStateWatcher] Failed to add auth state change listener.", e);
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
const unsubscribe = () => {
|
|
69
|
+
if (authClientRef.current) {
|
|
70
|
+
console.assert(typeof listener_id === "string", `Expected listener ID to unsubscribe auth-state-change-listener from to be a string!`);
|
|
71
|
+
try {
|
|
72
|
+
authClientRef.current.removeAuthStateChangeListener(listener_id);
|
|
73
|
+
}
|
|
74
|
+
catch (e) {
|
|
75
|
+
console.error("[useAuthClientStateWatcher] Failed to remove auth state change listener: ", e);
|
|
76
|
+
}
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
return unsubscribe;
|
|
81
|
+
}
|
|
82
|
+
}, [auth, debug, onAuthStateChanged]);
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=use-auth-client-state-watcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-auth-client-state-watcher.js","sourceRoot":"","sources":["../../src/hooks/use-auth-client-state-watcher.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useContext } from "react";
|
|
3
|
+
import { SchemaVaultsAuthContext, } from "../contexts/auth-client-context";
|
|
4
|
+
export function useAuth() {
|
|
5
|
+
const authContext = useContext(SchemaVaultsAuthContext);
|
|
6
|
+
return authContext;
|
|
7
|
+
}
|
|
8
|
+
export default useAuth;
|
|
9
|
+
//# sourceMappingURL=use-auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-auth.js","sourceRoot":"","sources":["../../src/hooks/use-auth.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AACnC,OAAO,EACL,uBAAuB,GAExB,MAAM,gCAAgC,CAAC;AAExC,MAAM,UAAU,OAAO;IACrB,MAAM,WAAW,GAAgC,UAAU,CACzD,uBAAuB,CACxB,CAAC;IACF,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,eAAe,OAAO,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import useAuth from "./use-auth";
|
|
3
|
+
import useAppEnvironment from "./use-app-environment";
|
|
4
|
+
import { useDebug } from "./use-debug";
|
|
5
|
+
import { useState } from "react";
|
|
6
|
+
import { useAuthClientStateWatcher } from "./use-auth-client-state-watcher";
|
|
7
|
+
function getCurrentUser(auth) {
|
|
8
|
+
return auth.currentUser;
|
|
9
|
+
}
|
|
10
|
+
function maybeGetCurrentUserFromAuthHook(authClientRef, debug = false) {
|
|
11
|
+
if (authClientRef.ready &&
|
|
12
|
+
authClientRef.client &&
|
|
13
|
+
authClientRef.client.current) {
|
|
14
|
+
const auth = authClientRef.client.current;
|
|
15
|
+
const currentUser = getCurrentUser(auth);
|
|
16
|
+
if (currentUser) {
|
|
17
|
+
if (debug) {
|
|
18
|
+
console.log("[maybeGetCurrentUserFromAuthHook] Loaded current user data from auth client: ", currentUser);
|
|
19
|
+
}
|
|
20
|
+
return currentUser;
|
|
21
|
+
}
|
|
22
|
+
if (debug) {
|
|
23
|
+
console.log("[maybeGetCurrentUserFromAuthHook] Auth client appears to be ready-- but no current user was found!");
|
|
24
|
+
}
|
|
25
|
+
return currentUser;
|
|
26
|
+
}
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
export function useCurrentUser() {
|
|
30
|
+
const environment = useAppEnvironment();
|
|
31
|
+
const authClientRef = useAuth();
|
|
32
|
+
const debug = useDebug(environment);
|
|
33
|
+
const [user, setUser] = useState(maybeGetCurrentUserFromAuthHook(authClientRef, debug));
|
|
34
|
+
useAuthClientStateWatcher({
|
|
35
|
+
debug,
|
|
36
|
+
onAuthStateChanged: async function updateCurrentUserOnAuthStateChanged({ auth, }) {
|
|
37
|
+
const user = auth.currentUser;
|
|
38
|
+
if (debug) {
|
|
39
|
+
console.log("[updateCurrentUserOnAuthStateChanged] Updating current user: ", user);
|
|
40
|
+
}
|
|
41
|
+
setUser(user);
|
|
42
|
+
return;
|
|
43
|
+
},
|
|
44
|
+
});
|
|
45
|
+
if (debug) {
|
|
46
|
+
console.warn("[useCurrentUser] Auth client is not ready yet, returning null for user data!");
|
|
47
|
+
}
|
|
48
|
+
return user;
|
|
49
|
+
}
|
|
50
|
+
export default useCurrentUser;
|
|
51
|
+
//# sourceMappingURL=use-current-user.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-current-user.js","sourceRoot":"","sources":["../../src/hooks/use-current-user.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAGb,OAAO,OAAO,MAAM,kBAAkB,CAAC;AAEvC,OAAO,iBAAiB,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,EAAE,yBAAyB,EAAE,MAAM,iCAAiC,CAAC;AAE5E,SAAS,cAAc,CAAC,IAA6B;IACnD,OAAO,IAAI,CAAC,WAAW,CAAC;AAC1B,CAAC;AAED,SAAS,+BAA+B,CACtC,aAAyC,EACzC,QAAiB,KAAK;IAEtB,IACE,aAAa,CAAC,KAAK;QACnB,aAAa,CAAC,MAAM;QACpB,aAAa,CAAC,MAAM,CAAC,OAAO,EAC5B,CAAC;QACD,MAAM,IAAI,GAA4B,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC;QACnE,MAAM,WAAW,GAAoB,cAAc,CAAC,IAAI,CAAC,CAAC;QAE1D,IAAI,WAAW,EAAE,CAAC;YAChB,IAAI,KAAK,EAAE,CAAC;gBACV,OAAO,CAAC,GAAG,CACT,+EAA+E,EAC/E,WAAW,CACZ,CAAC;YACJ,CAAC;YACD,OAAO,WAA8B,CAAC;QACxC,CAAC;QAED,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,CAAC,GAAG,CACT,oGAAoG,CACrG,CAAC;QACJ,CAAC;QAED,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,MAAM,WAAW,GAAG,iBAAiB,EAAE,CAAC;IACxC,MAAM,aAAa,GAAG,OAAO,EAAE,CAAC;IAChC,MAAM,KAAK,GAAY,QAAQ,CAAC,WAAW,CAAC,CAAC;IAE7C,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAC9B,+BAA+B,CAAC,aAAa,EAAE,KAAK,CAAC,CACtD,CAAC;IAEF,yBAAyB,CAAC;QACxB,KAAK;QACL,kBAAkB,EAAE,KAAK,UAAU,mCAAmC,CAAC,EACrE,IAAI,GACL;YACC,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC;YAC9B,IAAI,KAAK,EAAE,CAAC;gBACV,OAAO,CAAC,GAAG,CACT,+DAA+D,EAC/D,IAAI,CACL,CAAC;YACJ,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,CAAC;YACd,OAAO;QACT,CAAC;KACF,CAAC,CAAC;IAEH,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,CAAC,IAAI,CACV,8EAA8E,CAC/E,CAAC;IACJ,CAAC;IAED,OAAO,IAA8B,CAAC;AACxC,CAAC;AAED,eAAe,cAAc,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { SchemaVaultsAppEnvironment } from "@schemavaults/app-definitions";
|
|
2
|
+
export declare function useDebug(environment: SchemaVaultsAppEnvironment): boolean;
|
|
3
|
+
export default useDebug;
|
|
4
|
+
export declare function useDebugWithSpecifiedBooleanOrLookupDefault(environment: SchemaVaultsAppEnvironment, debug?: undefined | boolean): boolean;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useMemo } from "react";
|
|
3
|
+
export function useDebug(environment) {
|
|
4
|
+
return useMemo(() => {
|
|
5
|
+
if (environment === "development" ||
|
|
6
|
+
environment === "test" ||
|
|
7
|
+
environment === "staging") {
|
|
8
|
+
return true;
|
|
9
|
+
}
|
|
10
|
+
try {
|
|
11
|
+
if (typeof process.env.NEXT_PUBLIC_SCHEMAVAULTS_PRIVATE_BETA === "string" &&
|
|
12
|
+
process.env.NEXT_PUBLIC_SCHEMAVAULTS_PRIVATE_BETA.includes("true")) {
|
|
13
|
+
return true;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
catch (e) {
|
|
17
|
+
void e; /** no-op */
|
|
18
|
+
}
|
|
19
|
+
return false;
|
|
20
|
+
}, [environment]);
|
|
21
|
+
}
|
|
22
|
+
export default useDebug;
|
|
23
|
+
export function useDebugWithSpecifiedBooleanOrLookupDefault(environment, debug) {
|
|
24
|
+
const defaultDebugState = useDebug(environment);
|
|
25
|
+
if (typeof debug === "boolean") {
|
|
26
|
+
return debug;
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
return defaultDebugState;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=use-debug.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-debug.js","sourceRoot":"","sources":["../../src/hooks/use-debug.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAGb,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAEhC,MAAM,UAAU,QAAQ,CAAC,WAAuC;IAC9D,OAAO,OAAO,CAAC,GAAY,EAAE;QAC3B,IACE,WAAW,KAAK,aAAa;YAC7B,WAAW,KAAK,MAAM;YACtB,WAAW,KAAK,SAAS,EACzB,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,CAAC;YACH,IACE,OAAO,OAAO,CAAC,GAAG,CAAC,qCAAqC,KAAK,QAAQ;gBACrE,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAClE,CAAC;gBACD,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QAAC,OAAO,CAAU,EAAE,CAAC;YACpB,KAAK,CAAC,CAAC,CAAC,YAAY;QACtB,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;AACpB,CAAC;AAED,eAAe,QAAQ,CAAC;AAExB,MAAM,UAAU,2CAA2C,CACzD,WAAuC,EACvC,KAA2B;IAE3B,MAAM,iBAAiB,GAAY,QAAQ,CAAC,WAAW,CAAC,CAAC;IACzD,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE,CAAC;QAC/B,OAAO,KAAK,CAAC;IACf,CAAC;SAAM,CAAC;QACN,OAAO,iBAAiB,CAAC;IAC3B,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useEffect } from "react";
|
|
3
|
+
import useAuth from "./use-auth";
|
|
4
|
+
export function useEffectIfAuthenticated(effect) {
|
|
5
|
+
const authContext = useAuth();
|
|
6
|
+
useEffect(() => {
|
|
7
|
+
if (!authContext.ready || !authContext.client.current) {
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
const auth = authContext.client.current;
|
|
11
|
+
if (auth.isAuthenticated) {
|
|
12
|
+
const unsubscribe = effect(auth);
|
|
13
|
+
return unsubscribe;
|
|
14
|
+
}
|
|
15
|
+
}, [authContext, effect]);
|
|
16
|
+
}
|
|
17
|
+
export default useEffectIfAuthenticated;
|
|
18
|
+
//# sourceMappingURL=use-effect-if-authenticated.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-effect-if-authenticated.js","sourceRoot":"","sources":["../../src/hooks/use-effect-if-authenticated.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAClC,OAAO,OAAO,MAAM,YAAY,CAAC;AAKjC,MAAM,UAAU,wBAAwB,CACtC,MAAwD;IAExD,MAAM,WAAW,GAAG,OAAO,EAAE,CAAC;IAE9B,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACtD,OAAO;QACT,CAAC;QACD,MAAM,IAAI,GAA4B,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC;QACjE,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,MAAM,WAAW,GAAkB,MAAM,CAAC,IAAI,CAAC,CAAC;YAChD,OAAO,WAAW,CAAC;QACrB,CAAC;IACH,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC;AAC5B,CAAC;AAED,eAAe,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import useDebug from "./use-debug";
|
|
3
|
+
import useAppEnvironment from "./use-app-environment";
|
|
4
|
+
export function useIsClientExecutionEnvironment() {
|
|
5
|
+
const environment = useAppEnvironment();
|
|
6
|
+
const debug = useDebug(environment);
|
|
7
|
+
try {
|
|
8
|
+
if (window) {
|
|
9
|
+
return true;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
catch (e) {
|
|
13
|
+
void e;
|
|
14
|
+
}
|
|
15
|
+
if (debug) {
|
|
16
|
+
console.log("[useIsClientExecutionEnvironment] This does not appear to be running in the browser!");
|
|
17
|
+
}
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
export default useIsClientExecutionEnvironment;
|
|
21
|
+
//# sourceMappingURL=use-is-client-execution-environment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-is-client-execution-environment.js","sourceRoot":"","sources":["../../src/hooks/use-is-client-execution-environment.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAGb,OAAO,QAAQ,MAAM,mBAAmB,CAAC;AACzC,OAAO,iBAAiB,MAAM,6BAA6B,CAAC;AAE5D,MAAM,UAAU,+BAA+B;IAC7C,MAAM,WAAW,GAA+B,iBAAiB,EAAE,CAAC;IACpE,MAAM,KAAK,GAAY,QAAQ,CAAC,WAAW,CAAC,CAAC;IAE7C,IAAI,CAAC;QACH,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAAC,OAAO,CAAU,EAAE,CAAC;QACpB,KAAK,CAAC,CAAC;IACT,CAAC;IAED,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,CAAC,GAAG,CACT,sFAAsF,CACvF,CAAC;IACJ,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,eAAe,+BAA+B,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export interface UseLogoutEffectOptions {
|
|
2
|
+
onLogoutSuccess?: (successful_logout_redirect_uri: string) => void;
|
|
3
|
+
onLogoutFailure?: (e: unknown) => void;
|
|
4
|
+
debug?: boolean;
|
|
5
|
+
}
|
|
6
|
+
export declare function useLogoutEffect({ onLogoutSuccess, onLogoutFailure, ...opts }: UseLogoutEffectOptions): void;
|
|
7
|
+
export default useLogoutEffect;
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useEffect, useMemo } from "react";
|
|
3
|
+
import { useAuth } from "./use-auth";
|
|
4
|
+
import { useRouter } from "next/navigation";
|
|
5
|
+
import { useAppEnvironment, } from "./use-app-environment";
|
|
6
|
+
import { useDebugWithSpecifiedBooleanOrLookupDefault } from "./use-debug";
|
|
7
|
+
export function useLogoutEffect({ onLogoutSuccess, onLogoutFailure, ...opts }) {
|
|
8
|
+
const authContext = useAuth();
|
|
9
|
+
const router = useRouter();
|
|
10
|
+
const environment = useAppEnvironment();
|
|
11
|
+
const debug = useDebugWithSpecifiedBooleanOrLookupDefault(environment, opts?.debug);
|
|
12
|
+
const onLogoutSuccessCallback = useMemo(() => {
|
|
13
|
+
if (typeof onLogoutSuccess === "function") {
|
|
14
|
+
return onLogoutSuccess;
|
|
15
|
+
}
|
|
16
|
+
else {
|
|
17
|
+
return function defaultOnLogoutSuccessCallback(successful_logout_redirect_uri) {
|
|
18
|
+
if (debug) {
|
|
19
|
+
console.warn("No 'onLogoutSuccess' callback is set! Falling back to default behaviour...");
|
|
20
|
+
}
|
|
21
|
+
router.push(successful_logout_redirect_uri);
|
|
22
|
+
return;
|
|
23
|
+
}; // defaultOnLogoutSuccessCallback()
|
|
24
|
+
}
|
|
25
|
+
}, [debug, onLogoutSuccess, router]);
|
|
26
|
+
const onLogoutFailureCallback = useMemo(() => {
|
|
27
|
+
if (typeof onLogoutFailure === "function") {
|
|
28
|
+
return onLogoutFailure;
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
return function defaultOnLogoutFailureCallback(e) {
|
|
32
|
+
if (debug) {
|
|
33
|
+
console.warn("No 'onLogoutFailure' callback is set! Falling back to default behaviour...");
|
|
34
|
+
}
|
|
35
|
+
const errMsg = e instanceof Error
|
|
36
|
+
? e.message
|
|
37
|
+
: "An unknown error occurred while logging out!";
|
|
38
|
+
console.error("[defaultOnLogoutFailureCallback]", errMsg);
|
|
39
|
+
return;
|
|
40
|
+
}; // defaultOnLogoutFailureCallback()
|
|
41
|
+
}
|
|
42
|
+
}, [debug, onLogoutFailure]);
|
|
43
|
+
useEffect(() => {
|
|
44
|
+
let cancelDueToUnmount = false;
|
|
45
|
+
function unsubscribe() {
|
|
46
|
+
cancelDueToUnmount = true;
|
|
47
|
+
}
|
|
48
|
+
if (!authContext.ready ||
|
|
49
|
+
!authContext.client ||
|
|
50
|
+
!authContext.client.current) {
|
|
51
|
+
if (debug) {
|
|
52
|
+
console.log("[useLogoutEffect] Auth client not ready-- not attempting logout until effect is re-triggered!");
|
|
53
|
+
}
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
const auth = authContext.client.current;
|
|
57
|
+
const successful_logout_redirect_uri = auth.successful_logout_redirect_uri ?? "/";
|
|
58
|
+
if (cancelDueToUnmount) {
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
if (debug) {
|
|
62
|
+
console.log("[useLogoutEffect] Attempting to log out!");
|
|
63
|
+
}
|
|
64
|
+
auth
|
|
65
|
+
.logout()
|
|
66
|
+
.then(() => {
|
|
67
|
+
if (cancelDueToUnmount)
|
|
68
|
+
return;
|
|
69
|
+
onLogoutSuccessCallback(successful_logout_redirect_uri);
|
|
70
|
+
return;
|
|
71
|
+
})
|
|
72
|
+
.catch((e) => {
|
|
73
|
+
if (cancelDueToUnmount)
|
|
74
|
+
return;
|
|
75
|
+
onLogoutFailureCallback(e);
|
|
76
|
+
return;
|
|
77
|
+
});
|
|
78
|
+
return unsubscribe;
|
|
79
|
+
}, [
|
|
80
|
+
authContext,
|
|
81
|
+
debug,
|
|
82
|
+
onLogoutSuccessCallback,
|
|
83
|
+
onLogoutFailureCallback,
|
|
84
|
+
router,
|
|
85
|
+
]);
|
|
86
|
+
}
|
|
87
|
+
export default useLogoutEffect;
|
|
88
|
+
//# sourceMappingURL=use-logout-effect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-logout-effect.js","sourceRoot":"","sources":["../../src/hooks/use-logout-effect.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { useRouter } from "next/navigation";
|
|
2
|
+
import type { UseUiToastHook } from "../types/UiToastFn";
|
|
3
|
+
export declare function useStartLoginOauthPKCEFlow(useAppRouter: typeof useRouter, checkIfAuthenticatedWithServer: () => Promise<boolean>, useToast: UseUiToastHook): void;
|
|
4
|
+
export default useStartLoginOauthPKCEFlow;
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import useEffectIfAuthenticated from "./use-effect-if-authenticated";
|
|
3
|
+
import useAuth from "./use-auth";
|
|
4
|
+
import { useEffect } from "react";
|
|
5
|
+
import useAppEnvironment from "./use-app-environment";
|
|
6
|
+
import useDebug from "./use-debug";
|
|
7
|
+
export function useStartLoginOauthPKCEFlow(useAppRouter, checkIfAuthenticatedWithServer, useToast) {
|
|
8
|
+
const router = useAppRouter();
|
|
9
|
+
const authContext = useAuth();
|
|
10
|
+
const environment = useAppEnvironment();
|
|
11
|
+
const debug = useDebug(environment);
|
|
12
|
+
const { toast } = useToast();
|
|
13
|
+
useEffectIfAuthenticated((auth) => {
|
|
14
|
+
console.assert(!!auth.currentUser, "Expected user to be logged in if this point was reached-- but current user data is falsy!");
|
|
15
|
+
if (debug) {
|
|
16
|
+
console.log("[useEffectIfAuthenticated] Sending to account page...");
|
|
17
|
+
}
|
|
18
|
+
const redirect_uri = auth.successful_authentication_redirect_uri;
|
|
19
|
+
router.push(redirect_uri);
|
|
20
|
+
return () => { };
|
|
21
|
+
});
|
|
22
|
+
useEffect(() => {
|
|
23
|
+
let cancelLoginEffect = false;
|
|
24
|
+
async function checkIfAlreadyAuthenticated(auth) {
|
|
25
|
+
if (!auth.isAuthenticated) {
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
const hasValidRefreshTokenSet = await checkIfAuthenticatedWithServer();
|
|
29
|
+
if (!hasValidRefreshTokenSet) {
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
return true;
|
|
33
|
+
}
|
|
34
|
+
async function startLoginPkceFlow(auth) {
|
|
35
|
+
if (cancelLoginEffect) {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
await auth.login();
|
|
39
|
+
}
|
|
40
|
+
async function handleAuthClientReady(auth) {
|
|
41
|
+
if (cancelLoginEffect) {
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
let isAuthenticated = false;
|
|
45
|
+
try {
|
|
46
|
+
isAuthenticated = await checkIfAlreadyAuthenticated(auth);
|
|
47
|
+
}
|
|
48
|
+
catch (e) {
|
|
49
|
+
// no-op
|
|
50
|
+
console.error("[useStartLoginOauthPKCEFlow] Error checking if user is already authenticated: ", e);
|
|
51
|
+
}
|
|
52
|
+
if (isAuthenticated) {
|
|
53
|
+
if (debug) {
|
|
54
|
+
console.log("[startLoginPkceFlow] User appears to already be logged in! Not triggering Oauth2 PKCE flow-- a different effect should redirect the user to the account page...");
|
|
55
|
+
}
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
if (debug) {
|
|
60
|
+
console.log("[startLoginPkceFlow] User does not appear to already be logged in... Starting Oauth2 PKCE flow!");
|
|
61
|
+
}
|
|
62
|
+
await startLoginPkceFlow(auth);
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
if (authContext.ready) {
|
|
67
|
+
if (debug) {
|
|
68
|
+
console.log("[useStartLoginOauthPKCEFlow] Auth client ready.");
|
|
69
|
+
}
|
|
70
|
+
const clientRef = authContext.client;
|
|
71
|
+
if (!clientRef) {
|
|
72
|
+
if (debug) {
|
|
73
|
+
console.error("[useStartLoginOauthPKCEFlow] Auth client not ready. -- null client ref.");
|
|
74
|
+
}
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
try {
|
|
78
|
+
if (clientRef.current) {
|
|
79
|
+
const auth = clientRef.current;
|
|
80
|
+
handleAuthClientReady(auth).catch(function onFailureStartingLoginFlow(e) {
|
|
81
|
+
console.error("Error start login flow: ", e);
|
|
82
|
+
toast({
|
|
83
|
+
variant: "destructive",
|
|
84
|
+
title: "Error starting login flow",
|
|
85
|
+
description: e instanceof Error
|
|
86
|
+
? e.message
|
|
87
|
+
: "An unknown error has occurred!",
|
|
88
|
+
});
|
|
89
|
+
return;
|
|
90
|
+
});
|
|
91
|
+
return function effectUnsubscribeHandler() {
|
|
92
|
+
cancelLoginEffect = true;
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
catch (e) {
|
|
97
|
+
if (debug) {
|
|
98
|
+
console.error("[useStartLoginOauthPKCEFlow] Error redirecting to login page: ", e);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
if (debug) {
|
|
104
|
+
console.log("[useStartLoginOauthPKCEFlow] Auth client not ready.");
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}, [authContext, debug, router, toast, checkIfAuthenticatedWithServer]);
|
|
108
|
+
}
|
|
109
|
+
export default useStartLoginOauthPKCEFlow;
|
|
110
|
+
//# sourceMappingURL=use-start-login-oauth-pkce-flow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-start-login-oauth-pkce-flow.js","sourceRoot":"","sources":["../../src/hooks/use-start-login-oauth-pkce-flow.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { useRouter } from "next/navigation";
|
|
2
|
+
import type { UseUiToastHook } from "../types/UiToastFn";
|
|
3
|
+
export declare function useStartRegisterOauthPKCEFlow(useAppRouter: typeof useRouter, checkIfAuthenticatedWithServer: () => Promise<boolean>, useToast: UseUiToastHook): void;
|
|
4
|
+
export default useStartRegisterOauthPKCEFlow;
|