import React from 'react'; import PropTypes from 'prop-types'; import DirColumnNav from './dir-column-nav'; import DirColumnFile from './dir-column-file'; import DirListView from './dir-list-view'; import DirGridView from './dir-grid-view'; import { SIDE_PANEL_FOLDED_WIDTH } from '../../constants'; const propTypes = { isSidePanelFolded: PropTypes.bool, isTreePanelShown: PropTypes.bool.isRequired, currentMode: PropTypes.string.isRequired, path: PropTypes.string.isRequired, repoID: PropTypes.string.isRequired, // repoinfo currentRepoInfo: PropTypes.object.isRequired, enableDirPrivateShare: PropTypes.bool.isRequired, userPerm: PropTypes.string, isGroupOwnedRepo: PropTypes.bool.isRequired, // tree isTreeDataLoading: PropTypes.bool.isRequired, treeData: PropTypes.object.isRequired, currentNode: PropTypes.object, onNodeClick: PropTypes.func.isRequired, onNodeCollapse: PropTypes.func.isRequired, onNodeExpanded: PropTypes.func.isRequired, onRenameNode: PropTypes.func.isRequired, onDeleteNode: PropTypes.func.isRequired, onAddFileNode: PropTypes.func.isRequired, onAddFolderNode: PropTypes.func.isRequired, // file isViewFile: PropTypes.bool.isRequired, isFileLoading: PropTypes.bool.isRequired, isFileLoadedErr: PropTypes.bool.isRequired, hash: PropTypes.string, filePermission: PropTypes.string, content: PropTypes.string, lastModified: PropTypes.string, latestContributor: PropTypes.string, onLinkClick: PropTypes.func.isRequired, // repo content isRepoInfoBarShow: PropTypes.bool.isRequired, usedRepoTags: PropTypes.array.isRequired, updateUsedRepoTags: PropTypes.func.isRequired, // list isDirentListLoading: PropTypes.bool.isRequired, direntList: PropTypes.array.isRequired, sortBy: PropTypes.string.isRequired, sortOrder: PropTypes.string.isRequired, sortItems: PropTypes.func.isRequired, onAddFolder: PropTypes.func.isRequired, onAddFile: PropTypes.func.isRequired, updateDirent: PropTypes.func.isRequired, onItemClick: PropTypes.func.isRequired, onItemSelected: PropTypes.func.isRequired, onItemDelete: PropTypes.func.isRequired, onItemRename: PropTypes.func.isRequired, onItemMove: PropTypes.func.isRequired, onItemCopy: PropTypes.func.isRequired, onItemConvert: PropTypes.func.isRequired, onDirentClick: PropTypes.func.isRequired, isAllItemSelected: PropTypes.bool.isRequired, onAllItemSelected: PropTypes.func.isRequired, selectedDirentList: PropTypes.array.isRequired, onItemsMove: PropTypes.func.isRequired, onItemsCopy: PropTypes.func.isRequired, onItemsDelete: PropTypes.func.isRequired, repoTags: PropTypes.array.isRequired, onFileTagChanged: PropTypes.func, showDirentDetail: PropTypes.func.isRequired, fullDirentList: PropTypes.array, onItemsScroll: PropTypes.func.isRequired, isDirentDetailShow: PropTypes.bool.isRequired }; const DRAG_HANDLER_HEIGHT = 26; class DirColumnView extends React.Component { constructor(props) { super(props); this.state = { inResizing: false, navRate: 0.25, }; this.containerWidth = null; this.resizeRef = null; this.dragHandler = null; this.viewModeContainer = React.createRef(); } onResizeMouseUp = () => { if (this.state.inResizing) { this.setState({ inResizing: false }); } this.setCookie('navRate', this.state.navRate); }; onResizeMouseDown = () => { this.containerWidth = this.viewModeContainer.current.clientWidth; this.setState({ inResizing: true }); }; onResizeMouseMove = (e) => { const { isSidePanelFolded } = this.props; let sizeNavWidth = isSidePanelFolded ? SIDE_PANEL_FOLDED_WIDTH + 3 : this.containerWidth / 0.78 * 0.22 + 3; let rate = (e.nativeEvent.clientX - sizeNavWidth) / this.containerWidth; if (rate < 0.1) { this.setState({ inResizing: false, navRate: 0.12, }); } else if (rate > 0.4) { this.setState({ inResizing: false, navRate: 0.38, }); } else { this.setState({ navRate: rate }); } }; onMouseOver = (event) => { if (!this.dragHandler) return; const { top } = this.resizeRef.getBoundingClientRect(); const dragHandlerTop = event.pageY - top - DRAG_HANDLER_HEIGHT / 2; this.setDragHandlerTop(dragHandlerTop); }; setDragHandlerTop = (top) => { this.dragHandler.style.top = top + 'px'; }; setCookie = (name, value) => { let cookie = name + '=' + value + ';'; document.cookie = cookie; }; getCookie = (cookiename) => { let name = cookiename + '='; let cookie = document.cookie.split(';'); for (let i = 0, len = cookie.length; i < len; i++) { let c = cookie[i].trim(); if (c.indexOf(name) == 0) { return c.substring(name.length, c.length) * 1; } } return ''; }; UNSAFE_componentWillMount() { let rate = this.getCookie('navRate'); if (rate) { this.setState({ navRate: rate, }); } } render() { const { currentMode, isTreePanelShown } = this.props; const { navRate, inResizing } = this.state; const onResizeMove = inResizing ? this.onResizeMouseMove : null; const select = inResizing ? 'none' : ''; const mainFlex = '1 0 ' + (1 - navRate) * 100 + '%'; return (
{isTreePanelShown && ( <>
this.resizeRef = ref} style={{ left: `calc(${navRate ? navRate * 100 + '%' : '25%'} - 1px)` }} onMouseDown={this.onResizeMouseDown} onMouseOver={this.onMouseOver} >
this.dragHandler = ref} style={{ height: DRAG_HANDLER_HEIGHT }}>
)}
{} : this.props.onItemsScroll}> {this.props.isViewFile ? ( ) : (currentMode == 'list' ? : )}
); } } DirColumnView.propTypes = propTypes; export default DirColumnView;