Skip to content
Open
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
86 changes: 26 additions & 60 deletions packages/eui/src/components/copy/copy.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,83 +6,49 @@
* Side Public License, v 1.
*/

import React, { Component, ReactElement, ReactNode } from 'react';
import React, { ReactElement, ReactNode, useState } from 'react';
import { CommonProps } from '../common';
import { copyToClipboard } from '../../services';
import { EuiToolTip, EuiToolTipProps } from '../tool_tip';

export interface EuiCopyProps extends CommonProps {
/**
* Text that will be copied to clipboard when copy function is executed.
*/
textToCopy: string;
/**
* Tooltip message displayed before copy function is called.
*/
beforeMessage?: ReactNode;
/**
* Tooltip message displayed after copy function is called that lets the user know that
* 'textToCopy' has been copied to the clipboard.
*/
afterMessage?: ReactNode;
/**
* Function that must return a component. First argument is 'copy' function.
* Use your own logic to create the component that users interact with when triggering copy.
*/
children(copy: () => void): ReactElement;
/**
* Optional props to pass to the EuiToolTip component.
*/
tooltipProps?: Partial<
Omit<EuiToolTipProps, 'children' | 'content' | 'onMouseOut'>
>;
Comment thread
weronikaolejniczak marked this conversation as resolved.
}

interface EuiCopyState {
tooltipText: ReactNode;
}

export class EuiCopy extends Component<EuiCopyProps, EuiCopyState> {
static defaultProps = {
afterMessage: 'Copied',
};

constructor(props: EuiCopyProps) {
super(props);

this.state = {
tooltipText: this.props.beforeMessage,
};
}

copy = () => {
const isCopied = copyToClipboard(this.props.textToCopy);
export const EuiCopy = ({
textToCopy,
beforeMessage,
afterMessage = 'Copied',
children,
tooltipProps,
}: EuiCopyProps) => {
const [tooltipText, setTooltipText] = useState<ReactNode>(beforeMessage);

const copy = () => {
const isCopied = copyToClipboard(textToCopy);
if (isCopied) {
this.setState({
tooltipText: this.props.afterMessage,
});
setTooltipText(afterMessage);
}
};

resetTooltipText = () => {
this.setState({
tooltipText: this.props.beforeMessage,
});
const resetTooltipText = () => {
setTooltipText(beforeMessage);
};
Comment thread
weronikaolejniczak marked this conversation as resolved.
Outdated

render() {
const { children, tooltipProps } = this.props;

return (
// See `src/components/tool_tip/tool_tip.js` for explanation of below eslint-disable
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@abhijnyan-codes we do need this comment by the eslint-disable:

// See src/components/tool_tip/tool_tip.js for explanation of below eslint-disable

Let's please bring it back 🙏🏻

// eslint-disable-next-line jsx-a11y/mouse-events-have-key-events
<EuiToolTip
content={this.state.tooltipText}
onMouseOut={this.resetTooltipText}
{...tooltipProps}
>
{children(this.copy)}
</EuiToolTip>
);
}
}
return (
// eslint-disable-next-line jsx-a11y/mouse-events-have-key-events
<EuiToolTip
content={tooltipText}
onMouseOut={resetTooltipText}
{...tooltipProps}
>
{children(copy)}
</EuiToolTip>
);
};
Loading