"use client" import type { User } from "better-auth" import type { Member } from "better-auth/plugins/organization" import { EllipsisIcon, UserCogIcon, Users, UserXIcon } from "lucide-react" import { useContext, useState } from "react" import { AuthUIContext } from "../../lib/auth-ui-provider" import { cn } from "../../lib/utils" import type { AuthLocalization } from "../../localization/auth-localization" import type { SettingsCardClassNames } from "../settings/shared/settings-card" import { Button } from "../ui/button" import { Card } from "../ui/card" import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from "../ui/dropdown-menu" import { UserView } from "../user-view" import { LeaveOrganizationDialog } from "./leave-organization-dialog" import { RemoveMemberDialog } from "./remove-member-dialog" import { UpdateMemberRoleDialog } from "./update-member-role-dialog" import { UpdateMemberTeamsDialog } from "./update-member-teams-dialog" export interface MemberCellProps { className?: string classNames?: SettingsCardClassNames member: Member & { user?: Partial | null } localization?: AuthLocalization hideActions?: boolean } export function MemberCell({ className, classNames, member, localization: localizationProp, hideActions }: MemberCellProps) { const { teams: teamOptions, organization: organizationOptions, hooks: { useListMembers, useSession, useListOrganizations, useHasPermission }, localization: contextLocalization } = useContext(AuthUIContext) const { enabled: teamsEnabled } = teamOptions || {} const localization = { ...contextLocalization, ...localizationProp } const { data: sessionData } = useSession() const [removeDialogOpen, setRemoveDialogOpen] = useState(false) const [leaveDialogOpen, setLeaveDialogOpen] = useState(false) const [updateRoleDialogOpen, setUpdateRoleDialogOpen] = useState(false) const [updateTeamsDialogOpen, setUpdateTeamsDialogOpen] = useState(false) const builtInRoles = [ { role: "owner", label: localization.OWNER }, { role: "admin", label: localization.ADMIN }, { role: "member", label: localization.MEMBER } ] const { data } = useListMembers({ query: { organizationId: member.organizationId } }) const members = data?.members const myRole = members?.find( (m) => m.user?.id === sessionData?.user.id )?.role const roles = [...builtInRoles, ...(organizationOptions?.customRoles || [])] const role = roles.find((r) => r.role === member.role) const isSelf = sessionData?.user.id === member?.userId const { data: organizations } = useListOrganizations() const organization = organizations?.find( (org) => org.id === member.organizationId ) const { data: hasPermissionToUpdateMember } = useHasPermission({ organizationId: member.organizationId, permission: { member: ["update"] } }) return ( <> {role?.label} {!hideActions && (isSelf || member.role !== "owner" || myRole === "owner") && ( e.preventDefault()} > {hasPermissionToUpdateMember?.success && ( <> setUpdateRoleDialogOpen(true) } > {localization?.UPDATE_ROLE} {teamsEnabled && ( setUpdateTeamsDialogOpen( true ) } > {localization?.UPDATE_TEAMS} )} )} isSelf ? setLeaveDialogOpen(true) : setRemoveDialogOpen(true) } variant="destructive" > {isSelf ? localization?.LEAVE_ORGANIZATION : localization?.REMOVE_MEMBER} )} {organization && ( )} {teamsEnabled && ( )} ) }