|
55 | 55 | import { uploadFile } from '$lib/apis/files'; |
56 | 56 | import { generateAutoCompletion } from '$lib/apis'; |
57 | 57 | import { deleteFileById } from '$lib/apis/files'; |
| 58 | + import { getChatById } from '$lib/apis/chats'; |
58 | 59 | import { getSessionUser } from '$lib/apis/auths'; |
59 | 60 | import { getTools } from '$lib/apis/tools'; |
60 | 61 |
|
|
806 | 807 | const onDragOver = (e: DragEvent) => { |
807 | 808 | e.preventDefault(); |
808 | 809 |
|
809 | | - // Check if a file is being dragged. |
810 | | - if (e.dataTransfer?.types?.includes('Files')) { |
| 810 | + // Check if a file or a sidebar chat item is being dragged. |
| 811 | + if ( |
| 812 | + e.dataTransfer?.types?.includes('Files') || |
| 813 | + e.dataTransfer?.types?.includes('text/plain') |
| 814 | + ) { |
811 | 815 | dragged = true; |
812 | 816 | } else { |
813 | 817 | dragged = false; |
|
825 | 829 | e.preventDefault(); |
826 | 830 | console.log(e); |
827 | 831 |
|
| 832 | + // Check if the dropped data is a sidebar chat item |
| 833 | + const textData = e.dataTransfer?.getData('text/plain'); |
| 834 | + if (textData) { |
| 835 | + try { |
| 836 | + const data = JSON.parse(textData); |
| 837 | + if (data.type === 'chat' && data.id) { |
| 838 | + // Fetch the chat to get its title, then add as a reference chat |
| 839 | + const chat = await getChatById(localStorage.token, data.id); |
| 840 | + if (chat) { |
| 841 | + const chatItem = { |
| 842 | + type: 'chat', |
| 843 | + id: chat.id, |
| 844 | + name: chat.title, |
| 845 | + collection_name: '', |
| 846 | + status: 'processed' |
| 847 | + }; |
| 848 | + if (!files.find((f) => f.id === chatItem.id)) { |
| 849 | + files = [...files, chatItem]; |
| 850 | + } |
| 851 | + } |
| 852 | + dragged = false; |
| 853 | + e.stopPropagation(); |
| 854 | + return; |
| 855 | + } |
| 856 | + } catch (_) { |
| 857 | + // Not valid JSON — fall through to file handling |
| 858 | + } |
| 859 | + } |
| 860 | +
|
828 | 861 | if (e.dataTransfer?.files) { |
829 | 862 | const inputFiles = Array.from(e.dataTransfer?.files); |
830 | 863 | if (inputFiles && inputFiles.length > 0) { |
|
1022 | 1055 |
|
1023 | 1056 | dropzoneElement = document.getElementById('chat-pane'); |
1024 | 1057 | if (dropzoneElement) { |
1025 | | - dropzoneElement.addEventListener('dragover', onDragOver); |
1026 | | - dropzoneElement.addEventListener('drop', onDrop); |
| 1058 | + dropzoneElement.addEventListener('dragover', onDragOver, true); |
| 1059 | + dropzoneElement.addEventListener('drop', onDrop, true); |
1027 | 1060 | dropzoneElement.addEventListener('dragleave', onDragLeave); |
1028 | 1061 | } |
1029 | 1062 |
|
|
1041 | 1074 | window.removeEventListener('blur', onBlur); |
1042 | 1075 |
|
1043 | 1076 | if (dropzoneElement) { |
1044 | | - dropzoneElement.removeEventListener('dragover', onDragOver); |
1045 | | - dropzoneElement.removeEventListener('drop', onDrop); |
| 1077 | + dropzoneElement.removeEventListener('dragover', onDragOver, true); |
| 1078 | + dropzoneElement.removeEventListener('drop', onDrop, true); |
1046 | 1079 | dropzoneElement.removeEventListener('dragleave', onDragLeave); |
1047 | 1080 | } |
1048 | 1081 | }; |
|
0 commit comments