wagtail/client/src/components/Explorer/actions.js

93 lines
2.6 KiB
JavaScript

import * as admin from '../../api/admin';
import { createAction } from '../../utils/actions';
import { MAX_EXPLORER_PAGES } from '../../config/wagtailConfig';
const getPageStart = createAction('GET_PAGE_START');
const getPageSuccess = createAction('GET_PAGE_SUCCESS', (id, data) => ({ id, data }));
const getPageFailure = createAction('GET_PAGE_FAILURE', (id, error) => ({ id, error }));
/**
* Gets a page from the API.
*/
function getPage(id) {
return (dispatch) => {
dispatch(getPageStart(id));
return admin.getPage(id).then((data) => {
dispatch(getPageSuccess(id, data));
}, (error) => {
dispatch(getPageFailure(id, error));
});
};
}
const getChildrenStart = createAction('GET_CHILDREN_START', id => ({ id }));
const getChildrenSuccess = createAction('GET_CHILDREN_SUCCESS', (id, items, meta) => ({ id, items, meta }));
const getChildrenFailure = createAction('GET_CHILDREN_FAILURE', (id, error) => ({ id, error }));
/**
* Gets the children of a node from the API.
*/
function getChildren(id, offset = 0) {
return (dispatch) => {
dispatch(getChildrenStart(id));
return admin.getPageChildren(id, {
offset: offset,
}).then(({ items, meta }) => {
const nbPages = offset + items.length;
dispatch(getChildrenSuccess(id, items, meta));
// Load more pages if necessary. Only one request is created even though
// more might be needed, thus naturally throttling the loading.
if (nbPages < meta.total_count && nbPages < MAX_EXPLORER_PAGES) {
dispatch(getChildren(id, nbPages));
}
}, (error) => {
dispatch(getChildrenFailure(id, error));
});
};
}
const openExplorer = createAction('OPEN_EXPLORER', id => ({ id }));
export const closeExplorer = createAction('CLOSE_EXPLORER');
export function toggleExplorer(id) {
return (dispatch, getState) => {
const { explorer, nodes } = getState();
if (explorer.isVisible) {
dispatch(closeExplorer());
} else {
const page = nodes[id];
dispatch(openExplorer(id));
if (!page) {
dispatch(getChildren(id));
}
// We need to get the title of the starting page, only if it is not the site's root.
const isNotRoot = id !== 1;
if (isNotRoot) {
dispatch(getPage(id));
}
}
};
}
export const popPage = createAction('POP_PAGE');
const pushPagePrivate = createAction('PUSH_PAGE', id => ({ id }));
export function pushPage(id) {
return (dispatch, getState) => {
const { nodes } = getState();
const page = nodes[id];
dispatch(pushPagePrivate(id));
if (page && !page.isFetching && !page.children.count > 0) {
dispatch(getChildren(id));
}
};
}