Tips & Tricks

Guia de Uso da API com Claude Code

Aprenda sobre o guia de uso da API com o Claude Code. Dicas práticas e exemplos de código incluídos.

Melhorando a Experiência do Usuário com a Clipboard API

Copiar código com um clique, colar rich text - a Clipboard API melhora significativamente a usabilidade de aplicações web. Com o Claude Code, você pode construir rapidamente implementações que consideram compatibilidade entre navegadores e segurança.

Botão de Cópia para Blocos de Código

> Adicione um botão de cópia aos blocos de código.
> Exiba feedback "Copiado" após o clique.
// components/CopyButton.tsx
import { useState, useCallback } from 'react';

interface CopyButtonProps {
  text: string;
}

export function CopyButton({ text }: CopyButtonProps) {
  const [copied, setCopied] = useState(false);

  const handleCopy = useCallback(async () => {
    try {
      await navigator.clipboard.writeText(text);
      setCopied(true);
      setTimeout(() => setCopied(false), 2000);
    } catch (err) {
      // Fallback
      fallbackCopy(text);
      setCopied(true);
      setTimeout(() => setCopied(false), 2000);
    }
  }, [text]);

  return (
    <button
      onClick={handleCopy}
      className="absolute right-2 top-2 rounded bg-gray-700 px-2 py-1 text-xs text-white
        transition-colors hover:bg-gray-600"
      aria-label={copied ? 'Copiado' : 'Copiar código'}
    >
      {copied ? '✓ Copiado' : 'Copiar'}
    </button>
  );
}

function fallbackCopy(text: string): void {
  const textarea = document.createElement('textarea');
  textarea.value = text;
  textarea.style.position = 'fixed';
  textarea.style.opacity = '0';
  document.body.appendChild(textarea);
  textarea.select();
  document.execCommand('copy');
  document.body.removeChild(textarea);
}

Cópia de Rich Text

// utils/clipboard.ts
export async function copyRichText(html: string, plainText: string): Promise<void> {
  if (!navigator.clipboard?.write) {
    fallbackCopy(plainText);
    return;
  }

  const htmlBlob = new Blob([html], { type: 'text/html' });
  const textBlob = new Blob([plainText], { type: 'text/plain' });

  const item = new ClipboardItem({
    'text/html': htmlBlob,
    'text/plain': textBlob,
  });

  await navigator.clipboard.write([item]);
}

// Exemplo de uso: cópia de dados de tabela
async function copyTableAsHtml(data: string[][]) {
  const html = `<table>${data.map(row =>
    `<tr>${row.map(cell => `<td>${cell}</td>`).join('')}</tr>`
  ).join('')}</table>`;
  
  const text = data.map(row => row.join('\t')).join('\n');
  await copyRichText(html, text);
}

Leitura do Clipboard

// Processamento de imagem ao colar
async function handlePaste(e: ClipboardEvent): Promise<void> {
  const items = e.clipboardData?.items;
  if (!items) return;

  for (const item of items) {
    if (item.type.startsWith('image/')) {
      e.preventDefault();
      const blob = item.getAsFile();
      if (blob) {
        const url = URL.createObjectURL(blob);
        insertImage(url);
      }
    }
  }
}

// Verificação de permissão com Permissions API
async function checkClipboardPermission(): Promise<boolean> {
  try {
    const result = await navigator.permissions.query({
      name: 'clipboard-read' as PermissionName,
    });
    return result.state === 'granted' || result.state === 'prompt';
  } catch {
    return false;
  }
}

Funcionalidade de Copiar URL para Compartilhamento

function ShareUrl({ url, title }: { url: string; title: string }) {
  const [copied, setCopied] = useState(false);

  const handleCopy = async () => {
    await navigator.clipboard.writeText(url);
    setCopied(true);
    setTimeout(() => setCopied(false), 3000);
  };

  return (
    <div className="flex items-center gap-2 rounded-lg border p-3">
      <input
        type="text"
        value={url}
        readOnly
        className="flex-1 bg-transparent text-sm outline-none"
      />
      <button
        onClick={handleCopy}
        className="rounded bg-blue-600 px-3 py-1 text-sm text-white hover:bg-blue-700"
      >
        {copied ? 'Copiado!' : 'Copiar URL'}
      </button>
    </div>
  );
}

Considerações de Segurança

// Colagem com sanitização
function sanitizePastedContent(html: string): string {
  const div = document.createElement('div');
  div.innerHTML = html;
  
  // Remover tags de script
  div.querySelectorAll('script, iframe, object, embed').forEach(el => el.remove());
  
  // Remover atributos de event handler
  div.querySelectorAll('*').forEach(el => {
    Array.from(el.attributes)
      .filter(attr => attr.name.startsWith('on'))
      .forEach(attr => el.removeAttribute(attr.name));
  });
  
  return div.innerHTML;
}

Resumo

Utilizar a Clipboard API pode melhorar significativamente a UX de funcionalidades como cópia de blocos de código e compartilhamento. Com o Claude Code, é possível criar implementações robustas que incluem processamento de fallback e medidas de segurança. Combinando com a Web Share API, você pode oferecer funcionalidades de compartilhamento ainda mais flexíveis. Não se esqueça de considerar também a otimização de performance. Para especificações detalhadas, consulte o MDN Web Docs.

#Claude Code #Clipboard API #JavaScript #UX #Web API