@@ -61,25 +61,35 @@ export const Icon = props => {
6161 hasLinearGradient = true ,
6262 } = props
6363
64+ const { clientId, isSelected } = useBlockEditContext ( )
6465 const [ isOpen , setIsOpen ] = useState ( false )
6566 const popoverEl = useRef ( null )
6667
6768 const clickOutsideListener = useCallback ( event => {
6869 if ( isOpen ) {
70+ // If the icon is clicked, just close the popover.
71+ if ( event . target . closest ( '.stk--inner-svg' ) ) {
72+ event . stopPropagation ( )
73+ }
6974 if ( ! isElementDescendant ( popoverEl . current , event . target ) && ! event . target . closest ( '.components-popover' ) ) {
7075 setIsOpen ( false )
7176 }
7277 }
73- } )
78+ } , [ popoverEl . current , isOpen ] )
79+
80+ // When the block is unselected, make sure that the popover is closed.
81+ useEffect ( ( ) => {
82+ if ( ! isSelected && isOpen ) {
83+ setIsOpen ( false )
84+ }
85+ } , [ isSelected , isOpen ] )
7486
7587 // Assign the outside click listener.
7688 useEffect ( ( ) => {
7789 document . body . addEventListener ( 'click' , clickOutsideListener )
7890 return ( ) => document . body . removeEventListener ( 'click' , clickOutsideListener )
7991 } , [ clickOutsideListener ] )
8092
81- const { clientId, isSelected } = useBlockEditContext ( )
82-
8393 // Enable editing of the icon only when the current block that implements
8494 // it is selected. We need to use setTimeout since the isSelected is
8595 // changed earlier.
@@ -141,7 +151,7 @@ export const Icon = props => {
141151 onClick = { event => {
142152 if ( debouncedIsSelected ) {
143153 // Only register a click to .stk--inner-svg.
144- if ( event . target . closest ( '.stk--inner-svg' ) ) {
154+ if ( event . target . closest ( '.stk--inner-svg' ) && ! isOpen ) {
145155 setIsOpen ( ! isOpen )
146156 }
147157 }
0 commit comments