feat: image attachment copy and download (#3488)
This commit is contained in:
parent
9655b33903
commit
e8ae776084
@ -1,6 +1,17 @@
|
|||||||
|
import {
|
||||||
|
CopyOutlined,
|
||||||
|
DownloadOutlined,
|
||||||
|
RotateLeftOutlined,
|
||||||
|
RotateRightOutlined,
|
||||||
|
SwapOutlined,
|
||||||
|
UndoOutlined,
|
||||||
|
ZoomInOutlined,
|
||||||
|
ZoomOutOutlined
|
||||||
|
} from '@ant-design/icons'
|
||||||
import FileManager from '@renderer/services/FileManager'
|
import FileManager from '@renderer/services/FileManager'
|
||||||
import { FileTypes, Message } from '@renderer/types'
|
import { FileType, FileTypes, Message } from '@renderer/types'
|
||||||
import { Image as AntdImage, Upload } from 'antd'
|
import { download } from '@renderer/utils/download'
|
||||||
|
import { Image as AntdImage, Space, Upload } from 'antd'
|
||||||
import { FC } from 'react'
|
import { FC } from 'react'
|
||||||
import styled from 'styled-components'
|
import styled from 'styled-components'
|
||||||
|
|
||||||
@ -9,6 +20,13 @@ interface Props {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const MessageAttachments: FC<Props> = ({ message }) => {
|
const MessageAttachments: FC<Props> = ({ message }) => {
|
||||||
|
const handleCopyImage = async (image: FileType) => {
|
||||||
|
const data = await FileManager.readFile(image)
|
||||||
|
const blob = new Blob([data], { type: 'image/png' })
|
||||||
|
const item = new ClipboardItem({ [blob.type]: blob })
|
||||||
|
await navigator.clipboard.write([item])
|
||||||
|
}
|
||||||
|
|
||||||
if (!message.files) {
|
if (!message.files) {
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
@ -16,7 +34,34 @@ const MessageAttachments: FC<Props> = ({ message }) => {
|
|||||||
if (message?.files && message.files[0]?.type === FileTypes.IMAGE) {
|
if (message?.files && message.files[0]?.type === FileTypes.IMAGE) {
|
||||||
return (
|
return (
|
||||||
<Container style={{ marginBottom: 8 }}>
|
<Container style={{ marginBottom: 8 }}>
|
||||||
{message.files?.map((image) => <Image src={FileManager.getFileUrl(image)} key={image.id} width="33%" />)}
|
{message.files?.map((image) => (
|
||||||
|
<Image
|
||||||
|
src={FileManager.getFileUrl(image)}
|
||||||
|
key={image.id}
|
||||||
|
width="33%"
|
||||||
|
preview={{
|
||||||
|
toolbarRender: (
|
||||||
|
_,
|
||||||
|
{
|
||||||
|
transform: { scale },
|
||||||
|
actions: { onFlipY, onFlipX, onRotateLeft, onRotateRight, onZoomOut, onZoomIn, onReset }
|
||||||
|
}
|
||||||
|
) => (
|
||||||
|
<ToobarWrapper size={12} className="toolbar-wrapper">
|
||||||
|
<SwapOutlined rotate={90} onClick={onFlipY} />
|
||||||
|
<SwapOutlined onClick={onFlipX} />
|
||||||
|
<RotateLeftOutlined onClick={onRotateLeft} />
|
||||||
|
<RotateRightOutlined onClick={onRotateRight} />
|
||||||
|
<ZoomOutOutlined disabled={scale === 1} onClick={onZoomOut} />
|
||||||
|
<ZoomInOutlined disabled={scale === 50} onClick={onZoomIn} />
|
||||||
|
<UndoOutlined onClick={onReset} />
|
||||||
|
<CopyOutlined onClick={() => handleCopyImage(image)} />
|
||||||
|
<DownloadOutlined onClick={() => download(FileManager.getFileUrl(image))} />
|
||||||
|
</ToobarWrapper>
|
||||||
|
)
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
))}
|
||||||
</Container>
|
</Container>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@ -48,4 +93,19 @@ const Image = styled(AntdImage)`
|
|||||||
border-radius: 10px;
|
border-radius: 10px;
|
||||||
`
|
`
|
||||||
|
|
||||||
|
const ToobarWrapper = styled(Space)`
|
||||||
|
padding: 0px 24px;
|
||||||
|
color: #fff;
|
||||||
|
font-size: 20px;
|
||||||
|
background-color: rgba(0, 0, 0, 0.1);
|
||||||
|
border-radius: 100px;
|
||||||
|
.anticon {
|
||||||
|
padding: 12px;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
.anticon:hover {
|
||||||
|
opacity: 0.3;
|
||||||
|
}
|
||||||
|
`
|
||||||
|
|
||||||
export default MessageAttachments
|
export default MessageAttachments
|
||||||
|
|||||||
@ -28,6 +28,10 @@ class FileManager {
|
|||||||
return Promise.all(files.map((file) => this.addFile(file)))
|
return Promise.all(files.map((file) => this.addFile(file)))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static async readFile(file: FileType): Promise<Buffer> {
|
||||||
|
return (await window.api.file.binaryFile(file.id + file.ext)).data
|
||||||
|
}
|
||||||
|
|
||||||
static async uploadFile(file: FileType): Promise<FileType> {
|
static async uploadFile(file: FileType): Promise<FileType> {
|
||||||
console.log(`[FileManager] Uploading file: ${JSON.stringify(file)}`)
|
console.log(`[FileManager] Uploading file: ${JSON.stringify(file)}`)
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user