diff --git a/api-server/src/common/models/user.json b/api-server/src/common/models/user.json index bc7187ab73..9630a2138e 100644 --- a/api-server/src/common/models/user.json +++ b/api-server/src/common/models/user.json @@ -208,6 +208,7 @@ "solution": "string", "githubLink": "string", "challengeType": "number", + "isManuallyApproved": "boolean", "files": { "type": [ { diff --git a/api-server/src/common/utils/index.js b/api-server/src/common/utils/index.js index c467d7c48a..3f86552081 100644 --- a/api-server/src/common/utils/index.js +++ b/api-server/src/common/utils/index.js @@ -17,5 +17,6 @@ export const fixCompletedChallengeItem = obj => 'solution', 'githubLink', 'challengeType', - 'files' + 'files', + 'isManuallyApproved' ]); diff --git a/api-server/src/server/boot/challenge.js b/api-server/src/server/boot/challenge.js index ccbfad9378..bab717e633 100644 --- a/api-server/src/server/boot/challenge.js +++ b/api-server/src/server/boot/challenge.js @@ -69,7 +69,7 @@ export default async function bootChallenge(app, done) { done(); } -const jsProjects = [ +const jsCertProjectIds = [ 'aaa48de84e1ecc7c742e1124', 'a7f4d8f2483413a6ce226cac', '56533eb9ac21ba0edf2244e2', @@ -77,6 +77,10 @@ const jsProjects = [ 'aa2e6f85cab2ab736c9a9b24' ]; +const multiFileCertProjectIds = getChallenges() + .filter(challenge => challenge.challengeType === 14) + .map(challenge => challenge.id); + export function buildUserUpdate( user, challengeId, @@ -85,7 +89,10 @@ export function buildUserUpdate( ) { const { files, completedDate = Date.now() } = _completedChallenge; let completedChallenge = {}; - if (jsProjects.includes(challengeId)) { + if ( + jsCertProjectIds.includes(challengeId) || + multiFileCertProjectIds.includes(challengeId) + ) { completedChallenge = { ..._completedChallenge, files: files.map(file => @@ -223,14 +230,19 @@ export function modernChallengeCompleted(req, res, next) { .getCompletedChallenges$() .flatMap(() => { const completedDate = Date.now(); - const { id, files } = req.body; + const { id, files, challengeType } = req.body; - const { alreadyCompleted, updateData } = buildUserUpdate(user, id, { + const data = { id, files, completedDate - }); + }; + if (challengeType === 14) { + data.isManuallyApproved = false; + } + + const { alreadyCompleted, updateData } = buildUserUpdate(user, id, data); const points = alreadyCompleted ? user.points : user.points + 1; const updatePromise = new Promise((resolve, reject) => user.updateAttributes(updateData, err => { diff --git a/client/src/templates/Challenges/classic/desktop-layout.tsx b/client/src/templates/Challenges/classic/desktop-layout.tsx index 8a8130169f..d123b023e7 100644 --- a/client/src/templates/Challenges/classic/desktop-layout.tsx +++ b/client/src/templates/Challenges/classic/desktop-layout.tsx @@ -2,6 +2,7 @@ import { first } from 'lodash-es'; import React, { useState, ReactElement } from 'react'; import { ReflexContainer, ReflexSplitter, ReflexElement } from 'react-reflex'; import { sortChallengeFiles } from '../../../../../utils/sort-challengefiles'; +import { challengeTypes } from '../../../../utils/challenge-types'; import { ChallengeFile, ChallengeFiles, @@ -14,6 +15,7 @@ type Pane = { flex: number }; interface DesktopLayoutProps { block: string; challengeFiles: ChallengeFiles; + challengeType: number; editor: ReactElement | null; hasEditableBoundaries: boolean; hasNotes: boolean; @@ -68,6 +70,7 @@ const DesktopLayout = (props: DesktopLayoutProps): JSX.Element => { const { block, + challengeType, resizeProps, instructions, editor, @@ -83,11 +86,15 @@ const DesktopLayout = (props: DesktopLayoutProps): JSX.Element => { const challengeFile = getChallengeFile(); const projectBasedChallenge = hasEditableBoundaries; - const displayPreview = projectBasedChallenge - ? showPreview && hasPreview - : hasPreview; + const isMultiFileCertProject = + challengeType === challengeTypes.multiFileCertProject; + const displayPreview = + projectBasedChallenge || isMultiFileCertProject + ? showPreview && hasPreview + : hasPreview; const displayNotes = projectBasedChallenge ? showNotes && hasNotes : false; - const displayConsole = projectBasedChallenge ? showConsole : true; + const displayConsole = + projectBasedChallenge || isMultiFileCertProject ? showConsole : true; const { codePane, editorPane, @@ -99,7 +106,7 @@ const DesktopLayout = (props: DesktopLayoutProps): JSX.Element => { return (