Skip to content

Commit 58242cc

Browse files
committed
fix(jupyter): simplify resize logic and add WeakMap for root instances
- Simplify handleResize to directly set dimensions without stale state comparison - Add WeakMap to store and reuse createRoot instances, preventing memory leaks - Keep minimal change approach for viewport sizing fix
1 parent e6d70d0 commit 58242cc

2 files changed

Lines changed: 16 additions & 11 deletions

File tree

  • bindings/kepler.gl-jupyter/js/lib/keplergl/components

bindings/kepler.gl-jupyter/js/lib/keplergl/components/app.js

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// SPDX-License-Identifier: MIT
22
// Copyright contributors to the kepler.gl project
33

4-
import React, {useEffect, useState, useRef} from 'react';
4+
import {useEffect, useState, useRef} from 'react';
55
import styled from 'styled-components';
66
const ReactHelmet = require('react-helmet');
77
const Helmet = ReactHelmet ? ReactHelmet.Helmet : null;
@@ -58,15 +58,12 @@ function App() {
5858

5959
const width = rootElm.current.offsetWidth;
6060
const height = rootElm.current.offsetHeight;
61-
const dimensionToSet = {
62-
...(width && width !== windowDimension.width ? {width} : {}),
63-
...(height && height !== windowDimension.height ? {height} : {})
64-
};
65-
66-
setDimension(dimensionToSet);
61+
if (width && height) {
62+
setDimension({width, height});
63+
}
6764
};
6865

69-
// in Jupyter Lab, parent component has transition when window resize.
66+
// in Jupyter Lab, parent component has transition when window resize.
7067
// need to delay call to get the final parent width,
7168
const resizeDelay = () => window.setTimeout(handleResize, 500);
7269

bindings/kepler.gl-jupyter/js/lib/keplergl/components/root.js

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
11
// SPDX-License-Identifier: MIT
22
// Copyright contributors to the kepler.gl project
33

4-
import React, {useEffect, useRef} from 'react';
4+
import {useEffect, useRef} from 'react';
55
import {createRoot} from 'react-dom/client';
66
import {Provider} from 'react-redux';
77
import App from './app';
88
import Window from 'global/window';
99
import {addDataConfigToKeplerGl} from '../kepler.gl';
1010

11+
// Store root instances to avoid creating multiple roots for the same element
12+
const rootInstances = new WeakMap();
13+
1114
// Separate component to handle data loading after mount
1215
function DataLoader({store, onRenderComplete}) {
1316
const hasLoadedData = useRef(false);
@@ -30,8 +33,13 @@ function DataLoader({store, onRenderComplete}) {
3033
}
3134

3235
function renderRoot({id, store, ele, onRenderComplete}) {
33-
// Use React 18 createRoot API
34-
const root = createRoot(ele);
36+
// Use React 18 createRoot API - reuse existing root if available
37+
let root = rootInstances.get(ele);
38+
if (!root) {
39+
root = createRoot(ele);
40+
rootInstances.set(ele, root);
41+
}
42+
3543
root.render(
3644
<Provider store={store}>
3745
<DataLoader store={store} onRenderComplete={onRenderComplete} />

0 commit comments

Comments
 (0)