|
1 |
| -import type firebaseType from 'firebase/firestore'; |
2 |
| -import { doc, getFirestore, onSnapshot } from 'firebase/firestore'; |
3 | 1 | import * as React from 'react';
|
4 | 2 | import { useReducer } from 'react';
|
5 | 3 | import { useDropzone } from 'react-dropzone';
|
6 | 4 | import { LANGUAGE_LABELS } from '../../../context/UserDataContext/properties/userLang';
|
7 | 5 | import UserDataContext from '../../../context/UserDataContext/UserDataContext';
|
8 | 6 | import { useActiveGroup } from '../../../hooks/groups/useActiveGroup';
|
9 | 7 | import { usePostActions } from '../../../hooks/groups/usePostActions';
|
10 |
| -import { useFirebaseApp } from '../../../hooks/useFirebase'; |
| 8 | +import useProblemSubmissionResult from '../../../hooks/useProblemSubmissionResult'; |
11 | 9 | import {
|
12 | 10 | ExecutionStatus,
|
13 | 11 | GroupProblemData,
|
@@ -76,26 +74,7 @@ export default function ProblemSubmissionInterface({
|
76 | 74 | },
|
77 | 75 | });
|
78 | 76 |
|
79 |
| - const firebaseApp = useFirebaseApp(); |
80 |
| - const [onlineJudgeSubmissionDoc, setOnlineJudgeSubmissionDoc] = |
81 |
| - React.useState<firebaseType.DocumentReference | null>(null); |
82 |
| - const [submissionResult, setSubmissionResult] = React.useState< |
83 |
| - (Submission & { type: SubmissionType.ONLINE_JUDGE }) | null |
84 |
| - >(null); |
85 |
| - |
86 |
| - React.useEffect(() => { |
87 |
| - if (!onlineJudgeSubmissionDoc || !firebaseApp) { |
88 |
| - setSubmissionResult(null); |
89 |
| - return; |
90 |
| - } |
91 |
| - |
92 |
| - const unsub = onSnapshot(onlineJudgeSubmissionDoc, doc => { |
93 |
| - setSubmissionResult( |
94 |
| - doc.data() as Submission & { type: SubmissionType.ONLINE_JUDGE } |
95 |
| - ); |
96 |
| - }); |
97 |
| - return unsub; |
98 |
| - }, [onlineJudgeSubmissionDoc, firebaseApp]); |
| 77 | + const [submissionResult, setSubmissionID] = useProblemSubmissionResult(); |
99 | 78 |
|
100 | 79 | if (activeGroup.activeUserId !== firebaseUser?.uid) {
|
101 | 80 | // this suggests the parent is viewing the child's account
|
@@ -139,30 +118,20 @@ export default function ProblemSubmissionInterface({
|
139 | 118 |
|
140 | 119 | const handleSubmitSolution = async e => {
|
141 | 120 | e.preventDefault();
|
142 |
| - if (isCPIClass) { |
143 |
| - const submissionID = await submitSolution(problem, { |
144 |
| - ...submission, |
145 |
| - type: SubmissionType.ONLINE_JUDGE, |
146 |
| - judgeProblemId: problem.usacoGuideId, // todo update |
147 |
| - gradingStatus: 'waiting', |
148 |
| - result: -1, // todo write a rule for this? |
| 121 | + try { |
| 122 | + const submissionID = await submitSolution({ |
| 123 | + problemID: problem.usacoGuideId, |
| 124 | + language: submission.language, |
| 125 | + filename: { |
| 126 | + cpp: 'main.cpp', |
| 127 | + java: 'Main.java', |
| 128 | + py: 'main.py', |
| 129 | + }[submission.language], |
| 130 | + sourceCode: submission.code, |
149 | 131 | });
|
150 |
| - setOnlineJudgeSubmissionDoc( |
151 |
| - doc( |
152 |
| - getFirestore(firebaseApp), |
153 |
| - 'groups', |
154 |
| - activeGroup.activeGroupId, |
155 |
| - 'posts', |
156 |
| - problem.postId, |
157 |
| - 'problems', |
158 |
| - problem.id, |
159 |
| - 'submissions', |
160 |
| - submissionID |
161 |
| - ) |
162 |
| - ); |
163 |
| - } else { |
164 |
| - submitSolution(problem, submission); |
165 |
| - editSubmission(emptySubmission); |
| 132 | + setSubmissionID(submissionID); |
| 133 | + } catch (error) { |
| 134 | + alert('Failed to submit solution: ' + error.message); |
166 | 135 | }
|
167 | 136 | };
|
168 | 137 |
|
@@ -211,35 +180,6 @@ export default function ProblemSubmissionInterface({
|
211 | 180 | <OnlineJudgeSubmission submission={submissionResult} />
|
212 | 181 | </div>
|
213 | 182 | )}
|
214 |
| - {/*<div className="mt-4">*/} |
215 |
| - {/* <label*/} |
216 |
| - {/* htmlFor="score"*/} |
217 |
| - {/* className="block text-sm font-medium text-gray-700 dark:text-gray-300"*/} |
218 |
| - {/* >*/} |
219 |
| - {/* Score*/} |
220 |
| - {/* </label>*/} |
221 |
| - {/* <div className="mt-1 relative rounded-md shadow-sm w-24">*/} |
222 |
| - {/* <ScoreInput*/} |
223 |
| - {/* type="number"*/} |
224 |
| - {/* name="score"*/} |
225 |
| - {/* id="score"*/} |
226 |
| - {/* min={0}*/} |
227 |
| - {/* max={100}*/} |
228 |
| - {/* value={*/} |
229 |
| - {/* submission.result === null*/} |
230 |
| - {/* ? ''*/} |
231 |
| - {/* : Math.round((submission.result as number) * 100)*/} |
232 |
| - {/* }*/} |
233 |
| - {/* onChange={e =>*/} |
234 |
| - {/* editSubmission({ result: parseInt(e.target.value) / 100 })*/} |
235 |
| - {/* }*/} |
236 |
| - {/* className="input"*/} |
237 |
| - {/* placeholder="0 - 100"*/} |
238 |
| - {/* aria-describedby="price-currency"*/} |
239 |
| - {/* required*/} |
240 |
| - {/* />*/} |
241 |
| - {/* </div>*/} |
242 |
| - {/*</div>*/} |
243 | 183 | <div className="mt-4">
|
244 | 184 | <label className="block text-sm font-medium text-gray-700 dark:text-gray-300">
|
245 | 185 | Language
|
|
0 commit comments