diff --git a/web/src/assets/images/file/audio_disabled.svg b/web/src/assets/images/file/audio_disabled.svg new file mode 100644 index 00000000..93d83a0a --- /dev/null +++ b/web/src/assets/images/file/audio_disabled.svg @@ -0,0 +1,13 @@ + + + 音乐 + + + + + + + + + + \ No newline at end of file diff --git a/web/src/assets/images/file/csv_disabled.svg b/web/src/assets/images/file/csv_disabled.svg new file mode 100644 index 00000000..29add1f6 --- /dev/null +++ b/web/src/assets/images/file/csv_disabled.svg @@ -0,0 +1,18 @@ + + + 编组 57 + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/web/src/assets/images/file/excel_disabled.svg b/web/src/assets/images/file/excel_disabled.svg new file mode 100644 index 00000000..5e2136e9 --- /dev/null +++ b/web/src/assets/images/file/excel_disabled.svg @@ -0,0 +1,17 @@ + + + Excel + + + + + + + + + + + + + + \ No newline at end of file diff --git a/web/src/assets/images/file/html_disabled.svg b/web/src/assets/images/file/html_disabled.svg new file mode 100644 index 00000000..fa237301 --- /dev/null +++ b/web/src/assets/images/file/html_disabled.svg @@ -0,0 +1,17 @@ + + + Word + + + + + + + + + + + + + + \ No newline at end of file diff --git a/web/src/assets/images/file/json_disabled.svg b/web/src/assets/images/file/json_disabled.svg new file mode 100644 index 00000000..267e2b46 --- /dev/null +++ b/web/src/assets/images/file/json_disabled.svg @@ -0,0 +1,14 @@ + + + JSON + + + + + + + + + + + \ No newline at end of file diff --git a/web/src/assets/images/file/md_disabled.svg b/web/src/assets/images/file/md_disabled.svg new file mode 100644 index 00000000..8fe81fe7 --- /dev/null +++ b/web/src/assets/images/file/md_disabled.svg @@ -0,0 +1,19 @@ + + + PDF + + + + + + + + + + MD + + + + + + \ No newline at end of file diff --git a/web/src/assets/images/file/pause.svg b/web/src/assets/images/file/pause.svg new file mode 100644 index 00000000..0e26ece0 --- /dev/null +++ b/web/src/assets/images/file/pause.svg @@ -0,0 +1,16 @@ + + + 播放 + + + + + + + + + + + + + \ No newline at end of file diff --git a/web/src/assets/images/file/pdf_disabled.svg b/web/src/assets/images/file/pdf_disabled.svg new file mode 100644 index 00000000..950edcb8 --- /dev/null +++ b/web/src/assets/images/file/pdf_disabled.svg @@ -0,0 +1,20 @@ + + + PDF + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/web/src/assets/images/file/play.svg b/web/src/assets/images/file/play.svg new file mode 100644 index 00000000..f2ff9cb7 --- /dev/null +++ b/web/src/assets/images/file/play.svg @@ -0,0 +1,28 @@ + + + 播放 + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/web/src/assets/images/file/ppt_disabled.svg b/web/src/assets/images/file/ppt_disabled.svg new file mode 100644 index 00000000..f3da453e --- /dev/null +++ b/web/src/assets/images/file/ppt_disabled.svg @@ -0,0 +1,14 @@ + + + file-ppt-2-fill + + + + + + + + + + + \ No newline at end of file diff --git a/web/src/assets/images/file/txt_disabled.svg b/web/src/assets/images/file/txt_disabled.svg new file mode 100644 index 00000000..100565ce --- /dev/null +++ b/web/src/assets/images/file/txt_disabled.svg @@ -0,0 +1,14 @@ + + + txt + + + + + + + + + + + \ No newline at end of file diff --git a/web/src/assets/images/file/video_disabled.svg b/web/src/assets/images/file/video_disabled.svg new file mode 100644 index 00000000..f8f71c2a --- /dev/null +++ b/web/src/assets/images/file/video_disabled.svg @@ -0,0 +1,16 @@ + + + 编组 59 + + + + + + + + + + + + + \ No newline at end of file diff --git a/web/src/assets/images/file/word_disabled.svg b/web/src/assets/images/file/word_disabled.svg new file mode 100644 index 00000000..d4f9e6ec --- /dev/null +++ b/web/src/assets/images/file/word_disabled.svg @@ -0,0 +1,15 @@ + + + Word + + + + + + + + + + + + \ No newline at end of file diff --git a/web/src/components/Chat/FileList.tsx b/web/src/components/Chat/FileList.tsx index 3c84a59f..41fed7d8 100644 --- a/web/src/components/Chat/FileList.tsx +++ b/web/src/components/Chat/FileList.tsx @@ -1,5 +1,6 @@ -import { type FC } from 'react' +import { type FC, useRef, useState } from 'react' import { Flex, Spin } from 'antd' +import { CloseOutlined } from '@ant-design/icons' import clsx from 'clsx' import type { UploadFile, FlexProps } from 'antd' @@ -13,101 +14,154 @@ interface FileListProps { const FileList: FC = ({ fileList, onDelete, wrap, className = "rb:mx-3! rb:mt-3! rb:w-max!" }) => { + const [playingUid, setPlayingUid] = useState(null) + const mediaRef = useRef(null) + + const handleClose = () => { + mediaRef.current?.pause() + setPlayingUid(null) + } + + const playingFile = fileList.find(f => f.uid === playingUid) + if (!fileList.length) return null - return ( - - {fileList.map((file) => { - if (file.type?.includes('image')) { - return ( - -
- {file.name} - {onDelete &&
onDelete(file)} - >
} -
-
- ) - } - if (file.type?.includes('video')) { - return ( - -
-
-
- ) - } - if (file.type?.includes('audio')) { - return ( - -
-
-
- ) - } - return ( - - -
{ + console.log('getFileIconClassName file', file) + if (file.status === 'uploading') { + return file.type?.includes('audio') + ? "rb:bg-[url('@/assets/images/file/audio_disabled.svg')]" + : file.type?.includes('video') + ? "rb:bg-[url('@/assets/images/file/video_disabled.svg')]" + : file.type?.includes('pdf') + ? "rb:bg-[url('@/assets/images/file/pdf_disabled.svg')]" + : (file.type?.includes('excel') || file.type?.includes('spreadsheetml.sheet')) + ? "rb:bg-[url('@/assets/images/file/excel_disabled.svg')]" + : file.type?.includes('csv') + ? "rb:bg-[url('@/assets/images/file/csv_disabled.svg')]" + : file.type?.includes('html') + ? "rb:bg-[url('@/assets/images/file/html_disabled.svg')]" + : file.type?.includes('json') + ? "rb:bg-[url('@/assets/images/file/json_disabled.svg')]" : file.type?.includes('ppt') + ? "rb:bg-[url('@/assets/images/file/ppt_disabled.svg')]" + : file.type?.includes('markdown') + ? "rb:bg-[url('@/assets/images/file/md_disabled.svg')]" + : file.type?.includes('text') + ? "rb:bg-[url('@/assets/images/file/txt_disabled.svg')]" + : (file.type?.includes('doc') || file.type?.includes('docx') || file.type?.includes('word') || file.type?.includes('wordprocessingml.document')) + ? "rb:bg-[url('@/assets/images/file/word_disabled.svg')]" + : "rb:bg-[url('@/assets/images/file/txt_disabled.svg')]" + } + return file.type?.includes('audio') + ? "rb:bg-[url('@/assets/images/file/audio.svg')]" + : file.type?.includes('video') + ? "rb:bg-[url('@/assets/images/file/video.svg')]" + : file.type?.includes('pdf') + ? "rb:bg-[url('@/assets/images/file/pdf.svg')]" + : (file.type?.includes('excel') || file.type?.includes('spreadsheetml.sheet')) + ? "rb:bg-[url('@/assets/images/file/excel.svg')]" + : file.type?.includes('csv') + ? "rb:bg-[url('@/assets/images/file/csv.svg')]" + : file.type?.includes('html') + ? "rb:bg-[url('@/assets/images/file/html.svg')]" + : file.type?.includes('json') + ? "rb:bg-[url('@/assets/images/file/json.svg')]" + : file.type?.includes('ppt') ? "rb:bg-[url('@/assets/images/file/ppt.svg')]" - : file.type?.includes('text') - ? "rb:bg-[url('@/assets/images/file/txt.svg')]" : file.type?.includes('markdown') - ? "rb:bg-[url('@/assets/images/file/md.svg')]" - : (file.type?.includes('doc') || file.type?.includes('docx') || file.type?.includes('word') || file.type?.includes('wordprocessingml.document')) - ? "rb:bg-[url('@/assets/images/file/word.svg')]" - : null - )} - >
-
-
{file.name}
-
{[file.type?.split('/').pop(), file.size].filter(item => item).join(' · ')}
-
- {onDelete &&
onDelete(file)} - >
} -
-
- ) - })} -
+ ? "rb:bg-[url('@/assets/images/file/md.svg')]" + : file.type?.includes('text') + ? "rb:bg-[url('@/assets/images/file/txt.svg')]" + : (file.type?.includes('doc') || file.type?.includes('docx') || file.type?.includes('word') || file.type?.includes('wordprocessingml.document')) + ? "rb:bg-[url('@/assets/images/file/word.svg')]" + : "rb:bg-[url('@/assets/images/file/txt.svg')]" + } + + return ( + <> + + {fileList.map((file) => { + if (file.type?.includes('image')) { + return ( + +
+ {file.name} + {onDelete &&
onDelete(file)} + >
} +
+
+ ) + } + return ( + + +
+
+
{file.name}
+
{[file.type?.split('/').pop(), file.size].filter(item => item).join(' · ')}
+
+ {file.status === 'done' && (file.type?.includes('video') || file.type?.includes('audio')) && +
playingUid === file.uid ? handleClose() : setPlayingUid(file.uid)} + >
+ } + {onDelete &&
onDelete(file)} + >
} +
+
+ ) + })} +
+ + {playingFile && ( +
+ + {playingFile.type?.includes('video') ? ( +
+ )} + ) } diff --git a/web/src/components/Header/index.tsx b/web/src/components/Header/index.tsx index ac59fcc2..0dd51bbd 100644 --- a/web/src/components/Header/index.tsx +++ b/web/src/components/Header/index.tsx @@ -2,7 +2,7 @@ * @Author: ZhaoYing * @Date: 2026-02-02 15:07:49 * @Last Modified by: ZhaoYing - * @Last Modified time: 2026-02-05 13:43:59 + * @Last Modified time: 2026-04-03 20:21:02 */ /** * AppHeader Component @@ -180,7 +180,7 @@ const AppHeader: FC<{source?: 'space' | 'manage';}> = ({source = 'manage'}) => { > - {/[\u4e00-\u9fa5]/.test(user.username) ? user.username.slice(0, 2) : user.username[0]} + {/[\u4e00-\u9fa5]/.test(user.username) ? user.username.slice(user.username.length, -2) : user.username[0]} {user.username}