{"version":3,"file":"useContentManagerInitData.mjs","sources":["../../../admin/src/hooks/useContentManagerInitData.ts"],"sourcesContent":["import { useEffect } from 'react';\n\nimport {\n useAuth,\n type Permission,\n useNotification,\n useStrapiApp,\n useAPIErrorHandler,\n} from '@strapi/admin/strapi-admin';\nimport { useNotifyAT } from '@strapi/design-system';\nimport { stringify } from 'qs';\nimport { useIntl } from 'react-intl';\n\nimport { COLLECTION_TYPES, SINGLE_TYPES } from '../constants/collections';\nimport { HOOKS } from '../constants/hooks';\nimport { AppState, setInitialData } from '../modules/app';\nimport { useTypedDispatch, useTypedSelector } from '../modules/hooks';\nimport { useGetAllContentTypeSettingsQuery } from '../services/contentTypes';\nimport { useGetInitialDataQuery } from '../services/init';\nimport { getTranslation } from '../utils/translations';\n\nimport type { Component } from '../../../shared/contracts/components';\nimport type {\n ContentType,\n FindContentTypesSettings,\n} from '../../../shared/contracts/content-types';\nimport type { GetInitData } from '../../../shared/contracts/init';\n\nconst { MUTATE_COLLECTION_TYPES_LINKS, MUTATE_SINGLE_TYPES_LINKS } = HOOKS;\n\ninterface ContentManagerLink {\n permissions: Permission[];\n search: string | null;\n kind: string;\n title: string;\n to: string;\n uid: string;\n name: string;\n isDisplayed: boolean;\n}\n\nconst useContentManagerInitData = (): AppState => {\n const { toggleNotification } = useNotification();\n const dispatch = useTypedDispatch();\n const runHookWaterfall = useStrapiApp(\n 'useContentManagerInitData',\n (state) => state.runHookWaterfall\n );\n const { notifyStatus } = useNotifyAT();\n const { formatMessage } = useIntl();\n const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler(getTranslation);\n const checkUserHasPermissions = useAuth(\n 'useContentManagerInitData',\n (state) => state.checkUserHasPermissions\n );\n\n const state = useTypedSelector((state) => state['content-manager'].app);\n\n const initialDataQuery = useGetInitialDataQuery(undefined, {\n /**\n * TODO: remove this when the CTB has been refactored to use redux-toolkit-query\n * and it can invalidate the cache on mutation\n */\n refetchOnMountOrArgChange: true,\n });\n\n useEffect(() => {\n if (initialDataQuery.data) {\n notifyStatus(\n formatMessage({\n id: getTranslation('App.schemas.data-loaded'),\n defaultMessage: 'The schemas have been successfully loaded.',\n })\n );\n }\n }, [formatMessage, initialDataQuery.data, notifyStatus]);\n\n useEffect(() => {\n if (initialDataQuery.error) {\n toggleNotification({ type: 'danger', message: formatAPIError(initialDataQuery.error) });\n }\n }, [formatAPIError, initialDataQuery.error, toggleNotification]);\n\n const contentTypeSettingsQuery = useGetAllContentTypeSettingsQuery();\n\n useEffect(() => {\n if (contentTypeSettingsQuery.error) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(contentTypeSettingsQuery.error),\n });\n }\n }, [formatAPIError, contentTypeSettingsQuery.error, toggleNotification]);\n\n const formatData = async (\n components: Component[],\n contentTypes: ContentType[],\n fieldSizes: GetInitData.Response['data']['fieldSizes'],\n contentTypeConfigurations: FindContentTypesSettings.Response['data']\n ) => {\n /**\n * We group these by the two types we support. We do with an object because we can use default\n * values of arrays to make sure we always have an array to manipulate further on if, for example,\n * a user has not made any single types.\n *\n * This means we have to manually add new content types to this hook if we add a new type – but\n * the safety is worth it.\n */\n const { collectionType: collectionTypeLinks, singleType: singleTypeLinks } =\n contentTypes.reduce<{\n collectionType: ContentType[];\n singleType: ContentType[];\n }>(\n (acc, model) => {\n acc[model.kind].push(model);\n return acc;\n },\n {\n collectionType: [],\n singleType: [],\n }\n );\n const collectionTypeSectionLinks = generateLinks(\n collectionTypeLinks,\n 'collectionTypes',\n contentTypeConfigurations\n );\n const singleTypeSectionLinks = generateLinks(singleTypeLinks, 'singleTypes');\n\n // Collection Types verifications\n const collectionTypeLinksPermissions = await Promise.all(\n collectionTypeSectionLinks.map(({ permissions }) => checkUserHasPermissions(permissions))\n );\n\n const authorizedCollectionTypeLinks = collectionTypeSectionLinks.filter(\n (_, index) => collectionTypeLinksPermissions[index].length > 0\n );\n\n // Single Types verifications\n const singleTypeLinksPermissions = await Promise.all(\n singleTypeSectionLinks.map(({ permissions }) => checkUserHasPermissions(permissions))\n );\n const authorizedSingleTypeLinks = singleTypeSectionLinks.filter(\n (_, index) => singleTypeLinksPermissions[index].length > 0\n );\n const { ctLinks } = runHookWaterfall(MUTATE_COLLECTION_TYPES_LINKS, {\n ctLinks: authorizedCollectionTypeLinks,\n models: contentTypes,\n });\n const { stLinks } = runHookWaterfall(MUTATE_SINGLE_TYPES_LINKS, {\n stLinks: authorizedSingleTypeLinks,\n models: contentTypes,\n });\n\n dispatch(\n setInitialData({\n authorizedCollectionTypeLinks: ctLinks,\n authorizedSingleTypeLinks: stLinks,\n components,\n contentTypeSchemas: contentTypes,\n fieldSizes,\n })\n );\n };\n\n useEffect(() => {\n if (initialDataQuery.data && contentTypeSettingsQuery.data) {\n formatData(\n initialDataQuery.data.components,\n initialDataQuery.data.contentTypes,\n initialDataQuery.data.fieldSizes,\n contentTypeSettingsQuery.data\n );\n }\n }, [initialDataQuery.data, contentTypeSettingsQuery.data]);\n\n return { ...state };\n};\n\nconst generateLinks = (\n links: ContentType[],\n type: 'collectionTypes' | 'singleTypes',\n configurations: FindContentTypesSettings.Response['data'] = []\n) => {\n return links\n .filter((link) => link.isDisplayed)\n .map((link) => {\n const collectionTypesPermissions = [\n { action: 'plugin::content-manager.explorer.create', subject: link.uid },\n { action: 'plugin::content-manager.explorer.read', subject: link.uid },\n ];\n const singleTypesPermissions = [\n { action: 'plugin::content-manager.explorer.read', subject: link.uid },\n ];\n const permissions =\n type === 'collectionTypes' ? collectionTypesPermissions : singleTypesPermissions;\n\n const currentContentTypeConfig = configurations.find(({ uid }) => uid === link.uid);\n\n let search = null;\n\n if (currentContentTypeConfig) {\n const searchParams = {\n page: 1,\n pageSize: currentContentTypeConfig.settings.pageSize,\n sort: `${currentContentTypeConfig.settings.defaultSortBy}:${currentContentTypeConfig.settings.defaultSortOrder}`,\n };\n\n search = stringify(searchParams, { encode: false });\n }\n\n return {\n permissions,\n search,\n kind: link.kind,\n title: link.info.displayName,\n to: `/content-manager/${link.kind === 'collectionType' ? COLLECTION_TYPES : SINGLE_TYPES}/${\n link.uid\n }`,\n uid: link.uid,\n // Used for the list item key in the helper plugin\n name: link.uid,\n isDisplayed: link.isDisplayed,\n } satisfies ContentManagerLink;\n });\n};\n\nexport { useContentManagerInitData };\nexport type { ContentManagerLink };\n"],"names":["MUTATE_COLLECTION_TYPES_LINKS","MUTATE_SINGLE_TYPES_LINKS","HOOKS","useContentManagerInitData","toggleNotification","useNotification","dispatch","useTypedDispatch","runHookWaterfall","useStrapiApp","state","notifyStatus","useNotifyAT","formatMessage","useIntl","_unstableFormatAPIError","formatAPIError","useAPIErrorHandler","getTranslation","checkUserHasPermissions","useAuth","useTypedSelector","app","initialDataQuery","useGetInitialDataQuery","undefined","refetchOnMountOrArgChange","useEffect","data","id","defaultMessage","error","type","message","contentTypeSettingsQuery","useGetAllContentTypeSettingsQuery","formatData","components","contentTypes","fieldSizes","contentTypeConfigurations","collectionType","collectionTypeLinks","singleType","singleTypeLinks","reduce","acc","model","kind","push","collectionTypeSectionLinks","generateLinks","singleTypeSectionLinks","collectionTypeLinksPermissions","Promise","all","map","permissions","authorizedCollectionTypeLinks","filter","_","index","length","singleTypeLinksPermissions","authorizedSingleTypeLinks","ctLinks","models","stLinks","setInitialData","contentTypeSchemas","links","configurations","link","isDisplayed","collectionTypesPermissions","action","subject","uid","singleTypesPermissions","currentContentTypeConfig","find","search","searchParams","page","pageSize","settings","sort","defaultSortBy","defaultSortOrder","stringify","encode","title","info","displayName","to","COLLECTION_TYPES","SINGLE_TYPES","name"],"mappings":"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"}