@plone/volto
Version:
Volto
80 lines (73 loc) • 2.02 kB
JSX
/***
* A hook that makes it easy to use the AddLinkForm link editing component.
*
* To use it, in your component, do something like:
*
* const linkEditor = useLinkEditor();
*
* return (<>
* <button ref={linkEditor.anchorNode} onClick={() => linkEditor.show()}>btn</button>
* {linkEditor.anchorNode && <linkEditor.LinkEditor value={value} id={id} onChange={onChange} />}
* </>);
*
*/
import React from 'react';
import PositionedToolbar from '@plone/volto-slate/editor/ui/PositionedToolbar';
import AddLinkForm from '@plone/volto/components/manage/AnchorPlugin/components/LinkButton/AddLinkForm';
function getPositionStyle(position) {
return (
position || {
style: {
opacity: 1,
top: -5,
left: 55,
},
}
);
}
const useLinkEditor = () => {
const [showLinkEditor, setShowLinkEditor] = React.useState(false);
const show = React.useCallback(() => setShowLinkEditor(true), []);
const anchorNode = React.useRef();
const LinkEditor = React.useCallback(
(props) => {
const {
id,
value,
onChange,
placeholder,
objectBrowserPickerType,
position,
} = props;
return showLinkEditor && anchorNode.current ? (
<PositionedToolbar
className="add-link"
toggleButton={anchorNode.current}
position={getPositionStyle(position)}
>
<AddLinkForm
placeholder={placeholder}
data={{ url: value || '' }}
theme={{}}
objectBrowserPickerType={objectBrowserPickerType}
onChangeValue={(url) => {
setShowLinkEditor(false);
onChange(id, url);
}}
onClear={() => {}}
onOverrideContent={(c) => {
setShowLinkEditor(false);
}}
/>
</PositionedToolbar>
) : null;
},
[showLinkEditor],
);
return {
anchorNode,
show,
LinkEditor,
};
};
export default useLinkEditor;