-
Notifications
You must be signed in to change notification settings - Fork 330
/
Copy pathClerkProvider.tsx
44 lines (38 loc) · 1.44 KB
/
ClerkProvider.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
'use client';
import { ClerkProvider as ReactClerkProvider } from '@clerk/clerk-react';
import { useRouter } from 'next/navigation';
import React from 'react';
import { ClerkNextOptionsProvider } from '../../client-boundary/NextOptionsContext';
import { useSafeLayoutEffect } from '../../client-boundary/useSafeLayoutEffect';
import type { NextClerkProviderProps } from '../../types';
import { mergeNextClerkPropsWithEnv } from '../../utils/mergeNextClerkPropsWithEnv';
import { useAwaitableNavigate } from './useAwaitableNavigate';
declare global {
export interface Window {
__clerk_nav_await: Array<(value: void) => void>;
__clerk_nav: (to: string) => Promise<void>;
}
}
export const ClientClerkProvider = (props: NextClerkProviderProps) => {
const { __unstable_invokeMiddlewareOnAuthStateChange = true } = props;
const router = useRouter();
const navigate = useAwaitableNavigate();
useSafeLayoutEffect(() => {
window.__unstable__onBeforeSetActive = () => {
if (__unstable_invokeMiddlewareOnAuthStateChange) {
router.refresh();
router.push(window.location.href);
}
};
window.__unstable__onAfterSetActive = () => {
router.refresh();
};
}, []);
const mergedProps = mergeNextClerkPropsWithEnv({ ...props, navigate });
return (
<ClerkNextOptionsProvider options={mergedProps}>
{/*// @ts-ignore*/}
<ReactClerkProvider {...mergedProps} />
</ClerkNextOptionsProvider>
);
};