diff --git a/.changeset/poor-rockets-look.md b/.changeset/poor-rockets-look.md new file mode 100644 index 00000000000..02c6bcdef7b --- /dev/null +++ b/.changeset/poor-rockets-look.md @@ -0,0 +1,8 @@ +--- +'@clerk/localizations': patch +'@clerk/clerk-js': patch +'@clerk/shared': patch +'@clerk/types': patch +--- + +Introduced searching for members list on `OrganizationProfile` diff --git a/packages/clerk-js/src/ui/common/NotificationCountBadge.tsx b/packages/clerk-js/src/ui/common/NotificationCountBadge.tsx index c5ef64bfddb..4efddafca1c 100644 --- a/packages/clerk-js/src/ui/common/NotificationCountBadge.tsx +++ b/packages/clerk-js/src/ui/common/NotificationCountBadge.tsx @@ -7,19 +7,21 @@ import { animations } from '../styledSystem'; type NotificationCountBadgeProps = PropsOfComponent & { notificationCount: number; containerSx?: ThemableCssProp; + shouldAnimate?: boolean; }; export const NotificationCountBadge = (props: NotificationCountBadgeProps) => { - const { notificationCount, containerSx, ...restProps } = props; + const { notificationCount, containerSx, shouldAnimate = true, ...restProps } = props; const prefersReducedMotion = usePrefersReducedMotion(); const { t } = useLocalizations(); const localeKey = t(localizationKeys('locale')); const formattedNotificationCount = formatToCompactNumber(notificationCount, localeKey); const enterExitAnimation: ThemableCssProp = t => ({ - animation: prefersReducedMotion - ? 'none' - : `${animations.notificationAnimation} ${t.transitionDuration.$textField} ${t.transitionTiming.$slowBezier} 0s 1 normal forwards`, + animation: + shouldAnimate && !prefersReducedMotion + ? `${animations.notificationAnimation} ${t.transitionDuration.$textField} ${t.transitionTiming.$slowBezier} 0s 1 normal forwards` + : 'none', }); return ( diff --git a/packages/clerk-js/src/ui/components/OrganizationProfile/ActiveMembersList.tsx b/packages/clerk-js/src/ui/components/OrganizationProfile/ActiveMembersList.tsx index 18a935a3dd6..d324fe19320 100644 --- a/packages/clerk-js/src/ui/components/OrganizationProfile/ActiveMembersList.tsx +++ b/packages/clerk-js/src/ui/components/OrganizationProfile/ActiveMembersList.tsx @@ -8,16 +8,14 @@ import { useFetchRoles, useLocalizeCustomRoles } from '../../hooks/useFetchRoles import { handleError } from '../../utils'; import { DataTable, RoleSelect, RowContainer } from './MemberListTable'; -const membershipsParams = { - memberships: { - pageSize: 10, - keepPreviousData: true, - }, +type ActiveMembersListProps = { + memberships: ReturnType['memberships']; + pageSize: number; }; -export const ActiveMembersList = () => { +export const ActiveMembersList = ({ memberships, pageSize }: ActiveMembersListProps) => { const card = useCardState(); - const { organization, memberships } = useOrganization(membershipsParams); + const { organization } = useOrganization(); const { options, isLoading: loadingRoles } = useFetchRoles(); @@ -44,8 +42,8 @@ export const ActiveMembersList = () => { onPageChange={n => memberships?.fetchPage?.(n)} itemCount={memberships?.count || 0} pageCount={memberships?.pageCount || 0} - itemsPerPage={membershipsParams.memberships.pageSize} - isLoading={memberships?.isLoading || loadingRoles} + itemsPerPage={pageSize} + isLoading={(memberships?.isLoading && !memberships?.data.length) || loadingRoles} emptyStateLocalizationKey={localizationKeys('organizationProfile.membersPage.detailsTitle__emptyRow')} headers={[ localizationKeys('organizationProfile.membersPage.activeMembersTab.tableHeader__user'), diff --git a/packages/clerk-js/src/ui/components/OrganizationProfile/MembersActions.tsx b/packages/clerk-js/src/ui/components/OrganizationProfile/MembersActions.tsx index 9f44d2adb64..a1d5439a0cb 100644 --- a/packages/clerk-js/src/ui/components/OrganizationProfile/MembersActions.tsx +++ b/packages/clerk-js/src/ui/components/OrganizationProfile/MembersActions.tsx @@ -4,22 +4,31 @@ import { Animated } from '../../elements'; import { Action } from '../../elements/Action'; import { InviteMembersScreen } from './InviteMembersScreen'; -export const MembersActionsRow = () => { +type MembersActionsRowProps = { + actionSlot?: React.ReactNode; +}; + +export const MembersActionsRow = ({ actionSlot }: MembersActionsRowProps) => { const canManageMemberships = useProtect({ permission: 'org:sys_memberships:manage' }); return ( ({ width: '100%', marginLeft: 'auto', padding: `${t.space.$none} ${t.space.$1}`, })} + gap={actionSlot ? 2 : undefined} > + {actionSlot} {canManageMemberships && ( - +