UNPKG

feeles-ide

Version:

The hackable and serializable IDE to make learning material

222 lines (195 loc) 6.73 kB
import _extends from 'babel-runtime/helpers/extends'; import _Object$getPrototypeOf from 'babel-runtime/core-js/object/get-prototype-of'; import _classCallCheck from 'babel-runtime/helpers/classCallCheck'; import _createClass from 'babel-runtime/helpers/createClass'; import _possibleConstructorReturn from 'babel-runtime/helpers/possibleConstructorReturn'; import _inherits from 'babel-runtime/helpers/inherits'; import React, { PureComponent } from 'react'; import PropTypes from 'prop-types'; import { DropTarget } from 'react-dnd'; import { NativeTypes } from 'react-dnd-html5-backend'; import includes from 'lodash/includes'; import FileCard from './FileCard'; import DragTypes from '../../utils/dragTypes'; var getStyles = function getStyles(props, context) { var isRoot = props.isRoot, isDirOpened = props.isDirOpened, isOver = props.isOver, dragSource = props.dragSource; var cd = props.dir; var _context$muiTheme = context.muiTheme, palette = _context$muiTheme.palette, spacing = _context$muiTheme.spacing, transitions = _context$muiTheme.transitions; var borderStyle = isOver && !includes(cd.files, dragSource) ? 'dashed' : 'solid'; var borderWidth = 4; return { root: isRoot ? { paddingTop: 16, paddingRight: 0, paddingBottom: 80, paddingLeft: 16 } : { display: 'flex', flexDirection: 'column', alignItems: 'stretch', justifyContent: 'space-around', boxSizing: 'border-box', height: isDirOpened(cd, 'auto', 40), marginTop: 4, marginRight: 8, paddingBottom: isDirOpened(cd, spacing.desktopGutterLess, 0), paddingLeft: isDirOpened(cd, spacing.desktopGutterLess, 0), borderWidth: borderWidth, borderStyle: borderStyle, borderColor: palette.primary1Color, borderRadius: 2, transition: transitions.easeOut(null, ['margin', 'padding-bottom', 'border']) }, closed: { color: palette.secondaryTextColor, paddingLeft: spacing.desktopGutterLess, cursor: 'pointer' }, closer: { marginLeft: -spacing.desktopGutterLess, backgroundColor: palette.primary1Color, cursor: 'pointer' }, closerLabel: { paddingLeft: spacing.desktopGutterLess, fontWeight: 'bold', color: palette.alternateTextColor } }; }; var _DirCard = function (_PureComponent) { _inherits(_DirCard, _PureComponent); function _DirCard() { _classCallCheck(this, _DirCard); return _possibleConstructorReturn(this, (_DirCard.__proto__ || _Object$getPrototypeOf(_DirCard)).apply(this, arguments)); } _createClass(_DirCard, [{ key: 'render', value: function render() { var _props = this.props, isRoot = _props.isRoot, isDirOpened = _props.isDirOpened, handleDirToggle = _props.handleDirToggle, connectDropTarget = _props.connectDropTarget; var cd = this.props.dir; var prepareStyles = this.context.muiTheme.prepareStyles; var transfer = { selectedFile: this.props.selectedFile, tabbedFiles: this.props.tabbedFiles, isDirOpened: this.props.isDirOpened, handleFileSelect: this.props.handleFileSelect, handleDirToggle: this.props.handleDirToggle, handleFileMove: this.props.handleFileMove, handleNativeDrop: this.props.handleNativeDrop, openFileDialog: this.props.openFileDialog, putFile: this.props.putFile }; var _getStyles = getStyles(this.props, this.context), root = _getStyles.root, closed = _getStyles.closed, closer = _getStyles.closer, closerLabel = _getStyles.closerLabel; var closerProps = { style: prepareStyles(closer), labelStyle: prepareStyles(closerLabel), onClick: function onClick() { return handleDirToggle(cd); } }; return connectDropTarget(React.createElement( 'div', { style: prepareStyles(root) }, isDirOpened(cd, [].concat(isRoot ? null : React.createElement(DirCloser, _extends({ key: 'closer' }, closerProps)), cd.dirs.map(function (dir) { return React.createElement(DirCard, _extends({ key: dir.path, dir: dir }, transfer)); }), cd.files.map(function (file) { return React.createElement(FileCard, _extends({ key: file.key, file: file }, transfer)); })), React.createElement( 'div', { style: prepareStyles(closed), onClick: function onClick() { return handleDirToggle(cd); } }, cd.path )) )); } }]); return _DirCard; }(PureComponent); _DirCard.propTypes = { dir: PropTypes.object.isRequired, selectedFile: PropTypes.object, tabbedFiles: PropTypes.array.isRequired, isDirOpened: PropTypes.func.isRequired, handleFileSelect: PropTypes.func.isRequired, handleDirToggle: PropTypes.func.isRequired, handleFileMove: PropTypes.func.isRequired, handleNativeDrop: PropTypes.func.isRequired, isRoot: PropTypes.bool, openFileDialog: PropTypes.func.isRequired, putFile: PropTypes.func.isRequired, connectDropTarget: PropTypes.func.isRequired, isOver: PropTypes.bool.isRequired, dragSource: PropTypes.object }; _DirCard.contextTypes = { muiTheme: PropTypes.object.isRequired }; _DirCard.defaultProps = { isRoot: false }; var spec = { drop: function drop(props, monitor) { if (monitor.getDropResult()) { return; } var _monitor$getItem = monitor.getItem(), files = _monitor$getItem.files; switch (monitor.getItemType()) { case DragTypes.File: files.filter(function (file) { return !includes(props.dir.files, file); }).forEach(function (file) { return props.handleFileMove(file, props.dir); }); break; case NativeTypes.FILE: props.handleNativeDrop(files, props.dir); break; } return {}; } }; var collect = function collect(connect, monitor) { return { connectDropTarget: connect.dropTarget(), isOver: monitor.isOver({ shallow: true }), dragSource: monitor.getItem() }; }; var DirCard = DropTarget([DragTypes.File, NativeTypes.FILE], spec, collect)(_DirCard); export default DirCard; export var DirCloser = function DirCloser(props) { return React.createElement( 'div', { style: props.style, onClick: props.onClick }, React.createElement( 'span', { style: props.labelStyle }, '../' ) ); }; DirCloser.propTypes = { style: PropTypes.object.isRequired, onClick: PropTypes.func.isRequired, labelStyle: PropTypes.object.isRequired };