@atlaskit/renderer
Version:
Renderer component
56 lines • 1.79 kB
JavaScript
import React from 'react';
import memoizeOne from 'memoize-one';
import { getExtensionModuleNodePrivateProps, getNodeRenderer } from '@atlaskit/editor-common/extensions';
import { useProvider } from '@atlaskit/editor-common/provider-factory';
export const useMultiBodiedExtensionContext = ({
extensionType,
extensionKey
}) => {
const isMounted = React.useRef(true);
const localGetNodeRenderer = React.useMemo(() => memoizeOne(getNodeRenderer), []);
const [provider, setProvider] = React.useState();
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const [privateProps, setPrivateProps] = React.useState();
const providerPromise = useProvider('extensionProvider');
React.useEffect(() => {
if (providerPromise) {
providerPromise.then(p => {
if (isMounted.current) {
setProvider(p);
}
return getExtensionModuleNodePrivateProps(p, extensionType, extensionKey);
}).then(pr => {
if (isMounted.current) {
setPrivateProps(pr);
}
});
}
}, [providerPromise, extensionType, extensionKey]);
const NodeRenderer = React.useMemo(() => {
if (!provider) {
return null;
}
return localGetNodeRenderer(provider, extensionType, extensionKey);
}, [provider, extensionType, extensionKey, localGetNodeRenderer]);
React.useEffect(() => {
isMounted.current = true;
return () => {
isMounted.current = false;
};
}, []);
return React.useMemo(() => {
if (!provider || !NodeRenderer || !privateProps) {
return {
extensionContext: null,
loading: true
};
}
return {
extensionContext: {
NodeRenderer,
privateProps
},
loading: false
};
}, [provider, NodeRenderer, privateProps]);
};