Skip to content

Commit dabf9a8

Browse files
authored
fix: button popover won't close. fixes #2032 (#2050)
* fix: button popover won't close. fixes #2032 * Update src/block-components/icon/index.js [skip ci] * Update src/block-components/link/index.js [skip ci]
1 parent 4e6b1f5 commit dabf9a8

File tree

2 files changed

+28
-7
lines changed

2 files changed

+28
-7
lines changed

src/block-components/icon/index.js

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -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
}

src/block-components/link/index.js

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,13 +48,24 @@ export const Link = props => {
4848
return () => clearTimeout( t )
4949
}, [ isSelected ] )
5050

51+
// If the block is unselected, make sure that the opopver is closed.
52+
useEffect( () => {
53+
if ( ! isSelected && isOpen ) {
54+
setIsOpen( false )
55+
}
56+
}, [ isSelected, isOpen ] )
57+
5158
const clickOutsideListener = useCallback( event => {
5259
if ( isOpen ) {
60+
// If the button text is clicked, don't re-open the popover, just close it.
61+
if ( event.target.closest( '.stk-button' ) && event.target.closest( props.linkTrigger || '.rich-text' ) ) {
62+
event.stopPropagation()
63+
}
5364
if ( ! isElementDescendant( popoverEl.curent, event.target ) && ! event.target.closest( '.components-popover' ) ) {
5465
setIsOpen( false )
5566
}
5667
}
57-
}, [ popoverEl.current ] )
68+
}, [ popoverEl.current, isOpen ] )
5869

5970
// Assign the outside click listener.
6071
useEffect( () => {
@@ -78,8 +89,8 @@ export const Link = props => {
7889
onClick={ e => {
7990
if ( debouncedIsSelected ) {
8091
const ref = e.target.closest( props.linkTrigger || '.rich-text' )
81-
if ( ref ) {
82-
// Only trigger the setIsOpen when the rich text is selected.
92+
if ( ref && ! isOpen ) {
93+
// Only trigger the setIsOpen when the rich text is selected.
8394
setPopoverRef( ref )
8495
setIsOpen( ! isOpen )
8596
}

0 commit comments

Comments
 (0)