Files
frontend-app-learner-dashboard/src/data/redux/app/reducer.js
Maxwell Frank 731fbe2e2e refactor: course filters (#303)
Co-authored-by: Maxwell Frank <mfrank@2u.com>
2024-03-28 12:50:59 -04:00

82 lines
2.0 KiB
JavaScript

import { createSlice } from '@reduxjs/toolkit';
import { StrictDict } from 'utils';
const initialState = {
pageNumber: 1,
courseData: {},
entitlement: [],
emailConfirmation: {},
enterpriseDashboard: {},
platformSettings: {},
suggestedCourses: [],
selectSessionModal: {},
filters: [],
};
export const cardId = (val) => `card-${val}`;
export const today = Date.now();
/**
* Creates a redux slice with actions to load dashboard data and manage visual layout
*/
const app = createSlice({
name: 'app',
initialState,
reducers: {
loadCourses: (state, { payload: { courses } }) => ({
...state,
courseData: courses.reduce(
(obj, curr, index) => {
const out = { ...curr, cardId: cardId(index) };
if (out.enrollment.lastEnrolled === null) {
out.enrollment.lastEnrolled = today;
}
return { ...obj, [cardId(index)]: out };
},
{},
),
}),
loadGlobalData: (state, { payload }) => ({
...state,
emailConfirmation: payload.emailConfirmation,
enterpriseDashboard: payload.enterpriseDashboard,
platformSettings: payload.platformSettings,
suggestedCourses: payload.suggestedCourses,
socialShareSettings: payload.socialShareSettings,
}),
updateSelectSessionModal: (state, { payload }) => ({
...state,
selectSessionModal: { cardId: payload },
}),
setPageNumber: (state, { payload }) => ({ ...state, pageNumber: payload }),
setFilters: (state, { payload }) => ({
...state,
filters: payload,
}),
addFilter: (state, { payload }) => ({
...state,
filters: [...state.filters, payload],
}),
removeFilter: (state, { payload }) => ({
...state,
filters: state.filters.filter(item => item !== payload),
}),
clearFilters: (state) => ({
...state,
filters: [],
}),
},
});
const actions = StrictDict(app.actions);
const { reducer } = app;
export {
actions,
initialState,
reducer,
};