Merge branch 'main' into 21720-material-ui-upgrade
[arvados.git] / services / workbench2 / src / components / copy-to-clipboard / copy-result-to-clipboard.ts
1 // Copyright (C) The Arvados Authors. All rights reserved.
2 //
3 // SPDX-License-Identifier: AGPL-3.0
4
5 import React from 'react';
6 import copy from 'copy-to-clipboard';
7
8 interface CopyToClipboardProps {
9   getText: (() => string);
10   children: any
11   onCopy?(text: string, result: boolean): void;
12   options?: {
13     debug?: boolean;
14     message?: string;
15     format?: string; // MIME type
16   };
17 }
18
19 export default class CopyResultToClipboard extends React.PureComponent<CopyToClipboardProps> {
20   static defaultProps = {
21     onCopy: undefined,
22     options: undefined
23   };
24
25   onClick = event => {
26     const {
27       getText,
28       onCopy,
29       children,
30       options
31     } = this.props;
32
33     const elem = React.Children.only(children);
34
35     const text = getText();
36
37     const result = copy(text, options);
38
39     if (onCopy) {
40       onCopy(text, result);
41     }
42
43     // Bypass onClick if it was present
44     if (elem && elem.props && typeof elem.props.onClick === 'function') {
45       elem.props.onClick(event);
46     }
47   };
48
49
50   render() {
51     const {
52       getText: _getText,
53       onCopy: _onCopy,
54       options: _options,
55       children,
56       ...props
57     } = this.props;
58     const elem = React.Children.only(children);
59
60     return React.cloneElement(elem, {...props, onClick: this.onClick});
61   }
62 }