diff --git a/index.d.ts b/index.d.ts index a07592dd..e07f768b 100644 --- a/index.d.ts +++ b/index.d.ts @@ -21,6 +21,7 @@ export type Props = FontAwesomeIconProps type BackwardCompatibleOmit = Pick>; export interface FontAwesomeIconProps extends BackwardCompatibleOmit, 'children' | 'mask' | 'transform'> { + forwardedRef?: ((e: any) => void) | React.RefObject icon: IconProp mask?: IconProp className?: string diff --git a/index.es.js b/index.es.js index 426ce684..7c015fa0 100644 --- a/index.es.js +++ b/index.es.js @@ -300,7 +300,10 @@ function objectWithKey(key, value) { return Array.isArray(value) && value.length > 0 || !Array.isArray(value) && value ? _defineProperty({}, key, value) : {}; } -function FontAwesomeIcon(props) { +function FontAwesomeIcon(_ref2) { + var forwardedRef = _ref2.forwardedRef, + props = _objectWithoutProperties(_ref2, ["forwardedRef"]); + var iconArgs = props.icon, maskArgs = props.mask, symbol = props.symbol, @@ -321,7 +324,9 @@ function FontAwesomeIcon(props) { } var abstract = renderedIcon.abstract; - var extraProps = {}; + var extraProps = { + ref: forwardedRef + }; Object.keys(props).forEach(function (key) { // eslint-disable-next-line no-prototype-builtins if (!FontAwesomeIcon.defaultProps.hasOwnProperty(key)) { diff --git a/index.js b/index.js index bbbf3e27..eab314b3 100644 --- a/index.js +++ b/index.js @@ -305,7 +305,10 @@ return Array.isArray(value) && value.length > 0 || !Array.isArray(value) && value ? _defineProperty({}, key, value) : {}; } - function FontAwesomeIcon(props) { + function FontAwesomeIcon(_ref2) { + var forwardedRef = _ref2.forwardedRef, + props = _objectWithoutProperties(_ref2, ["forwardedRef"]); + var iconArgs = props.icon, maskArgs = props.mask, symbol = props.symbol, @@ -326,7 +329,9 @@ } var abstract = renderedIcon.abstract; - var extraProps = {}; + var extraProps = { + ref: forwardedRef + }; Object.keys(props).forEach(function (key) { // eslint-disable-next-line no-prototype-builtins if (!FontAwesomeIcon.defaultProps.hasOwnProperty(key)) { diff --git a/src/components/FontAwesomeIcon.js b/src/components/FontAwesomeIcon.js index 55ff28fb..9214b5ec 100644 --- a/src/components/FontAwesomeIcon.js +++ b/src/components/FontAwesomeIcon.js @@ -7,7 +7,7 @@ import objectWithKey from '../utils/object-with-key' import PropTypes from 'prop-types' import React from 'react' -export default function FontAwesomeIcon(props) { +export default function FontAwesomeIcon({ forwardedRef, ...props }) { const { icon: iconArgs, mask: maskArgs, symbol, className, title } = props const iconLookup = normalizeIconArgs(iconArgs) @@ -37,7 +37,7 @@ export default function FontAwesomeIcon(props) { } const { abstract } = renderedIcon - const extraProps = {} + const extraProps = { ref: forwardedRef } Object.keys(props).forEach(key => { // eslint-disable-next-line no-prototype-builtins diff --git a/src/components/__tests__/FontAwesomeIcon.test.js b/src/components/__tests__/FontAwesomeIcon.test.js index a01ab98c..9db9e470 100644 --- a/src/components/__tests__/FontAwesomeIcon.test.js +++ b/src/components/__tests__/FontAwesomeIcon.test.js @@ -32,8 +32,10 @@ const faCircle = { fontawesome.library.add(faCoffee, faCircle) -function mount(props = {}) { - const component = renderer.create() +function mount(props = {}, { createNodeMock } = {}) { + const component = renderer.create(, { + createNodeMock + }) return component.toJSON() } @@ -289,3 +291,35 @@ describe('swap opacity', () => { expect(vm.props.className.includes('fa-swap-opacity')).toBeFalsy() }) }) + +describe('using ref', () => { + const node = {} + + test('function', () => { + const spy = jest.fn(element => element) + + mount( + { icon: faCoffee, forwardedRef: spy }, + { + createNodeMock: () => node + } + ) + + expect(spy.mock.calls.length).toBe(1) + expect(spy.mock.results[0].value).toBe(node) + }) + + test('callback ref', () => { + let forwardedRef = null + const setForwardedRef = element => (forwardedRef = element) + + mount( + { icon: faCoffee, forwardedRef: setForwardedRef }, + { + createNodeMock: () => node + } + ) + + expect(forwardedRef).toBe(node) + }) +})