54 lines · 1.6 KB · TypeScript
RawDownload
export interface WorkspaceFileDragEvent {  readonly dataTransfer: {    readonly types: ReadonlyArray<string>;    readonly files: Iterable<File>;    dropEffect: string;  };  readonly relatedTarget: EventTarget | null;  readonly currentTarget: {    contains(target: Node | null): boolean;  };  preventDefault(): void;} export interface WorkspaceFileDropHost {  setDragActive(active: boolean): void;  addFiles(files: File[]): void;} function isFileDrag(event: WorkspaceFileDragEvent): boolean {  return event.dataTransfer.types.includes("Files");} function movedWithinDropTarget(event: WorkspaceFileDragEvent): boolean {  return event.relatedTarget !== null && event.currentTarget.contains(event.relatedTarget as Node);} export function makeWorkspaceFileDropHandlers(host: WorkspaceFileDropHost) {  return {    onDragEnter(event: WorkspaceFileDragEvent) {      if (!isFileDrag(event)) return;      event.preventDefault();      if (movedWithinDropTarget(event)) return;      host.setDragActive(true);    },    onDragOver(event: WorkspaceFileDragEvent) {      if (!isFileDrag(event)) return;      event.preventDefault();      event.dataTransfer.dropEffect = "copy";      host.setDragActive(true);    },    onDragLeave(event: WorkspaceFileDragEvent) {      if (!isFileDrag(event)) return;      event.preventDefault();      if (movedWithinDropTarget(event)) return;      host.setDragActive(false);    },    onDrop(event: WorkspaceFileDragEvent) {      if (!isFileDrag(event)) return;      event.preventDefault();      host.setDragActive(false);      host.addFiles(Array.from(event.dataTransfer.files));    },  };}