diff --git a/.changeset/quiet-spiders-cough.md b/.changeset/quiet-spiders-cough.md new file mode 100644 index 00000000000..15ea87b7037 --- /dev/null +++ b/.changeset/quiet-spiders-cough.md @@ -0,0 +1,5 @@ +--- +'@primer/react': patch +--- + +Update the `AnchoredOverlay` component so that the `ref` value is not overridden when spreading props diff --git a/packages/react/src/AnchoredOverlay/AnchoredOverlay.test.tsx b/packages/react/src/AnchoredOverlay/AnchoredOverlay.test.tsx index 18ad29d3b9f..0701c2c18c4 100644 --- a/packages/react/src/AnchoredOverlay/AnchoredOverlay.test.tsx +++ b/packages/react/src/AnchoredOverlay/AnchoredOverlay.test.tsx @@ -1,4 +1,4 @@ -import {act, useCallback, useState} from 'react' +import {act, createRef, useCallback, useRef, useState} from 'react' import {describe, expect, it, vi} from 'vitest' import {render} from '@testing-library/react' import {userEvent} from 'vitest/browser' @@ -145,4 +145,34 @@ describe('AnchoredOverlay', () => { }, }) }) + + it('should support a `ref` through `overlayProps` on the overlay element', () => { + const ref = createRef() + + function Test() { + const anchorRef = useRef(null) + return ( + { + return ( + + ) + }} + > +
content
+
+ ) + } + + render() + + expect(document.getElementById('overlay')).toBe(ref.current) + }) }) diff --git a/packages/react/src/AnchoredOverlay/AnchoredOverlay.tsx b/packages/react/src/AnchoredOverlay/AnchoredOverlay.tsx index c052ab9cf10..dde0ef6d923 100644 --- a/packages/react/src/AnchoredOverlay/AnchoredOverlay.tsx +++ b/packages/react/src/AnchoredOverlay/AnchoredOverlay.tsx @@ -249,7 +249,6 @@ export const AnchoredOverlay: React.FC { + if (overlayProps?.ref) { + assignRef(overlayProps.ref, node) + } + updateOverlayRef(node) + }} > {showXIcon ? (
@@ -288,4 +293,15 @@ export const AnchoredOverlay: React.FC( + ref: React.MutableRefObject | ((instance: T | null) => void) | null | undefined, + value: T | null, +) { + if (typeof ref === 'function') { + ref(value) + } else if (ref) { + ref.current = value + } +} + AnchoredOverlay.displayName = 'AnchoredOverlay'