(options: UseCreatePaperOptions = {})
| 30 | * @returns An object containing the paper instance and a reference to the paper HTML element. |
| 31 | */ |
| 32 | export function useCreatePaper(options: UseCreatePaperOptions = {}) { |
| 33 | const { overwriteDefaultPaperElement, ...restOptions } = options; |
| 34 | |
| 35 | const paperContainerElement = useRef<HTMLDivElement | null>(null); |
| 36 | const { graph } = useGraphStore(); |
| 37 | |
| 38 | const paperCtx = useContext(PaperContext); |
| 39 | useLayoutEffect(() => { |
| 40 | if (!paperCtx) { |
| 41 | return; |
| 42 | } |
| 43 | |
| 44 | const { paper } = paperCtx; |
| 45 | if (!paper) { |
| 46 | throw new Error('Paper is not created'); |
| 47 | } |
| 48 | |
| 49 | if (overwriteDefaultPaperElement) { |
| 50 | const customElement = overwriteDefaultPaperElement(paperCtx); |
| 51 | if (!customElement) { |
| 52 | throw new Error('overwriteDefaultPaperElement must return a valid HTML or SVG element'); |
| 53 | } |
| 54 | paperContainerElement.current?.replaceChildren(customElement); |
| 55 | } else { |
| 56 | if (!paperContainerElement.current) { |
| 57 | throw new Error('Paper container element is not defined'); |
| 58 | } |
| 59 | paperContainerElement.current.replaceChildren(paper.el); |
| 60 | } |
| 61 | paper.unfreeze(); |
| 62 | |
| 63 | // eslint-disable-next-line react-hooks/exhaustive-deps |
| 64 | }, [graph, overwriteDefaultPaperElement]); |
| 65 | |
| 66 | useLayoutEffect(() => { |
| 67 | if (!paperCtx) { |
| 68 | return; |
| 69 | } |
| 70 | const { paper } = paperCtx; |
| 71 | if (!paper) { |
| 72 | return; |
| 73 | } |
| 74 | /** |
| 75 | * Resize the paper container element to match the paper size. |
| 76 | * @param jointPaper - The paper instance. |
| 77 | */ |
| 78 | function resizePaperContainer(jointPaper: dia.Paper) { |
| 79 | if (paperContainerElement.current) { |
| 80 | paperContainerElement.current.style.width = jointPaper.el.style.width; |
| 81 | paperContainerElement.current.style.height = jointPaper.el.style.height; |
| 82 | } |
| 83 | } |
| 84 | // An object to keep track of the listeners. It's not exposed, so the users |
| 85 | const controller = new mvc.Listener(); |
| 86 | controller.listenTo(paper, 'resize', resizePaperContainer); |
| 87 | controller.listenTo(paper, 'all', (type: PaperEventType, ...args: unknown[]) => |
| 88 | handleEvent(type, restOptions, paper, ...args) |
| 89 | ); |
no test coverage detected