Pular para o conteúdo principal

Perguntas Frequentes

Perguntas e respostas comuns sobre o Dropup.

Geral​

O que é o Dropup?​

Dropup é uma biblioteca React leve e headless para upload de arquivos. Ela fornece funcionalidade de arrastar e soltar, validação de arquivos, rastreamento de progresso de upload e suporte para armazenamento em nuvem - tudo em um pacote com menos de 10KB gzipped.

Por que "headless"?​

Headless significa que o Dropup não inclui nenhum componente de UI. Ele fornece a lógica e o gerenciamento de estado, enquanto você constrói a UI da forma que desejar. Isso lhe dá controle total sobre a aparência.

Qual é o tamanho do bundle?​

  • Core (@samithahansaka/dropup): < 10KB gzipped
  • Com suporte a nuvem: +2KB por provedor
  • Com processamento de imagens: +5KB
  • Com protocolo tus: +3KB (requer tus-js-client como peer)

Suporta TypeScript?​

Sim! O Dropup é escrito em TypeScript e inclui definições de tipos abrangentes. Nenhum pacote @types é necessário.

Qual versão do React é necessária?​

React 16.8+ (requer suporte a hooks).

Uso​

Como faço upload de arquivos?​

const { files, actions } = useDropup({
upload: { url: '/api/upload' },
});

// Upload de todos os arquivos
actions.upload();

// Upload de arquivos específicos
actions.upload(['file-id-1', 'file-id-2']);

Como lido com erros de validação?​

useDropup({
accept: 'image/*',
maxSize: 5 * 1024 * 1024,

onValidationError: (errors) => {
errors.forEach(({ file, errors }) => {
console.log(`${file.name}: ${errors.join(', ')}`);
});
},
});

Posso usar lógica de upload personalizada?​

Sim! Passe uma função em vez de um objeto de configuração:

useDropup({
upload: async (file, options) => {
const { signal, onProgress } = options;

// Sua lógica de upload personalizada
const response = await customUpload(file.file, {
signal,
onProgress,
});

return { url: response.url };
},
});

Como adiciono arquivos programaticamente?​

const { actions } = useDropup();

// Da área de transferência
document.addEventListener('paste', (e) => {
const files = e.clipboardData?.files;
if (files) {
actions.addFiles(files);
}
});

Posso ter múltiplas zonas de soltar?​

Sim! Cada chamada useDropup cria uma instância independente:

const images = useDropup({ accept: 'image/*' });
const documents = useDropup({ accept: '.pdf' });

// Use separadamente
<div {...images.getDropProps()}>...</div>
<div {...documents.getDropProps()}>...</div>

Uploads​

Como mostro o progresso do upload?​

const { files } = useDropup({ upload: { url: '/api/upload' } });

{files.map(file => (
<div key={file.id}>
{file.name}: {file.progress}%
</div>
))}

Como cancelo um upload?​

const { actions } = useDropup();

// Cancelar arquivo específico
actions.cancel('file-id');

// Cancelar todos os uploads
actions.cancel();

Como tento novamente uploads que falharam?​

const { actions } = useDropup();

// Tentar novamente arquivos específicos
actions.retry(['file-id']);

// Tentar novamente todos que falharam
actions.retry();

Suporta uploads em partes?​

Sim! Use createChunkedUploader:

import { createChunkedUploader } from '@samithahansaka/dropup';

useDropup({
upload: createChunkedUploader({
url: '/api/upload/chunk',
chunkSize: 5 * 1024 * 1024, // 5MB
}),
});

Posso fazer upload diretamente para o S3?​

Sim! Use o uploader de nuvem:

import { createS3Uploader } from '@samithahansaka/dropup/cloud/s3';

useDropup({
upload: createS3Uploader({
getPresignedUrl: async (file) => {
const res = await fetch('/api/s3/presign', {
method: 'POST',
body: JSON.stringify({ filename: file.name }),
});
return res.json();
},
}),
});

Validação​

Como restrinjo tipos de arquivo?​

// Por tipo MIME
useDropup({ accept: 'image/*' });

// Por extensão
useDropup({ accept: '.pdf, .doc' });

// Múltiplos
useDropup({ accept: ['image/*', 'application/pdf'] });

Como defino limites de tamanho?​

useDropup({
maxSize: 10 * 1024 * 1024, // 10MB máx
minSize: 1024, // 1KB mín
});

Como limito o número de arquivos?​

useDropup({
maxFiles: 5,
});

Posso adicionar validação personalizada?​

Sim! Use customRules:

useDropup({
customRules: [
(file) => {
if (file.name.includes('draft')) {
return 'Arquivos de rascunho não são permitidos';
}
return true;
},
],
});

Previews​

Como mostro previews de imagens?​

Previews são habilitados por padrão:

const { files } = useDropup();

{files.map(file => (
file.preview && <img src={file.preview} alt="" />
))}

Preciso limpar as URLs de preview?​

Não! O Dropup revoga automaticamente as Object URLs quando os arquivos são removidos ou o componente é desmontado.

Posso desabilitar previews?​

useDropup({ generatePreviews: false });

Solução de Problemas​

Arquivos não estão sendo enviados​

  1. Verifique se upload está configurado:

    useDropup({ upload: { url: '/api/upload' } });
  2. Certifique-se de chamar actions.upload() (a menos que autoUpload: true)

  3. Verifique o console do navegador para erros de rede

URLs de preview não funcionam​

  1. Certifique-se de que o arquivo é uma imagem
  2. Verifique se generatePreviews não está false
  3. Verifique se o objeto de arquivo tem uma propriedade preview válida

Arrastar e soltar não funciona​

  1. Certifique-se de espalhar getDropProps() em um elemento container
  2. Inclua o input oculto: <input {...getInputProps()} />
  3. Verifique se disabled não está true

Erros de TypeScript​

  1. Atualize para a versão mais recente do Dropup
  2. Certifique-se de que tsconfig.json tem moduleResolution adequado
  3. Verifique se @samithahansaka/dropup está em dependencies, não devDependencies

Vazamentos de memória​

  1. Certifique-se de que componentes usando useDropup são desmontados corretamente
  2. Chame actions.reset() antes de desmontar se necessário
  3. Não armazene arquivos em estado externo sem limpeza

Compatibilidade​

Funciona com Next.js?​

Sim! Use a diretiva 'use client':

'use client';
import { useDropup } from '@samithahansaka/dropup';

Funciona com React Native?​

Sim! Use o adaptador nativo:

import { NativeAdapter } from '@samithahansaka/dropup/native';

useDropup({ adapter: NativeAdapter });

Suporta SSR?​

Sim! O Dropup é seguro para SSR. Ele só usa APIs do navegador quando estão disponíveis.

Suporte a navegadores?​

Todos os navegadores modernos:

  • Chrome 60+
  • Firefox 55+
  • Safari 12+
  • Edge 79+

Contribuindo​

Como posso contribuir?​

  1. Faça um fork do repositório
  2. Crie uma branch de feature
  3. Envie um pull request

Veja CONTRIBUTING.md para detalhes.

Como reporto bugs?​

Abra uma issue em github.com/samithahansaka/dropup/issues.

Existe um roadmap?​

Verifique as issues e discussões do GitHub para recursos planejados.