( props: Readonly<PaperProps<ElementItem>> )
| 134 | |
| 135 | // eslint-disable-next-line jsdoc/require-jsdoc |
| 136 | function Component<ElementItem extends GraphElement = GraphElement>( |
| 137 | props: Readonly<PaperProps<ElementItem>> |
| 138 | ) { |
| 139 | const { |
| 140 | renderElement, |
| 141 | style, |
| 142 | className, |
| 143 | elementSelector = noopSelector as (item: GraphElement) => ElementItem, |
| 144 | scale, |
| 145 | children, |
| 146 | onElementsSizeReady, |
| 147 | onElementsSizeChange, |
| 148 | useHTMLOverlay, |
| 149 | ...paperOptions |
| 150 | } = props; |
| 151 | |
| 152 | const { paperContainerElement, paperCtx } = useCreatePaper({ |
| 153 | ...paperOptions, |
| 154 | scale, |
| 155 | }); |
| 156 | |
| 157 | const paperContext = useContext(PaperContext); |
| 158 | if (!paperContext) { |
| 159 | throw new Error('Paper must be used within a `PaperProvider` or `Paper` component'); |
| 160 | } |
| 161 | const { recordOfSVGElements } = paperContext; |
| 162 | |
| 163 | const graph = useGraph(); |
| 164 | const [HTMLRendererContainer, setHTMLRendererContainer] = useState<HTMLElement | null>(null); |
| 165 | const elements = useElements((items) => items.map(elementSelector)); |
| 166 | const areElementsMeasured = useAreElementMeasured(); |
| 167 | // Keep previous sizes in a ref |
| 168 | const previousSizesRef = useRef<number[][]>([]); |
| 169 | |
| 170 | // Whenever elements change (or we’ve just become measured) compare old ↔ new |
| 171 | useEffect(() => { |
| 172 | if (!paperCtx) return; |
| 173 | if (!onElementsSizeChange) return; |
| 174 | if (!areElementsMeasured) return; |
| 175 | const { paper } = paperCtx; |
| 176 | if (!paper) return; |
| 177 | |
| 178 | // Build current list of [width, height] |
| 179 | const currentSizes = elements.map(({ width = 0, height = 0 }) => [width, height]); |
| 180 | const previousSizes = previousSizesRef.current; |
| 181 | let changed = false; |
| 182 | |
| 183 | // Quick bail-out on length mismatch |
| 184 | if (previousSizes.length === currentSizes.length) { |
| 185 | // Otherwise scan for any width/height diff |
| 186 | for (const [index, currentSize] of currentSizes.entries()) { |
| 187 | if ( |
| 188 | previousSizes[index][0] !== currentSize[0] || |
| 189 | previousSizes[index][1] !== currentSize[1] |
| 190 | ) { |
| 191 | changed = true; |
| 192 | break; |
| 193 | } |
nothing calls this directly
no test coverage detected