@@ -211,7 +208,7 @@ const Summation = ({
spaceId,
}: SummationProps) => {
const [isSummationOpen, setSummationOpen] = useState(false);
- const submissionState = usersSubmissions.getSubmissionState(userPrincipal);
+ const submissionState = usersSubmissions.getSubmissionState(userPrincipal) as "Rejected" | "WaitingForReview" | "Accepted";
return (
<>
@@ -242,201 +239,41 @@ const Summation = ({
{isSummationOpen && (
- |
- {Object.entries(currentTaskData).map(([key]) => (
-
- ))}
- |
-
- )}
- >
- );
-};
-
-interface GenericTaskSummationProps {
- genericTask: TaskType["GenericTask"];
- usersSubmissions: UserSubmissions;
- submission: TaskData;
- authAtlasSpace: ActorSubclass<_SERVICE>;
- taskId: string;
- subtaskId: string;
- unAuthAtlasSpace: ActorSubclass<_SERVICE>;
- spaceId: string;
- submissionState: "Rejected" | "WaitingForReview" | "Accepted";
- user: string;
-}
-
-interface SubtaskSubmission {
- authAtlasSpace: ActorSubclass<_SERVICE>;
- userPrincipal: Principal;
- taskId: bigint;
- subtaskId: bigint;
- reason: string | null;
-}
+
+ {Object.entries(currentTaskData).map(([key]) => {
+ const subtask = currentTask.tasks[Number(key)];
-const GenericTaskSummation = ({
- genericTask,
- submission,
- authAtlasSpace,
- taskId,
- subtaskId,
- unAuthAtlasSpace,
- spaceId,
- submissionState,
- user,
-}: GenericTaskSummationProps) => {
- const dispatch = useDispatch();
- const userPrincipal = Principal.from(user);
- const isLoading = useSelector((state: RootState) => state.app.isLoading);
-
- const { register, handleSubmit } = useForm();
- const onSubmit: SubmitHandler = async (data) => {
- const rawReason = data.reason?.trim();
- const trimmedRawReason = !rawReason || rawReason === "" ? null : rawReason;
- await runWithLoading(
- async () => {
- await toast.promise(
- rejectSubtaskSubmission({
- authAtlasSpace,
- userPrincipal,
- taskId: BigInt(taskId),
- subtaskId: BigInt(subtaskId),
- reason: trimmedRawReason,
- }),
- {
- loading: "Rejecting task...",
- error: "Failed to reject task.",
- }
- );
- setShowRejectPopup(false);
- await getSpaceTasks({
- spaceId,
- unAuthAtlasSpace,
- dispatch,
- });
- },
- dispatch,
- () => setShowRejectPopup(false)
- );
- };
-
- const [showRejectPopup, setShowRejectPopup] = useState(false);
+ const commonProps = {
+ usersSubmissions: usersSubmissions,
+ submission: usersSubmissions.getSubmission(userPrincipal, key),
+ authAtlasSpace: authAtlasSpace,
+ taskId: taskId,
+ subtaskId: key,
+ unAuthAtlasSpace: unAuthAtlasSpace,
+ spaceId: spaceId,
+ submissionState: submissionState,
+ user: userPrincipal,
+ };
- const acceptSubtask = async () => {
- await runWithLoading(async () => {
- await toast.promise(
- acceptSubtaskSubmission({
- authAtlasSpace,
- userPrincipal,
- taskId: BigInt(taskId),
- subtaskId: BigInt(subtaskId),
- }),
- {
- loading: "Accepting task...",
- success: "Task accepted successfully.",
- error: "Failed to accept task.",
- }
- );
- await getSpaceTasks({
- spaceId,
- unAuthAtlasSpace,
- dispatch,
- });
- }, dispatch);
- };
+ const task = "GenericTask" in subtask ? subtask.GenericTask : subtask.DiscordTask;
- const singleSubmissionState = Object.keys(submission.submissionData.state)[0];
+ if (task) {
+ return (
+
+ );
+ }
- return (
-
-
- Subtask: {subtaskId} | Status: {singleSubmissionState}
-
-
- {genericTask.task_content.TitleAndDescription.task_title}
-
-
- {genericTask.task_content.TitleAndDescription.task_description}
-
-
- Submitted response:
-
- {submission.submissionData.submission.Text.content}
-
- {submissionState === "Rejected" &&
- submission.submissionData.rejection_reason[0] &&
- submission.submissionData.rejection_reason[0].trim().length > 0 && (
-
- Reject Reason:
-
- {submission.submissionData.rejection_reason[0]}
-
-
- )}
-
- {submissionState === "WaitingForReview" &&
- singleSubmissionState === "WaitingForReview" && (
- <>
-
-
-
-
- >
- )}
-
-
- {showRejectPopup && (
-
-
-
- Reason for Rejection
-
-
-
-
+ console.warn(`Unknown task type for key ${key}:`, subtask);
+ return null;
+ })}
+ |
+
)}
-
+ >
);
};
-
export default Submissions;
diff --git a/src/atlas_frontend/src/components/Task/TaskRenderer.tsx b/src/atlas_frontend/src/components/Task/TaskRenderer.tsx
new file mode 100644
index 0000000..a74121e
--- /dev/null
+++ b/src/atlas_frontend/src/components/Task/TaskRenderer.tsx
@@ -0,0 +1,47 @@
+import React from 'react';
+import { taskRegistry } from './tasks/taskRegistry';
+import type { TaskType } from "../../../../declarations/atlas_space/atlas_space.did";
+import type { Principal } from '@dfinity/principal';
+import type { ActorSubclass } from '@dfinity/agent';
+import type { _SERVICE } from '../../../../declarations/atlas_space/atlas_space.did';
+
+interface TaskRendererProps {
+ task: [number, TaskType];
+ spacePrincipal: Principal;
+ taskId: string;
+ unAuthAtlasSpace: ActorSubclass<_SERVICE> | null;
+ isUserInHub: boolean;
+}
+
+type GenericTaskType = Extract