import React, { useCallback,useEffect } from "react"; import { useDispatch, useSelector } from "react-redux"; import { changeContextMenu, setSelectedTarget, addSelectedTarget, removeSelectedTarget, setNavigatorLoadingStatus, navitateTo, showImgPreivew, openMusicDialog, toggleSnackbar, dragAndDrop, openLoadingDialog } from "../../actions/index"; import statusHelper from "../../untils/page" import FileIcon from "./FileIcon"; import SmallIcon from "./SmallIcon"; import TableItem from "./TableRow"; import classNames from "classnames"; import { isPreviewable } from "../../config"; import { allowSharePreview } from "../../untils/index"; import { makeStyles } from "@material-ui/core"; import { useDrag } from "react-dnd"; import { getEmptyImage } from 'react-dnd-html5-backend' import DropWarpper from "./DnD/DropWarpper" import { useHistory, useLocation } from "react-router-dom"; import ClickAwayListener from "@material-ui/core/ClickAwayListener"; const useStyles = makeStyles(theme => ({ container: { padding: "7px" }, fixFlex: { minWidth: 0 }, dragging:{ opacity:0.4, } })); export default function ObjectIcon(props) { const path = useSelector(state => state.navigator.path); const selected = useSelector(state => state.explorer.selected); const viewMethod = useSelector( state => state.viewUpdate.explorerViewMethod ); let location = useLocation(); let history = useHistory(); const dispatch = useDispatch(); const ContextMenu = useCallback( (type, open) => dispatch(changeContextMenu(type, open)), [dispatch] ); const SetSelectedTarget = useCallback( targets => dispatch(setSelectedTarget(targets)), [dispatch] ); const AddSelectedTarget = useCallback( targets => dispatch(addSelectedTarget(targets)), [dispatch] ); const RemoveSelectedTarget = useCallback( id => dispatch(removeSelectedTarget(id)), [dispatch] ); const SetNavigatorLoadingStatus = useCallback( status => dispatch(setNavigatorLoadingStatus(status)), [dispatch] ); const NavitateTo = useCallback(targets => dispatch(navitateTo(targets)), [ dispatch ]); const ShowImgPreivew = useCallback( targets => dispatch(showImgPreivew(targets)), [dispatch] ); const OpenMusicDialog = useCallback(() => dispatch(openMusicDialog()), [ dispatch ]); const ToggleSnackbar = useCallback( (vertical, horizontal, msg, color) => dispatch(toggleSnackbar(vertical, horizontal, msg, color)), [dispatch] ); const DragAndDrop = useCallback( (source, target) => dispatch(dragAndDrop(source, target)), [dispatch] ); const OpenLoadingDialog = useCallback( text => dispatch(openLoadingDialog(text)), [dispatch] ); const classes = useStyles(); const contextMenu = e => { e.preventDefault(); if ( selected.findIndex(value => { return value === props.file; }) === -1 ) { SetSelectedTarget([props.file]); } ContextMenu("file", true); }; const selectFile = e => { let presentIndex = selected.findIndex(value => { return value === props.file; }); if (presentIndex !== -1 && e.ctrlKey) { RemoveSelectedTarget(presentIndex); } else { if (e.ctrlKey) { AddSelectedTarget(props.file); } else { SetSelectedTarget([props.file]); } } }; const handleClick = e => { if (window.isMobile) { selectFile(e); if (props.file.type === "dir") { enterFolder(); return; } } else { selectFile(e); } }; const handleDoubleClick = () => { if (props.file.type === "dir") { enterFolder(); return; } if (!allowSharePreview()) { ToggleSnackbar("top", "right", "未登录用户无法预览", "warning"); return; } let previewPath = selected[0].path === "/" ? selected[0].path + selected[0].name : selected[0].path + "/" + selected[0].name; switch (isPreviewable(selected[0].name)) { case "img": ShowImgPreivew(selected[0]); return; case "msDoc": if (statusHelper.isSharePage(location.pathname)) { return; } history.push("/doc" + previewPath); return; case "audio": OpenMusicDialog(); return; case "open": window.open( window.apiURL.preview + "/?action=preview&path=" + encodeURIComponent(previewPath) ); return; case "video": if (statusHelper.isSharePage(location.pathname)) { return; } history.push("/video" + previewPath); return; case "edit": if (statusHelper.isSharePage(location.pathname)) { return; } history.push("/text" + previewPath); return; default: OpenLoadingDialog("获取下载地址..."); return; } }; const enterFolder = () => { NavitateTo( path === "/" ? path + props.file.name : path + "/" + props.file.name ); }; const [{ isDragging }, drag,preview] = useDrag({ item: { object:props.file, type: "object", selected:[...selected], viewMethod:viewMethod, }, end: (item, monitor) => { const dropResult = monitor.getDropResult(); if (item && dropResult) { if (dropResult.folder){ if (item.object.id !== dropResult.folder.id || item.object.type !== dropResult.folder.type){ DragAndDrop(item.object,dropResult.folder); } } } }, canDrag: () =>{ return !statusHelper.isMobile() && statusHelper.isHomePage(location.pathname); }, collect: monitor => ({ isDragging: monitor.isDragging() }) }); useEffect(() => { preview(getEmptyImage(), { captureDraggingState: true }) }, []) if (viewMethod === "list") { return ( ); } return (
{props.file.type === "dir" && viewMethod !== "list" && ( )} {props.file.type === "file" && viewMethod === "icon" && ( )} {props.file.type === "file" && viewMethod === "smallIcon" && ( )}
); }