Skip to content

Commit abc787d

Browse files
committed
fix(pr): try to fix vercel/next.js#44363
1 parent a8e22cd commit abc787d

9 files changed

Lines changed: 474 additions & 371 deletions

File tree

Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
1+
'use client'
2+
3+
import { Disclosure, Transition } from '@headlessui/react'
4+
import PaperClipIcon from '@heroicons/react/outline/PaperClipIcon'
5+
import { Review } from './[pr]/page'
6+
7+
export function ReviewSummary({ review }: { review: Review }) {
8+
return (
9+
<div className="bg-white border border-black overflow-hidden " key={review.reviewerId}>
10+
<div className="px-4 py-5 sm:px-6">
11+
<h3 className="text-lg leading-6 font-medium text-gray-900">
12+
Review by {review.reviewerFullName}
13+
</h3>
14+
<p className="mt-1 max-w-2xl text-sm text-gray-500">Personal details and application.</p>
15+
</div>
16+
<div className="border-t border-gray-200 px-4 py-5 sm:px-6">
17+
<dl className="grid grid-cols-1 gap-x-4 gap-y-8 sm:grid-cols-2">
18+
<div className="sm:col-span-1">
19+
<dt className="text-sm font-medium text-gray-500">Full name</dt>
20+
<dd className="mt-1 text-sm text-gray-900">{review.reviewerFullName}</dd>
21+
</div>
22+
<div className="sm:col-span-1">
23+
<dt className="text-sm font-medium text-gray-500">Recommendation</dt>
24+
<dd className="mt-1 text-sm text-gray-900">{review.recommendationText}</dd>
25+
</div>
26+
<div className="sm:col-span-1">
27+
<dt className="text-sm font-medium text-gray-500">Email address</dt>
28+
<dd className="mt-1 text-sm text-gray-900">
29+
{review.reviewerComments?.[0]?.authorEmail?.toLowerCase()}
30+
</dd>
31+
</div>
32+
<div className="sm:col-span-1">
33+
<dt className="text-sm font-medium text-gray-500">Salary expectation</dt>
34+
<dd className="mt-1 text-sm text-gray-900">$120,000</dd>
35+
</div>
36+
<div className="sm:col-span-2">
37+
<dt className="text-sm font-medium text-gray-500">Reviewer Comments</dt>
38+
<dd className="mt-1 text-sm text-gray-900">
39+
<Disclosure>
40+
{({ open }) => (
41+
<>
42+
<Disclosure.Button className="text-indigo-600 hover:text-indigo-500">
43+
Show more {`${open}`}
44+
</Disclosure.Button>
45+
46+
{/*
47+
Use the `Transition` + `open` render prop argument to add transitions.
48+
*/}
49+
<Disclosure.Panel>AAAAAAAAA</Disclosure.Panel>
50+
<Transition
51+
show={open}
52+
enter="transition duration-100 ease-out"
53+
enterFrom="transform scale-95 opacity-0"
54+
enterTo="transform scale-100 opacity-100"
55+
leave="transition duration-75 ease-out"
56+
leaveFrom="transform scale-100 opacity-100"
57+
leaveTo="transform scale-95 opacity-0"
58+
>
59+
{/*
60+
Don't forget to add `static` to your `Disclosure.Panel`!
61+
*/}
62+
{/* <Disclosure.Panel>
63+
<div
64+
className="prose"
65+
dangerouslySetInnerHTML={{
66+
__html: review.reviewerComments?.[0]?.comments,
67+
}}
68+
/>
69+
Yes! You can purchase a license that you can share with your entire team.
70+
</Disclosure.Panel> */}
71+
</Transition>
72+
</>
73+
)}
74+
</Disclosure>
75+
</dd>
76+
</div>
77+
{review.reviewFiles.length > 0 && (
78+
<div className="sm:col-span-2">
79+
<dt className="text-sm font-medium text-gray-500">Attachments</dt>
80+
<dd className="mt-1 text-sm text-gray-900">
81+
<ul
82+
role="list"
83+
className="border border-gray-200 rounded-md divide-y divide-gray-200"
84+
>
85+
{review.reviewFiles.map((file) => (
86+
<li
87+
key={file._href}
88+
className="pl-3 pr-4 py-3 flex items-center justify-between text-sm"
89+
>
90+
<div className="w-0 flex-1 flex items-center">
91+
<PaperClipIcon
92+
className="flex-shrink-0 h-5 w-5 text-gray-400"
93+
aria-hidden="true"
94+
/>
95+
<span className="ml-2 flex-1 w-0 truncate">{file.name.en_US}</span>
96+
</div>
97+
<div className="ml-4 flex-shrink-0">
98+
<a href="#" className="font-medium text-indigo-600 hover:text-indigo-500">
99+
Download
100+
</a>
101+
</div>
102+
</li>
103+
// <li className="pl-3 pr-4 py-3 flex items-center justify-between text-sm">
104+
// <div className="w-0 flex-1 flex items-center">
105+
// <PaperClipIcon
106+
// className="flex-shrink-0 h-5 w-5 text-gray-400"
107+
// aria-hidden="true"
108+
// />
109+
// <span className="ml-2 flex-1 w-0 truncate">
110+
// coverletter_back_end_developer.pdf
111+
// </span>
112+
// </div>
113+
// <div className="ml-4 flex-shrink-0">
114+
// <a
115+
// href="#"
116+
// className="font-medium text-indigo-600 hover:text-indigo-500"
117+
// >
118+
// Download
119+
// </a>
120+
// </div>
121+
// </li>
122+
))}
123+
</ul>
124+
</dd>
125+
</div>
126+
)}
127+
</dl>
128+
</div>
129+
</div>
130+
)
131+
}

apps/peer-review/app/[pr]/page.tsx

Lines changed: 70 additions & 124 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
import { PaperClipIcon } from '@heroicons/react/outline/index'
1+
import { ReviewSummary } from 'apps/peer-review/app/ReviewSummary'
22
interface Reviews {
33
reviewRound: ReviewRound
44
reviews: Review[]
55
}
66

7-
interface Review {
7+
export interface Review {
88
id: number
99
submissionId: number
1010
reviewerId: number
@@ -96,10 +96,10 @@ interface ReviewRound {
9696

9797
interface Submission {
9898
itemsMax: number
99-
items: Item[]
99+
items: SubmissionItem[]
100100
}
101101

102-
interface Item {
102+
export interface SubmissionItem {
103103
_href: string
104104
contextId: number
105105
currentPublicationId: number
@@ -156,9 +156,15 @@ interface CoverImage {
156156
}
157157

158158
const fetchPR = async (submission: string) => {
159-
const url = `${process.env.OJS_URL}/_reviews/${submission}/reviews?apiToken=${process.env.OJS_TOKEN}`
160-
const res = await fetch(url)
161-
return res.json() as Promise<Reviews[]>
159+
try {
160+
const url = `${process.env.OJS_URL}/_reviews/${submission}/reviews?apiToken=${process.env.OJS_TOKEN}`
161+
const res = await fetch(url)
162+
return res.json() as Promise<Reviews[]>
163+
} catch (e) {
164+
console.error('ERROR')
165+
console.error(e)
166+
return []
167+
}
162168
}
163169

164170
const fetchFile = async (file: string) => {
@@ -167,143 +173,83 @@ const fetchFile = async (file: string) => {
167173
return res.blob()
168174
}
169175

170-
const fetchSubmission = async (submission: string) => {
171-
const url = `${process.env.OJS_URL}/submissions/${submission}?apiToken=${process.env.OJS_TOKEN}`
172-
console.log({ url })
173-
const res = await fetch(url)
174-
console.log({ res })
175-
return res.json() as Promise<Item>
176+
export const fetchSubmission = async (
177+
submission: string,
178+
query: URLSearchParams = new URLSearchParams(),
179+
) => {
180+
try {
181+
const url = `${process.env.OJS_URL}/submissions/${submission}?apiToken=${
182+
process.env.OJS_TOKEN
183+
}&${query.toString()}}`
184+
console.log({ url })
185+
const res = await fetch(url)
186+
console.log({ res })
187+
return res.json() as Promise<SubmissionItem>
188+
} catch (e) {
189+
console.error('ERROR')
190+
console.error(e)
191+
return null
192+
}
176193
}
177194

178195
export default async function Page(props: { params: { pr: string } }) {
179196
const {
180197
params: { pr },
181198
} = props
182199

183-
console.log(props)
200+
console.log({ props })
184201
const thing = await fetchPR(pr)
185202
const submission = await fetchSubmission(pr)
186-
console.log('Submission')
187-
console.log(submission)
203+
console.log({ submission })
204+
if (!submission) {
205+
return <div>Submission not found</div>
206+
}
188207
return (
189208
<div className="container">
190-
<main className="w-full max-w-2xl mx-auto">
209+
<main className="w-full max-w-2xl mx-auto flex flex-col gap-8">
191210
{/* Create a nicely styled page to display reviews, with links to download files */}
192211

193-
<h1 className="my-10 text-2xl font-bold flex flex-col">
212+
<h1 className="mt-8 text-2xl font-bold flex flex-col">
194213
<span className="text-lg font-normal">Reviews for</span>
195214
<span> {submission.publications?.[0]?.title?.en_US}</span>
196215
</h1>
197-
<div className="flex flex-col">
216+
<div className="flex flex-col gap-2">
217+
<span className="text-lg font-normal">by</span>
218+
<span className="font-normal">{submission.publications?.[0]?.authorsString}</span>
219+
</div>
220+
<div className="flex flex-col gap-2">
221+
<span className="text-lg font-normal">Submitted</span>
222+
<span className="font-normal">{submission.dateSubmitted}</span>
223+
</div>
224+
225+
<div className="flex flex-col gap-2">
226+
<span className="text-lg font-normal">Last Activity</span>
227+
<span className="font-normal">{submission.lastModified}</span>
228+
</div>
229+
230+
<div className="flex flex-col gap-2">
231+
<span className="text-lg font-normal">Status</span>
232+
<span className="font-normal">{submission.statusLabel}</span>
233+
</div>
234+
235+
<div className="flex flex-col gap-2">
236+
<span className="text-lg font-normal">Progress</span>
237+
<span className="font-normal">{submission.submissionProgress}%</span>
238+
</div>
239+
240+
<div className="flex flex-col gap-2">
241+
<span className="text-lg font-normal">DOI</span>
242+
<span className="font-normal">{submission.publications?.[0]?.['pub-id::doi']}</span>
243+
</div>
244+
245+
<div className="flex flex-col gap-8">
198246
{thing.map((review) => (
199-
<div className="flex flex-col" key={review.reviewRound.id}>
200-
<h2 className="text-xl font-bold">Review Round {review.reviewRound.round}</h2>
247+
<div className="flex flex-col gap-4" key={review.reviewRound.id}>
248+
<h2 className="text-2xl font-bold">Review Round {review.reviewRound.round}</h2>
201249
<h3 className="text-lg font-bold">{review.reviewRound.statusKey}</h3>
202250
<div className="flex flex-col gap-8">
203251
{review.reviews.map((review) => (
204-
<div
205-
className="bg-white shadow overflow-hidden sm:rounded-lg"
206-
key={review.reviewerId}
207-
>
208-
<div className="px-4 py-5 sm:px-6">
209-
<h3 className="text-lg leading-6 font-medium text-gray-900">
210-
Review by {review.reviewerFullName}
211-
</h3>
212-
<p className="mt-1 max-w-2xl text-sm text-gray-500">
213-
Personal details and application.
214-
</p>
215-
</div>
216-
<div className="border-t border-gray-200 px-4 py-5 sm:px-6">
217-
<dl className="grid grid-cols-1 gap-x-4 gap-y-8 sm:grid-cols-2">
218-
<div className="sm:col-span-1">
219-
<dt className="text-sm font-medium text-gray-500">Full name</dt>
220-
<dd className="mt-1 text-sm text-gray-900">{review.reviewerFullName}</dd>
221-
</div>
222-
<div className="sm:col-span-1">
223-
<dt className="text-sm font-medium text-gray-500">Recommendation</dt>
224-
<dd className="mt-1 text-sm text-gray-900">
225-
{review.recommendationText}
226-
</dd>
227-
</div>
228-
<div className="sm:col-span-1">
229-
<dt className="text-sm font-medium text-gray-500">Email address</dt>
230-
<dd className="mt-1 text-sm text-gray-900">
231-
{review.reviewerComments?.[0]?.authorEmail?.toLowerCase()}
232-
</dd>
233-
</div>
234-
<div className="sm:col-span-1">
235-
<dt className="text-sm font-medium text-gray-500">Salary expectation</dt>
236-
<dd className="mt-1 text-sm text-gray-900">$120,000</dd>
237-
</div>
238-
<div className="sm:col-span-2">
239-
<dt className="text-sm font-medium text-gray-500">Reviewer Comments</dt>
240-
<dd className="mt-1 text-sm text-gray-900">
241-
<div
242-
className="prose"
243-
dangerouslySetInnerHTML={{
244-
__html: review.reviewerComments?.[0]?.comments,
245-
}}
246-
/>
247-
</dd>
248-
</div>
249-
{review.reviewFiles.length > 0 && (
250-
<div className="sm:col-span-2">
251-
<dt className="text-sm font-medium text-gray-500">Attachments</dt>
252-
<dd className="mt-1 text-sm text-gray-900">
253-
<ul
254-
role="list"
255-
className="border border-gray-200 rounded-md divide-y divide-gray-200"
256-
>
257-
{review.reviewFiles.map((file) => (
258-
<li
259-
key={file._href}
260-
className="pl-3 pr-4 py-3 flex items-center justify-between text-sm"
261-
>
262-
<div className="w-0 flex-1 flex items-center">
263-
<PaperClipIcon
264-
className="flex-shrink-0 h-5 w-5 text-gray-400"
265-
aria-hidden="true"
266-
/>
267-
<span className="ml-2 flex-1 w-0 truncate">
268-
{file.name.en_US}
269-
</span>
270-
</div>
271-
<div className="ml-4 flex-shrink-0">
272-
<a
273-
href="#"
274-
className="font-medium text-indigo-600 hover:text-indigo-500"
275-
>
276-
Download
277-
</a>
278-
</div>
279-
</li>
280-
// <li className="pl-3 pr-4 py-3 flex items-center justify-between text-sm">
281-
// <div className="w-0 flex-1 flex items-center">
282-
// <PaperClipIcon
283-
// className="flex-shrink-0 h-5 w-5 text-gray-400"
284-
// aria-hidden="true"
285-
// />
286-
// <span className="ml-2 flex-1 w-0 truncate">
287-
// coverletter_back_end_developer.pdf
288-
// </span>
289-
// </div>
290-
// <div className="ml-4 flex-shrink-0">
291-
// <a
292-
// href="#"
293-
// className="font-medium text-indigo-600 hover:text-indigo-500"
294-
// >
295-
// Download
296-
// </a>
297-
// </div>
298-
// </li>
299-
))}
300-
</ul>
301-
</dd>
302-
</div>
303-
)}
304-
</dl>
305-
</div>
306-
</div>
252+
<ReviewSummary review={review} key={review.id} />
307253
))}
308254
</div>
309255
</div>

0 commit comments

Comments
 (0)