Skip to content

Commit cc63aab

Browse files
authored
feat(ui,shared): Export useOrganizationCreationDefaults hook (#7694)
1 parent 93ead8c commit cc63aab

14 files changed

Lines changed: 158 additions & 8 deletions

File tree

.changeset/thick-hoops-film.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
---
2+
'@clerk/tanstack-react-start': minor
3+
'@clerk/chrome-extension': minor
4+
'@clerk/react-router': minor
5+
'@clerk/nextjs': minor
6+
'@clerk/shared': minor
7+
'@clerk/react': minor
8+
'@clerk/ui': minor
9+
---
10+
11+
Export `useOrganizationCreationDefaults` hook to fetch suggested organization name and logo from default naming rules

packages/chrome-extension/src/__tests__/__snapshots__/exports.test.ts.snap

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ exports[`public exports > should not include a breaking change 1`] = `
3535
"useClerk",
3636
"useEmailLink",
3737
"useOrganization",
38+
"useOrganizationCreationDefaults",
3839
"useOrganizationList",
3940
"useReverification",
4041
"useSession",

packages/chrome-extension/src/react/re-exports.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ export {
3030
useClerk,
3131
useEmailLink,
3232
useOrganization,
33+
useOrganizationCreationDefaults,
3334
useOrganizationList,
3435
useReverification,
3536
useSession,

packages/nextjs/src/client-boundary/hooks.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ export {
66
useEmailLink,
77
useOrganization,
88
useOrganizationList,
9+
useOrganizationCreationDefaults,
910
useSession,
1011
useSessionList,
1112
useSignIn,

packages/nextjs/src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ export {
5252
useClerk,
5353
useEmailLink,
5454
useOrganization,
55+
useOrganizationCreationDefaults,
5556
useOrganizationList,
5657
useReverification,
5758
useSession,

packages/react-router/src/__tests__/__snapshots__/exports.test.ts.snap

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ exports[`root public exports > should not change unexpectedly 1`] = `
5959
"useClerk",
6060
"useEmailLink",
6161
"useOrganization",
62+
"useOrganizationCreationDefaults",
6263
"useOrganizationList",
6364
"useReverification",
6465
"useSession",

packages/react/src/hooks/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ export { useSignIn, useSignUp, useWaitlist } from './useClerkSignal';
44
export {
55
useClerk,
66
useOrganization,
7+
useOrganizationCreationDefaults,
78
useOrganizationList,
89
useSessionList,
910
useUser,

packages/shared/src/react/hooks/index.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
export { assertContextExists, createContextAndHook } from './createContextAndHook';
22
export { useAPIKeys as __experimental_useAPIKeys } from './useAPIKeys';
33
export { useOrganization } from './useOrganization';
4+
export { useOrganizationCreationDefaults } from './useOrganizationCreationDefaults';
5+
export type {
6+
UseOrganizationCreationDefaultsParams,
7+
UseOrganizationCreationDefaultsReturn,
8+
} from './useOrganizationCreationDefaults.types';
49
export { useOrganizationList } from './useOrganizationList';
510
export { useAttemptToEnableOrganizations } from './useAttemptToEnableOrganizations';
611
export { useSafeLayoutEffect } from './useSafeLayoutEffect';
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import { useMemo } from 'react';
2+
3+
import { STABLE_KEYS } from '../stable-keys';
4+
import { createCacheKeys } from './createCacheKeys';
5+
6+
export function useOrganizationCreationDefaultsCacheKeys(params: { userId: string | null }) {
7+
const { userId } = params;
8+
return useMemo(() => {
9+
return createCacheKeys({
10+
stablePrefix: STABLE_KEYS.ORGANIZATION_CREATION_DEFAULTS_KEY,
11+
authenticated: Boolean(userId),
12+
tracked: {
13+
userId: userId ?? null,
14+
},
15+
untracked: {
16+
args: {},
17+
},
18+
});
19+
}, [userId]);
20+
}
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
import { eventMethodCalled } from '../../telemetry/events/method-called';
2+
import type { EnvironmentResource } from '../../types/environment';
3+
import { defineKeepPreviousDataFn } from '../clerk-rq/keep-previous-data';
4+
import { useClerkQuery } from '../clerk-rq/useQuery';
5+
import { useAssertWrappedByClerkProvider, useClerkInstanceContext, useUserContext } from '../contexts';
6+
import { useOrganizationCreationDefaultsCacheKeys } from './useOrganizationCreationDefaults.shared';
7+
import type {
8+
UseOrganizationCreationDefaultsParams,
9+
UseOrganizationCreationDefaultsReturn,
10+
} from './useOrganizationCreationDefaults.types';
11+
12+
const HOOK_NAME = 'useOrganizationCreationDefaults';
13+
14+
/**
15+
* The `useOrganizationCreationDefaults()` hook retrieves the organization creation defaults for the current user.
16+
*
17+
* @example
18+
* ### Basic usage
19+
*
20+
* ```tsx
21+
* import { useOrganizationCreationDefaults } from '@clerk/clerk-react'
22+
*
23+
* export default function CreateOrganizationForm() {
24+
* const { data, isLoading } = useOrganizationCreationDefaults()
25+
*
26+
* if (isLoading) return <div>Loading...</div>
27+
*
28+
* return (
29+
* <form>
30+
* <input defaultValue={data?.form.name} placeholder="Organization name" />
31+
* <input defaultValue={data?.form.slug} placeholder="Slug" />
32+
* <button type="submit">Create</button>
33+
* </form>
34+
* )
35+
* }
36+
* ```
37+
*/
38+
export function useOrganizationCreationDefaults(
39+
params: UseOrganizationCreationDefaultsParams = {},
40+
): UseOrganizationCreationDefaultsReturn {
41+
useAssertWrappedByClerkProvider(HOOK_NAME);
42+
43+
const { keepPreviousData = true, enabled = true } = params;
44+
const clerk = useClerkInstanceContext();
45+
const user = useUserContext();
46+
47+
// @ts-expect-error `__internal_environment` is not typed
48+
const environment = clerk.__internal_environment as unknown as EnvironmentResource | null | undefined;
49+
const featureEnabled = environment?.organizationSettings?.organizationCreationDefaults?.enabled ?? false;
50+
51+
clerk.telemetry?.record(eventMethodCalled(HOOK_NAME));
52+
53+
const { queryKey } = useOrganizationCreationDefaultsCacheKeys({ userId: user?.id ?? null });
54+
55+
const queryEnabled = Boolean(user) && enabled && featureEnabled && clerk.loaded;
56+
57+
const query = useClerkQuery({
58+
queryKey,
59+
queryFn: user?.getOrganizationCreationDefaults,
60+
enabled: queryEnabled,
61+
placeholderData: defineKeepPreviousDataFn(keepPreviousData),
62+
});
63+
64+
return {
65+
data: query.data,
66+
error: (query.error ?? null) as UseOrganizationCreationDefaultsReturn['error'],
67+
isLoading: query.isLoading,
68+
isFetching: query.isFetching,
69+
};
70+
}

0 commit comments

Comments
 (0)