Skip to content

Commit fe2f823

Browse files
SCAL-241097 Fix for liveboard shound not rerender if parent component rerenders
1 parent facf4a5 commit fe2f823

File tree

1 file changed

+58
-58
lines changed

1 file changed

+58
-58
lines changed

src/react/index.tsx

+58-58
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React from 'react';
1+
import React, { memo } from 'react';
22
import useDeepCompareEffect from 'use-deep-compare-effect';
33
import { deepMerge } from '../utils';
44
import { SearchBarEmbed as _SearchBarEmbed, SearchBarViewConfig } from '../embed/search-bar';
@@ -20,50 +20,49 @@ const componentFactory = <T extends typeof TsEmbed, U extends EmbedProps, V exte
2020
// not be destroyed when the component is unmounted.
2121
isPreRenderedComponent = false,
2222
) => React.forwardRef<InstanceType<T>, U>(
23-
(props: U, forwardedRef: React.MutableRefObject<InstanceType<T>>) => {
24-
const ref = React.useRef<HTMLDivElement>(null);
25-
const { className, ...embedProps } = props;
26-
const { viewConfig, listeners } = getViewPropsAndListeners<Omit<U, 'className'>, V>(
27-
embedProps,
28-
);
29-
30-
const handleDestroy = (tsEmbed: InstanceType<T>) => {
23+
memo(
24+
(props: U, forwardedRef: React.MutableRefObject<InstanceType<T>>) => {
25+
const ref = React.useRef<HTMLDivElement>(null);
26+
const { className, ...embedProps } = props;
27+
const { viewConfig, listeners } = getViewPropsAndListeners<Omit<U, 'className'>, V>(embedProps);
28+
29+
const handleDestroy = (tsEmbed: InstanceType<T>) => {
3130
// do not destroy if it is a preRender component
32-
if (isPreRenderedComponent) return;
31+
if (isPreRenderedComponent) return;
3332

34-
// if component is connected to a preRendered component
35-
if (props.preRenderId) {
36-
tsEmbed.hidePreRender();
37-
return;
38-
}
33+
// if component is connected to a preRendered component
34+
if (props.preRenderId) {
35+
tsEmbed.hidePreRender();
36+
return;
37+
}
3938

40-
tsEmbed.destroy();
41-
};
39+
tsEmbed.destroy();
40+
};
4241

43-
const handlePreRenderRendering = (tsEmbed: InstanceType<T>) => {
44-
tsEmbed.preRender();
45-
};
42+
const handlePreRenderRendering = (tsEmbed: InstanceType<T>) => {
43+
tsEmbed.preRender();
44+
};
4645

47-
const handleDefaultRendering = (tsEmbed: InstanceType<T>) => {
46+
const handleDefaultRendering = (tsEmbed: InstanceType<T>) => {
4847
// if component is connected to a preRendered component
49-
if (props.preRenderId) {
50-
tsEmbed.showPreRender();
51-
return;
52-
}
53-
54-
tsEmbed.render();
55-
};
56-
57-
const handleRendering = (tsEmbed: InstanceType<T>) => {
58-
if (isPreRenderedComponent) {
59-
handlePreRenderRendering(tsEmbed);
60-
return;
61-
}
62-
handleDefaultRendering(tsEmbed);
63-
};
64-
65-
useDeepCompareEffect(() => {
66-
const tsEmbed = new EmbedConstructor(
48+
if (props.preRenderId) {
49+
tsEmbed.showPreRender();
50+
return;
51+
}
52+
53+
tsEmbed.render();
54+
};
55+
56+
const handleRendering = (tsEmbed: InstanceType<T>) => {
57+
if (isPreRenderedComponent) {
58+
handlePreRenderRendering(tsEmbed);
59+
return;
60+
}
61+
handleDefaultRendering(tsEmbed);
62+
};
63+
64+
useDeepCompareEffect(() => {
65+
const tsEmbed = new EmbedConstructor(
6766
ref!.current,
6867
deepMerge(
6968
{
@@ -74,26 +73,27 @@ const componentFactory = <T extends typeof TsEmbed, U extends EmbedProps, V exte
7473
},
7574
viewConfig,
7675
),
77-
) as InstanceType<T>;
78-
Object.keys(listeners).forEach((eventName) => {
79-
tsEmbed.on(eventName as EmbedEvent, listeners[eventName as EmbedEvent]);
80-
});
81-
handleRendering(tsEmbed);
82-
if (forwardedRef) {
76+
) as InstanceType<T>;
77+
Object.keys(listeners).forEach((eventName) => {
78+
tsEmbed.on(eventName as EmbedEvent, listeners[eventName as EmbedEvent]);
79+
});
80+
handleRendering(tsEmbed);
81+
if (forwardedRef) {
8382
// eslint-disable-next-line no-param-reassign
84-
forwardedRef.current = tsEmbed;
85-
}
86-
return () => {
87-
handleDestroy(tsEmbed);
88-
};
89-
}, [viewConfig, listeners]);
90-
91-
return viewConfig.insertAsSibling ? (
92-
<span data-testid="tsEmbed" ref={ref} style={{ position: 'absolute' }}></span>
93-
) : (
94-
<div data-testid="tsEmbed" ref={ref} className={className}></div>
95-
);
96-
},
83+
forwardedRef.current = tsEmbed;
84+
}
85+
return () => {
86+
handleDestroy(tsEmbed);
87+
};
88+
}, [viewConfig, listeners]);
89+
90+
return viewConfig.insertAsSibling ? (
91+
<span data-testid="tsEmbed" ref={ref} style={{ position: 'absolute' }}></span>
92+
) : (
93+
<div data-testid="tsEmbed" ref={ref} className={className}></div>
94+
);
95+
},
96+
),
9797
);
9898

9999
interface SearchProps extends EmbedProps, SearchViewConfig { }

0 commit comments

Comments
 (0)