Skip to content

Commit 95c7aee

Browse files
committed
Handle isFileSubmission flag for URL submissions for TG
1 parent 8d1f45f commit 95c7aee

File tree

3 files changed

+50
-8
lines changed

3 files changed

+50
-8
lines changed

src/apps/review/src/lib/components/ChallengeDetailsContent/ChallengeDetailsContent.tsx

Lines changed: 40 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
/**
22
* Challenge Details Content.
33
*/
4-
import { FC, ReactNode, useContext, useMemo } from 'react'
4+
import { FC, ReactNode, useCallback, useContext, useMemo } from 'react'
5+
import { toast } from 'react-toastify'
56

67
import { ActionLoading } from '~/apps/admin/src/lib'
78

@@ -185,6 +186,37 @@ export const ChallengeDetailsContent: FC<Props> = (props: Props) => {
185186
isLoadingBool: isDownloadingSubmissionBool,
186187
downloadSubmission,
187188
}: useDownloadSubmissionProps = useDownloadSubmission()
189+
const submissionsById = useMemo(() => {
190+
const map = new Map<string, BackendSubmission>()
191+
props.submissions.forEach(submission => {
192+
if (submission?.id) {
193+
map.set(submission.id, submission)
194+
}
195+
})
196+
return map
197+
}, [props.submissions])
198+
const handleSubmissionDownload = useCallback((submissionId: string) => {
199+
const submission = submissionsById.get(submissionId)
200+
if (submission && submission.isFileSubmission === false) {
201+
const targetUrl = submission.url?.trim()
202+
if (targetUrl) {
203+
if (typeof window !== 'undefined') {
204+
const openedWindow = window.open(targetUrl, '_blank', 'noopener,noreferrer')
205+
if (openedWindow === null) {
206+
toast.error('We could not open the submission URL. Check your pop-up blocker and try again.')
207+
}
208+
} else {
209+
toast.error('Unable to open the submission URL from this environment.')
210+
}
211+
} else {
212+
toast.error('Submission URL is not available for this entry.')
213+
}
214+
215+
return
216+
}
217+
218+
downloadSubmission(submissionId)
219+
}, [downloadSubmission, submissionsById])
188220
const {
189221
isLoading: isLoadingProjectResult,
190222
projectResults,
@@ -335,7 +367,7 @@ export const ChallengeDetailsContent: FC<Props> = (props: Props) => {
335367

336368
if (SUBMISSION_TAB_KEYS.has(selectedTabNormalized)) {
337369
return renderSubmissionTab({
338-
downloadSubmission,
370+
downloadSubmission: handleSubmissionDownload,
339371
isActiveChallenge: props.isActiveChallenge,
340372
isDownloadingSubmission,
341373
isLoadingSubmission: props.isLoadingSubmission,
@@ -361,7 +393,7 @@ export const ChallengeDetailsContent: FC<Props> = (props: Props) => {
361393
checkpointReviewMinimumPassingScore={props.checkpointReviewMinimumPassingScore}
362394
isLoading={props.isLoadingSubmission}
363395
isDownloading={isDownloadingSubmission}
364-
downloadSubmission={downloadSubmission}
396+
downloadSubmission={handleSubmissionDownload}
365397
mode={checkpointMode}
366398
/>
367399
)
@@ -373,7 +405,7 @@ export const ChallengeDetailsContent: FC<Props> = (props: Props) => {
373405
isLoading={isLoadingProjectResult}
374406
projectResults={projectResults}
375407
isDownloading={isDownloadingSubmission}
376-
downloadSubmission={downloadSubmission}
408+
downloadSubmission={handleSubmissionDownload}
377409
/>
378410
)
379411
}
@@ -386,7 +418,7 @@ export const ChallengeDetailsContent: FC<Props> = (props: Props) => {
386418
approvalMinimumPassingScore={props.approvalMinimumPassingScore}
387419
isLoadingReview={props.isLoadingSubmission}
388420
isDownloading={isDownloadingSubmission}
389-
downloadSubmission={downloadSubmission}
421+
downloadSubmission={handleSubmissionDownload}
390422
isActiveChallenge={props.isActiveChallenge}
391423
/>
392424
)
@@ -400,7 +432,7 @@ export const ChallengeDetailsContent: FC<Props> = (props: Props) => {
400432
postMortemMinimumPassingScore={props.postMortemMinimumPassingScore}
401433
isLoadingReview={props.isLoadingSubmission}
402434
isDownloading={isDownloadingSubmission}
403-
downloadSubmission={downloadSubmission}
435+
downloadSubmission={handleSubmissionDownload}
404436
isActiveChallenge={props.isActiveChallenge}
405437
columnLabel='Post-Mortem'
406438
/>
@@ -415,7 +447,7 @@ export const ChallengeDetailsContent: FC<Props> = (props: Props) => {
415447
postMortemMinimumPassingScore={props.postMortemMinimumPassingScore}
416448
isLoadingReview={props.isLoadingSubmission}
417449
isDownloading={isDownloadingSubmission}
418-
downloadSubmission={downloadSubmission}
450+
downloadSubmission={handleSubmissionDownload}
419451
isActiveChallenge={props.isActiveChallenge}
420452
phaseIdFilter={props.selectedPhaseId}
421453
/>
@@ -430,7 +462,7 @@ export const ChallengeDetailsContent: FC<Props> = (props: Props) => {
430462
reviewMinimumPassingScore={props.reviewMinimumPassingScore}
431463
isLoadingReview={props.isLoadingSubmission}
432464
isDownloading={isDownloadingSubmission}
433-
downloadSubmission={downloadSubmission}
465+
downloadSubmission={handleSubmissionDownload}
434466
mappingReviewAppeal={props.mappingReviewAppeal}
435467
isActiveChallenge={props.isActiveChallenge}
436468
/>

src/apps/review/src/lib/models/BackendSubmission.model.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,11 @@ export interface BackendSubmission {
4848
* Indicates whether the submission is the latest for the member.
4949
*/
5050
isLatest?: boolean
51+
/**
52+
* Flag indicating whether the submission includes a downloadable file.
53+
* When false the submission is represented only by a URL.
54+
*/
55+
isFileSubmission?: boolean
5156
}
5257

5358
/**

src/apps/review/src/lib/models/SubmissionInfo.model.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,10 @@ export interface SubmissionInfo {
5656
* Submission type (e.g. CONTEST_SUBMISSION, CHECKPOINT_SUBMISSION).
5757
*/
5858
type?: string
59+
/**
60+
* Flag indicating whether the submission includes an uploaded file.
61+
*/
62+
isFileSubmission?: boolean
5963
}
6064

6165
/**
@@ -118,6 +122,7 @@ export function convertBackendSubmissionToSubmissionInfo(
118122
return {
119123
aggregateScore,
120124
id: data.id,
125+
isFileSubmission: data.isFileSubmission,
121126
isLatest: data.isLatest,
122127
isPassingReview,
123128
memberId: data.memberId,

0 commit comments

Comments
 (0)