Skip to content

Commit

Permalink
fix(clerk-js): Revalidate environment on window focus for Keyless
Browse files Browse the repository at this point in the history
  • Loading branch information
panteliselef committed Dec 19, 2024
1 parent 4fecdac commit c61fa3a
Show file tree
Hide file tree
Showing 4 changed files with 71 additions and 2 deletions.
5 changes: 5 additions & 0 deletions .changeset/bright-mangos-pump.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@clerk/clerk-js': patch
---

Revalidate environment on window focus for Keyless.
2 changes: 2 additions & 0 deletions packages/clerk-js/src/core/clerk.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1898,6 +1898,8 @@ export class Clerk implements ClerkInterface {
await initEnvironmentPromise;
initComponents();
await initClient();
} else {
throw e;
}
});

Expand Down
4 changes: 2 additions & 2 deletions packages/clerk-js/src/ui/components/KeylessPrompt/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,12 @@ import { useClerk } from '@clerk/shared/react';
import { css } from '@emotion/react';
import { useState } from 'react';

import { useEnvironment } from '../../contexts';
import { descriptors, Flex, Link, Spinner } from '../../customizables';
import { Portal } from '../../elements/Portal';
import { InternalThemeProvider } from '../../styledSystem';
import { ClerkLogoIcon } from './ClerkLogoIcon';
import { KeySlashIcon } from './KeySlashIcon';
import { useRevalidateEnvironment } from './use-revalidate-environment';

type KeylessPromptProps = {
claimUrl: string;
Expand All @@ -20,7 +20,7 @@ const _KeylessPrompt = (_props: KeylessPromptProps) => {
const [isLoading, setIsLoading] = useState(false);
const handleFocus = () => setIsExpanded(true);

const claimed = Boolean(useEnvironment().authConfig.claimedAt);
const claimed = Boolean(useRevalidateEnvironment().authConfig.claimedAt);
const clerk = useClerk();

return (
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
import { useClerk } from '@clerk/shared/react';
import { useEffect, useReducer } from 'react';

import type { Clerk } from '../../../core/clerk';
import type { Environment } from '../../../core/resources';
import { useEnvironment } from '../../contexts';

/**
* Revalidates environment on focus, highly optimized for Keyless mode.
* Attention: this is not a generic solution, and should not be used for revalidating environment inside UI components that are end-user facing (e.g. SignIn)
*/
function useRevalidateEnvironment() {
const clerk = useClerk();
const [, forceUpdate] = useReducer(v => v + 1, 0);

useEffect(() => {
const controller = new AbortController();
window.addEventListener(
'focus',

async () => {
const environment = (clerk as Clerk).__unstable__environment as Environment | undefined;

if (!environment) {
return;
}

if (environment.authConfig.claimedAt !== null) {
return controller.abort();
}

if (document.visibilityState !== 'visible') {
return;
}

const maxRetries = 2;

for (let i = 0; i < maxRetries; i++) {
const {
authConfig: { claimedAt },
} = await environment.fetch();

if (claimedAt !== null) {
forceUpdate();
break;
}
}
},
{
signal: controller.signal,
},
);

return () => {
controller.abort();
};
}, []);

return useEnvironment();
}

export { useRevalidateEnvironment };

0 comments on commit c61fa3a

Please sign in to comment.