Skip to content

Commit

Permalink
Exercise tags API operations added in redux module and selectors.
Browse files Browse the repository at this point in the history
  • Loading branch information
Martin Krulis committed Nov 25, 2019
1 parent 30dbc7f commit 24f3068
Show file tree
Hide file tree
Showing 2 changed files with 80 additions and 2 deletions.
77 changes: 75 additions & 2 deletions src/redux/modules/exercises.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import { actionTypes as supplementaryFilesActionTypes } from './supplementaryFil
import { actionTypes as attachmentFilesActionTypes } from './attachmentFiles';
import { actionTypes as paginationActionTypes } from './pagination';

import { arrayToObject } from '../../helpers/common';
import { arrayToObject, unique } from '../../helpers/common';

const resourceName = 'exercises';
const { actions, reduceActions, actionTypes } = factory({
Expand Down Expand Up @@ -37,6 +37,18 @@ export const additionalActionTypes = {
DETACH_EXERCISE_GROUP_PENDING: 'recodex/exercises/DETACH_EXERCISE_GROUP_PENDING',
DETACH_EXERCISE_GROUP_REJECTED: 'recodex/exercises/DETACH_EXERCISE_GROUP_REJECTED',
DETACH_EXERCISE_GROUP_FULFILLED: 'recodex/exercises/DETACH_EXERCISE_GROUP_FULFILLED',
FETCH_TAGS: 'recodex/exercises/FETCH_TAGS',
FETCH_TAGS_PENDING: 'recodex/exercises/FETCH_TAGS_PENDING',
FETCH_TAGS_REJECTED: 'recodex/exercises/FETCH_TAGS_REJECTED',
FETCH_TAGS_FULFILLED: 'recodex/exercises/FETCH_TAGS_FULFILLED',
ADD_TAG: 'recodex/exercises/ADD_TAG',
ADD_TAG_PENDING: 'recodex/exercises/ADD_TAG_PENDING',
ADD_TAG_REJECTED: 'recodex/exercises/ADD_TAG_REJECTED',
ADD_TAG_FULFILLED: 'recodex/exercises/ADD_TAG_FULFILLED',
REMOVE_TAG: 'recodex/exercises/REMOVE_TAG',
REMOVE_TAG_PENDING: 'recodex/exercises/REMOVE_TAG_PENDING',
REMOVE_TAG_REJECTED: 'recodex/exercises/REMOVE_TAG_REJECTED',
REMOVE_TAG_FULFILLED: 'recodex/exercises/REMOVE_TAG_FULFILLED',
};

export const loadExercise = actions.pushResource;
Expand Down Expand Up @@ -126,7 +138,34 @@ export const detachExerciseFromGroup = (exerciseId, groupId) =>
meta: { exerciseId, groupId },
});

/**
/*
* Tags
*/

export const fetchTags = () =>
createApiAction({
type: additionalActionTypes.FETCH_TAGS,
method: 'GET',
endpoint: '/exercises/tags',
});

export const addTag = (exerciseId, tagName) =>
createApiAction({
type: additionalActionTypes.ADD_TAG,
method: 'POST',
endpoint: `/exercises/${exerciseId}/tags/${tagName}`,
meta: { exerciseId, tagName },
});

export const removeTag = (exerciseId, tagName) =>
createApiAction({
type: additionalActionTypes.REMOVE_TAG,
method: 'DELETE',
endpoint: `/exercises/${exerciseId}/tags/${tagName}`,
meta: { exerciseId, tagName },
});

/*
* Reducer
*/

Expand Down Expand Up @@ -235,6 +274,40 @@ const reducer = handleActions(
)
)
: state,

[additionalActionTypes.FETCH_TAGS_PENDING]: state => state.set('tags', null),
[additionalActionTypes.FETCH_TAGS_REJECTED]: state => state.delete('tags'),
[additionalActionTypes.FETCH_TAGS_FULFILLED]: (state, { payload }) => state.set('tags', payload.sort()),

[additionalActionTypes.ADD_TAG_PENDING]: (state, { meta: { exerciseId } }) => state.set('tagsPending', exerciseId),
[additionalActionTypes.ADD_TAG_REJECTED]: state => state.delete('tagsPending'),
[additionalActionTypes.ADD_TAG_FULFILLED]: (state, { payload: data, meta: { exerciseId, tagName } }) =>
state
.delete('tagsPending')
.setIn(
['resources', exerciseId],
createRecord({
data,
state: resourceStatus.FULFILLED,
didInvalidate: false,
lastUpdate: Date.now(),
})
)
.update('tags', [], tags => unique([...tags, tagName]).sort()),

[additionalActionTypes.REMOVE_TAG_PENDING]: (state, { meta: { exerciseId } }) =>
state.set('tagsPending', exerciseId),
[additionalActionTypes.REMOVE_TAG_REJECTED]: state => state.delete('tagsPending'),
[additionalActionTypes.REMOVE_TAG_FULFILLED]: (state, { payload: data, meta: { exerciseId, tagName } }) =>
state.delete('tagsPending').setIn(
['resources', exerciseId],
createRecord({
data,
state: resourceStatus.FULFILLED,
didInvalidate: false,
lastUpdate: Date.now(),
})
),
}),
initialState
);
Expand Down
5 changes: 5 additions & 0 deletions src/redux/selectors/exercises.js
Original file line number Diff line number Diff line change
Expand Up @@ -99,3 +99,8 @@ export const getExerciseDetachingGroupId = defaultMemoize(id =>
exercise => exercise && exercise.getIn(['data', 'detachingGroupId'], null)
)
);

export const getExerciseTags = state => getExercises(state).get('tags', []);
export const getExerciseTagsLoading = state => getExercises(state).get('tags') === null;

export const getExerciseTagsUpdatePending = state => getExercises(state).get('tagsPending', null);

0 comments on commit 24f3068

Please sign in to comment.