mirror of https://github.com/msgbyte/tailchat
feat: 输入框粘贴上传图片
parent
1174a56de4
commit
5ffb5c1aee
@ -0,0 +1,34 @@
|
|||||||
|
export class ClipboardHelper {
|
||||||
|
data: DataTransfer;
|
||||||
|
|
||||||
|
constructor(e: { clipboardData: DataTransfer }) {
|
||||||
|
this.data = e.clipboardData;
|
||||||
|
}
|
||||||
|
|
||||||
|
hasImage(): File | false {
|
||||||
|
const image = this.isPasteImage(this.data.items);
|
||||||
|
if (image === false) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const file = image.getAsFile();
|
||||||
|
if (file === null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return file;
|
||||||
|
}
|
||||||
|
|
||||||
|
private isPasteImage(items: DataTransferItemList): DataTransferItem | false {
|
||||||
|
let i = 0;
|
||||||
|
let item: DataTransferItem;
|
||||||
|
while (i < items.length) {
|
||||||
|
item = items[i];
|
||||||
|
if (item.type.indexOf('image') !== -1) {
|
||||||
|
return item;
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,48 @@
|
|||||||
|
import { ModalWrapper } from '@/plugin/common';
|
||||||
|
import { Button } from '@/plugin/component';
|
||||||
|
import React from 'react';
|
||||||
|
import { t, useAsyncFn } from 'tailchat-shared';
|
||||||
|
|
||||||
|
interface ImageUploadPreviewerProps {
|
||||||
|
imageUrl: string;
|
||||||
|
onConfirm: () => void;
|
||||||
|
}
|
||||||
|
export const ImageUploadPreviewer: React.FC<ImageUploadPreviewerProps> =
|
||||||
|
React.memo((props) => {
|
||||||
|
const { imageUrl } = props;
|
||||||
|
|
||||||
|
const [{ loading }, handleConfirm] = useAsyncFn(async () => {
|
||||||
|
if (typeof props.onConfirm === 'function') {
|
||||||
|
await Promise.resolve(props.onConfirm());
|
||||||
|
}
|
||||||
|
}, [props.onConfirm]);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<ModalWrapper style={{ maxHeight: '60vh', maxWidth: '60vw' }}>
|
||||||
|
<div className="flex">
|
||||||
|
<div className="w-2/3 p-2.5 bg-black bg-opacity-20 rounded">
|
||||||
|
<img className="max-h-160" src={imageUrl} />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="w-1/3 p-2 flex flex-col items-end justify-between">
|
||||||
|
<div className="text-right">
|
||||||
|
<div className="text-lg">{t('上传图片到会话')}</div>
|
||||||
|
<div className="text-sm text-gray-400">
|
||||||
|
{t('请勿上传违反当地法律法规的图片')}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<Button
|
||||||
|
className="mt-4"
|
||||||
|
type="primary"
|
||||||
|
loading={loading}
|
||||||
|
onClick={handleConfirm}
|
||||||
|
>
|
||||||
|
{t('确认')}
|
||||||
|
</Button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</ModalWrapper>
|
||||||
|
);
|
||||||
|
});
|
||||||
|
ImageUploadPreviewer.displayName = 'ImageUploadPreviewer';
|
Loading…
Reference in New Issue