1
- import React from 'react' ;
1
+ import React , { memo } from 'react' ;
2
2
import useDeepCompareEffect from 'use-deep-compare-effect' ;
3
3
import { deepMerge } from '../utils' ;
4
4
import { SearchBarEmbed as _SearchBarEmbed , SearchBarViewConfig } from '../embed/search-bar' ;
@@ -20,50 +20,49 @@ const componentFactory = <T extends typeof TsEmbed, U extends EmbedProps, V exte
20
20
// not be destroyed when the component is unmounted.
21
21
isPreRenderedComponent = false ,
22
22
) => 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 > ) => {
31
30
// do not destroy if it is a preRender component
32
- if ( isPreRenderedComponent ) return ;
31
+ if ( isPreRenderedComponent ) return ;
33
32
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
+ }
39
38
40
- tsEmbed . destroy ( ) ;
41
- } ;
39
+ tsEmbed . destroy ( ) ;
40
+ } ;
42
41
43
- const handlePreRenderRendering = ( tsEmbed : InstanceType < T > ) => {
44
- tsEmbed . preRender ( ) ;
45
- } ;
42
+ const handlePreRenderRendering = ( tsEmbed : InstanceType < T > ) => {
43
+ tsEmbed . preRender ( ) ;
44
+ } ;
46
45
47
- const handleDefaultRendering = ( tsEmbed : InstanceType < T > ) => {
46
+ const handleDefaultRendering = ( tsEmbed : InstanceType < T > ) => {
48
47
// 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 (
67
66
ref ! . current ,
68
67
deepMerge (
69
68
{
@@ -74,26 +73,27 @@ const componentFactory = <T extends typeof TsEmbed, U extends EmbedProps, V exte
74
73
} ,
75
74
viewConfig ,
76
75
) ,
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 ) {
83
82
// 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
+ ) ,
97
97
) ;
98
98
99
99
interface SearchProps extends EmbedProps , SearchViewConfig { }
0 commit comments