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
67import { 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 />
0 commit comments