Componente UploadFiles
O componente UploadFiles é uma interface de usuário para compartilhar arquivos, como fotos, vídeos, documentos e figurinhas. Ele utiliza o componente Upload da biblioteca antd para gerenciar o upload de arquivos, bem como a visualização de imagens.
Função e Utilização
isClicked
: Hooks do React para acessar o estado de SearchContext e ChatContext.useEffect
: Hook do React para executar efeitos colaterais em resposta a mudanças de estado.ChangeEvent
: Tipagem de evento para manipulação de mudanças no input de busca.
Funções Utilizadas
handleChange
: Função para atualizar a lista de arquivos carregados.handlePreview
: Função para exibir a visualização da imagem quando um arquivo é clicado.uploadButton
: Componente para o botão de upload, incluindo o ícone PlusOutlined.
Estrutura do Código
import { PlusOutlined } from '@ant-design/icons'
import { Button, Flex, Image, Upload, UploadFile, UploadProps } from 'antd'
import React, { useState } from 'react'
import './style.css'
const gradient = 'linear-gradient(to right, #1E2C39, #2B4156)'
const buttonStyle: React.CSSProperties = {
border: 'none',
color: 'white',
fontSize: '1rem',
background: gradient,
}
const confirmButtonStyle: React.CSSProperties = {
border: 'none',
color: 'white',
fontSize: '1rem',
backgroundColor: '#2B4156',
width: '100%',
}
export const UploadFiles = () => {
const [isClicked, setIsClicked] = useState(false)
const [previewOpen, setPreviewOpen] = useState(false)
const [previewImage, setPreviewImage] = useState('')
const [fileList, setFileList] = useState<UploadFile[]>([])
const handlePreview = async (file: UploadFile) => {
setPreviewImage(file.url || (file.preview as string))
setPreviewOpen(true)
}
const handleChange: UploadProps['onChange'] = ({ fileList: newFileList }) => {
setFileList(newFileList)
}
const uploadButton = (
<button style={{ border: 0, background: 'none' }} type="button">
<PlusOutlined
style={{
color: 'white',
}}
/>
<div style={{ marginTop: 8, color: 'white' }}>Upload</div>
</button>
)
return (
<Flex
style={{
position: 'absolute',
backgroundColor: '#17212B',
height: 'fit-content',
borderRadius: '14px',
width: 'fit-content',
minWidth: '250px',
bottom: '50px',
margin: '14px',
display: 'flex',
flexDirection: 'column',
padding: '14px 24px',
gap: '14px',
}}
>
{isClicked ? (
<Flex vertical align="center" gap={24}>
<h4
style={{
color: 'white',
}}
>
Compartilhe arquivos ...
</h4>
<Flex>
{previewImage ? (
<Image
wrapperStyle={{ display: 'none' }}
preview={{
visible: previewOpen,
onVisibleChange: (visible) => setPreviewOpen(visible),
afterOpenChange: (visible) => !visible && setPreviewImage(''),
}}
src={previewImage}
alt=""
/>
) : (
<Upload
action={''}
listType="picture-circle"
fileList={fileList}
onPreview={handlePreview}
onChange={handleChange}
>
{fileList?.length >= 8 ? null : uploadButton}
</Upload>
)}
</Flex>
<Flex gap={24}>
<Button
style={confirmButtonStyle}
onClick={() => setIsClicked(!isClicked)}
>
Voltar
</Button>
<Button style={confirmButtonStyle}>Compartilhar</Button>
</Flex>
</Flex>
) : (
<>
<Button style={buttonStyle} onClick={() => setIsClicked(!isClicked)}>
Fotos e videos
</Button>
<Button style={buttonStyle} onClick={() => setIsClicked(!isClicked)}>
Documentos
</Button>
<Button style={buttonStyle} onClick={() => setIsClicked(!isClicked)}>
Figurinhas
</Button>
</>
)}
</Flex>
)
}
Exemplo de Uso
O componente UploadFiles permite que os usuários carreguem e visualizem arquivos em uma interface amigável, com botões para selecionar diferentes tipos de arquivos. Ele utiliza o componente Upload do antd para gerenciar o upload e a visualização de arquivos, e estilos personalizados para uma aparência moderna e consistente.
Exemplo de Uso
<UploadFiles />