@@ -3,10 +3,14 @@ import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
33import { config } from '@/lib/config' ;
44import { type ChapterAssignmentProgress , type UserChapterAssignment } from '@/lib/types' ;
55
6+ export interface AssignSelectedItem {
7+ chapterAssignmentId : number ;
8+ drafterId : number | null ;
9+ peerCheckerId : number | null ;
10+ }
11+
612export interface AssignChapterPayload {
7- chapterAssignmentId : number [ ] ;
8- userId : number ;
9- peerCheckerId ?: number ;
13+ assignments : AssignSelectedItem [ ] ;
1014}
1115
1216export interface ChapterAssignmentsByUser {
@@ -47,35 +51,28 @@ const fetchChapterAssignmentsByUserId = async (
4751 return ( await res . json ( ) ) as ChapterAssignmentsByUser ;
4852} ;
4953
50- export interface AssignChaptersResponse {
51- success : boolean ;
52- message ?: string ;
53- assignedUser ?: string ;
54- peerChecker ?: string ;
55- }
56-
5754const assignChaptersToUser = async (
58- payload : AssignChapterPayload & { email : string }
59- ) : Promise < number [ ] > => {
60- const { email, userId , chapterAssignmentId , peerCheckerId } = payload ;
61-
62- const response = await fetch ( ` ${ config . api . url } /users/ ${ userId } /chapter-assignments` , {
63- method : 'PATCH' ,
64- headers : {
65- 'Content-Type' : 'application/json ' ,
66- 'x-user-email' : email ,
67- } ,
68- body : JSON . stringify ( {
69- chapterAssignmentIds : chapterAssignmentId ,
70- peerCheckerId : peerCheckerId ,
71- } ) ,
72- } ) ;
55+ payload : AssignChapterPayload & { email : string ; projectId : string }
56+ ) : Promise < UserChapterAssignment [ ] > => {
57+ const { email, projectId , assignments } = payload ;
58+
59+ const response = await fetch (
60+ ` ${ config . api . url } /projects/ ${ projectId } /chapter-assignments/assign-selected` ,
61+ {
62+ method : 'PATCH ' ,
63+ headers : {
64+ 'Content-Type' : 'application/json' ,
65+ 'x-user-email' : email ,
66+ } ,
67+ body : JSON . stringify ( { assignments } ) ,
68+ }
69+ ) ;
7370
7471 if ( ! response . ok ) {
7572 throw new Error ( 'Failed to assign chapters' ) ;
7673 }
7774
78- return ( await response . json ( ) ) as number [ ] ;
75+ return ( await response . json ( ) ) as UserChapterAssignment [ ] ;
7976} ;
8077
8178export const useChapterAssignments = ( projectId : string , email : string ) => {
@@ -117,21 +114,23 @@ export const useAssignChapters = (
117114
118115 if ( previousAssignments ) {
119116 const updatedAssignments = previousAssignments . map ( assignment => {
120- if ( variables . chapterAssignmentId . includes ( assignment . assignmentId ) ) {
121- return {
122- ...assignment ,
123- ...( assignedUserName &&
124- variables . userId && {
125- assignedUser : { id : variables . userId , displayName : assignedUserName } ,
126- } ) ,
127- ...( peerCheckerName &&
128- variables . peerCheckerId && {
129- peerChecker : { id : variables . peerCheckerId , displayName : peerCheckerName } ,
130- } ) ,
131- status : assignment . status === 'not_started' ? 'draft' : assignment . status ,
132- } ;
133- }
134- return assignment ;
117+ const item = variables . assignments . find (
118+ a => a . chapterAssignmentId === assignment . assignmentId
119+ ) ;
120+ if ( ! item ) return assignment ;
121+
122+ return {
123+ ...assignment ,
124+ assignedUser :
125+ item . drafterId !== null && assignedUserName
126+ ? { id : item . drafterId , displayName : assignedUserName }
127+ : null ,
128+ peerChecker :
129+ item . peerCheckerId !== null && peerCheckerName
130+ ? { id : item . peerCheckerId , displayName : peerCheckerName }
131+ : null ,
132+ status : assignment . status === 'not_started' ? 'draft' : assignment . status ,
133+ } ;
135134 } ) ;
136135
137136 queryClient . setQueryData ( [ 'chapterAssignments' , projectId , email ] , updatedAssignments ) ;
@@ -140,7 +139,6 @@ export const useAssignChapters = (
140139 return { previousAssignments } ;
141140 } ,
142141 onError : ( _err , _variables , context ) => {
143- // Rollback on error
144142 if ( context ?. previousAssignments ) {
145143 queryClient . setQueryData (
146144 [ 'chapterAssignments' , projectId , email ] ,
@@ -153,8 +151,16 @@ export const useAssignChapters = (
153151 queryKey : [ 'chapterAssignments' , projectId , email ] ,
154152 } ) ;
155153
156- void queryClient . invalidateQueries ( {
157- queryKey : [ 'userChapterAssignments' , variables . userId ] ,
154+ // Invalidate user assignment caches for every unique user touched
155+ const affectedUserIds = new Set < number > ( ) ;
156+ variables . assignments . forEach ( a => {
157+ if ( a . drafterId !== null ) affectedUserIds . add ( a . drafterId ) ;
158+ if ( a . peerCheckerId !== null ) affectedUserIds . add ( a . peerCheckerId ) ;
159+ } ) ;
160+ affectedUserIds . forEach ( userId => {
161+ void queryClient . invalidateQueries ( {
162+ queryKey : [ 'userChapterAssignments' , userId ] ,
163+ } ) ;
158164 } ) ;
159165
160166 void queryClient . invalidateQueries ( {
0 commit comments