Skip to content

Commit 8dc2e63

Browse files
feat(clerk-js): Opt out of combined flow when in restricted mode (#5020)
1 parent 4773d0a commit 8dc2e63

File tree

5 files changed

+62
-4
lines changed

5 files changed

+62
-4
lines changed

.changeset/early-apples-return.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@clerk/clerk-js': patch
3+
---
4+
5+
Opt out of combined flow when sign up mode is restricted.

integration/presets/envs.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,13 @@ const withSignInOrUpEmailLinksFlow = withEmailLinks
123123
.setId('withSignInOrUpEmailLinksFlow')
124124
.setEnvVariable('public', 'CLERK_SIGN_UP_URL', undefined);
125125

126+
const withSignInOrUpwithRestrictedModeFlow = withEmailCodes
127+
.clone()
128+
.setId('withSignInOrUpwithRestrictedModeFlow')
129+
.setEnvVariable('private', 'CLERK_SECRET_KEY', instanceKeys.get('with-restricted-mode').sk)
130+
.setEnvVariable('public', 'CLERK_PUBLISHABLE_KEY', instanceKeys.get('with-restricted-mode').pk)
131+
.setEnvVariable('public', 'CLERK_SIGN_UP_URL', undefined);
132+
126133
export const envs = {
127134
base,
128135
withEmailCodes,
@@ -141,4 +148,5 @@ export const envs = {
141148
withWaitlistdMode,
142149
withSignInOrUpFlow,
143150
withSignInOrUpEmailLinksFlow,
151+
withSignInOrUpwithRestrictedModeFlow,
144152
} as const;
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import { expect, test } from '@playwright/test';
2+
3+
import type { Application } from '../models/application';
4+
import { appConfigs } from '../presets';
5+
import type { FakeUser } from '../testUtils';
6+
import { createTestUtils } from '../testUtils';
7+
8+
test.describe('sign-in-or-up restricted mode @nextjs', () => {
9+
test.describe.configure({ mode: 'serial' });
10+
let app: Application;
11+
let fakeUser: FakeUser;
12+
13+
test.beforeAll(async () => {
14+
app = await appConfigs.next.appRouter.clone().commit();
15+
await app.setup();
16+
await app.withEnv(appConfigs.envs.withSignInOrUpwithRestrictedModeFlow);
17+
await app.dev();
18+
19+
const m = createTestUtils({ app });
20+
fakeUser = m.services.users.createFakeUser();
21+
});
22+
23+
test.afterAll(async () => {
24+
await fakeUser.deleteIfExists();
25+
await app.teardown();
26+
});
27+
28+
test('It does not allow sign-in-or-up flow', async ({ page, context }) => {
29+
const u = createTestUtils({ app, page, context });
30+
await u.po.signIn.goTo();
31+
await u.po.signIn.waitForMounted();
32+
await expect(u.page.getByText(/continue to/i)).toBeHidden();
33+
await u.po.signIn.getIdentifierInput().fill(fakeUser.email);
34+
await u.po.signIn.continue();
35+
await expect(u.page.getByText(/no account found with this identifier/i)).toBeVisible();
36+
});
37+
});

packages/clerk-js/src/ui/contexts/components/SignIn.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,9 @@ export const SignInContext = createContext<SignInCtx | null>(null);
3333
export const useSignInContext = (): SignInContextType => {
3434
const context = useContext(SignInContext);
3535
const { navigate } = useRouter();
36-
const { displayConfig } = useEnvironment();
36+
const { displayConfig, userSettings } = useEnvironment();
3737
const { queryParams, queryString } = useRouter();
38+
const signUpMode = userSettings.signUp.mode;
3839
const options = useOptions();
3940
const clerk = useClerk();
4041

@@ -43,7 +44,8 @@ export const useSignInContext = (): SignInContextType => {
4344
}
4445

4546
const isCombinedFlow =
46-
Boolean(!options.signUpUrl && options.signInUrl && !isAbsoluteUrl(options.signInUrl)) ||
47+
(signUpMode !== 'restricted' &&
48+
Boolean(!options.signUpUrl && options.signInUrl && !isAbsoluteUrl(options.signInUrl))) ||
4749
context.withSignUp ||
4850
false;
4951

packages/clerk-js/src/ui/contexts/components/SignUp.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,17 @@ export const SignUpContext = createContext<SignUpCtx | null>(null);
3232
export const useSignUpContext = (): SignUpContextType => {
3333
const context = useContext(SignUpContext);
3434
const { navigate } = useRouter();
35-
const { displayConfig } = useEnvironment();
35+
const { displayConfig, userSettings } = useEnvironment();
3636
const { queryParams, queryString } = useRouter();
37+
const signUpMode = userSettings.signUp.mode;
3738
const options = useOptions();
3839
const clerk = useClerk();
39-
const isCombinedFlow = Boolean(!options.signUpUrl && options.signInUrl && !isAbsoluteUrl(options.signInUrl));
40+
const isCombinedFlow =
41+
(signUpMode !== 'restricted' &&
42+
Boolean(
43+
!options.signUpUrl && options.signInUrl && !isAbsoluteUrl(options.signInUrl) && signUpMode === 'public',
44+
)) ||
45+
false;
4046

4147
const initialValuesFromQueryParams = useMemo(
4248
() => getInitialValuesFromQueryParams(queryString, SIGN_UP_INITIAL_VALUE_KEYS),

0 commit comments

Comments
 (0)