import copy from 'copy-to-clipboard'; import React, { useCallback, useEffect, useState } from 'react'; import FormInputButton from 'Components/Form/FormInputButton'; import Icon from 'Components/Icon'; import { icons, kinds } from 'Helpers/Props'; import { ButtonProps } from './Button'; import styles from './ClipboardButton.css'; export interface ClipboardButtonProps extends Omit { value: string; } export type ClipboardState = 'success' | 'error' | null; export default function ClipboardButton({ id, value, className = styles.button, ...otherProps }: ClipboardButtonProps) { const [state, setState] = useState(null); useEffect(() => { if (!state) { return; } const timeoutId = setTimeout(() => { setState(null); }, 3000); return () => { if (timeoutId) { clearTimeout(timeoutId); } }; }, [state]); const handleClick = useCallback(async () => { try { if ('clipboard' in navigator) { await navigator.clipboard.writeText(value); } else { copy(value); } setState('success'); } catch (e) { setState('error'); console.error(`Failed to copy to clipboard`, e); } }, [value]); return ( {state ? ( ) : null} ); }