Pular para o conteúdo principal

Referência de Valores de Retorno

Tudo que é retornado pelo hook useDropup.

Visão Geral

const {
files, // Array de objetos de arquivo
state, // Estado atual
actions, // Ações disponíveis
getDropProps, // Props para zona de drop
getInputProps, // Props para elemento input
openFileDialog, // Abrir seletor de arquivos
} = useDropup();

files

Array de objetos DropupFile representando todos os arquivos adicionados.

const { files } = useDropup();

files.forEach(file => {
console.log(file.id); // "abc123"
console.log(file.name); // "foto.jpg"
console.log(file.size); // 1234567
console.log(file.type); // "image/jpeg"
console.log(file.status); // "idle" | "uploading" | "complete" | "error"
console.log(file.progress); // 0-100
console.log(file.preview); // "blob:http://..." (apenas imagens)
console.log(file.uploadedUrl); // "https://..." (após upload)
console.log(file.error); // DropupError (se falhou)
});

Propriedades do DropupFile

PropriedadeTipoDescrição
idstringIdentificador único
fileFileObjeto File nativo do navegador
namestringNome do arquivo
sizenumberTamanho em bytes
typestringTipo MIME
statusFileStatusStatus atual
progressnumberProgresso do upload (0-100)
previewstring | undefinedURL de preview para imagens
uploadedUrlstring | undefinedURL após upload bem-sucedido
responseunknownDados da resposta do servidor
errorDropupError | undefinedErro se o upload falhou
metaRecord<string, unknown>Metadados personalizados

Valores de FileStatus

StatusDescrição
'idle'Arquivo adicionado, não enviando
'uploading'Upload em andamento
'complete'Upload bem-sucedido
'error'Upload falhou
'paused'Upload pausado (uploads retomáveis)

state

Estado atual da dropzone.

const { state } = useDropup();

console.log(state.isDragging); // true quando arrastando sobre
console.log(state.isDragAccept); // true quando arquivos arrastados são válidos
console.log(state.isDragReject); // true quando arquivos arrastados são inválidos
console.log(state.isUploading); // true quando algum arquivo está enviando
console.log(state.progress); // progresso geral 0-100
console.log(state.status); // 'idle' | 'uploading' | 'complete' | 'error'

Propriedades do State

PropriedadeTipoDescrição
isDraggingbooleanArquivos sendo arrastados sobre a zona de drop
isDragAcceptbooleanArquivos arrastados passam na validação
isDragRejectbooleanArquivos arrastados falham na validação
isUploadingbooleanAlgum arquivo sendo enviado atualmente
progressnumberProgresso médio de todos os arquivos (0-100)
statusDropupStatusStatus geral do upload

Valores de DropupStatus

StatusDescrição
'idle'Nenhum upload em andamento
'uploading'Um ou mais arquivos sendo enviados
'complete'Todos os uploads finalizados com sucesso
'error'Um ou mais uploads falharam

actions

Objeto contendo todas as ações disponíveis.

const { actions } = useDropup();

// Iniciar uploads
actions.upload(); // Enviar todos os arquivos idle
actions.upload(['id1', 'id2']); // Enviar arquivos específicos

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

// Remover arquivos
actions.remove('file-id'); // Remover arquivo específico
actions.reset(); // Remover todos os arquivos

// Tentar novamente uploads falhos
actions.retry(); // Tentar novamente todos os falhos
actions.retry(['id1']); // Tentar novamente arquivos específicos

// Adicionar arquivos programaticamente
actions.addFiles(fileList); // Adicionar File[] ou FileList

// Atualizar metadados do arquivo
actions.updateFileMeta('file-id', { tag: 'importante' });

Métodos de Ação

upload(fileIds?)

Iniciar upload de arquivos.

// Enviar todos os arquivos idle
actions.upload();

// Enviar arquivos específicos
actions.upload(['file-id-1', 'file-id-2']);
ParâmetroTipoDescrição
fileIdsstring[] (opcional)IDs específicos dos arquivos para enviar

cancel(fileId?)

Cancelar uploads em andamento.

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

// Cancelar arquivo específico
actions.cancel('file-id');
ParâmetroTipoDescrição
fileIdstring (opcional)ID específico do arquivo para cancelar

remove(fileId)

Remover um arquivo da lista.

actions.remove('file-id');
ParâmetroTipoDescrição
fileIdstringID do arquivo para remover

reset()

Remover todos os arquivos e resetar estado.

actions.reset();

retry(fileIds?)

Tentar novamente uploads falhos.

// Tentar novamente todos os uploads falhos
actions.retry();

// Tentar novamente arquivos específicos
actions.retry(['file-id-1']);
ParâmetroTipoDescrição
fileIdsstring[] (opcional)IDs específicos dos arquivos para tentar novamente

addFiles(files)

Adicionar arquivos programaticamente.

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

// De outra fonte
actions.addFiles([file1, file2]);
ParâmetroTipoDescrição
filesFile[] | FileListArquivos para adicionar

updateFileMeta(fileId, meta)

Atualizar metadados do arquivo.

actions.updateFileMeta('file-id', {
descricao: 'Minha foto',
tags: ['ferias', '2024'],
});
ParâmetroTipoDescrição
fileIdstringID do arquivo para atualizar
metaRecord<string, unknown>Metadados para mesclar

getDropProps

Retorna props para espalhar no elemento da zona de drop.

const { getDropProps, getInputProps } = useDropup();

<div {...getDropProps()}>
<input {...getInputProps()} />
Solte arquivos aqui
</div>

Com Props Personalizadas

<div
{...getDropProps({
className: 'minha-dropzone',
onClick: (e) => {
// Seu handler de clique personalizado
console.log('Clicado!');
},
})}
>
<input {...getInputProps()} />
</div>

Props Retornadas

PropriedadeTipoDescrição
onDragEnterfunctionHandler de entrada de arraste
onDragOverfunctionHandler de arraste sobre
onDragLeavefunctionHandler de saída de arraste
onDropfunctionHandler de soltar
onClickfunctionHandler de clique (abre diálogo)
rolestringRole de acessibilidade
tabIndexnumberTab index para foco

getInputProps

Retorna props para espalhar no input de arquivo oculto.

const { getInputProps } = useDropup();

<input {...getInputProps()} />

Com Props Personalizadas

<input
{...getInputProps({
id: 'file-input',
name: 'files',
})}
/>

Props Retornadas

PropriedadeTipoDescrição
type'file'Tipo do input
acceptstringTipos de arquivo aceitos
multiplebooleanPermitir múltiplos arquivos
onChangefunctionHandler de mudança
styleobjectEstilos ocultos

openFileDialog

Função para abrir programaticamente o seletor de arquivos.

const { openFileDialog } = useDropup();

<button onClick={openFileDialog}>
Procurar Arquivos
</button>

Exemplos de Uso

Lista de Arquivos Completa

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

return (
<div>
<h3>Arquivos ({files.length})</h3>

{files.map(file => (
<div key={file.id}>
{file.preview && (
<img src={file.preview} alt="" width={50} />
)}
<span>{file.name}</span>
<span>{(file.size / 1024).toFixed(1)} KB</span>
<span>{file.status}</span>

{file.status === 'uploading' && (
<progress value={file.progress} max={100} />
)}

{file.status === 'error' && (
<>
<span style={{ color: 'red' }}>{file.error?.message}</span>
<button onClick={() => actions.retry([file.id])}>Tentar Novamente</button>
</>
)}

<button onClick={() => actions.remove(file.id)}>Remover</button>
</div>
))}

{state.isUploading && (
<p>Enviando... {state.progress}%</p>
)}

<button
onClick={() => actions.upload()}
disabled={state.isUploading || files.length === 0}
>
Enviar Todos
</button>

<button onClick={() => actions.reset()}>
Limpar Todos
</button>
</div>
);
}

Estilização de Estado de Arraste

function StyledDropzone() {
const { state, getDropProps, getInputProps } = useDropup({
accept: 'image/*',
});

const getStyle = () => {
if (state.isDragAccept) return { borderColor: 'green', backgroundColor: '#e8f5e9' };
if (state.isDragReject) return { borderColor: 'red', backgroundColor: '#ffebee' };
if (state.isDragging) return { borderColor: 'blue', backgroundColor: '#e3f2fd' };
return { borderColor: 'gray', backgroundColor: 'white' };
};

return (
<div
{...getDropProps()}
style={{
border: '2px dashed',
borderRadius: 8,
padding: 40,
textAlign: 'center',
transition: 'all 0.2s',
...getStyle(),
}}
>
<input {...getInputProps()} />
{state.isDragReject ? (
<p>Apenas imagens são aceitas!</p>
) : (
<p>Solte imagens aqui</p>
)}
</div>
);
}