openreplay/frontend/app/duck/site.js

167 lines
4.8 KiB
JavaScript

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 UPDATE_PROJECT_RECORDING_STATUS = 'sites/UPDATE_PROJECT_RECORDING_STATUS';
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 => parseInt(s.id) === parseInt(siteId)));
case SET_SITE_ID:
const _siteId = action.siteId ? action.siteId : state.get('list').get(0).id;
localStorage.setItem(SITE_ID_STORAGE_KEY, _siteId);
const site = state.get('list').find(s => parseInt(s.id) == _siteId);
return state.set('siteId', _siteId).set('active', site);
case UPDATE_PROJECT_RECORDING_STATUS:
const { siteId: _siteIdToUpdate, status } = action;
const siteToUpdate = state.get('list').find(s => parseInt(s.id) === parseInt(_siteIdToUpdate));
const updatedSite = siteToUpdate.set('recorded', status);
return updateItemInList(state, updatedSite);
}
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 const updateProjectRecordingStatus = (siteId, status) => {
return {
type: UPDATE_PROJECT_RECORDING_STATUS,
siteId,
status
};
};
export default mergeReducers(
reducer,
createCRUDReducer(name, Site, idKey),
createRequestReducer({
saveGDPR: SAVE_GDPR,
...getCRUDRequestTypes(name)
})
);