@@ -14,6 +14,7 @@ import { MoreHorizontal, Trash2 } from "lucide-react";
1414import {
1515 Dialog ,
1616 DialogContent ,
17+ DialogDescription ,
1718 DialogHeader ,
1819 DialogFooter ,
1920 DialogTitle ,
@@ -25,11 +26,13 @@ import {
2526 SelectContent ,
2627 SelectItem ,
2728} from "@/components/ui/select" ;
28- import { CoachingRelationshipWithUserNames } from "@/types/coaching_relationship_with_user_names " ;
29+ import { CoachingRelationshipWithUserNames } from "@/types/coaching_relationship " ;
2930import { OrganizationStateStore } from "@/lib/stores/organization-state-store" ;
3031import { AuthStore } from "@/lib/stores/auth-store" ;
3132import { Id } from "@/types/general" ;
3233import { User , Role } from "@/types/user" ;
34+ import { useCoachingRelationshipMutation } from "@/lib/api/coaching-relationships" ;
35+ import { toast } from "sonner" ;
3336
3437interface MemberCardProps {
3538 firstName : string ;
@@ -41,6 +44,12 @@ interface MemberCardProps {
4144 users : User [ ] ;
4245}
4346
47+ interface Member {
48+ id : Id ;
49+ first_name : string ;
50+ last_name : string ;
51+ }
52+
4453export function MemberCard ( {
4554 firstName,
4655 lastName,
@@ -53,27 +62,79 @@ export function MemberCard({
5362 const currentOrganizationId = useOrganizationStateStore (
5463 ( state : OrganizationStateStore ) => state . currentOrganizationId
5564 ) ;
56- const { userSession } = useAuthStore ( ( state : AuthStore ) => state ) ;
57- const { deleteNested : deleteUser } = useUserMutation ( currentOrganizationId ) ;
65+ const { isACoach, userSession } = useAuthStore ( ( state : AuthStore ) => state ) ;
66+ const { error : deleteError , deleteNested : deleteUser } = useUserMutation ( currentOrganizationId ) ;
67+ const { error : createError , createNested : createRelationship } = useCoachingRelationshipMutation ( currentOrganizationId ) ;
68+
69+ console . log ( "is a coach" , isACoach ) ;
5870
5971 // Check if current user is a coach in any of this user's relationships
6072 // and make sure we can't delete ourselves. Admins can delete any user.
61- const canDeleteUser = userRelationships ?. some (
73+ const canDeleteUser = ( userRelationships ?. some (
6274 ( rel ) => rel . coach_id === userSession . id && userId !== userSession . id
63- ) || ( userSession . role === Role . Admin && userSession . id !== userId ) ;
75+ ) || ( userSession . role === Role . Admin ) ) && userSession . id !== userId ;
6476
6577 const handleDelete = async ( ) => {
6678 if ( ! confirm ( "Are you sure you want to delete this member?" ) ) {
6779 return ;
6880 }
81+ await deleteUser ( currentOrganizationId , userId ) ;
82+ onRefresh ( ) ;
6983
70- try {
71- await deleteUser ( currentOrganizationId , userId ) ;
84+ if ( deleteError ) {
85+ console . error ( "Error deleting member:" , deleteError ) ;
86+ toast . error ( "Error deleting member" ) ;
7287 onRefresh ( ) ;
73- } catch ( error ) {
74- console . error ( "Error deleting user:" , error ) ;
75- // TODO: Show an error toast here once we start using toasts for showing operation results.
88+ return ;
7689 }
90+ toast . success ( "Member deleted successfully" ) ;
91+ onRefresh ( ) ;
92+ } ;
93+
94+ const handleAssignMember = ( val : string ) => {
95+ const user = users . find ( ( m ) => m . id === val ) ;
96+ if ( ! user ) return ;
97+ const member : Member = {
98+ id : user . id ,
99+ first_name : user . first_name ,
100+ last_name : user . last_name ,
101+ } ;
102+ setAssignedMember ( member ) ;
103+ } ;
104+
105+ // Placeholder – actual UI flows will be implemented later
106+ const [ assignDialogOpen , setAssignDialogOpen ] = useState ( false ) ;
107+ const [ assignMode , setAssignMode ] = useState < "coach" | "coachee" > ( "coach" ) ;
108+ const [ selectedMember , setSelectedMember ] = useState < Member | null > ( null ) ;
109+ const [ assignedMember , setAssignedMember ] = useState < Member | null > ( null ) ;
110+
111+ const handleCreateCoachingRelationship = ( ) => {
112+ if ( ! selectedMember || ! assignedMember ) return ;
113+
114+ if ( assignMode === "coach" ) {
115+ console . log ( "Assign" , selectedMember . id , "as coach for" , userId ) ;
116+ createRelationship ( currentOrganizationId , {
117+ coach_id : assignedMember . id ,
118+ coachee_id : selectedMember . id ,
119+ } ) ;
120+ } else {
121+ console . log ( "Assign" , selectedMember . id , "as coachee for" , userId ) ;
122+ createRelationship ( currentOrganizationId , {
123+ coach_id : selectedMember . id ,
124+ coachee_id : assignedMember . id ,
125+ } ) ;
126+ }
127+
128+ if ( createError ) {
129+ toast . error ( `Error assigning ${ assignMode } ` ) ;
130+ return ;
131+ }
132+
133+ toast . success ( `Successfully assigned ${ assignedMember . first_name } ${ assignedMember . last_name } as ${ assignMode } for ${ selectedMember . first_name } ${ selectedMember . last_name } ` ) ;
134+ onRefresh ( ) ;
135+ setAssignDialogOpen ( false ) ;
136+ setSelectedMember ( null ) ;
137+ setAssignedMember ( null ) ;
77138 } ;
78139
79140 // Placeholder – actual UI flows will be implemented later
@@ -101,6 +162,7 @@ export function MemberCard({
101162 </ h3 >
102163 { email && < p className = "text-sm text-muted-foreground" > { email } </ p > }
103164 </ div >
165+ { ( isACoach || userSession . role === Role . Admin ) && (
104166 < DropdownMenu >
105167 < DropdownMenuTrigger asChild >
106168 < Button variant = "ghost" size = "icon" className = "text-muted-foreground" >
@@ -114,6 +176,7 @@ export function MemberCard({
114176 onClick = { ( ) => {
115177 setAssignMode ( "coach" ) ;
116178 setAssignDialogOpen ( true ) ;
179+ setSelectedMember ( { id : userId , first_name : firstName , last_name : lastName } ) ;
117180 } }
118181 >
119182 Assign Coach
@@ -122,6 +185,7 @@ export function MemberCard({
122185 onClick = { ( ) => {
123186 setAssignMode ( "coachee" ) ;
124187 setAssignDialogOpen ( true ) ;
188+ setSelectedMember ( { id : userId , first_name : firstName , last_name : lastName } ) ;
125189 } }
126190 >
127191 Assign Coachee
@@ -141,6 +205,7 @@ export function MemberCard({
141205 ) }
142206 </ DropdownMenuContent >
143207 </ DropdownMenu >
208+ ) }
144209
145210 { /* Assign Coach/Coachee Modal */ }
146211 < Dialog open = { assignDialogOpen } onOpenChange = { setAssignDialogOpen } >
@@ -149,10 +214,13 @@ export function MemberCard({
149214 < DialogTitle >
150215 { assignMode === "coach" ? "Assign Coach" : "Assign Coachee" }
151216 </ DialogTitle >
217+ < DialogDescription >
218+ Select a member to be their { assignMode === "coach" ? "coach" : "coachee" }
219+ </ DialogDescription >
152220 </ DialogHeader >
153221 < Select
154- onValueChange = { ( val ) => setSelectedMemberId ( val as Id ) }
155- value = { selectedMemberId ?? undefined }
222+ onValueChange = { ( val ) => handleAssignMember ( val ) }
223+ value = { assignedMember ?. id ?. toString ( ) }
156224 >
157225 < SelectTrigger className = "w-full" >
158226 < SelectValue placeholder = "Select a member" />
0 commit comments