mirror of
				https://github.com/mickael-kerjean/filestash.git
				synced 2025-10-31 18:16:00 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			92 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			92 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| import { DropTarget } from "react-dnd";
 | |
| 
 | |
| import { EventEmitter, BreadCrumb, PathElement } from "../../components/";
 | |
| import { pathBuilder, filetype, basename } from "../../helpers/";
 | |
| 
 | |
| export class BreadCrumbTargettable extends BreadCrumb {
 | |
|     constructor(props) {
 | |
|         super(props);
 | |
|     }
 | |
| 
 | |
|     render() {
 | |
|         return super.render(Element);
 | |
|     }
 | |
| }
 | |
| 
 | |
| const HOCDropTargetForVirtualFile = (Cmp) => {
 | |
|     const fileTarget = {
 | |
|         canDrop(props) {
 | |
|             return props.isLast ? false : true;
 | |
|         },
 | |
|         drop(props, monitor, component) {
 | |
|             const src = monitor.getItem();
 | |
|             if (props.currentSelection.length === 0) {
 | |
|                 const from = pathBuilder(src.path, src.name, src.type);
 | |
|                 const to = pathBuilder(props.path.full, src.name, src.type);
 | |
|                 return { action: "rename", args: [from, to, src.type], ctx: "breadcrumb" };
 | |
|             } else {
 | |
|                 return {
 | |
|                     action: "rename.multiple",
 | |
|                     args: props.currentSelection.map((selectionPath) => {
 | |
|                         const from = selectionPath;
 | |
|                         const to = pathBuilder(
 | |
|                             props.path.full,
 | |
|                             "./"+basename(selectionPath),
 | |
|                             filetype(selectionPath),
 | |
|                         );
 | |
|                         return [from, to];
 | |
|                     }),
 | |
|                 };
 | |
|             }
 | |
|         },
 | |
|     };
 | |
| 
 | |
|     return DropTarget(
 | |
|         "file",
 | |
|         fileTarget,
 | |
|         (connect, monitor) => ({
 | |
|             connectDropTarget: connect.dropTarget(),
 | |
|             isOver: monitor.isOver(),
 | |
|             canDrop: monitor.canDrop(),
 | |
|         }),
 | |
|     )(Cmp);
 | |
| };
 | |
| 
 | |
| const HOCDropTargetForFSFile = (Cmp) => {
 | |
|     const nativeFileTarget = {
 | |
|         canDrop(props) {
 | |
|             return props.isLast ? false : true;
 | |
|         },
 | |
|         drop: function(props, monitor) {
 | |
|             const files = monitor.getItem();
 | |
|             props.emit("file.upload", props.path.full, files);
 | |
|         },
 | |
|     };
 | |
| 
 | |
|     return DropTarget(
 | |
|         "__NATIVE_FILE__",
 | |
|         nativeFileTarget,
 | |
|         (connect, monitor) => ({
 | |
|             connectNativeFileDropTarget: connect.dropTarget(),
 | |
|             isNativeFileOver: monitor.isOver(),
 | |
|             canDropFile: monitor.canDrop(),
 | |
|         }),
 | |
|     )(Cmp);
 | |
| };
 | |
| 
 | |
| class ElementComponent extends PathElement {
 | |
|     constructor(props) {
 | |
|         super(props);
 | |
|     }
 | |
| 
 | |
|     render() {
 | |
|         const highlight = (this.props.isOver && this.props.canDrop ) ||
 | |
|             (this.props.isNativeFileOver && this.props.canDropFile);
 | |
|         return this.props.connectNativeFileDropTarget(this.props.connectDropTarget(
 | |
|             super.render(highlight),
 | |
|         ));
 | |
|     }
 | |
| }
 | |
| 
 | |
| const Element = EventEmitter(HOCDropTargetForVirtualFile(HOCDropTargetForFSFile(ElementComponent)));
 | 
