@@ -359,6 +370,7 @@ export function SubmissionDetails({
return (
{renderGeneralInfo()}
+ {renderLoader()}
{renderDetails()}
{renderSourceFiles()}
diff --git a/judgels-client/src/components/SubmissionDetails/Programming/SubmissionDetails.scss b/judgels-client/src/components/SubmissionDetails/Programming/SubmissionDetails.scss
index bdb446728..b5da5b6fb 100644
--- a/judgels-client/src/components/SubmissionDetails/Programming/SubmissionDetails.scss
+++ b/judgels-client/src/components/SubmissionDetails/Programming/SubmissionDetails.scss
@@ -58,6 +58,10 @@
float: left;
}
+ .pending-loader {
+ margin-bottom: 15px;
+ }
+
.submission-details-image {
overflow: auto;
}
diff --git a/judgels-client/src/routes/courses/courses/single/chapters/single/problems/single/Programming/submissions/modules/chapterProblemSubmissionActions.js b/judgels-client/src/routes/courses/courses/single/chapters/single/problems/single/Programming/submissions/modules/chapterProblemSubmissionActions.js
index 9a281d540..c0bfde420 100644
--- a/judgels-client/src/routes/courses/courses/single/chapters/single/problems/single/Programming/submissions/modules/chapterProblemSubmissionActions.js
+++ b/judgels-client/src/routes/courses/courses/single/chapters/single/problems/single/Programming/submissions/modules/chapterProblemSubmissionActions.js
@@ -34,12 +34,20 @@ export function createSubmission(courseSlug, chapterJid, chapterAlias, problemJi
sourceFiles['sourceFiles.' + key] = data.sourceFiles[key];
});
- await submissionProgrammingAPI.createSubmission(token, chapterJid, problemJid, data.gradingLanguage, sourceFiles);
+ const submission = await submissionProgrammingAPI.createSubmission(
+ token,
+ chapterJid,
+ problemJid,
+ data.gradingLanguage,
+ sourceFiles
+ );
toastActions.showSuccessToast('Solution submitted.');
window.scrollTo(0, 0);
- dispatch(push(`/courses/${courseSlug}/chapters/${chapterAlias}/problems/${problemAlias}/submissions`));
+ dispatch(
+ push(`/courses/${courseSlug}/chapters/${chapterAlias}/problems/${problemAlias}/submissions/${submission.id}`)
+ );
};
}
diff --git a/judgels-client/src/routes/courses/courses/single/chapters/single/problems/single/Programming/submissions/single/ChapterProblemSubmissionPage/ChapterProblemSubmissionPage.jsx b/judgels-client/src/routes/courses/courses/single/chapters/single/problems/single/Programming/submissions/single/ChapterProblemSubmissionPage/ChapterProblemSubmissionPage.jsx
index 4a86382ec..c0e3b1573 100644
--- a/judgels-client/src/routes/courses/courses/single/chapters/single/problems/single/Programming/submissions/single/ChapterProblemSubmissionPage/ChapterProblemSubmissionPage.jsx
+++ b/judgels-client/src/routes/courses/courses/single/chapters/single/problems/single/Programming/submissions/single/ChapterProblemSubmissionPage/ChapterProblemSubmissionPage.jsx
@@ -12,6 +12,7 @@ import { selectCourse } from '../../../../../../../../../modules/courseSelectors
import { selectCourseChapter } from '../../../../../../../modules/courseChapterSelectors';
import * as breadcrumbsActions from '../../../../../../../../../../../../modules/breadcrumbs/breadcrumbsActions';
import * as chapterProblemSubmissionActions from '../../modules/chapterProblemSubmissionActions';
+import { VerdictCode } from '../../../../../../../../../../../../modules/api/gabriel/verdict';
export class ChapterProblemSubmissionPage extends Component {
state = {
@@ -22,20 +23,10 @@ export class ChapterProblemSubmissionPage extends Component {
containerName: undefined,
};
- async componentDidMount() {
- const { data, profile, problemName, containerName } = await this.props.onGetSubmissionWithSource(
- +this.props.match.params.submissionId,
- this.props.statementLanguage
- );
- const sourceImageUrl = data.source ? undefined : await this.props.onGetSubmissionSourceImage(data.submission.jid);
- this.props.onPushBreadcrumb(this.props.match.url, '#' + data.submission.id);
- this.setState({
- submissionWithSource: data,
- sourceImageUrl,
- profile,
- problemName,
- containerName,
- });
+ currentTimeout;
+
+ componentDidMount() {
+ this.refreshSubmission();
}
async componentWillUnmount() {
@@ -63,6 +54,36 @@ export class ChapterProblemSubmissionPage extends Component {
);
}
+ refreshSubmission = async () => {
+ const { data, profile, problemName, containerName } = await this.props.onGetSubmissionWithSource(
+ +this.props.match.params.submissionId,
+ this.props.statementLanguage
+ );
+ const sourceImageUrl = data.source ? undefined : await this.props.onGetSubmissionSourceImage(data.submission.jid);
+ this.props.onPushBreadcrumb(this.props.match.url, '#' + data.submission.id);
+ this.setState({
+ submissionWithSource: data,
+ sourceImageUrl,
+ profile,
+ problemName,
+ containerName,
+ });
+
+ if (sourceImageUrl) {
+ return;
+ }
+
+ const verdictCode = data.submission.latestGrading && data.submission.latestGrading.verdict.code;
+
+ if (verdictCode === VerdictCode.PND) {
+ this.currentTimeout = setTimeout(this.refreshSubmission, 2000);
+ } else if (verdictCode === VerdictCode.AC) {
+ if (this.currentTimeout) {
+ window.location.reload();
+ }
+ }
+ };
+
renderSubmission = () => {
const { submissionWithSource, profile, sourceImageUrl } = this.state;
const { course, chapter } = this.props;
@@ -79,6 +100,8 @@ export class ChapterProblemSubmissionPage extends Component {
sourceImageUrl={sourceImageUrl}
profile={profile}
problemUrl={`/courses/${course.slug}/chapters/${chapter.alias}/problems/${problemAlias}`}
+ hideSourceFilename
+ showLoaderWhenPending
/>
);
};