44 *
55 * Description:
66 * Page that is shown when a user is trying to submit a Submission.
7- * Allows user to upload Submission.zip file using a Filestack plugin.
7+ * Allows users to submit either a standard zip upload or a Topgear URL,
8+ * depending on challenge metadata and legacy Topgear group defaults.
89 */
910/* eslint-env browser */
1011
@@ -21,6 +22,58 @@ import FilestackFilePicker from '../FilestackFilePicker';
2122import Uploading from '../Uploading' ;
2223import style from './styles.scss' ;
2324
25+ const SUBMISSION_TYPE_METADATA_FIELD = 'submission_type' ;
26+ const SUBMISSION_TYPE_URL = 'url' ;
27+ const SUBMISSION_TYPE_ZIP = 'zip' ;
28+
29+ /**
30+ * Resolves which submission experience should be shown for the challenge.
31+ * Explicit `submission_type` metadata wins over the historical Topgear group
32+ * check. When the metadata is absent or invalid, the current fallback remains:
33+ * Topgear/Wipro challenges use URL submission and all others use zip upload.
34+ *
35+ * @param {Array<Object> } metadata Challenge metadata entries.
36+ * @param {Array<String> } groups Challenge group ids.
37+ * @param {Object } communitiesList Loaded community metadata from Redux.
38+ * @return {{isLoadingCommunitiesList: Boolean, isUrlSubmission: Boolean} }
39+ */
40+ export function resolveSubmissionMode ( metadata , groups , communitiesList ) {
41+ const submissionType = _ . toLower ( _ . toString ( _ . get (
42+ _ . find ( metadata , { name : SUBMISSION_TYPE_METADATA_FIELD } ) ,
43+ 'value' ,
44+ '' ,
45+ ) ) . trim ( ) ) ;
46+
47+ if ( submissionType === SUBMISSION_TYPE_ZIP || submissionType === SUBMISSION_TYPE_URL ) {
48+ return {
49+ isLoadingCommunitiesList : false ,
50+ isUrlSubmission : submissionType === SUBMISSION_TYPE_URL ,
51+ } ;
52+ }
53+
54+ if ( _ . isEmpty ( groups ) ) {
55+ return {
56+ isLoadingCommunitiesList : false ,
57+ isUrlSubmission : false ,
58+ } ;
59+ }
60+
61+ if ( ! communitiesList . timestamp ) {
62+ return {
63+ isLoadingCommunitiesList : true ,
64+ isUrlSubmission : false ,
65+ } ;
66+ }
67+
68+ const topGearCommunity = _ . find ( communitiesList . data , { mainSubdomain : 'topgear' } ) ;
69+ const topGearGroupIds = _ . get ( topGearCommunity , 'groupIds' , [ ] ) ;
70+
71+ return {
72+ isLoadingCommunitiesList : false ,
73+ isUrlSubmission : _ . some ( groups , groupId => groupId && _ . includes ( topGearGroupIds , groupId ) ) ,
74+ } ;
75+ }
76+
2477/**
2578 * Submissions Page shown to develop challengers.
2679 */
@@ -137,31 +190,15 @@ class Submit extends React.Component {
137190 setSubmissionFilestackData,
138191 submitForm,
139192 groups,
193+ metadata,
140194 } = this . props ;
141195
142196 const id = 'file-picker-submission' ;
143-
144- let isLoadingCommunitiesList = false ;
145- let isChallengeBelongToTopgearGroup = false ;
146- // check if challenge belong to any group
147- if ( ! _ . isEmpty ( groups ) ) {
148- // check if communitiesList is loaded
149- if ( communitiesList . timestamp > 0 ) {
150- const topGearCommunity = _ . find ( communitiesList . data , { mainSubdomain : 'topgear' } ) ;
151- if ( topGearCommunity ) {
152- // check the group info match with group list
153- _ . forOwn ( groups , ( value ) => {
154- if ( value && _ . includes ( topGearCommunity . groupIds , value ) ) {
155- isChallengeBelongToTopgearGroup = true ;
156- return false ;
157- }
158- return true ;
159- } ) ;
160- }
161- } else {
162- isLoadingCommunitiesList = true ;
163- }
164- }
197+ const submissionMode = resolveSubmissionMode ( metadata , groups , communitiesList ) ;
198+ const {
199+ isLoadingCommunitiesList,
200+ isUrlSubmission : isChallengeBelongToTopgearGroup ,
201+ } = submissionMode ;
165202
166203 const submissionInstruction = isChallengeBelongToTopgearGroup ? (
167204 < div >
@@ -427,6 +464,7 @@ Submit.propTypes = {
427464 timestamp : PT . number . isRequired ,
428465 } ) . isRequired ,
429466 groups : PT . arrayOf ( PT . shape ( ) ) . isRequired ,
467+ metadata : PT . arrayOf ( PT . shape ( ) ) . isRequired ,
430468 isSubmitting : PT . bool . isRequired ,
431469 submitDone : PT . bool . isRequired ,
432470 errorMsg : PT . string ,
0 commit comments