Skip to content

Commit

Permalink
fix(clerk-js): Update props while respecting defaults set by Clerk.lo…
Browse files Browse the repository at this point in the history
…ad()

Support remounting ClerkProvider multiple times by making sure that the `updateProps` call during the loading phase does not override any defaults set by `Clerk.load()` for values that are missing
  • Loading branch information
nikosdouvlis committed May 28, 2024
1 parent ef8ef17 commit 58cee3c
Show file tree
Hide file tree
Showing 3 changed files with 53 additions and 1 deletion.
5 changes: 5 additions & 0 deletions .changeset/cold-chicken-drop.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@clerk/clerk-js': patch
---

Support remounting ClerkProvider multiple times by making sure that the `updateProps` call during the loading phase does not override any defaults set by `Clerk.load()` for values that are missing
45 changes: 45 additions & 0 deletions integration/tests/update-props.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
import { test } from '@playwright/test';

import type { FakeUser } from '../testUtils';
import { createTestUtils, testAgainstRunningApps } from '../testUtils';

testAgainstRunningApps({ withPattern: ['react.vite.withEmailCodes'] })('sign in flow @generic', ({ app }) => {
test.describe.configure({ mode: 'serial' });

let fakeUser: FakeUser;

test.beforeAll(async () => {
const u = createTestUtils({ app });
fakeUser = u.services.users.createFakeUser({
fictionalEmail: true,
withPassword: true,
});
await u.services.users.createBapiUser(fakeUser);
});

test.afterAll(async () => {
await fakeUser.deleteIfExists();
await app.teardown();
});

test('updating props after initial loading does not override defaults set by Clerk.load()', async ({
page,
context,
}) => {
const u = createTestUtils({ app, page, context });
await u.po.signIn.goTo({ searchParams: new URLSearchParams({ redirect_url: 'https://www.clerk.com' }) });
await u.page.waitForFunction(async () => {
// Emulate ClerkProvider being unmounted and mounted again
// as updateProps is going to be called without the default options set by window.Clerk.load()
await (window.Clerk as any).__unstable__updateProps({ options: {} });
});
await u.po.signIn.setIdentifier(fakeUser.email);
await u.po.signIn.continue();
await u.po.signIn.setPassword(fakeUser.password);
await u.po.signIn.continue();
await u.po.expect.toBeSignedIn();
// allowedRedirectOrigins should still be respected here
// even after the above updateProps invocation
await u.page.waitForURL(`${app.serverUrl}`);
});
});
4 changes: 3 additions & 1 deletion packages/clerk-js/src/ui/Components.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -169,6 +169,7 @@ const Components = (props: ComponentsProps) => {
nodes: new Map(),
impersonationFab: false,
});

const {
googleOneTapModal,
signInModal,
Expand Down Expand Up @@ -215,7 +216,8 @@ const Components = (props: ComponentsProps) => {
return;
}
}
setState(s => ({ ...s, ...restProps }));

setState(s => ({ ...s, ...restProps, options: { ...s.options, ...restProps.options } }));
};

componentsControls.closeModal = name => {
Expand Down

0 comments on commit 58cee3c

Please sign in to comment.