@backstage/plugin-techdocs-react
Version:
Shared frontend utilities for TechDocs and Addons
74 lines (71 loc) • 2.59 kB
JavaScript
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