Skip to content

Commit 088c92d

Browse files
fix: discussion page'
1 parent 1b0beb0 commit 088c92d

File tree

11 files changed

+712
-465
lines changed

11 files changed

+712
-465
lines changed

packages/api/schema.gql

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,7 @@ input PaperEntryInput {
125125
question: String!
126126
answer: String
127127
hint: String
128+
comments: [String!]!
128129
}
129130

130131
type MutatePaperPayload {
@@ -729,6 +730,7 @@ type PaperFormData {
729730
question: String!
730731
answer: String
731732
hint: String
733+
comments: [String!]!
732734
}
733735

734736
type Paper {

packages/api/src/graphql.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -564,6 +564,7 @@ export type GqlPaper = {
564564

565565
export type GqlPaperEntryInput = {
566566
answer?: InputMaybe<Scalars['String']['input']>;
567+
comments: Array<Scalars['String']['input']>;
567568
hint?: InputMaybe<Scalars['String']['input']>;
568569
id: Scalars['ID']['input'];
569570
question: Scalars['String']['input'];
@@ -573,6 +574,7 @@ export type GqlPaperEntryInput = {
573574
export type GqlPaperFormData = {
574575
__typename?: 'PaperFormData';
575576
answer?: Maybe<Scalars['String']['output']>;
577+
comments: Array<Scalars['String']['output']>;
576578
hint?: Maybe<Scalars['String']['output']>;
577579
id: Scalars['ID']['output'];
578580
question: Scalars['String']['output'];
@@ -1231,6 +1233,7 @@ export type GqlPaperResolvers<ContextType = Context, ParentType extends GqlResol
12311233

12321234
export type GqlPaperFormDataResolvers<ContextType = Context, ParentType extends GqlResolversParentTypes['PaperFormData'] = GqlResolversParentTypes['PaperFormData']> = ResolversObject<{
12331235
answer?: Resolver<Maybe<GqlResolversTypes['String']>, ParentType, ContextType>;
1236+
comments?: Resolver<Array<GqlResolversTypes['String']>, ParentType, ContextType>;
12341237
hint?: Resolver<Maybe<GqlResolversTypes['String']>, ParentType, ContextType>;
12351238
id?: Resolver<GqlResolversTypes['ID'], ParentType, ContextType>;
12361239
question?: Resolver<GqlResolversTypes['String'], ParentType, ContextType>;

packages/frontend/src/components/paper-text-input.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ const PaperTextInput: React.FC<PaperTextInputProps> = ({
7474
question: entry.question,
7575
id: entry.id,
7676
hint: entry.hint ? entry.hint : '',
77+
comments: [],
7778
})
7879
}
7980

packages/frontend/src/graphql/index.tsx

Lines changed: 535 additions & 434 deletions
Large diffs are not rendered by default.

packages/frontend/src/graphql/mutations/update-paper.gql

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,14 @@ mutation updatePaper($input: PaperUpdateInput!) {
2222
questionId
2323
answer
2424
hint
25+
comments
2526
}
2627
feedbackMentor {
2728
id
2829
questionId
2930
answer
3031
hint
32+
comments
3133
}
3234
}
3335
}

packages/frontend/src/graphql/queries/mentor-paper-page-data.gql

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
query MentorPaperPageData {
22
currentUser {
33
id
4-
theme
54
... on Mentor {
65
papers {
76
id
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
query FeedbackDiscussionPageData {
2+
currentUser {
3+
id
4+
... on Mentor {
5+
papers {
6+
id
7+
traineeId
8+
trainerId
9+
client
10+
mentorId
11+
periodStart
12+
periodEnd
13+
schoolPeriodStart
14+
schoolPeriodEnd
15+
subject
16+
status
17+
briefing {
18+
id
19+
questionId
20+
question
21+
answer
22+
hint
23+
comments
24+
}
25+
feedbackTrainee {
26+
id
27+
questionId
28+
question
29+
answer
30+
hint
31+
comments
32+
}
33+
feedbackMentor {
34+
id
35+
questionId
36+
question
37+
answer
38+
hint
39+
comments
40+
}
41+
}
42+
}
43+
... on Trainee {
44+
papers {
45+
id
46+
traineeId
47+
trainerId
48+
client
49+
mentorId
50+
periodStart
51+
periodEnd
52+
schoolPeriodStart
53+
schoolPeriodEnd
54+
subject
55+
status
56+
briefing {
57+
id
58+
questionId
59+
question
60+
answer
61+
hint
62+
comments
63+
}
64+
feedbackTrainee {
65+
id
66+
questionId
67+
question
68+
answer
69+
hint
70+
comments
71+
}
72+
feedbackMentor {
73+
id
74+
questionId
75+
question
76+
answer
77+
hint
78+
comments
79+
}
80+
}
81+
}
82+
}
83+
}

packages/frontend/src/pages/mentor-paper-feedback-page.tsx

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,12 @@ export const MentorPaperFeedbackPage: React.FunctionComponent = () => {
6363
subject: paper?.subject ?? '',
6464
status: PaperStatus.TraineeDone,
6565
briefing: paper ? omitDeep(paper.briefing, '__typename') : [],
66-
feedbackTrainee: paper?.feedbackTrainee ? omitDeep(paper.feedbackTrainee, '__typename') : [],
66+
feedbackTrainee: paper?.feedbackTrainee
67+
? omitDeep(paper.feedbackTrainee, '__typename').map((trainee) => ({
68+
...trainee,
69+
comments: trainee.comments ? trainee.comments : [],
70+
}))
71+
: [],
6772
feedbackMentor: omitDeep(feedback, '__typename'),
6873
},
6974
},
@@ -91,7 +96,12 @@ export const MentorPaperFeedbackPage: React.FunctionComponent = () => {
9196
subject: paper?.subject ?? '',
9297
status: PaperStatus.MentorDone,
9398
briefing: paper ? omitDeep(paper.briefing, '__typename') : [],
94-
feedbackTrainee: paper?.feedbackTrainee ? omitDeep(paper.feedbackTrainee, '__typename') : [],
99+
feedbackTrainee: paper?.feedbackTrainee
100+
? omitDeep(paper.feedbackTrainee, '__typename').map((trainee) => ({
101+
...trainee,
102+
comments: trainee.comments ? trainee.comments : [],
103+
}))
104+
: [],
95105
feedbackMentor: omitDeep(feedback, '__typename'),
96106
},
97107
},
@@ -130,6 +140,7 @@ export const MentorPaperFeedbackPage: React.FunctionComponent = () => {
130140
questionId: index.toString(),
131141
hint: h,
132142
answer: '',
143+
comments: [],
133144
}}
134145
forceActive={filteredQAs.length === 1 || index.toString() === '0'}
135146
key={q}

packages/frontend/src/pages/paper-briefing-page.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,7 @@ export const PaperBriefingPage: React.FunctionComponent = () => {
178178
questionId: index.toString(),
179179
hint: h,
180180
answer: '',
181+
comments: [],
181182
}}
182183
forceActive={filteredQAs.length === 1}
183184
key={q}

packages/frontend/src/pages/paper-feedback-discussion-page.tsx

Lines changed: 71 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,18 @@ import { Box, PaperH2, PaperLayout, Spacer } from '@lara/components'
44
import NavigationButtonLink from '../components/navigation-button-link'
55
import { Template } from '../templates/template'
66
import strings from '../locales/localization'
7-
import {
8-
useTraineePaperPageDataQuery,
9-
useMentorPaperPageDataQuery,
10-
FeedbackEntryProps,
11-
PaperFormData,
12-
} from '../graphql'
7+
8+
import { PaperFormData, useUpdatePaperMutation, useFeedbackDiscussionPageDataQuery } from '../graphql'
9+
import { omitDeep } from '@apollo/client/utilities'
1310
import CommentSection from '../components/comment-section'
1411

12+
interface FeedbackEntryProps {
13+
entry: PaperFormData
14+
comments: string[]
15+
onSubmit: (comment: string) => void
16+
displayTextInput: boolean
17+
}
18+
1519
// FeedbackEntryProps already declares:
1620
// { entry: PaperFormData; comments: string[]; onSubmit: (comment: string) => void; displayTextInput: boolean }
1721

@@ -28,6 +32,8 @@ export const FeedbackEntry: React.FC<FeedbackEntryProps> = ({ entry, comments, o
2832
},
2933
}))
3034

35+
console.log('here')
36+
3137
return (
3238
<Box mb="4" p="4">
3339
<Box mb="3">
@@ -40,26 +46,28 @@ export const FeedbackEntry: React.FC<FeedbackEntryProps> = ({ entry, comments, o
4046
)
4147
}
4248

43-
type PaperWithFeedback = {
44-
id: string
45-
feedbackTrainee?: PaperFormData[]
46-
feedbackMentor?: PaperFormData[]
47-
}
48-
4949
/**
5050
* Keep minimal changes: type the currentUser->papers access so we can call .map
5151
* with concrete PaperFormData elements instead of `any`.
5252
*/
5353
export const PaperFeedbackDiscussionPage: React.FC = () => {
5454
const { paperId } = useParams<{ paperId: string }>()
55-
const traineePaperData = useTraineePaperPageDataQuery()
56-
const mentorPaperData = useMentorPaperPageDataQuery()
55+
const data = useFeedbackDiscussionPageDataQuery()
56+
57+
const currentUser =
58+
data.data?.currentUser?.__typename === 'Mentor' || data.data?.currentUser?.__typename === 'Trainee'
59+
? data.data.currentUser
60+
: undefined
5761

58-
const currentUser = traineePaperData.data?.currentUser || mentorPaperData.data?.currentUser
62+
const papers = currentUser?.papers
5963

60-
// Narrow `papers` to a known shape (no `any`)
61-
const papers = (currentUser as unknown as { papers?: PaperWithFeedback[] })?.papers
62-
const paper = papers?.find((p) => p.id === paperId)
64+
const paper = papers?.find((p) => String(p?.id) === String(paperId))
65+
66+
const [updatePaper] = useUpdatePaperMutation()
67+
68+
console.log('current user: ', currentUser)
69+
console.log('paper: ', paper)
70+
console.log('papers: ', papers)
6371

6472
if (!paper || !currentUser) {
6573
return (
@@ -69,14 +77,49 @@ export const PaperFeedbackDiscussionPage: React.FC = () => {
6977
)
7078
}
7179

72-
// keep returning string[] as per FeedbackEntryProps
73-
const getCommentsForEntry = (_entryId: string): string[] => {
74-
return []
80+
// read comments from entry if present, else empty
81+
const getCommentsForEntry = (entry: PaperFormData): string[] => {
82+
return (entry.comments as string[]) || []
7583
}
7684

77-
// prefix unused args with _ to satisfy eslint no-unused-vars rule
78-
const handleCommentSubmit = (_entryId: string, _text: string) => {
79-
// TODO: Implement mutation to save comment for entry
85+
// Save a new comment into the correct side and persist via updatePaperMutation
86+
const handleCommentSubmit = async (side: 'trainee' | 'mentor', entryId: string, text: string) => {
87+
const t = text?.trim()
88+
if (!t) return
89+
90+
const nextTrainee: PaperFormData[] = (paper.feedbackTrainee ?? []).map((e) =>
91+
e.id === entryId && side === 'trainee' ? { ...e, comments: [...(e.comments ?? []), t] } : { ...e, comments: [] }
92+
)
93+
94+
const nextMentor: PaperFormData[] = (paper.feedbackMentor ?? []).map((e) =>
95+
e.id === entryId && side === 'mentor' ? { ...e, comments: [...(e.comments ?? []), t] } : { ...e, comments: [] }
96+
)
97+
98+
console.log('mentor and trainee: ')
99+
console.log(nextTrainee)
100+
console.log(nextMentor)
101+
102+
await updatePaper({
103+
variables: {
104+
input: {
105+
id: paper.id,
106+
traineeId: paper.traineeId ?? '',
107+
mentorId: paper.mentorId ?? '',
108+
trainerId: paper.trainerId ?? '',
109+
client: paper.client ?? '',
110+
subject: paper.subject ?? '',
111+
periodStart: paper.periodStart,
112+
periodEnd: paper.periodEnd,
113+
schoolPeriodStart: paper.schoolPeriodStart,
114+
schoolPeriodEnd: paper.schoolPeriodEnd,
115+
status: paper.status,
116+
briefing: omitDeep(paper.briefing ?? [], '__typename'),
117+
feedbackTrainee: omitDeep(nextTrainee, '__typename'),
118+
feedbackMentor: omitDeep(nextMentor, '__typename'),
119+
},
120+
},
121+
refetchQueries: ['TraineePaperPageData', 'MentorPaperPageData'],
122+
})
80123
}
81124

82125
return (
@@ -100,8 +143,8 @@ export const PaperFeedbackDiscussionPage: React.FC = () => {
100143
<FeedbackEntry
101144
key={entry.id}
102145
entry={entry}
103-
comments={getCommentsForEntry(entry.id)}
104-
onSubmit={(text) => handleCommentSubmit(entry.id, text)}
146+
comments={getCommentsForEntry(entry)}
147+
onSubmit={(text) => handleCommentSubmit('trainee', entry.id, text)}
105148
displayTextInput={true}
106149
/>
107150
))}
@@ -113,8 +156,8 @@ export const PaperFeedbackDiscussionPage: React.FC = () => {
113156
<FeedbackEntry
114157
key={entry.id}
115158
entry={entry}
116-
comments={getCommentsForEntry(entry.id)}
117-
onSubmit={(text) => handleCommentSubmit(entry.id, text)}
159+
comments={getCommentsForEntry(entry)}
160+
onSubmit={(text) => handleCommentSubmit('mentor', entry.id, text)}
118161
displayTextInput={true}
119162
/>
120163
))}

0 commit comments

Comments
 (0)