index.vue 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. <script setup lang="ts">
  2. import { ref } from 'vue';
  3. import Chat from './components/Chat.vue';
  4. import FileList from './components/FileList.vue';
  5. import { useMessage } from 'naive-ui';
  6. import { Oss } from '@/api/models';
  7. import { t } from '@/locales';
  8. import FileView from './components/FileView.vue';
  9. const message = useMessage();
  10. const file = ref<Oss>({});
  11. function onSelect(item: Oss) {
  12. if (file.value.url == item.url) {
  13. return;
  14. }
  15. file.value = item;
  16. }
  17. function onClear() {
  18. file.value.url = '';
  19. }
  20. </script>
  21. <template>
  22. <n-layout has-sider class="h-full w-full">
  23. <n-layout-sider
  24. :collapsed-width="0"
  25. collapse-mode="width"
  26. :width="280"
  27. show-trigger="arrow-circle"
  28. bordered
  29. >
  30. <FileList :file="file" @clear="onClear" @select="onSelect" />
  31. </n-layout-sider>
  32. <div class="w-full h-full">
  33. <n-split direction="horizontal" class="h-full" :default-size="0.6">
  34. <template #1>
  35. <div class="w-full h-full">
  36. <div
  37. v-if="file.fileName"
  38. class="text-gray-700 text-[17px] border-b px-4 font-bold h-12 flex justify-between items-center dark:text-white"
  39. >
  40. <div>{{ file.fileName }}.{{ file.type }}</div>
  41. <div>OpenAI</div>
  42. </div>
  43. <n-empty
  44. v-if="file.url === undefined"
  45. class="h-full w-full justify-center"
  46. :description="t('doc.previewEmpty')"
  47. />
  48. <template v-else>
  49. <FileView :url="file.url" />
  50. </template>
  51. </div>
  52. </template>
  53. <template #2>
  54. <div class="w-full h-full border-l dark:border-l-[#1e1e20]">
  55. <Chat :file="file" />
  56. </div>
  57. </template>
  58. </n-split>
  59. </div>
  60. </n-layout>
  61. </template>
  62. <style scoped lang="less"></style>