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
-
Verifique se
uploadestá configurado:useDropup({ upload: { url: '/api/upload' } }); -
Certifique-se de chamar
actions.upload()(a menos queautoUpload: true) -
Verifique o console do navegador para erros de rede
URLs de preview não funcionam
- Certifique-se de que o arquivo é uma imagem
- Verifique se
generatePreviewsnão estáfalse - Verifique se o objeto de arquivo tem uma propriedade
previewválida
Arrastar e soltar não funciona
- Certifique-se de espalhar
getDropProps()em um elemento container - Inclua o input oculto:
<input {...getInputProps()} /> - Verifique se
disablednão estátrue
Erros de TypeScript
- Atualize para a versão mais recente do Dropup
- Certifique-se de que
tsconfig.jsontemmoduleResolutionadequado - Verifique se
@samithahansaka/dropupestá emdependencies, nãodevDependencies
Vazamentos de memória
- Certifique-se de que componentes usando
useDropupsão desmontados corretamente - Chame
actions.reset()antes de desmontar se necessário - 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?
- Faça um fork do repositório
- Crie uma branch de feature
- 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.