char-fork/llama.cpp
git clone https://git.t4t.associates/char-fork/llama.cpp
094e53db1
char/aliceai-t5-moe
1/** 2* Drag-and-drop state machine for the ChatScreen. 3* 4* Tracks pointer enter/leave nesting so the overlay stays visible while the 5* cursor traverses child elements, then routes the dropped files either to 6* the active message-edit handler (if a message is being edited) or to the 7* caller's onDrop callback. 8*/ 9 10import { chatStore } from '$lib/stores' ; 11 12interface UseChatScreenDragAndDropOptions { 13/** Called when the user drops files and no message is being edited. */ 14onDrop :( files :File []) => void ; 15} 16 17export function useChatScreenDragAndDrop ( options :UseChatScreenDragAndDropOptions ) { 18let dragCounter = $state ( 0 ); 19let isDragOver = $state ( false ); 20 21function handleDragEnter ( event :DragEvent ) { 22event . preventDefault (); 23dragCounter ++ ; 24 25if ( event . dataTransfer ?. types . includes ( 'Files' )) { 26isDragOver = true ; 27} 28} 29 30function handleDragLeave ( event :DragEvent ) { 31event . preventDefault (); 32dragCounter -- ; 33 34if ( dragCounter === 0 ) { 35isDragOver = false ; 36} 37} 38 39function handleDragOver ( event :DragEvent ) { 40event . preventDefault (); 41} 42 43async function handleDrop ( event :DragEvent ) { 44event . preventDefault (); 45isDragOver = false ; 46dragCounter = 0 ; 47 48if ( ! event . dataTransfer ?. files ) return ; 49 50const files = Array . from ( event . dataTransfer . files ); 51 52if ( chatStore . isEditing ()) { 53const handler = chatStore . getAddFilesHandler (); 54 55if ( handler ) { 56handler ( files ); 57 58return ; 59} 60} 61 62options . onDrop ( files ); 63} 64 65return { 66dragHandlers :{ 67dragenter :handleDragEnter , 68dragleave :handleDragLeave , 69dragover :handleDragOver , 70drop :handleDrop 71}, 72get isDragOver () { 73return isDragOver ; 74} 75}; 76}