Skip to content

Commit 5f01d70

Browse files
author
Vikas Agarwal
committed
feat: refactoring the way redux is being used. Better use of included technology
1 parent 5a0c8d1 commit 5f01d70

File tree

5 files changed

+49
-73
lines changed

5 files changed

+49
-73
lines changed

src/actions/challenges.js

Lines changed: 31 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,7 @@ import {
2020
deleteResource as deleteResourceAPI
2121
} from '../services/challenges'
2222
import {
23-
LOAD_CHALLENGE_DETAILS_PENDING,
24-
LOAD_CHALLENGE_DETAILS_SUCCESS,
25-
LOAD_CHALLENGE_DETAILS_FAILURE,
26-
LOAD_CHALLENGE_MEMBERS_SUCCESS,
23+
LOAD_CHALLENGE_DETAILS,
2724
LOAD_CHALLENGE_METADATA_SUCCESS,
2825
LOAD_CHALLENGES_FAILURE,
2926
LOAD_CHALLENGES_PENDING,
@@ -45,7 +42,6 @@ import {
4542
CREATE_CHALLENGE_SUCCESS,
4643
CREATE_CHALLENGE_FAILURE
4744
} from '../config/constants'
48-
import { fetchProjectById } from '../services/projects'
4945
import { loadProject } from './projects'
5046

5147
/**
@@ -171,43 +167,18 @@ export function loadChallenges (projectId, status, filterChallengeName = null) {
171167
* Loads Challenge details
172168
*/
173169
export function loadChallengeDetails (projectId, challengeId) {
174-
return async (dispatch, getState) => {
175-
dispatch({
176-
type: LOAD_CHALLENGE_DETAILS_PENDING,
177-
challengeDetails: {}
178-
})
179-
180-
if (challengeId) {
181-
fetchChallenge(challengeId).then((challenge) => {
182-
dispatch({
183-
type: LOAD_CHALLENGE_DETAILS_SUCCESS,
184-
challengeDetails: challenge
185-
})
186-
loadProject(challenge.projectId)(dispatch, getState)
187-
}).catch((error) => {
188-
dispatch({
189-
type: LOAD_CHALLENGE_DETAILS_FAILURE,
190-
error
191-
})
192-
})
193-
} else {
194-
dispatch({
195-
type: LOAD_CHALLENGE_DETAILS_SUCCESS,
196-
challengeDetails: null
170+
return (dispatch, getState) => {
171+
return dispatch({
172+
type: LOAD_CHALLENGE_DETAILS,
173+
payload: fetchChallenge(challengeId).then((challenge) => {
174+
// TODO remove this unncessary check, or better utilize the the case when given project id
175+
// does not match with challenge's project id
176+
if (challenge.projectId === projectId) {
177+
dispatch(loadProject(projectId))
178+
}
179+
return challenge
197180
})
198-
199-
if (projectId) {
200-
fetchProjectById(projectId).then((selectedProject) => {
201-
if (!selectedProject) return
202-
const members = selectedProject.members
203-
.filter(m => m.role === 'manager' || m.role === 'copilot')
204-
dispatch({
205-
type: LOAD_CHALLENGE_MEMBERS_SUCCESS,
206-
members
207-
})
208-
})
209-
}
210-
}
181+
})
211182
}
212183
}
213184

@@ -458,6 +429,12 @@ export function loadResourceRoles () {
458429
}
459430
}
460431

432+
/**
433+
* Deletes a resource for the given challenge in given role
434+
* @param {UUID} challengeId id of the challenge for which resource is to be deleted
435+
* @param {UUID} roleId id of the role, the resource is in
436+
* @param {String} memberHandle handle of the resource
437+
*/
461438
export function deleteResource (challengeId, roleId, memberHandle) {
462439
const resource = {
463440
challengeId,
@@ -472,6 +449,12 @@ export function deleteResource (challengeId, roleId, memberHandle) {
472449
}
473450
}
474451

452+
/**
453+
* Creates a resource for the given challenge in given role
454+
* @param {UUID} challengeId id of the challenge for which resource is to be created
455+
* @param {UUID} roleId id of the role, the resource should be in
456+
* @param {String} memberHandle handle of the resource
457+
*/
475458
export function createResource (challengeId, roleId, memberHandle) {
476459
const resource = {
477460
challengeId,
@@ -486,6 +469,13 @@ export function createResource (challengeId, roleId, memberHandle) {
486469
}
487470
}
488471

472+
/**
473+
* Replaces the given resource in given role with new resource for the provided challenge
474+
* @param {UUID} challengeId id of the challenge for which resource is to be replaced
475+
* @param {UUID} roleId id of the role, the resource is in
476+
* @param {String} newMember handle of the new resource
477+
* @param {String} oldMember handle of the existing resource
478+
*/
489479
export function replaceResourceInRole (challengeId, roleId, newMember, oldMember) {
490480
return async (dispatch) => {
491481
if (newMember === oldMember) {

src/actions/projects.js

Lines changed: 8 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,26 @@
11
import {
2-
LOAD_PROJECT_DETAILS_SUCCESS,
3-
LOAD_PROJECT_DETAILS_PENDING,
4-
LOAD_PROJECT_DETAILS_FAILURE,
5-
LOAD_CHALLENGE_MEMBERS_SUCCESS
2+
LOAD_CHALLENGE_MEMBERS_SUCCESS,
3+
LOAD_PROJECT_DETAILS
64
} from '../config/constants'
75
import { fetchProjectById } from '../services/projects'
86

97
/**
108
* Loads project details
119
*/
1210
export function loadProject (projectId) {
13-
return async (dispatch, getState) => {
14-
dispatch({
15-
type: LOAD_PROJECT_DETAILS_PENDING,
16-
projectDetail: {}
17-
})
18-
if (projectId) {
19-
fetchProjectById(projectId).then((project) => {
20-
dispatch({
21-
type: LOAD_PROJECT_DETAILS_SUCCESS,
22-
projectDetail: project
23-
})
24-
11+
return (dispatch, getState) => {
12+
return dispatch({
13+
type: LOAD_PROJECT_DETAILS,
14+
payload: fetchProjectById(projectId).then((project) => {
2515
if (project && project.members) {
2616
const members = project.members.filter(m => m.role === 'manager' || m.role === 'copilot')
2717
dispatch({
2818
type: LOAD_CHALLENGE_MEMBERS_SUCCESS,
2919
members
3020
})
3121
}
32-
}).catch(() => {
33-
dispatch({
34-
type: LOAD_PROJECT_DETAILS_FAILURE
35-
})
22+
return project
3623
})
37-
} else {
38-
dispatch({
39-
type: LOAD_PROJECT_DETAILS_SUCCESS,
40-
projectDetail: null
41-
})
42-
}
24+
})
4325
}
4426
}

src/config/constants.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ export const LOAD_CHALLENGES_SUCCESS = 'LOAD_CHALLENGES_SUCCESS'
3434
export const LOAD_CHALLENGES_PENDING = 'LOAD_CHALLENGES_PENDING'
3535
export const LOAD_CHALLENGES_FAILURE = 'LOAD_CHALLENGES_FAILURE'
3636

37+
export const LOAD_CHALLENGE_DETAILS = 'LOAD_CHALLENGE_DETAILS'
3738
export const LOAD_CHALLENGE_DETAILS_SUCCESS = 'LOAD_CHALLENGE_DETAILS_SUCCESS'
3839
export const LOAD_CHALLENGE_DETAILS_PENDING = 'LOAD_CHALLENGE_DETAILS_PENDING'
3940
export const LOAD_CHALLENGE_DETAILS_FAILURE = 'LOAD_CHALLENGE_DETAILS_FAILURE'
@@ -46,6 +47,7 @@ export const CREATE_CHALLENGE_SUCCESS = 'CREATE_CHALLENGE_SUCCESS'
4647
export const CREATE_CHALLENGE_PENDING = 'CREATE_CHALLENGE_PENDING'
4748
export const CREATE_CHALLENGE_FAILURE = 'CREATE_CHALLENGE_FAILURE'
4849

50+
export const LOAD_PROJECT_DETAILS = 'LOAD_PROJECT_DETAILS'
4951
export const LOAD_PROJECT_DETAILS_SUCCESS = 'LOAD_PROJECT_DETAILS_SUCCESS'
5052
export const LOAD_PROJECT_DETAILS_PENDING = 'LOAD_PROJECT_DETAILS_PENDING'
5153
export const LOAD_PROJECT_DETAILS_FAILURE = 'LOAD_PROJECT_DETAILS_FAILURE'
@@ -54,7 +56,7 @@ export const LOAD_CHALLENGE_SUBMISSIONS_SUCCESS = 'LOAD_CHALLENGE_SUBMISSIONS_SU
5456
export const LOAD_CHALLENGE_SUBMISSIONS_PENDING = 'LOAD_CHALLENGE_SUBMISSIONS_PENDING'
5557
export const LOAD_CHALLENGE_SUBMISSIONS_FAILURE = 'LOAD_CHALLENGE_SUBMISSIONS_FAILURE'
5658

57-
export const LOAD_CHALLENGE_MEMBERS_SUCCESS = 'LOAD_CHALLENGE_MEMBERS'
59+
export const LOAD_CHALLENGE_MEMBERS_SUCCESS = 'LOAD_CHALLENGE_MEMBERS_SUCCESS'
5860
export const LOAD_CHALLENGE_METADATA_SUCCESS = 'LOAD_CHALLENGE_METADATA_SUCCESS'
5961

6062
export const SAVE_AUTH_TOKEN = 'SAVE_AUTH_TOKEN'

src/reducers/challenges.js

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -90,14 +90,15 @@ export default function (state = initialState, action) {
9090
case UPDATE_CHALLENGE_DETAILS_FAILURE:
9191
case CREATE_CHALLENGE_FAILURE:
9292
return { ...state, isLoading: false, attachments: [], challenge: null, failedToLoad: true }
93-
case LOAD_CHALLENGE_DETAILS_SUCCESS:
93+
case LOAD_CHALLENGE_DETAILS_SUCCESS: {
9494
return {
9595
...state,
96-
challengeDetails: action.challengeDetails,
96+
challengeDetails: action.payload,
9797
isLoading: false,
98-
attachments: _.has(action.challengeDetails, 'attachments') ? action.challengeDetails.attachments : [],
98+
attachments: _.has(action.payload, 'attachments') ? action.payload.attachments : [],
9999
failedToLoad: false
100100
}
101+
}
101102
case UPDATE_CHALLENGE_DETAILS_SUCCESS: {
102103
// During editing the challenge we might change its status, so when we came back to the challenge list
103104
// updated challenge might have to be removed from the list, or added to the list, or just updated
@@ -213,8 +214,9 @@ export default function (state = initialState, action) {
213214
[action.metadataKey]: action.metadataValue
214215
}
215216
}
216-
case LOAD_CHALLENGE_MEMBERS_SUCCESS:
217+
case LOAD_CHALLENGE_MEMBERS_SUCCESS: {
217218
return { ...state, metadata: { ...state.metadata, members: action.members } }
219+
}
218220
case UPLOAD_ATTACHMENT_PENDING:
219221
return { ...state, isUploading: true, isSuccess: false, uploadingId: action.challengeId }
220222
case UPLOAD_ATTACHMENT_SUCCESS:

src/reducers/projects.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ export default function (state = initialState, action) {
2121
case LOAD_PROJECT_DETAILS_SUCCESS:
2222
return {
2323
...state,
24-
projectDetail: action.projectDetail,
24+
projectDetail: action.payload,
2525
isLoading: false
2626
}
2727
default:

0 commit comments

Comments
 (0)