@@ -11,64 +11,68 @@ type RootCardProps = CardPropsType & {
1111 settingsComponent ?: React . ReactNode
1212 fullBlock ?: boolean
1313}
14+ export const Card = React . forwardRef < HTMLDivElement , RootCardProps > (
15+ (
16+ {
17+ meta,
18+ titleComponent,
19+ settingsComponent,
20+ className,
21+ withAds = false ,
22+ children,
23+ fullBlock = false ,
24+ knob,
25+ } ,
26+ ref
27+ ) => {
28+ const { icon, label, badge } = meta
29+ const [ canAdsLoad , setCanAdsLoad ] = useState ( true )
1430
15- export const Card = ( {
16- meta,
17- titleComponent,
18- settingsComponent,
19- className,
20- withAds = false ,
21- children,
22- fullBlock = false ,
23- knob,
24- } : RootCardProps ) => {
25- const { icon, label, badge } = meta
26- const [ canAdsLoad , setCanAdsLoad ] = useState ( true )
27-
28- useEffect ( ( ) => {
29- if ( ! withAds ) {
30- return
31- }
32-
33- const handleClassChange = ( ) => {
34- if ( document . documentElement . classList . contains ( 'dndState' ) ) {
35- setCanAdsLoad ( false )
36- } else {
37- setCanAdsLoad ( true )
31+ useEffect ( ( ) => {
32+ if ( ! withAds ) {
33+ return
3834 }
39- }
4035
41- const observer = new MutationObserver ( handleClassChange )
42- observer . observe ( document . documentElement , { attributes : true } )
36+ const handleClassChange = ( ) => {
37+ if ( document . documentElement . classList . contains ( 'dndState' ) ) {
38+ setCanAdsLoad ( false )
39+ } else {
40+ setCanAdsLoad ( true )
41+ }
42+ }
4343
44- return ( ) => {
45- observer . disconnect ( )
46- }
47- } , [ withAds ] )
44+ const observer = new MutationObserver ( handleClassChange )
45+ observer . observe ( document . documentElement , { attributes : true } )
4846
49- return (
50- < div className = { clsx ( 'block' , fullBlock && 'fullBlock' , className ) } >
51- < MobileBreakpoint >
52- { settingsComponent && < button className = "floatingFilter" > { settingsComponent } </ button > }
53- </ MobileBreakpoint >
54- < div className = "blockHeader" >
55- { knob }
56- < span className = "blockHeaderIcon" > { icon } </ span > { titleComponent || label } { ' ' }
57- < DesktopBreakpoint >
58- { settingsComponent && (
59- < span className = "blockHeaderSettingsButton" > { settingsComponent } </ span >
60- ) }
61- </ DesktopBreakpoint >
62- { badge && < span className = "blockHeaderBadge" > { badge } </ span > }
63- </ div >
47+ return ( ) => {
48+ observer . disconnect ( )
49+ }
50+ } , [ withAds ] )
6451
65- { canAdsLoad && withAds && (
66- < div className = "ad-wrapper blockRow" >
67- < AdvBanner />
52+ return (
53+ < div ref = { ref } className = { clsx ( 'block' , fullBlock && 'fullBlock' , className ) } >
54+ < MobileBreakpoint >
55+ { settingsComponent && < button className = "floatingFilter" > { settingsComponent } </ button > }
56+ </ MobileBreakpoint >
57+ < div className = "blockHeader" >
58+ { knob }
59+ < span className = "blockHeaderIcon" > { icon } </ span > { titleComponent || label } { ' ' }
60+ < DesktopBreakpoint >
61+ { settingsComponent && (
62+ < span className = "blockHeaderSettingsButton" > { settingsComponent } </ span >
63+ ) }
64+ </ DesktopBreakpoint >
65+ { badge && < span className = "blockHeaderBadge" > { badge } </ span > }
6866 </ div >
69- ) }
7067
71- < div className = "blockContent scrollable" > { children } </ div >
72- </ div >
73- )
74- }
68+ { canAdsLoad && withAds && (
69+ < div className = "ad-wrapper blockRow" >
70+ < AdvBanner />
71+ </ div >
72+ ) }
73+
74+ < div className = "blockContent scrollable" > { children } </ div >
75+ </ div >
76+ )
77+ }
78+ )
0 commit comments