diff --git a/src/components/admin/members-content.tsx b/src/components/admin/members-content.tsx index 75a1f93..e79220b 100644 --- a/src/components/admin/members-content.tsx +++ b/src/components/admin/members-content.tsx @@ -1,6 +1,6 @@ 'use client' -import { useState, useCallback, useEffect, useMemo } from 'react' +import { useState, useCallback, useEffect, useMemo } from 'react' import Link from 'next/link' import { useSearchParams, usePathname } from 'next/navigation' import { trpc } from '@/lib/trpc/client' @@ -138,20 +138,20 @@ export function MembersContent() { const { data: currentUser } = trpc.user.me.useQuery() const currentUserRole = currentUser?.role as RoleValue | undefined - const { data, isLoading } = trpc.user.list.useQuery({ - roles: roles, - search: search || undefined, - page, - perPage: 20, - }) - - const invitableIdsQuery = trpc.user.listInvitableIds.useQuery( - { - roles: roles, - search: search || undefined, - }, - { enabled: false } - ) + const { data, isLoading } = trpc.user.list.useQuery({ + roles: roles, + search: search || undefined, + page, + perPage: 20, + }) + + const invitableIdsQuery = trpc.user.listInvitableIds.useQuery( + { + roles: roles, + search: search || undefined, + }, + { enabled: false } + ) const utils = trpc.useUtils() @@ -171,9 +171,8 @@ export function MembersContent() { }, }) - // Users on the current page that are selectable (status NONE) const selectableUsers = useMemo( - () => (data?.users ?? []).filter((u) => u.status === 'NONE'), + () => data?.users ?? [], [data?.users] ) @@ -195,7 +194,7 @@ export function MembersContent() { }) }, []) - const toggleAll = useCallback(() => { + const toggleAll = useCallback(() => { if (allSelectableSelected) { // Deselect all on this page setSelectedIds((prev) => { @@ -215,22 +214,22 @@ export function MembersContent() { return next }) } - }, [allSelectableSelected, selectableUsers]) - - const selectAllMatching = useCallback(async () => { - const result = await invitableIdsQuery.refetch() - const ids = result.data?.userIds ?? [] - if (ids.length === 0) { - toast.info('No invitable members match the current filter') - return - } - setSelectedIds(new Set(ids)) - toast.success(`Selected ${ids.length} matching members`) - }, [invitableIdsQuery]) - - const clearSelection = useCallback(() => { - setSelectedIds(new Set()) - }, []) + }, [allSelectableSelected, selectableUsers]) + + const selectAllMatching = useCallback(async () => { + const result = await invitableIdsQuery.refetch() + const ids = result.data?.userIds ?? [] + if (ids.length === 0) { + toast.info('No invitable members match the current filter') + return + } + setSelectedIds(new Set(ids)) + toast.success(`Selected ${ids.length} matching members`) + }, [invitableIdsQuery]) + + const clearSelection = useCallback(() => { + setSelectedIds(new Set()) + }, []) const handleTabChange = (value: string) => { updateParams({ tab: value === 'all' ? null : value, page: '1' }) @@ -279,42 +278,42 @@ export function MembersContent() { {/* Content */} - {isLoading ? ( - - ) : data && data.users.length > 0 ? ( - <> - {/* Bulk selection controls */} - - -

- Selection persists across pages and filters. -

-
- - -
-
-
- - {/* Desktop table */} - + {isLoading ? ( + + ) : data && data.users.length > 0 ? ( + <> + {/* Bulk selection controls */} + + +

+ Selection persists across pages and filters. +

+
+ + +
+
+
+ + {/* Desktop table */} + @@ -323,7 +322,7 @@ export function MembersContent() { )} @@ -340,15 +339,11 @@ export function MembersContent() { {data.users.map((user) => ( - {user.status === 'NONE' ? ( - toggleUser(user.id)} - aria-label={`Select ${user.name || user.email}`} - /> - ) : ( - - )} + toggleUser(user.id)} + aria-label={`Select ${user.name || user.email}`} + />
@@ -438,14 +433,12 @@ export function MembersContent() {
- {user.status === 'NONE' && ( - toggleUser(user.id)} - aria-label={`Select ${user.name || user.email}`} - className="mt-1" - /> - )} + toggleUser(user.id)} + aria-label={`Select ${user.name || user.email}`} + className="mt-1" + /> ).avatarUrl as string | undefined} @@ -573,13 +566,13 @@ export function MembersContent() { )} Invite Selected -