@@ -116,7 +116,7 @@ class ChallengeEditor extends Component {
116
116
this . onUpdateMetadata = this . onUpdateMetadata . bind ( this )
117
117
this . getTemplatePhases = this . getTemplatePhases . bind ( this )
118
118
this . getAvailableTimelineTemplates = this . getAvailableTimelineTemplates . bind ( this )
119
- this . autoUpdateChallengeThrottled = _ . throttle ( this . autoUpdateChallenge . bind ( this ) , 3000 ) // 3s
119
+ this . autoUpdateChallengeThrottled = _ . throttle ( this . validateAndAutoUpdateChallenge . bind ( this ) , 3000 ) // 3s
120
120
this . updateResource = this . updateResource . bind ( this )
121
121
}
122
122
@@ -128,6 +128,18 @@ class ChallengeEditor extends Component {
128
128
this . resetChallengeData ( this . setState . bind ( this ) )
129
129
}
130
130
131
+ /**
132
+ * Validates challenge and if its valid calling an autosave method
133
+ *
134
+ * @param {string } changedField changed field
135
+ * @param {any } prevValue previous value
136
+ */
137
+ async validateAndAutoUpdateChallenge ( changedField , prevValue ) {
138
+ if ( this . validateChallenge ( ) ) {
139
+ this . autoUpdateChallenge ( changedField , prevValue )
140
+ }
141
+ }
142
+
131
143
async resetChallengeData ( setState = ( ) => { } ) {
132
144
const { isNew, challengeDetails, metadata, attachments, challengeId, assignedMemberDetails } = this . props
133
145
if (
@@ -922,35 +934,38 @@ class ChallengeEditor extends Component {
922
934
async updateAllChallengeInfo ( status , cb = ( ) => { } ) {
923
935
const { updateChallengeDetails, assignedMemberDetails : oldAssignedMember } = this . props
924
936
if ( this . state . isSaving ) return
925
- this . setState ( { isSaving : true } )
926
- const challenge = this . collectChallengeData ( status )
927
- let newChallenge = _ . cloneDeep ( this . state . challenge )
928
- newChallenge . status = status
929
- try {
930
- const challengeId = this . getCurrentChallengeId ( )
931
- const action = await updateChallengeDetails ( challengeId , challenge )
932
- const { copilot : previousCopilot , reviewer : previousReviewer } = this . state . draftChallenge . data
933
- const { challenge : { copilot, reviewer } , assignedMemberDetails : assignedMember } = this . state
934
- if ( copilot ) await this . updateResource ( challengeId , 'Copilot' , copilot , previousCopilot )
935
- if ( reviewer ) await this . updateResource ( challengeId , 'Reviewer' , reviewer , previousReviewer )
936
- const oldMemberHandle = _ . get ( oldAssignedMember , 'handle' )
937
- // assigned member has been updated
938
- if ( assignedMember && assignedMember . handle !== oldMemberHandle ) {
939
- await this . updateResource ( challengeId , 'Submitter' , assignedMember . handle , oldMemberHandle )
940
- }
937
+ this . setState ( { isSaving : true } , async ( ) => {
938
+ const challenge = this . collectChallengeData ( status )
939
+ let newChallenge = _ . cloneDeep ( this . state . challenge )
940
+ newChallenge . status = status
941
+ try {
942
+ const challengeId = this . getCurrentChallengeId ( )
943
+ // state can have updated assigned member (in cases where user changes assignments without refreshing the page)
944
+ const { challenge : { copilot, reviewer } , assignedMemberDetails : assignedMember } = this . state
945
+ const oldMemberHandle = _ . get ( oldAssignedMember , 'handle' )
946
+ const assignedMemberHandle = _ . get ( assignedMember , 'handle' )
947
+ // assigned member has been updated
948
+ if ( assignedMemberHandle !== oldMemberHandle ) {
949
+ await this . updateResource ( challengeId , 'Submitter' , assignedMemberHandle , oldMemberHandle )
950
+ }
951
+ const action = await updateChallengeDetails ( challengeId , challenge )
952
+ const { copilot : previousCopilot , reviewer : previousReviewer } = this . state . draftChallenge . data
953
+ if ( copilot !== previousCopilot ) await this . updateResource ( challengeId , 'Copilot' , copilot , previousCopilot )
954
+ if ( reviewer !== previousReviewer ) await this . updateResource ( challengeId , 'Reviewer' , reviewer , previousReviewer )
941
955
942
- const draftChallenge = { data : action . challengeDetails }
943
- draftChallenge . data . copilot = copilot
944
- draftChallenge . data . reviewer = reviewer
945
- this . setState ( { isLaunch : true ,
946
- isConfirm : newChallenge . id ,
947
- draftChallenge,
948
- challenge : newChallenge ,
949
- isSaving : false } , cb )
950
- } catch ( e ) {
951
- const error = _ . get ( e , 'response.data.message' , `Unable to update the challenge to status ${ status } ` )
952
- this . setState ( { isSaving : false , error } , cb )
953
- }
956
+ const draftChallenge = { data : action . challengeDetails }
957
+ draftChallenge . data . copilot = copilot
958
+ draftChallenge . data . reviewer = reviewer
959
+ this . setState ( { isLaunch : true ,
960
+ isConfirm : newChallenge . id ,
961
+ draftChallenge,
962
+ challenge : newChallenge ,
963
+ isSaving : false } , cb )
964
+ } catch ( e ) {
965
+ const error = _ . get ( e , 'response.data.message' , `Unable to update the challenge to status ${ status } ` )
966
+ this . setState ( { isSaving : false , error } , cb )
967
+ }
968
+ } )
954
969
}
955
970
956
971
async onActiveChallenge ( ) {
@@ -1043,7 +1058,6 @@ class ChallengeEditor extends Component {
1043
1058
return < div > Error loading challenge</ div >
1044
1059
}
1045
1060
const isTask = _ . get ( challenge , 'task.isTask' , false )
1046
- console . log ( this . props . assignedMemberDetails )
1047
1061
const { assignedMemberDetails, error } = this . state
1048
1062
let isActive = false
1049
1063
let isDraft = false
@@ -1194,7 +1208,7 @@ class ChallengeEditor extends Component {
1194
1208
<OutlineButton text={isSaving ? 'Saving...' : 'Save'} type={'success'} onClick={this.onSaveChallenge} />
1195
1209
</div> */ }
1196
1210
< div className = { styles . button } >
1197
- < PrimaryButton text = { 'Save Draft' } type = { 'info' } onClick = { this . createDraftHandler } />
1211
+ < PrimaryButton text = { isSaving ? 'Saving...' : 'Save Draft' } type = { 'info' } onClick = { this . createDraftHandler } />
1198
1212
</ div >
1199
1213
{ isDraft && (
1200
1214
< div className = { styles . button } >
@@ -1210,9 +1224,9 @@ class ChallengeEditor extends Component {
1210
1224
) }
1211
1225
</ div > }
1212
1226
{ ! isLoading && isActive && < div className = { styles . buttonContainer } >
1213
- { /* <div className={styles.button}>
1227
+ < div className = { styles . button } >
1214
1228
< OutlineButton text = { isSaving ? 'Saving...' : 'Save' } type = { 'success' } onClick = { this . onSaveChallenge } />
1215
- </div> */ }
1229
+ </ div >
1216
1230
{ isTask && (
1217
1231
< div className = { styles . button } >
1218
1232
< PrimaryButton text = { 'Close Task' } type = { 'danger' } onClick = { this . openCloseTaskConfirmation } />
0 commit comments