@@ -18,16 +18,13 @@ import {
1818 useState , useEffect , useRef , memo , useMemo ,
1919} from '@wordpress/element'
2020import { usePresetControls } from '~stackable/hooks'
21+ import { useDesignLibraryContext } from '../modal-design-library/modal'
2122
2223const DesignLibraryList = memo ( props => {
2324 const {
2425 className = '' ,
2526 designs,
2627 isBusy,
27- onSelectMulti,
28- selectedDesigns = [ ] ,
29- selectedDesignData = [ ] ,
30- selectedTab,
3128 } = props
3229 const containerRef = useRef ( null )
3330
@@ -48,29 +45,11 @@ const DesignLibraryList = memo( props => {
4845 { ! isBusy && < >
4946 < div className = { listClasses } >
5047 { ( designs || [ ] ) . map ( ( design , i ) => {
51- const selectedNum = selectedDesigns . indexOf ( design . id || design . designId ) + 1
52- const selectedData = selectedNum ? selectedDesignData [ selectedNum - 1 ] : null
53-
54- const previewProps = {
55- designId : design . id || design . designId ,
56- template : design . template || design . content ,
57- category : design . category ,
58- containerScheme : props . containerScheme ,
59- backgroundScheme : props . backgroundScheme ,
60- enableBackground : props . enableBackground ,
61- onClick : onSelectMulti ,
62- }
63-
6448 return (
6549 < DesignLibraryItem
50+ design = { design }
6651 key = { design . id || design . designId }
67- plan = { design . plan }
68- label = { design . label || design . title }
69- selectedNum = { selectedNum }
70- selectedData = { selectedData }
71- selectedTab = { selectedTab }
7252 designIndex = { i }
73- { ...previewProps }
7453 />
7554 )
7655 } ) }
@@ -92,10 +71,53 @@ DesignLibraryList.defaultProps = {
9271
9372export default DesignLibraryList
9473
95- const DesignLibraryItem = props => {
96- const { selectedTab , designIndex } = props
74+ const DesignLibraryItem = memo ( props => {
75+ const { design , designIndex } = props
9776 const wrapperRef = useRef ( null )
9877 const [ shouldRender , setShouldRender ] = useState ( designIndex < 9 )
78+
79+ const [ selectedTab ,
80+ selectedDesignIds ,
81+ selectedDesignData ,
82+ onSelectDesign ,
83+ isMultiSelectBusy ,
84+ containerScheme ,
85+ backgroundScheme ,
86+ enableBackground ,
87+ ] = useDesignLibraryContext ( )
88+
89+ const { selectedNum, selectedData } = useMemo ( ( ) => {
90+ const selectedNum = selectedDesignIds . indexOf ( design . id || design . designId ) + 1
91+ const selectedData = selectedNum ? selectedDesignData [ selectedNum - 1 ] : null
92+
93+ return { selectedNum, selectedData }
94+ } , [ selectedDesignIds , selectedDesignData ] )
95+
96+ const previewProps = useMemo ( ( ) => ( {
97+ designId : design . id || design . designId ,
98+ template : design . template || design . content ,
99+ category : design . category ,
100+ plan : design . plan ,
101+ label : design . label ,
102+ containerScheme,
103+ backgroundScheme,
104+ enableBackground : selectedTab !== 'pages' ? enableBackground : true ,
105+ selectedTab,
106+ selectedNum,
107+ selectedData,
108+ onClick : onSelectDesign ,
109+ } ) , [
110+ // Only track designId for memoization; other design properties will update when designId changes
111+ design . id || design . designId ,
112+ containerScheme ,
113+ backgroundScheme ,
114+ enableBackground ,
115+ selectedTab ,
116+ // selectedNum and selectedData are always in sync; updating selectedNum also updates selectedData
117+ selectedNum ,
118+ onSelectDesign ,
119+ ] )
120+
99121 const { getPresetMarks } = usePresetControls ( 'spacingSizes' )
100122
101123 // Intentionally no dependencies: presetMarks won't change while the design library is open
@@ -135,7 +157,7 @@ const DesignLibraryItem = props => {
135157 const observer = new IntersectionObserver ( ( [ entry ] ) => {
136158 // reduce flicker during rapid scrolls
137159 requestAnimationFrame ( ( ) => {
138- requestAnimationFrame ( ( ) => setShouldRender ( entry . isIntersecting ) )
160+ requestAnimationFrame ( ( ) => setShouldRender ( entry . isIntersecting || entry . intersectionRatio > 0 ) )
139161 } )
140162 } , {
141163 root : rootEl ,
@@ -151,7 +173,11 @@ const DesignLibraryItem = props => {
151173
152174 return (
153175 < div ref = { wrapperRef } >
154- < DesignLibraryListItem { ...props } shouldRender = { shouldRender } presetMarks = { presetMarks } />
176+ < DesignLibraryListItem
177+ previewProps = { previewProps }
178+ isMultiSelectBusy = { isMultiSelectBusy }
179+ shouldRender = { shouldRender }
180+ presetMarks = { presetMarks } />
155181 </ div >
156182 )
157- }
183+ } )
0 commit comments