Files
pole-book/server/node_modules/@strapi/content-manager/dist/admin/hooks/useContentManagerInitData.js

167 lines
7.0 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
'use strict';
var React = require('react');
var strapiAdmin = require('@strapi/admin/strapi-admin');
var designSystem = require('@strapi/design-system');
var qs = require('qs');
var reactIntl = require('react-intl');
var collections = require('../constants/collections.js');
var hooks$1 = require('../constants/hooks.js');
var app = require('../modules/app.js');
var hooks = require('../modules/hooks.js');
var contentTypes = require('../services/contentTypes.js');
var init = require('../services/init.js');
var translations = require('../utils/translations.js');
const { MUTATE_COLLECTION_TYPES_LINKS, MUTATE_SINGLE_TYPES_LINKS } = hooks$1.HOOKS;
const useContentManagerInitData = ()=>{
const { toggleNotification } = strapiAdmin.useNotification();
const dispatch = hooks.useTypedDispatch();
const runHookWaterfall = strapiAdmin.useStrapiApp('useContentManagerInitData', (state)=>state.runHookWaterfall);
const { notifyStatus } = designSystem.useNotifyAT();
const { formatMessage } = reactIntl.useIntl();
const { _unstableFormatAPIError: formatAPIError } = strapiAdmin.useAPIErrorHandler(translations.getTranslation);
const checkUserHasPermissions = strapiAdmin.useAuth('useContentManagerInitData', (state)=>state.checkUserHasPermissions);
const state = hooks.useTypedSelector((state)=>state['content-manager'].app);
const initialDataQuery = init.useGetInitialDataQuery(undefined, {
/**
* TODO: remove this when the CTB has been refactored to use redux-toolkit-query
* and it can invalidate the cache on mutation
*/ refetchOnMountOrArgChange: true
});
React.useEffect(()=>{
if (initialDataQuery.data) {
notifyStatus(formatMessage({
id: translations.getTranslation('App.schemas.data-loaded'),
defaultMessage: 'The schemas have been successfully loaded.'
}));
}
}, [
formatMessage,
initialDataQuery.data,
notifyStatus
]);
React.useEffect(()=>{
if (initialDataQuery.error) {
toggleNotification({
type: 'danger',
message: formatAPIError(initialDataQuery.error)
});
}
}, [
formatAPIError,
initialDataQuery.error,
toggleNotification
]);
const contentTypeSettingsQuery = contentTypes.useGetAllContentTypeSettingsQuery();
React.useEffect(()=>{
if (contentTypeSettingsQuery.error) {
toggleNotification({
type: 'danger',
message: formatAPIError(contentTypeSettingsQuery.error)
});
}
}, [
formatAPIError,
contentTypeSettingsQuery.error,
toggleNotification
]);
const formatData = async (components, contentTypes, fieldSizes, contentTypeConfigurations)=>{
/**
* We group these by the two types we support. We do with an object because we can use default
* values of arrays to make sure we always have an array to manipulate further on if, for example,
* a user has not made any single types.
*
* This means we have to manually add new content types to this hook if we add a new type but
* the safety is worth it.
*/ const { collectionType: collectionTypeLinks, singleType: singleTypeLinks } = contentTypes.reduce((acc, model)=>{
acc[model.kind].push(model);
return acc;
}, {
collectionType: [],
singleType: []
});
const collectionTypeSectionLinks = generateLinks(collectionTypeLinks, 'collectionTypes', contentTypeConfigurations);
const singleTypeSectionLinks = generateLinks(singleTypeLinks, 'singleTypes');
// Collection Types verifications
const collectionTypeLinksPermissions = await Promise.all(collectionTypeSectionLinks.map(({ permissions })=>checkUserHasPermissions(permissions)));
const authorizedCollectionTypeLinks = collectionTypeSectionLinks.filter((_, index)=>collectionTypeLinksPermissions[index].length > 0);
// Single Types verifications
const singleTypeLinksPermissions = await Promise.all(singleTypeSectionLinks.map(({ permissions })=>checkUserHasPermissions(permissions)));
const authorizedSingleTypeLinks = singleTypeSectionLinks.filter((_, index)=>singleTypeLinksPermissions[index].length > 0);
const { ctLinks } = runHookWaterfall(MUTATE_COLLECTION_TYPES_LINKS, {
ctLinks: authorizedCollectionTypeLinks,
models: contentTypes
});
const { stLinks } = runHookWaterfall(MUTATE_SINGLE_TYPES_LINKS, {
stLinks: authorizedSingleTypeLinks,
models: contentTypes
});
dispatch(app.setInitialData({
authorizedCollectionTypeLinks: ctLinks,
authorizedSingleTypeLinks: stLinks,
components,
contentTypeSchemas: contentTypes,
fieldSizes
}));
};
React.useEffect(()=>{
if (initialDataQuery.data && contentTypeSettingsQuery.data) {
formatData(initialDataQuery.data.components, initialDataQuery.data.contentTypes, initialDataQuery.data.fieldSizes, contentTypeSettingsQuery.data);
}
}, [
initialDataQuery.data,
contentTypeSettingsQuery.data
]);
return {
...state
};
};
const generateLinks = (links, type, configurations = [])=>{
return links.filter((link)=>link.isDisplayed).map((link)=>{
const collectionTypesPermissions = [
{
action: 'plugin::content-manager.explorer.create',
subject: link.uid
},
{
action: 'plugin::content-manager.explorer.read',
subject: link.uid
}
];
const singleTypesPermissions = [
{
action: 'plugin::content-manager.explorer.read',
subject: link.uid
}
];
const permissions = type === 'collectionTypes' ? collectionTypesPermissions : singleTypesPermissions;
const currentContentTypeConfig = configurations.find(({ uid })=>uid === link.uid);
let search = null;
if (currentContentTypeConfig) {
const searchParams = {
page: 1,
pageSize: currentContentTypeConfig.settings.pageSize,
sort: `${currentContentTypeConfig.settings.defaultSortBy}:${currentContentTypeConfig.settings.defaultSortOrder}`
};
search = qs.stringify(searchParams, {
encode: false
});
}
return {
permissions,
search,
kind: link.kind,
title: link.info.displayName,
to: `/content-manager/${link.kind === 'collectionType' ? collections.COLLECTION_TYPES : collections.SINGLE_TYPES}/${link.uid}`,
uid: link.uid,
// Used for the list item key in the helper plugin
name: link.uid,
isDisplayed: link.isDisplayed
};
});
};
exports.useContentManagerInitData = useContentManagerInitData;
//# sourceMappingURL=useContentManagerInitData.js.map