33import { parseAsInteger , useQueryStates } from "nuqs" ;
44import { useSuspenseQuery } from "@tanstack/react-query" ;
55import { useTranslations } from "next-intl" ;
6+ import { useCallback , useState } from "react" ;
7+ import { useAuth } from "@clerk/nextjs" ;
68import { useMembersColumns } from "./columns" ;
79import { DataTable as DataTableNew } from "@/components/widgets/data-table/data-table" ;
810import { useDataTableInstance } from "@/hooks/use-data-table-instance" ;
@@ -13,14 +15,59 @@ import {
1315import Text from "@/components/widgets/texts/text" ;
1416import { DataTablePagination } from "@/components/widgets/data-table/data-table-pagination" ;
1517import { useDashboardCommunityContext } from "@/components/providers/dashboard-community-context-provider" ;
18+ import { useRemoveCommunityMember } from "@/lib/mutations/community-remove-member" ;
19+ import { useToast } from "@/hooks/use-toast" ;
20+ import { captureException } from "@/lib/report" ;
21+ import ConfirmationDialog from "@/components/dialogs/confirmation-dialog" ;
1622
1723export default function MembersTable ( ) {
1824 const t = useTranslations ( "dashboard.communityDetails.members" ) ;
19- const { communityId } = useDashboardCommunityContext ( ) ;
25+ const { communityId, roles } = useDashboardCommunityContext ( ) ;
26+ const { getToken } = useAuth ( ) ;
27+ const { toast } = useToast ( ) ;
28+
29+ const isAdmin = roles . includes ( "administrator" ) ;
30+
2031 const { data : members } = useSuspenseQuery (
2132 communityUsersWithRoles ( communityId , [ "member" ] ) ,
2233 ) ;
2334
35+ const { removeCommunityMember, isPending } = useRemoveCommunityMember ( ) ;
36+ const [ pendingDeleteUserId , setPendingDeleteUserId ] = useState < string | null > (
37+ null ,
38+ ) ;
39+
40+ const onDelete = useCallback ( ( userId : string ) => {
41+ setPendingDeleteUserId ( userId ) ;
42+ } , [ ] ) ;
43+
44+ const handleConfirmDelete = useCallback ( async ( ) => {
45+ if ( ! pendingDeleteUserId ) return ;
46+ try {
47+ await removeCommunityMember ( {
48+ communityId,
49+ userId : pendingDeleteUserId ,
50+ getToken,
51+ } ) ;
52+ toast ( { title : t ( "toast-remove-member-success" ) } ) ;
53+ } catch ( err ) {
54+ captureException ( err ) ;
55+ toast ( {
56+ variant : "destructive" ,
57+ title : t ( "toast-remove-member-error" ) ,
58+ } ) ;
59+ } finally {
60+ setPendingDeleteUserId ( null ) ;
61+ }
62+ } , [
63+ communityId ,
64+ getToken ,
65+ pendingDeleteUserId ,
66+ removeCommunityMember ,
67+ t ,
68+ toast ,
69+ ] ) ;
70+
2471 const [ tablePagination , setTablePagination ] = useQueryStates (
2572 {
2673 page : parseAsInteger . withDefault ( 1 ) ,
@@ -32,7 +79,7 @@ export default function MembersTable() {
3279 } ,
3380 ) ;
3481
35- const columns = useMembersColumns ( ) ;
82+ const columns = useMembersColumns ( isAdmin ? { onDelete } : undefined ) ;
3683 const table = useDataTableInstance ( {
3784 data : members ,
3885 columns,
@@ -88,6 +135,15 @@ export default function MembersTable() {
88135 } }
89136 table = { table }
90137 />
138+ < ConfirmationDialog
139+ open = { ! ! pendingDeleteUserId }
140+ onOpenChange = { ( open ) => ! open && setPendingDeleteUserId ( null ) }
141+ title = { t ( "confirm-remove-member-title" ) }
142+ description = { t ( "confirm-remove-member-description" ) }
143+ confirmText = { t ( "confirm-remove-member-confirm" ) }
144+ onConfirm = { handleConfirmDelete }
145+ isPending = { isPending }
146+ />
91147 </ div >
92148 ) ;
93149}
0 commit comments