@@ -14,6 +14,7 @@ import { MoreHorizontal, Trash2 } from "lucide-react";
14
14
import {
15
15
Dialog ,
16
16
DialogContent ,
17
+ DialogDescription ,
17
18
DialogHeader ,
18
19
DialogFooter ,
19
20
DialogTitle ,
@@ -25,11 +26,13 @@ import {
25
26
SelectContent ,
26
27
SelectItem ,
27
28
} from "@/components/ui/select" ;
28
- import { CoachingRelationshipWithUserNames } from "@/types/coaching_relationship_with_user_names " ;
29
+ import { CoachingRelationshipWithUserNames } from "@/types/coaching_relationship " ;
29
30
import { OrganizationStateStore } from "@/lib/stores/organization-state-store" ;
30
31
import { AuthStore } from "@/lib/stores/auth-store" ;
31
32
import { Id } from "@/types/general" ;
32
33
import { User , Role } from "@/types/user" ;
34
+ import { useCoachingRelationshipMutation } from "@/lib/api/coaching-relationships" ;
35
+ import { toast } from "sonner" ;
33
36
34
37
interface MemberCardProps {
35
38
firstName : string ;
@@ -41,6 +44,12 @@ interface MemberCardProps {
41
44
users : User [ ] ;
42
45
}
43
46
47
+ interface Member {
48
+ id : Id ;
49
+ first_name : string ;
50
+ last_name : string ;
51
+ }
52
+
44
53
export function MemberCard ( {
45
54
firstName,
46
55
lastName,
@@ -53,27 +62,79 @@ export function MemberCard({
53
62
const currentOrganizationId = useOrganizationStateStore (
54
63
( state : OrganizationStateStore ) => state . currentOrganizationId
55
64
) ;
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 ) ;
58
70
59
71
// Check if current user is a coach in any of this user's relationships
60
72
// and make sure we can't delete ourselves. Admins can delete any user.
61
- const canDeleteUser = userRelationships ?. some (
73
+ const canDeleteUser = ( userRelationships ?. some (
62
74
( 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 ;
64
76
65
77
const handleDelete = async ( ) => {
66
78
if ( ! confirm ( "Are you sure you want to delete this member?" ) ) {
67
79
return ;
68
80
}
81
+ await deleteUser ( currentOrganizationId , userId ) ;
82
+ onRefresh ( ) ;
69
83
70
- try {
71
- await deleteUser ( currentOrganizationId , userId ) ;
84
+ if ( deleteError ) {
85
+ console . error ( "Error deleting member:" , deleteError ) ;
86
+ toast . error ( "Error deleting member" ) ;
72
87
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 ;
76
89
}
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 ) ;
77
138
} ;
78
139
79
140
// Placeholder – actual UI flows will be implemented later
@@ -101,6 +162,7 @@ export function MemberCard({
101
162
</ h3 >
102
163
{ email && < p className = "text-sm text-muted-foreground" > { email } </ p > }
103
164
</ div >
165
+ { ( isACoach || userSession . role === Role . Admin ) && (
104
166
< DropdownMenu >
105
167
< DropdownMenuTrigger asChild >
106
168
< Button variant = "ghost" size = "icon" className = "text-muted-foreground" >
@@ -114,6 +176,7 @@ export function MemberCard({
114
176
onClick = { ( ) => {
115
177
setAssignMode ( "coach" ) ;
116
178
setAssignDialogOpen ( true ) ;
179
+ setSelectedMember ( { id : userId , first_name : firstName , last_name : lastName } ) ;
117
180
} }
118
181
>
119
182
Assign Coach
@@ -122,6 +185,7 @@ export function MemberCard({
122
185
onClick = { ( ) => {
123
186
setAssignMode ( "coachee" ) ;
124
187
setAssignDialogOpen ( true ) ;
188
+ setSelectedMember ( { id : userId , first_name : firstName , last_name : lastName } ) ;
125
189
} }
126
190
>
127
191
Assign Coachee
@@ -141,6 +205,7 @@ export function MemberCard({
141
205
) }
142
206
</ DropdownMenuContent >
143
207
</ DropdownMenu >
208
+ ) }
144
209
145
210
{ /* Assign Coach/Coachee Modal */ }
146
211
< Dialog open = { assignDialogOpen } onOpenChange = { setAssignDialogOpen } >
@@ -149,10 +214,13 @@ export function MemberCard({
149
214
< DialogTitle >
150
215
{ assignMode === "coach" ? "Assign Coach" : "Assign Coachee" }
151
216
</ DialogTitle >
217
+ < DialogDescription >
218
+ Select a member to be their { assignMode === "coach" ? "coach" : "coachee" }
219
+ </ DialogDescription >
152
220
</ DialogHeader >
153
221
< Select
154
- onValueChange = { ( val ) => setSelectedMemberId ( val as Id ) }
155
- value = { selectedMemberId ?? undefined }
222
+ onValueChange = { ( val ) => handleAssignMember ( val ) }
223
+ value = { assignedMember ?. id ?. toString ( ) }
156
224
>
157
225
< SelectTrigger className = "w-full" >
158
226
< SelectValue placeholder = "Select a member" />
0 commit comments