import Site from 'Types/site'; import GDPR from 'Types/site/gdpr'; import { mergeReducers, createItemInListUpdater, success, array, createListUpdater, } from './funcTools/tools'; import { createCRUDReducer, getCRUDRequestTypes, createInit, createEdit, createRemove, createUpdate, saveType, } from './funcTools/crud'; import { createRequestReducer } from './funcTools/request'; import { Map, List, fromJS } from "immutable"; import { GLOBAL_HAS_NO_RECORDINGS, SITE_ID_STORAGE_KEY } from 'App/constants/storageKeys'; const storedSiteId = localStorage.getItem(SITE_ID_STORAGE_KEY); const name = 'project'; const idKey = 'id'; const itemInListUpdater = createItemInListUpdater(idKey) const updateItemInList = createListUpdater(idKey); const EDIT_GDPR = 'sites/EDIT_GDPR'; const SAVE_GDPR = 'sites/SAVE_GDPR'; const FETCH_GDPR = 'sites/FETCH_GDPR'; const FETCH_LIST = 'sites/FETCH_LIST'; const SET_SITE_ID = 'sites/SET_SITE_ID'; const FETCH_GDPR_SUCCESS = success(FETCH_GDPR); const SAVE_GDPR_SUCCESS = success(SAVE_GDPR); const FETCH_LIST_SUCCESS = success(FETCH_LIST); const SAVE = saveType('sites/SAVE'); const initialState = Map({ list: List(), instance: fromJS(), remainingSites: undefined, siteId: null, active: null, }); const reducer = (state = initialState, action = {}) => { switch(action.type) { case EDIT_GDPR: return state.mergeIn([ 'instance', 'gdpr' ], action.gdpr); case FETCH_GDPR_SUCCESS: return state.mergeIn([ 'instance', 'gdpr' ], action.data); case success(SAVE): const newSite = Site(action.data); return updateItemInList(state, newSite) .set('siteId', newSite.get('id')) .set('active', newSite); case SAVE_GDPR_SUCCESS: const gdpr = GDPR(action.data); return state.setIn([ 'instance', 'gdpr' ], gdpr); case FETCH_LIST_SUCCESS: let siteId = state.get("siteId"); const siteIds = action.data.map(s => parseInt(s.projectId)) const siteExists = siteIds.includes(siteId); if (action.siteIdFromPath && siteIds.includes(parseInt(action.siteIdFromPath))) { siteId = action.siteIdFromPath; } else if (!siteId || !siteExists) { siteId = siteIds.includes(parseInt(storedSiteId)) ? storedSiteId : action.data[0].projectId; } const list = List(action.data.map(Site)); const hasRecordings = list.some(s => s.recorded); if (!hasRecordings) { localStorage.setItem(GLOBAL_HAS_NO_RECORDINGS, true) } else { localStorage.removeItem(GLOBAL_HAS_NO_RECORDINGS) } return state.set('list', list) .set('siteId', siteId) .set('active', list.find(s => s.id === parseInt(siteId))); case SET_SITE_ID: localStorage.setItem(SITE_ID_STORAGE_KEY, action.siteId) const site = state.get('list').find(s => parseInt(s.id) == action.siteId); return state.set('siteId', action.siteId).set('active', site); } return state; }; export function editGDPR(gdpr) { return { type: EDIT_GDPR, gdpr, }; } export function fetchGDPR(siteId) { return { types: array(FETCH_GDPR), call: client => client.get(`/${ siteId }/gdpr`), } } export const saveGDPR = (siteId, gdpr) => (dispatch, getState) => { const g = getState().getIn(['site', 'instance', 'gdpr']); return dispatch({ types: array(SAVE_GDPR), call: client => client.post(`/${ siteId }/gdpr`, g.toData()), }); } export function fetchList(siteId) { return { types: array(FETCH_LIST), call: client => client.get('/projects'), siteIdFromPath: siteId }; } export function save(site) { return { types: array(SAVE), call: client => client.post(`/projects`, site.toData()), } } // export const fetchList = createFetchList(name); export const init = createInit(name); export const edit = createEdit(name); // export const save = createSave(name); export const update = createUpdate(name); export const remove = createRemove(name); export function setSiteId(siteId) { return { type: SET_SITE_ID, siteId, }; } export default mergeReducers( reducer, createCRUDReducer(name, Site, idKey), createRequestReducer({ saveGDPR: SAVE_GDPR, ...getCRUDRequestTypes(name), }), );