Skip to content
Open
Changes from all commits
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
73 changes: 28 additions & 45 deletions packages/eui/src/components/copy/copy.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
* Side Public License, v 1.
*/

import React, { Component, ReactElement, ReactNode } from 'react';
import React, { ReactElement, ReactNode, useState, useCallback } from 'react';
import { CommonProps } from '../common';
import { copyToClipboard } from '../../services';
import { EuiToolTip, EuiToolTipProps } from '../tool_tip';
Expand All @@ -33,56 +33,39 @@ export interface EuiCopyProps extends CommonProps {
/**
* Optional props to pass to the EuiToolTip component.
*/
tooltipProps?: Partial<
tooltipProps?: Partial
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 This seems like a syntax error:

Suggested change
tooltipProps?: Partial
tooltipProps?: Partial<

Omit<EuiToolTipProps, 'children' | 'content' | 'onMouseOut'>
>;
}

interface EuiCopyState {
tooltipText: ReactNode;
}

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

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

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

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

resetTooltipText = () => {
this.setState({
tooltipText: this.props.beforeMessage,
});
};
}, [textToCopy, afterMessage]);

render() {
const { children, tooltipProps } = this.props;
const resetTooltipText = useCallback(() => {
setTooltipText(beforeMessage);
}, [beforeMessage]);

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