← Back to all hooks

useCopyToClipboard

Copy text to clipboard with success/failure handling and automatic fallback for older browsers. Includes auto-reset and error management.

Live Demo

Try copying different types of content. Success state auto-resets after 3 seconds.

šŸ“ Custom Text

šŸ’» Code Snippet

import { useCopyToClipboard } from "@uiblock/hooks";

export default function Demo() {
  const { copy, isSuccess } = useCopyToClipboard();
  
  return (
    <button onClick={() => copy('Hello World!')}>
      {isSuccess ? 'Copied!' : 'Copy'}
    </button>
  );
}

šŸ”— Quick Copy Examples

API Key
sk_test_4eC39HqLyjWDarjtT1zdp7dc
Email
user@example.com
URL
https://github.com/yourusername/hooks

šŸ’” Features:

  • Modern Clipboard API with fallback for older browsers
  • Success/error state management
  • Auto-reset after 3 seconds
  • Works in secure (HTTPS) and non-secure contexts

Code Examples

Basic Usage

import { useCopyToClipboard } from "@uiblock/hooks";

export default function CopyButton() {
  const { copy, isSuccess } = useCopyToClipboard();

  return (
    <button onClick={() => copy('Hello World!')}>
      {isSuccess ? 'āœ… Copied!' : 'šŸ“‹ Copy'}
    </button>
  );
}

With Error Handling

import { useCopyToClipboard } from "@uiblock/hooks";

export default function CopyWithError() {
  const { copy, isSuccess, isError, error } = useCopyToClipboard();

  const handleCopy = async (text) => {
    const success = await copy(text);
    if (success) {
      console.log('Copied successfully!');
    }
  };

  return (
    <div>
      <button onClick={() => handleCopy('Copy me!')}>
        Copy
      </button>
      {isSuccess && <p>āœ… Copied!</p>}
      {isError && <p>āŒ Error: {error}</p>}
    </div>
  );
}

Copy Code Snippet

import { useCopyToClipboard } from "@uiblock/hooks";

export default function CodeBlock({ code }) {
  const { copy, isSuccess } = useCopyToClipboard(2000);

  return (
    <div className="code-block">
      <pre>{code}</pre>
      <button onClick={() => copy(code)}>
        {isSuccess ? 'Copied!' : 'Copy Code'}
      </button>
    </div>
  );
}

Custom Timeout

import { useCopyToClipboard } from "@uiblock/hooks";

export default function CustomTimeout() {
  // Success state resets after 5 seconds
  const { copy, isSuccess, reset } = useCopyToClipboard(5000);

  return (
    <div>
      <button onClick={() => copy('Text')}>Copy</button>
      {isSuccess && (
        <div>
          <span>Copied!</span>
          <button onClick={reset}>Reset Now</button>
        </div>
      )}
    </div>
  );
}

How It Works

Here's the implementation with fallback support:

import { useState, useCallback } from 'react'

export function useCopyToClipboard(timeout = 2000) {
  const [copiedText, setCopiedText] = useState(null)
  const [isSuccess, setIsSuccess] = useState(false)
  const [isError, setIsError] = useState(false)
  const [error, setError] = useState(null)

  const reset = useCallback(() => {
    setCopiedText(null)
    setIsSuccess(false)
    setIsError(false)
    setError(null)
  }, [])

  const copy = useCallback(async (text) => {
    reset()

    try {
      // Modern Clipboard API (preferred)
      if (navigator.clipboard && window.isSecureContext) {
        await navigator.clipboard.writeText(text)
        setCopiedText(text)
        setIsSuccess(true)
        setTimeout(reset, timeout)
        return true
      }

      // Fallback for older browsers
      const textArea = document.createElement('textarea')
      textArea.value = text
      textArea.style.position = 'fixed'
      textArea.style.left = '-999999px'
      document.body.appendChild(textArea)
      textArea.select()

      const successful = document.execCommand('copy')
      textArea.remove()

      if (successful) {
        setCopiedText(text)
        setIsSuccess(true)
        setTimeout(reset, timeout)
        return true
      }
      
      throw new Error('Copy failed')
    } catch (err) {
      setError(err.message)
      setIsError(true)
      return false
    }
  }, [timeout, reset])

  return { copiedText, copy, isSuccess, isError, error, reset }
}

Key Features:

  • Tries modern Clipboard API first (secure contexts)
  • Falls back to document.execCommand for older browsers
  • Manages success/error states automatically
  • Auto-resets after configurable timeout

API Reference

Parameters

timeout?: number

Time in milliseconds before auto-reset (default: 2000)

Returns

  • copiedText: string | null - The last copied text
  • copy: (text: string) => Promise<boolean> - Function to copy text
  • isSuccess: boolean - True if last copy succeeded
  • isError: boolean - True if last copy failed
  • error: string | null - Error message if copy failed
  • reset: () => void - Manually reset all states

Browser Support

Modern Clipboard API

Requires HTTPS (secure context). Supported in all modern browsers.

Fallback Method

Uses document.execCommand('copy') for older browsers and non-secure contexts. Works in IE11+.

šŸ’” Use Cases

  • Copy code snippets from documentation
  • Share links and URLs
  • Copy API keys and tokens
  • Copy email addresses and phone numbers
  • Copy formatted text or JSON data
  • Copy command-line instructions
  • Share referral codes
  • Copy product IDs or SKUs