11import { useState } from "react" ;
22import { useCurrentOrganization } from "@/lib/hooks/use-current-organization" ;
33import { useAuthStore } from "@/lib/providers/auth-store-provider" ;
4- import { useCurrentUserRole } from "@/lib/hooks/use-current-user-role" ;
54import { useUserMutation } from "@/lib/api/organizations/users" ;
5+ import { getUserDisplayRoles , getUserCoaches } from "@/lib/utils/user-roles" ;
66import { Button } from "@/components/ui/button" ;
77import {
88 DropdownMenu ,
@@ -30,19 +30,18 @@ import {
3030import { CoachingRelationshipWithUserNames } from "@/types/coaching_relationship" ;
3131import { AuthStore } from "@/lib/stores/auth-store" ;
3232import { Id } from "@/types/general" ;
33- import { User , Role , isAdminOrSuperAdmin } from "@/types/user" ;
33+ import { User , isAdminOrSuperAdmin , UserRoleState } from "@/types/user" ;
3434import { RelationshipRole } from "@/types/relationship-role" ;
3535import { useCoachingRelationshipMutation } from "@/lib/api/coaching-relationships" ;
3636import { toast } from "sonner" ;
3737
3838interface MemberCardProps {
39- firstName : string ;
40- lastName : string ;
41- email : string ;
42- userId : Id ;
39+ user : User ;
40+ currentUserId : Id ;
4341 userRelationships : CoachingRelationshipWithUserNames [ ] ;
4442 onRefresh : ( ) => void ;
4543 users : User [ ] ;
44+ currentUserRoleState : UserRoleState ;
4645}
4746
4847interface Member {
@@ -52,17 +51,24 @@ interface Member {
5251}
5352
5453export function MemberCard ( {
55- firstName,
56- lastName,
57- email,
58- userId,
54+ user,
55+ currentUserId,
5956 userRelationships,
6057 onRefresh,
6158 users,
59+ currentUserRoleState,
6260} : MemberCardProps ) {
6361 const { currentOrganizationId } = useCurrentOrganization ( ) ;
6462 const { isACoach, userSession } = useAuthStore ( ( state : AuthStore ) => state ) ;
65- const currentUserRoleState = useCurrentUserRole ( ) ;
63+
64+ // Extract user properties
65+ const { id : userId , first_name : firstName , last_name : lastName , email } = user ;
66+
67+ // Get display roles for this user
68+ const displayRoles = getUserDisplayRoles ( user , currentOrganizationId , userRelationships ) ;
69+
70+ // Get coaches for this user
71+ const coaches = getUserCoaches ( userId , userRelationships ) ;
6672 const { error : deleteError , deleteNested : deleteUser } = useUserMutation (
6773 currentOrganizationId
6874 ) ;
@@ -71,17 +77,11 @@ export function MemberCard({
7177
7278 console . log ( "is a coach" , isACoach ) ;
7379
74- // Check if current user is a coach in any of this user's relationships
75- // and make sure we can't delete ourselves. Admins can delete any user.
80+ // Only admins and super admins can delete users (but not themselves)
7681 const canDeleteUser =
7782 currentUserRoleState . hasAccess &&
78- (
79- ( userRelationships ?. some (
80- ( rel ) => rel . coach_id === userSession . id && userId !== userSession . id
81- ) ||
82- currentUserRoleState . role === Role . Admin ) &&
83- userSession . id !== userId
84- ) ;
83+ userSession . id !== userId &&
84+ isAdminOrSuperAdmin ( currentUserRoleState ) ;
8585
8686 const handleDelete = async ( ) => {
8787 if ( ! confirm ( "Are you sure you want to delete this member?" ) ) {
@@ -117,46 +117,55 @@ export function MemberCard({
117117 const [ selectedMember , setSelectedMember ] = useState < Member | null > ( null ) ;
118118 const [ assignedMember , setAssignedMember ] = useState < Member | null > ( null ) ;
119119
120- const handleCreateCoachingRelationship = ( ) => {
120+ const handleCreateCoachingRelationship = async ( ) => {
121121 if ( ! selectedMember || ! assignedMember ) return ;
122122
123- if ( assignMode === RelationshipRole . Coach ) {
124- console . log ( "Assign" , selectedMember . id , "as coach for" , userId ) ;
125- createRelationship ( currentOrganizationId , {
126- coach_id : assignedMember . id ,
127- coachee_id : selectedMember . id ,
128- } ) ;
129- } else {
130- console . log ( "Assign" , selectedMember . id , "as coachee for" , userId ) ;
131- createRelationship ( currentOrganizationId , {
132- coach_id : selectedMember . id ,
133- coachee_id : assignedMember . id ,
134- } ) ;
135- }
123+ try {
124+ if ( assignMode === RelationshipRole . Coach ) {
125+ console . log ( "Assign" , selectedMember . id , "as coach for" , userId ) ;
126+ await createRelationship ( currentOrganizationId , {
127+ coach_id : assignedMember . id ,
128+ coachee_id : selectedMember . id ,
129+ } ) ;
130+ } else {
131+ console . log ( "Assign" , selectedMember . id , "as coachee for" , userId ) ;
132+ await createRelationship ( currentOrganizationId , {
133+ coach_id : selectedMember . id ,
134+ coachee_id : assignedMember . id ,
135+ } ) ;
136+ }
136137
137- if ( createError ) {
138+ toast . success (
139+ `Successfully assigned ${ assignedMember . first_name } ${ assignedMember . last_name } as ${ assignMode } for ${ selectedMember . first_name } ${ selectedMember . last_name } `
140+ ) ;
141+ onRefresh ( ) ;
142+ setAssignDialogOpen ( false ) ;
143+ setSelectedMember ( null ) ;
144+ setAssignedMember ( null ) ;
145+ } catch ( error ) {
138146 toast . error ( `Error assigning ${ assignMode } ` ) ;
139- return ;
147+ console . error ( "Error creating coaching relationship:" , error ) ;
140148 }
141-
142- toast . success (
143- `Successfully assigned ${ assignedMember . first_name } ${ assignedMember . last_name } as ${ assignMode } for ${ selectedMember . first_name } ${ selectedMember . last_name } `
144- ) ;
145- onRefresh ( ) ;
146- setAssignDialogOpen ( false ) ;
147- setSelectedMember ( null ) ;
148- setAssignedMember ( null ) ;
149149 } ;
150150
151151 return (
152152 < div className = "flex items-center p-4 hover:bg-accent/50 transition-colors" >
153153 < div className = "flex-1" >
154154 < h3 className = "font-medium" >
155155 { firstName } { lastName }
156+ { userId === currentUserId && " (You)" }
156157 </ h3 >
157158 { email && < p className = "text-sm text-muted-foreground" > { email } </ p > }
159+ { displayRoles . length > 0 && (
160+ < p className = "text-sm text-muted-foreground" >
161+ < span className = "font-medium" > Roles:</ span > { displayRoles . join ( ', ' ) }
162+ </ p >
163+ ) }
164+ < p className = "text-sm text-muted-foreground" >
165+ < span className = "font-medium" > Coaches:</ span > { coaches . length > 0 ? coaches . join ( ', ' ) : 'None' }
166+ </ p >
158167 </ div >
159- { ( isACoach || isAdminOrSuperAdmin ( currentUserRoleState ) ) && (
168+ { isAdminOrSuperAdmin ( currentUserRoleState ) && (
160169 < DropdownMenu >
161170 < DropdownMenuTrigger asChild >
162171 < Button
@@ -200,7 +209,7 @@ export function MemberCard({
200209 ) }
201210 { canDeleteUser && (
202211 < >
203- < DropdownMenuSeparator />
212+ { userId !== currentUserId && < DropdownMenuSeparator /> }
204213 < DropdownMenuItem
205214 onClick = { handleDelete }
206215 className = "text-destructive focus:text-destructive"
@@ -222,7 +231,7 @@ export function MemberCard({
222231 </ DialogTitle >
223232 < DialogDescription >
224233 Select a member to be their{ " " }
225- { assignMode === RelationshipRole . Coach ? "coach" : "coachee" }
234+ { assignMode . toLowerCase ( ) }
226235 </ DialogDescription >
227236 </ DialogHeader >
228237 < Select
0 commit comments