@@ -13,17 +13,18 @@ import {
1313 Tabs ,
1414} from "@mui/material" ;
1515import { useParams } from "next/navigation" ;
16+ import { useMemo , useState } from "react" ;
1617import { useLazyLoadQuery , useMutation } from "react-relay" ;
1718
1819import {
20+ umlApiFindUserInfosQuery ,
1921 umlApiGetLecturerExerciseOverviewQuery ,
2022 umlApiUpdateTutorSolutionMutation ,
2123} from "@/components/hylimo/api/UmlApi" ;
2224import { getSemanticModel } from "@/components/hylimo/semanticModelGenerator" ;
2325import { AddUMLAssignmentModal } from "@/components/uml-assignment/AddUMLAssignmentModal" ;
2426import ExerciseInfoTab from "@/components/uml-assignment/ExerciseInfoTab" ;
2527import SubmissionsTab from "@/components/uml-assignment/SubmissionsTab" ;
26- import { useState } from "react" ;
2728
2829export default function LecturerUmlAssignment ( ) {
2930 const { umlId } = useParams ( ) ;
@@ -38,6 +39,36 @@ export default function LecturerUmlAssignment() {
3839 { fetchPolicy : "network-only" , fetchKey : refreshKey }
3940 ) ;
4041
42+ const studentIds = useMemo ( ( ) => {
43+ const ids =
44+ data ?. getUmlExerciseByAssessmentId ?. studentSubmissions ?. map (
45+ ( sub : any ) => sub . studentId
46+ ) || [ ] ;
47+
48+ // Defensive: filter out empty values and duplicates before querying user infos.
49+ return Array . from ( new Set ( ids . filter ( ( id : any ) => typeof id === "string" && id . length > 0 ) ) ) ;
50+ } , [ data ?. getUmlExerciseByAssessmentId ?. studentSubmissions ] ) ;
51+
52+ // Fetch user infos for all students
53+ const userInfosData = useLazyLoadQuery < any > (
54+ umlApiFindUserInfosQuery ,
55+ { ids : studentIds } ,
56+ { fetchPolicy : "network-only" }
57+ ) ;
58+
59+ const userInfos = useMemo ( ( ) => {
60+ const userMap : Record < string , any > = { } ;
61+ if ( userInfosData ?. findUserInfos ) {
62+ userInfosData . findUserInfos . forEach ( ( user : any ) => {
63+ // Backend may return null entries when referenced users no longer exist.
64+ if ( user ?. id ) {
65+ userMap [ user . id ] = user ;
66+ }
67+ } ) ;
68+ }
69+ return userMap ;
70+ } , [ userInfosData ?. findUserInfos ] ) ;
71+
4172 const [ updateTutorSolution , isUpdating ] = useMutation (
4273 umlApiUpdateTutorSolutionMutation
4374 ) ;
@@ -114,7 +145,7 @@ export default function LecturerUmlAssignment() {
114145 isUpdating = { isUpdating }
115146 />
116147 ) : tabIndex === 1 ? (
117- < SubmissionsTab exercise = { exercise } />
148+ < SubmissionsTab exercise = { exercise } userInfos = { userInfos } />
118149 ) : null }
119150 </ Box >
120151 { isEditModalOpen && exercise && content && (
0 commit comments