useOrganization()
The useOrganization() hook is used to retrieve attributes of the currently active organization.
useOrganization() parameters
useOrganization() accepts a single object with the following optional properties:
Shared properties
Properties that are shared across the invitations, membershipRequests, memberships, and domains properties.
OrganizationInvitationStatus
useOrganization() accepts status as a property for the invitations and membershipRequests parameters.
status is a string that can be one of the following:
type OrganizationInvitationStatus = "pending" | "accepted" | "revoked";OrganizationCustomRoleKey
useOrganization accepts role as a property for the memberships parameter.
role is a string that represents the user's role in the organization. Clerk provides the default roles org:admin and org:member. However, you can create custom roles as well.
OrganizationEnrollmentMode
useOrganization() accepts enrollmentMode as a property for the domains paramater.
enrollmentMode is a string that can be one of the following:
type OrganizationEnrollmentMode = "manual_invitation" | "automatic_invitation" | "automatic_suggestion";- Name
isLoaded- Type
boolean- Description
A boolean that is set to
falseuntil Clerk loads and initializes.
- Name
organization- Type
Organization- Description
The currently active organization.
- Name
membership- Type
OrganizationMembership- Description
The current organization membership.
- Name
memberships- Type
PaginatedResources- Description
Includes a paginated list of the organization's memberships.
- Name
invitations- Type
PaginatedResources- Description
Includes a paginated list of the organization's invitations.
- Name
membershipRequests- Type
PaginatedResources- Description
Includes a paginated list of the organization's membership requests.
- Name
domains- Type
PaginatedResources- Description
Includes a paginated list of the organization's domains.
PaginatedResources
How to use the useOrganization() hook
Expanding and paginating attributes
To keep network usage to a minimum, developers are required to opt-in by specifying which resource they need to fetch and paginate through. So by default, the memberships, invitations, membershipRequests, and domains attributes are not populated. You must pass true or an object with the desired properties to fetch and paginate the data.
// invitations.data will never be populated.
const { invitations } = useOrganization();
// Use default values to fetch invitations, such as initialPage = 1 and pageSize = 10
const { invitations } = useOrganization({
invitations: true
});
// Pass your own values to fetch invitations
const { invitations } = useOrganization({
invitations: {
pageSize: 20,
initialPage: 2, // skips the first page
}
});
// Aggregate pages in order to render an infinite list
const { invitations } = useOrganization({
invitations: {
infinite: true,
}
});Infinite pagination
The following example demonstrates how to use the infinite property to fetch and append new data to the existing list. The memberships attribute will be populated with the first page of the organization's memberships. When the "Load more" button is clicked, the fetchNext helper function will be called to append the next page of memberships to the list.
import { useOrganization } from "@clerk/clerk-react";
export default function MemberList() {
const { memberships } = useOrganization({
memberships: {
infinite: true, // Append new data to the existing list
keepPreviousData: true, // Persist the cached data until the new data has been fetched
},
});
if (!memberships) {
// Handle loading state
return null;
}
return (
<div>
<h2>Organization members</h2>
<ul>
{memberships.data?.map((membership) => (
<li key={membership.id}>
{membership.publicUserData.firstName} {membership.publicUserData.lastName} <
{membership.publicUserData.identifier}> :: {membership.role}
</li>
))}
</ul>
<button
disabled={!memberships.hasNextPage} // Disable the button if there are no more available pages to be fetched
onClick={memberships.fetchNext}
>
Load more
</button>
</div>
);
}Simple pagination
The following example demonstrates how to use the fetchPrevious and fetchNext helper functions to paginate through the data. The memberships attribute will be populated with the first page of the organization's memberships. When the "Previous page" or "Next page" button is clicked, the fetchPrevious or fetchNext helper function will be called to fetch the previous or next page of memberships.
Notice the difference between this example's pagination and the infinite pagination example above.
import { useOrganization } from "@clerk/clerk-react";
export default function MemberList() {
const { memberships } = useOrganization({
memberships: {
keepPreviousData: true, // Persist the cached data until the new data has been fetched
},
});
if (!memberships) {
// Handle loading state
return null;
}
return (
<div>
<h2>Organization members</h2>
<ul>
{memberships.data?.map((membership) => (
<li key={membership.id}>
{membership.publicUserData.firstName} {membership.publicUserData.lastName} <
{membership.publicUserData.identifier}> :: {membership.role}
</li>
))}
</ul>
<button
disabled={!memberships.hasPreviousPage}
onClick={memberships.fetchPrevious}
>
Previous page
</button>
<button
disabled={!memberships.hasNextPage}
onClick={memberships.fetchNext}
>
Next page
</button>
</div>
);
}To see the different organization features integrated into one application, take a look at our organizations demo repository.