diff --git a/src/components/audio-player/audio-element.tsx b/src/components/audio-player/audio-element.tsx new file mode 100644 index 00000000..8bbb1a27 --- /dev/null +++ b/src/components/audio-player/audio-element.tsx @@ -0,0 +1,20 @@ +import React from 'react'; +import styled from 'styled-components'; + +const AudioWrapper = styled.div` + width: 100%; + height: 100%; + display: flex; + align-items: center; + justify-content: flex-start; +`; + +const AudioElement: React.FC = (props) => { + return ( + + + + ); +}; + +export default AudioElement; diff --git a/src/locales/en-US/playground.ts b/src/locales/en-US/playground.ts index 41d9e788..fd376636 100644 --- a/src/locales/en-US/playground.ts +++ b/src/locales/en-US/playground.ts @@ -90,7 +90,7 @@ export default { 'playground.audio.stoprecord': 'Stop Recording', 'playground.audio.generating.tips': 'Generated text will appear here.', 'playground.audio.uploadfile.tips': - 'Please upload an audio file, supported formats: {formats}', + 'Upload an audio file, supported formats: {formats}', 'playground.input.multiplePaste': 'Batch Input Mode', 'playground.input.multiplePaste.tips': 'When enabled, pasted multi-line text will be automatically split by newline into separate entries in the form.', diff --git a/src/locales/zh-CN/playground.ts b/src/locales/zh-CN/playground.ts index 5602d41f..3401c561 100644 --- a/src/locales/zh-CN/playground.ts +++ b/src/locales/zh-CN/playground.ts @@ -87,7 +87,7 @@ export default { 'playground.audio.startrecord': '开始录音', 'playground.audio.stoprecord': '停止录音', 'playground.audio.generating.tips': '生成的文本将出现在这里', - 'playground.audio.uploadfile.tips': '请上传音频文件,支持格式:{formats}', + 'playground.audio.uploadfile.tips': '上传音频文件,支持格式:{formats}', 'playground.audio.button.generate': '生成文本', 'playground.input.multiplePaste': '批量输入', 'playground.input.multiplePaste.tips': diff --git a/src/pages/playground/components/message-input.tsx b/src/pages/playground/components/message-input.tsx index 1dee5502..0a75f10e 100644 --- a/src/pages/playground/components/message-input.tsx +++ b/src/pages/playground/components/message-input.tsx @@ -1,7 +1,14 @@ +import AudioElement from '@/components/audio-player/audio-element'; import IconFont from '@/components/icon-font'; +import UploadAudio from '@/components/upload-audio'; import HotKeys, { KeyMap } from '@/config/hotkeys'; -import { convertFileToBase64 } from '@/utils/load-audio-file'; -import { ClearOutlined, SendOutlined, SwapOutlined } from '@ant-design/icons'; +import { convertFileToBase64, readAudioFile } from '@/utils/load-audio-file'; +import { + ClearOutlined, + CustomerServiceOutlined, + SendOutlined, + SwapOutlined +} from '@ant-design/icons'; import { useIntl } from '@umijs/max'; import { Button, Checkbox, Divider, Input, Tooltip } from 'antd'; import _ from 'lodash'; @@ -14,8 +21,9 @@ import React, { useState } from 'react'; import { useHotkeys } from 'react-hotkeys-hook'; +import styled from 'styled-components'; import { Roles } from '../config'; -import { MessageItem } from '../config/types'; +import { AudioFormat, MessageItem } from '../config/types'; import '../style/message-input.less'; import ThumbImg from './thumb-img'; import UploadImg from './upload-img'; @@ -26,6 +34,12 @@ const audioTypeMap: Record = { 'audio/mpeg': 'mp3' }; +const AudioWrapper = styled.div` + audio { + padding-top: 10px; + } +`; + type CurrentMessage = Omit; type ActionType = @@ -139,9 +153,14 @@ const MessageInput: React.FC = forwardRef( content: '', imgs: [] }); - const imgCountRef = useRef(0); + const uidCountRef = useRef(0); const inputRef = useRef(null); + const updateUidCount = () => { + uidCountRef.current += 1; + return uidCountRef.current; + }; + const isDisabled = useMemo(() => { return disabled ? true @@ -239,9 +258,9 @@ const MessageInput: React.FC = forwardRef( if (imgs.length) { const list = _.map(imgs, (img: string) => { - imgCountRef.current += 1; + updateUidCount(); return { - uid: imgCountRef.current, + uid: uidCountRef.current, dataUrl: img }; }); @@ -273,14 +292,19 @@ const MessageInput: React.FC = forwardRef( }) => { // convert audio file to base64 try { - console.log('audio file====', data.file); const base64Audio = await convertFileToBase64(data.file); + const audioData = await readAudioFile(data.file); + console.log('audioData====', audioData); setMessage({ ...message, - audio: { - format: audioTypeMap[data.file.type], - dataUrl: base64Audio - } + audio: [ + { + uid: updateUidCount(), + format: audioTypeMap[data.file.type] as AudioFormat, + base64: base64Audio.split(',')[1], + data: _.pick(audioData, ['url', 'name', 'duration']) + } + ] }); } catch (error) { console.error('Error converting audio to Base64:', error); @@ -298,6 +322,17 @@ const MessageInput: React.FC = forwardRef( }); }; + const handleDeleteAudio = (uid: number | string) => { + const list = _.filter( + message.audio, + (item: MessageItem) => item.uid !== uid + ); + setMessage({ + ...message, + audio: list + }); + }; + const handleOnPaste = (e: any) => { const text = e.clipboardData.getData('text'); if (!text) { @@ -318,16 +353,6 @@ const MessageInput: React.FC = forwardRef( } }; - const handleDeleteLastImage = useCallback(() => { - if (message.imgs && message.imgs?.length > 0) { - const newImgList = [...(message.imgs || [])]; - const lastImage = newImgList.pop(); - if (lastImage) { - handleDeleteImg(lastImage.uid); - } - } - }, [message.imgs, handleDeleteImg]); - useImperativeHandle(ref, () => ({ handleInputChange: handleInputChange })); @@ -387,7 +412,7 @@ const MessageInput: React.FC = forwardRef( size="middle" > )} - {/* {actions.includes('upload') && message.role === Roles.User && ( + {actions.includes('upload') && message.role === Roles.User && ( = forwardRef( icon={} onChange={handleUploadAudioChange} > - )} */} - {actions.includes('upload') && message.role === Roles.User && ( - )} {tools} {actions.includes('clear') && ( @@ -490,11 +509,22 @@ const MessageInput: React.FC = forwardRef( )} - +
+ + {message.audio && message.audio.length > 0 && ( + + + + )} +
{actions.includes('paste') ? (