UNPKG

@mskcc/carbon-react

Version:

Carbon react components for the MSKCC DSM

105 lines (97 loc) 3.47 kB
/** * MSKCC 2021, 2024 */ 'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var _rollupPluginBabelHelpers = require('../../_virtual/_rollupPluginBabelHelpers.js'); var PropTypes = require('prop-types'); var React = require('react'); var debounce = require('lodash.debounce'); var cx = require('classnames'); var events = require('../../tools/events.js'); var usePrefix = require('../../internal/usePrefix.js'); var IconButton = require('../IconButton/IconButton.js'); function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; } var PropTypes__default = /*#__PURE__*/_interopDefaultLegacy(PropTypes); var React__default = /*#__PURE__*/_interopDefaultLegacy(React); var debounce__default = /*#__PURE__*/_interopDefaultLegacy(debounce); var cx__default = /*#__PURE__*/_interopDefaultLegacy(cx); function Copy(_ref) { let { children, className, feedback, feedbackTimeout, onAnimationEnd, onClick, ...other } = _ref; const [animation, setAnimation] = React.useState(''); const prefix = usePrefix.usePrefix(); const classNames = cx__default["default"](className, `${prefix}--copy`, { [`${prefix}--copy-btn--animating`]: animation, [`${prefix}--copy-btn--${animation}`]: animation }); // eslint-disable-next-line react-hooks/exhaustive-deps const handleFadeOut = React.useCallback(debounce__default["default"](() => { setAnimation('fade-out'); }, feedbackTimeout), [feedbackTimeout]); const handleClick = React.useCallback(() => { setAnimation('fade-in'); handleFadeOut(); }, [handleFadeOut]); const handleAnimationEnd = event => { if (event.animationName === 'hide-feedback') { setAnimation(''); } }; React.useEffect(() => () => { handleFadeOut.cancel(); }, [handleFadeOut]); const initialLabel = other['aria-label'] ?? ''; return /*#__PURE__*/React__default["default"].createElement(IconButton.IconButton, _rollupPluginBabelHelpers["extends"]({ closeOnActivation: false, align: "bottom", className: classNames, label: animation ? feedback : initialLabel, onClick: events.composeEventHandlers([onClick, handleClick]), onAnimationEnd: events.composeEventHandlers([onAnimationEnd, handleAnimationEnd]) }, other, { "aria-label": !children && (animation ? feedback : other['aria-label']) || null }), children); } Copy.propTypes = { /** * Pass in content to be rendered in the underlying `<button>` */ children: PropTypes__default["default"].node, /** * Specify an optional className to be applied to the underlying `<button>` */ className: PropTypes__default["default"].string, /** * Specify the string that is displayed when the button is clicked and the * content is copied */ feedback: PropTypes__default["default"].string, /** * Specify the time it takes for the feedback message to timeout */ feedbackTimeout: PropTypes__default["default"].number, /** * Specify an optional `onAnimationEnd` handler that is called when the underlying * animation ends */ onAnimationEnd: PropTypes__default["default"].func, /** * Specify an optional `onClick` handler that is called when the underlying * `<button>` is clicked */ onClick: PropTypes__default["default"].func }; Copy.defaultProps = { feedback: 'Copied!', feedbackTimeout: 2000, onClick: () => {} }; exports["default"] = Copy;