useCopyClick.js 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. "use strict";
  2. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
  3. var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
  4. Object.defineProperty(exports, "__esModule", {
  5. value: true
  6. });
  7. exports.default = void 0;
  8. var React = _interopRequireWildcard(require("react"));
  9. var _copyToClipboard = _interopRequireDefault(require("copy-to-clipboard"));
  10. var _useEvent = _interopRequireDefault(require("rc-util/lib/hooks/useEvent"));
  11. var _toList = _interopRequireDefault(require("../../_util/toList"));
  12. var __awaiter = void 0 && (void 0).__awaiter || function (thisArg, _arguments, P, generator) {
  13. function adopt(value) {
  14. return value instanceof P ? value : new P(function (resolve) {
  15. resolve(value);
  16. });
  17. }
  18. return new (P || (P = Promise))(function (resolve, reject) {
  19. function fulfilled(value) {
  20. try {
  21. step(generator.next(value));
  22. } catch (e) {
  23. reject(e);
  24. }
  25. }
  26. function rejected(value) {
  27. try {
  28. step(generator["throw"](value));
  29. } catch (e) {
  30. reject(e);
  31. }
  32. }
  33. function step(result) {
  34. result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);
  35. }
  36. step((generator = generator.apply(thisArg, _arguments || [])).next());
  37. });
  38. };
  39. const useCopyClick = ({
  40. copyConfig,
  41. children
  42. }) => {
  43. const [copied, setCopied] = React.useState(false);
  44. const [copyLoading, setCopyLoading] = React.useState(false);
  45. const copyIdRef = React.useRef(null);
  46. const cleanCopyId = () => {
  47. if (copyIdRef.current) {
  48. clearTimeout(copyIdRef.current);
  49. }
  50. };
  51. const copyOptions = {};
  52. if (copyConfig.format) {
  53. copyOptions.format = copyConfig.format;
  54. }
  55. React.useEffect(() => cleanCopyId, []);
  56. // Keep copy action up to date
  57. const onClick = (0, _useEvent.default)(e => __awaiter(void 0, void 0, void 0, function* () {
  58. var _a;
  59. e === null || e === void 0 ? void 0 : e.preventDefault();
  60. e === null || e === void 0 ? void 0 : e.stopPropagation();
  61. setCopyLoading(true);
  62. try {
  63. const text = typeof copyConfig.text === 'function' ? yield copyConfig.text() : copyConfig.text;
  64. (0, _copyToClipboard.default)(text || (0, _toList.default)(children, true).join('') || '', copyOptions);
  65. setCopyLoading(false);
  66. setCopied(true);
  67. // Trigger tips update
  68. cleanCopyId();
  69. copyIdRef.current = setTimeout(() => {
  70. setCopied(false);
  71. }, 3000);
  72. (_a = copyConfig.onCopy) === null || _a === void 0 ? void 0 : _a.call(copyConfig, e);
  73. } catch (error) {
  74. setCopyLoading(false);
  75. throw error;
  76. }
  77. }));
  78. return {
  79. copied,
  80. copyLoading,
  81. onClick
  82. };
  83. };
  84. var _default = exports.default = useCopyClick;