Skip to content

Commit 99ec73b

Browse files
committed
Fixes initial value re-render when options get fetched
1 parent 9b5d216 commit 99ec73b

File tree

2 files changed

+122
-7
lines changed

2 files changed

+122
-7
lines changed

packages/clerk-js/src/ui/components/OrganizationProfile/InviteMembersForm.tsx

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,7 @@ export const InviteMembersForm = (props: InviteMembersFormProps) => {
4242
label: localizationKeys('formFieldLabel__emailAddresses'),
4343
});
4444

45-
const defaultRole = useDefaultRole();
46-
47-
const roleField = useFormControl('role', defaultRole ?? '', {
45+
const roleField = useFormControl('role', '', {
4846
label: localizationKeys('formFieldLabel__role'),
4947
});
5048

@@ -190,6 +188,8 @@ const AsyncRoleSelect = (field: ReturnType<typeof useFormControl<'role'>>) => {
190188

191189
const { t } = useLocalizations();
192190

191+
const defaultRole = useDefaultRole();
192+
193193
return (
194194
<Form.ControlRow elementId={field.id}>
195195
<Flex
@@ -198,6 +198,7 @@ const AsyncRoleSelect = (field: ReturnType<typeof useFormControl<'role'>>) => {
198198
>
199199
<RoleSelect
200200
{...field.props}
201+
value={field.props.value || (defaultRole ?? '')}
201202
roles={options}
202203
isDisabled={isLoading}
203204
onChange={value => field.setValue(value)}

packages/clerk-js/src/ui/components/OrganizationProfile/__tests__/InviteMembersPage.test.tsx

Lines changed: 118 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import type { OrganizationInvitationResource } from '@clerk/types';
22
import { describe } from '@jest/globals';
33
import { waitFor } from '@testing-library/dom';
4+
import React from 'react';
45

56
import { ClerkAPIResponseError } from '../../../../core/resources';
67
import { render } from '../../../../testUtils';
@@ -91,10 +92,9 @@ describe('InviteMembersPage', () => {
9192
await userEvent.click(getByRole('button', { name: /admin/i }));
9293
});
9394

94-
it('initializes with the only available role', async () => {
95+
it("initializes if there's only one role available", async () => {
9596
const { wrapper, fixtures } = await createFixtures(f => {
9697
f.withOrganizations();
97-
f.withOrganizationDomains(undefined, undefined);
9898
f.withUser({
9999
email_addresses: ['test@clerk.com'],
100100
organization_memberships: [{ name: 'Org1', role: 'admin' }],
@@ -126,11 +126,59 @@ describe('InviteMembersPage', () => {
126126
{ wrapper },
127127
);
128128
await userEvent.type(getByTestId('tag-input'), 'test+1@clerk.com,');
129-
await userEvent.click(getByRole('button', { name: /member/i }));
129+
await waitFor(() => expect(getByRole('button', { name: /member/i })).toBeInTheDocument());
130+
});
131+
132+
it("does not initialize if there's neither a default role nor a unique role", async () => {
133+
const { wrapper, fixtures } = await createFixtures(f => {
134+
f.withOrganizations();
135+
f.withUser({
136+
email_addresses: ['test@clerk.com'],
137+
organization_memberships: [{ name: 'Org1', role: 'admin' }],
138+
});
139+
});
140+
141+
fixtures.clerk.organization?.getRoles.mockResolvedValue({
142+
total_count: 1,
143+
data: [
144+
{
145+
pathRoot: '',
146+
reload: jest.fn(),
147+
id: 'member',
148+
key: 'member',
149+
name: 'member',
150+
description: '',
151+
permissions: [],
152+
createdAt: new Date(),
153+
updatedAt: new Date(),
154+
},
155+
{
156+
pathRoot: '',
157+
reload: jest.fn(),
158+
id: 'admin',
159+
key: 'admin',
160+
name: 'admin',
161+
description: '',
162+
permissions: [],
163+
createdAt: new Date(),
164+
updatedAt: new Date(),
165+
},
166+
],
167+
});
168+
169+
fixtures.clerk.organization?.inviteMembers.mockResolvedValueOnce([{}] as OrganizationInvitationResource[]);
170+
const { getByRole, userEvent, getByTestId } = render(
171+
<Action.Root>
172+
<InviteMembersScreen />
173+
</Action.Root>,
174+
{ wrapper },
175+
);
176+
await userEvent.type(getByTestId('tag-input'), 'test+1@clerk.com,');
177+
await waitFor(() => expect(getByRole('button', { name: /select role/i })).toBeInTheDocument());
130178
});
131179
});
132180

133-
describe('Submitting', () => {
181+
describe('when submitting', () => {
134182
it('keeps the Send button disabled until a role is selected and one or more email has been entered', async () => {
135183
const { wrapper, fixtures } = await createFixtures(f => {
136184
f.withOrganizations();
@@ -154,6 +202,17 @@ describe('InviteMembersPage', () => {
154202
createdAt: new Date(),
155203
updatedAt: new Date(),
156204
},
205+
{
206+
pathRoot: '',
207+
reload: jest.fn(),
208+
id: 'admin',
209+
key: 'admin',
210+
name: 'Admin',
211+
description: '',
212+
permissions: [],
213+
createdAt: new Date(),
214+
updatedAt: new Date(),
215+
},
157216
],
158217
});
159218

@@ -197,6 +256,17 @@ describe('InviteMembersPage', () => {
197256
createdAt: new Date(),
198257
updatedAt: new Date(),
199258
},
259+
{
260+
pathRoot: '',
261+
reload: jest.fn(),
262+
id: 'admin',
263+
key: 'admin',
264+
name: 'Admin',
265+
description: '',
266+
permissions: [],
267+
createdAt: new Date(),
268+
updatedAt: new Date(),
269+
},
200270
],
201271
});
202272

@@ -243,6 +313,17 @@ describe('InviteMembersPage', () => {
243313
createdAt: new Date(),
244314
updatedAt: new Date(),
245315
},
316+
{
317+
pathRoot: '',
318+
reload: jest.fn(),
319+
id: 'admin',
320+
key: 'admin',
321+
name: 'Admin',
322+
description: '',
323+
permissions: [],
324+
createdAt: new Date(),
325+
updatedAt: new Date(),
326+
},
246327
],
247328
});
248329

@@ -348,6 +429,17 @@ describe('InviteMembersPage', () => {
348429
createdAt: new Date(),
349430
updatedAt: new Date(),
350431
},
432+
{
433+
pathRoot: '',
434+
reload: jest.fn(),
435+
id: 'admin',
436+
key: 'admin',
437+
name: 'Admin',
438+
description: '',
439+
permissions: [],
440+
createdAt: new Date(),
441+
updatedAt: new Date(),
442+
},
351443
],
352444
});
353445

@@ -407,6 +499,17 @@ describe('InviteMembersPage', () => {
407499
createdAt: new Date(),
408500
updatedAt: new Date(),
409501
},
502+
{
503+
pathRoot: '',
504+
reload: jest.fn(),
505+
id: 'admin',
506+
key: 'admin',
507+
name: 'Admin',
508+
description: '',
509+
permissions: [],
510+
createdAt: new Date(),
511+
updatedAt: new Date(),
512+
},
410513
],
411514
});
412515

@@ -462,6 +565,17 @@ describe('InviteMembersPage', () => {
462565
createdAt: new Date(),
463566
updatedAt: new Date(),
464567
},
568+
{
569+
pathRoot: '',
570+
reload: jest.fn(),
571+
id: 'admin',
572+
key: 'admin',
573+
name: 'Admin',
574+
description: '',
575+
permissions: [],
576+
createdAt: new Date(),
577+
updatedAt: new Date(),
578+
},
465579
],
466580
});
467581

0 commit comments

Comments
 (0)