|
|
@@ -12,17 +12,40 @@
|
|
|
</div>
|
|
|
<div v-else-if="isPdfFile(file.name)" class="pdf-preview">
|
|
|
<iframe v-if="file.preview" :src="file.preview" frameborder="0"></iframe>
|
|
|
- <div v-else class="pdf-no-preview">无法加载PDF预览</div>
|
|
|
+ <div v-else class="no-preview-text">无法加载PDF预览</div>
|
|
|
</div>
|
|
|
- <div v-else class="text-preview">
|
|
|
+ <div v-else-if="isVideoFile(file.name)" class="video-preview">
|
|
|
+ <video v-if="file.preview" controls>
|
|
|
+ <source :src="file.preview" />
|
|
|
+ 您的浏览器不支持视频预览
|
|
|
+ </video>
|
|
|
+ <div v-else class="no-preview-text">无法加载视频预览</div>
|
|
|
+ </div>
|
|
|
+ <div v-else-if="isAudioFile(file.name)" class="audio-preview">
|
|
|
+ <div class="audio-info">
|
|
|
+ <div class="audio-icon"></div>
|
|
|
+ <span class="audio-name">{{ file.name }}</span>
|
|
|
+ </div>
|
|
|
+ <audio v-if="file.preview" controls>
|
|
|
+ <source :src="file.preview" />
|
|
|
+ 您的浏览器不支持音频预览
|
|
|
+ </audio>
|
|
|
+ <div v-else class="no-preview-text">无法加载音频预览</div>
|
|
|
+ </div>
|
|
|
+ <div v-else-if="isTextFile(file.name)" class="text-preview">
|
|
|
<pre>{{ file.content || '文件内容加载中...' }}</pre>
|
|
|
</div>
|
|
|
+ <div v-else class="no-preview">
|
|
|
+ <div class="no-preview-icon"></div>
|
|
|
+ <div class="no-preview-text">不支持预览此文件格式</div>
|
|
|
+ <div class="no-preview-hint">{{ getFileExtension(file.name) }} 格式文件暂不支持在线预览</div>
|
|
|
+ </div>
|
|
|
</div>
|
|
|
</div>
|
|
|
</template>
|
|
|
|
|
|
<script setup lang="ts">
|
|
|
- import { isImageFile, isPdfFile } from './utils';
|
|
|
+ import { isImageFile, isPdfFile, isVideoFile, isAudioFile, isTextFile, getFileExtension } from './utils';
|
|
|
import type { AttachedFile } from './types';
|
|
|
|
|
|
defineProps<{
|
|
|
@@ -117,14 +140,51 @@
|
|
|
height: 100%;
|
|
|
border: none;
|
|
|
}
|
|
|
+ }
|
|
|
+
|
|
|
+ .video-preview {
|
|
|
+ width: 100%;
|
|
|
+ height: 100%;
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: center;
|
|
|
+
|
|
|
+ video {
|
|
|
+ width: 100%;
|
|
|
+ max-height: 100%;
|
|
|
+ border-radius: 4px;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .audio-preview {
|
|
|
+ width: 100%;
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ align-items: center;
|
|
|
+ gap: 16px;
|
|
|
+ padding: 20px 0;
|
|
|
|
|
|
- .pdf-no-preview {
|
|
|
+ .audio-info {
|
|
|
display: flex;
|
|
|
align-items: center;
|
|
|
- justify-content: center;
|
|
|
- height: 100%;
|
|
|
- color: #8b949e;
|
|
|
- font-size: 14px;
|
|
|
+ gap: 10px;
|
|
|
+
|
|
|
+ .audio-icon {
|
|
|
+ width: 40px;
|
|
|
+ height: 40px;
|
|
|
+ background-image: var(--img-chat-attach-icon);
|
|
|
+ background-repeat: no-repeat;
|
|
|
+ background-size: 100% 100%;
|
|
|
+ }
|
|
|
+
|
|
|
+ .audio-name {
|
|
|
+ font-size: 14px;
|
|
|
+ color: #e0e6ed;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ audio {
|
|
|
+ width: 100%;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -137,5 +197,33 @@
|
|
|
color: #e0e6ed;
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ .no-preview {
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: center;
|
|
|
+ height: 100%;
|
|
|
+ gap: 12px;
|
|
|
+
|
|
|
+ .no-preview-icon {
|
|
|
+ width: 64px;
|
|
|
+ height: 64px;
|
|
|
+ background-image: var(--img-chat-attach-icon);
|
|
|
+ background-repeat: no-repeat;
|
|
|
+ background-size: 100% 100%;
|
|
|
+ opacity: 0.4;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .no-preview-text {
|
|
|
+ color: #8b949e;
|
|
|
+ font-size: 14px;
|
|
|
+ }
|
|
|
+
|
|
|
+ .no-preview-hint {
|
|
|
+ color: #6e7681;
|
|
|
+ font-size: 12px;
|
|
|
+ }
|
|
|
}
|
|
|
</style>
|