MCPcopy
hub / github.com/clientIO/joint / Component

Function Component

packages/joint-react/src/components/paper/paper.tsx:136–310  ·  view source on GitHub ↗
(
  props: Readonly<PaperProps<ElementItem>>
)

Source from the content-addressed store, hash-verified

134
135// eslint-disable-next-line jsdoc/require-jsdoc
136function 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 }

Callers

nothing calls this directly

Calls 5

useCreatePaperFunction · 0.90
useGraphFunction · 0.90
useElementsFunction · 0.90
useAreElementMeasuredFunction · 0.90
mapMethod · 0.80

Tested by

no test coverage detected