UNPKG

@backstage/plugin-techdocs-react

Version:

Shared frontend utilities for TechDocs and Addons

74 lines (71 loc) 2.59 kB
import { jsx } from 'react/jsx-runtime'; import { useCallback } from 'react'; import { useOutlet } from 'react-router-dom'; import { attachComponentData, createReactExtension, useElementFilter } from '@backstage/core-plugin-api'; const TECHDOCS_ADDONS_KEY = "techdocs.addons.addon.v1"; const TECHDOCS_ADDONS_WRAPPER_KEY = "techdocs.addons.wrapper.v1"; const TechDocsAddons = () => null; attachComponentData(TechDocsAddons, TECHDOCS_ADDONS_WRAPPER_KEY, true); const getDataKeyByName = (name) => { return `${TECHDOCS_ADDONS_KEY}.${name.toLocaleLowerCase("en-US")}`; }; function createTechDocsAddonExtension(options) { const { name, component: TechDocsAddon } = options; return createReactExtension({ name, component: { sync: (props) => /* @__PURE__ */ jsx(TechDocsAddon, { ...props }) }, data: { [TECHDOCS_ADDONS_KEY]: options, [getDataKeyByName(name)]: true } }); } const getTechDocsAddonByName = (collection, key) => { return collection.selectByComponentData({ key }).getElements()[0]; }; const getAllTechDocsAddons = (collection) => { return collection.selectByComponentData({ key: TECHDOCS_ADDONS_WRAPPER_KEY }).selectByComponentData({ key: TECHDOCS_ADDONS_KEY }); }; const getAllTechDocsAddonsData = (collection) => { return collection.selectByComponentData({ key: TECHDOCS_ADDONS_WRAPPER_KEY }).findComponentData({ key: TECHDOCS_ADDONS_KEY }); }; const useTechDocsAddons = () => { const node = useOutlet(); const collection = useElementFilter(node, getAllTechDocsAddons); const options = useElementFilter(node, getAllTechDocsAddonsData); const findAddonByData = useCallback( (data) => { if (!collection || !data) return null; const nameKey = getDataKeyByName(data.name); return getTechDocsAddonByName(collection, nameKey) ?? null; }, [collection] ); const renderComponentByName = useCallback( (name) => { const data = options.find((option) => option.name === name); return data ? findAddonByData(data) : null; }, [options, findAddonByData] ); const renderComponentsByLocation = useCallback( (location) => { const data = options.filter((option) => option.location === location); return data.length ? data.map(findAddonByData) : null; }, [options, findAddonByData] ); return { renderComponentByName, renderComponentsByLocation }; }; export { TECHDOCS_ADDONS_KEY, TECHDOCS_ADDONS_WRAPPER_KEY, TechDocsAddons, createTechDocsAddonExtension, getDataKeyByName, useTechDocsAddons }; //# sourceMappingURL=addons.esm.js.map