fix: input img url fall back image

This commit is contained in:
jialin
2025-12-02 15:58:17 +08:00
parent ce3a82ddda
commit b9c034469b
6 changed files with 77 additions and 43 deletions
+3 -2
View File
@@ -70,8 +70,9 @@ const AutoImage: React.FC<
setIsError(false);
}, [props.onLoad]);
const handleOnError = useCallback(() => {
const handleOnError = useCallback((e: any) => {
setIsError(true);
e.target.src = fallbackImg;
}, []);
useEffect(() => {
@@ -127,4 +128,4 @@ const AutoImage: React.FC<
);
};
export default React.memo(AutoImage);
export default AutoImage;
+2 -3
View File
@@ -158,8 +158,7 @@ export default {
'playground.uploadfile.sizeError':
'File size exceeds the limit. Maximum allowed: {size}.',
'playground.uploadImage.url.invalid':
'Please enter a direct .png or .jpg image URL (e.g. https://.../image.png). Press ESC to cancel.',
'playground.uploadImage.url.holder':
'Enter an image URL (supports .png, .jpeg, .jpg)',
'Please enter a direct image URL (e.g. https://.../image.png). Press ESC to cancel.',
'playground.uploadImage.url.holder': 'Enter an image URL',
'playground.uploadImage.url.button': 'Add Image from URL'
};
+4 -5
View File
@@ -161,9 +161,8 @@ export default {
'playground.uploadfile.sizeError':
'File size exceeds the limit. Maximum allowed: {size}.',
'playground.uploadImage.url.invalid':
'Please enter a direct .png or .jpg image URL (e.g. https://.../image.png). Press ESC to cancel.',
'playground.uploadImage.url.holder':
'Enter an image URL (supports .png, .jpeg, .jpg)',
'Please enter a direct image URL (e.g. https://.../image.png). Press ESC to cancel.',
'playground.uploadImage.url.holder': 'Enter an image URL',
'playground.uploadImage.url.button': 'Add Image from URL'
};
@@ -171,7 +170,7 @@ export default {
// 1. 'playground.rerank.query.validate': 'The query is required.'
// 2. 'playground.image.generate.error': 'Something went wrong. The image could not be generated.',
// 3. 'playground.uploadfile.sizeError': 'File size exceeds the limit. Maximum allowed: {size}.'
// 4. 'playground.uploadImage.url.invalid': 'Please enter a direct .png or .jpg image URL(e.g. https://.../image.png). Press ESC to cancel.',
// 5. 'playground.uploadImage.url.holder': 'Enter an image URL (supports .png, .jpeg, .jpg)'
// 4. 'playground.uploadImage.url.invalid': 'Please enter a direct image URL(e.g. https://.../image.png). Press ESC to cancel.',
// 5. 'playground.uploadImage.url.holder': 'Enter an image URL'
// 6. 'playground.uploadImage.url.button': 'Add Image from URL'
// ========== End of To-Do List ==========
+4 -5
View File
@@ -155,14 +155,13 @@ export default {
'playground.uploadfile.sizeError':
'Размер файла превышает ограничение. Максимальный размер: {size}.',
'playground.uploadImage.url.invalid':
'Please enter a direct .png or .jpg image URL (e.g. https://.../image.png). Press ESC to cancel.',
'playground.uploadImage.url.holder':
'Enter an image URL (supports .png, .jpeg, .jpg)',
'Please enter a direct image URL (e.g. https://.../image.png). Press ESC to cancel.',
'playground.uploadImage.url.holder': 'Enter an image URL',
'playground.uploadImage.url.button': 'Add Image from URL'
};
// ========== To-Do: Translate Keys (Remove After Translation) ==========
// 1. 'playground.uploadImage.url.invalid': 'Please enter a direct .png or .jpg image URL(e.g. https://.../image.png). Press ESC to cancel.',
// 2. 'playground.uploadImage.url.holder': 'Enter an image URL (supports .png, .jpeg, .jpg)',
// 1. 'playground.uploadImage.url.invalid': 'Please enter a direct image URL(e.g. https://.../image.png). Press ESC to cancel.',
// 2. 'playground.uploadImage.url.holder': 'Enter an image URL',
// 3. 'playground.uploadImage.url.button': 'Add Image from URL'
// ========== End of To-Do List ==========
+2 -3
View File
@@ -151,8 +151,7 @@ export default {
'playground.uploadfile.sizeError':
'上传的文件大小超过限制,最大允许 {size}。',
'playground.uploadImage.url.invalid':
'请输入直接的 .png 或 .jpg 图片链接(例如:https://…/image.png)。按 ESC 可取消。',
'playground.uploadImage.url.holder':
'请输入图片链接(支持 .png、.jpeg、.jpg 格式)',
'请输入直接的图片链接(例如:https://…/image.png)。按 ESC 可取消。',
'playground.uploadImage.url.holder': '请输入图片链接',
'playground.uploadImage.url.button': '从链接添加图片'
};
+62 -25
View File
@@ -1,5 +1,6 @@
import DropDownActions from '@/components/drop-down-actions';
import {
DeleteOutlined,
LinkOutlined,
PictureOutlined,
UploadOutlined
@@ -7,9 +8,25 @@ import {
import { useIntl } from '@umijs/max';
import { Button, Input, Tooltip } from 'antd';
import { useRef, useState } from 'react';
import styled from 'styled-components';
import UploadImg from '../components/upload-img';
const regex = /(https?:\/\/\S+\.(png|jpg|jpeg))/gi;
const ImgInputWrapper = styled.div`
position: relative;
.del-btn {
display: none;
position: absolute;
right: 8px;
top: 50%;
transform: translateY(-50%);
background: var(--ant-color-bg-container);
}
&:hover {
.del-btn {
display: flex;
}
}
`;
const useAddImage = (options: {
size?: 'small' | 'middle' | 'large';
@@ -31,29 +48,39 @@ const useAddImage = (options: {
}, 100);
};
const handleInputImageUrl = (e: any) => {
const url = e.target.value;
const isValid = regex.test(url);
setOpenImgTips(!isValid);
if (isValid) {
const handleInputImageUrl = async (e: any) => {
const url = e.target.value?.trim();
if (url) {
handleUpdateImgList([
{
uid: updateUidCount(),
dataUrl: e.target.value
dataUrl: url
}
]);
setIsFromUrl(false);
}
setTimeout(() => {
setOpenImgTips(false);
}, 2000);
setIsFromUrl(false);
} else {
setOpenImgTips(true);
}
// set openImgTips to false after next frame if is not valid
if (!url) {
requestAnimationFrame(() => {
setTimeout(() => {
setOpenImgTips(false);
}, 3000);
});
}
};
const handleClose = () => {
setIsFromUrl(false);
setOpenImgTips(false);
};
const handleOnEscape = (e: any) => {
if (e.key === 'Escape') {
setIsFromUrl(false);
setOpenImgTips(false);
handleClose();
}
};
@@ -64,17 +91,27 @@ const useAddImage = (options: {
id: 'playground.uploadImage.url.invalid'
})}
>
<Input
ref={inputImgRef}
status={openImgTips ? 'error' : ''}
placeholder={intl.formatMessage({
id: 'playground.uploadImage.url.holder'
})}
style={{ width: 360, height: 32 }}
onBlur={handleInputImageUrl}
onPressEnter={handleInputImageUrl}
onKeyDown={handleOnEscape}
></Input>
<ImgInputWrapper>
<Input
ref={inputImgRef}
status={openImgTips ? 'error' : ''}
placeholder={intl.formatMessage({
id: 'playground.uploadImage.url.holder'
})}
style={{ width: 360, height: 32 }}
onBlur={handleInputImageUrl}
onPressEnter={handleInputImageUrl}
onKeyDown={handleOnEscape}
></Input>
<div className="del-btn">
<Button
onClick={handleClose}
icon={<DeleteOutlined />}
size="small"
type="text"
></Button>
</div>
</ImgInputWrapper>
</Tooltip>
) : null;