import React, { PropTypes } from 'react' import ReactDOM from 'react-dom' import CSSModules from 'browser/lib/CSSModules' import styles from './StorageItem.styl' import consts from 'browser/lib/consts' import dataApi from 'browser/main/lib/dataApi' import store from 'browser/main/store' const electron = require('electron') const { shell, remote } = electron const { Menu, MenuItem } = remote import { SketchPicker } from 'react-color' class UnstyledFolderItem extends React.Component { constructor (props) { super(props) this.state = { status: 'IDLE', folder: { showColumnPicker: false, colorPickerPos: { left: 0, top: 0 }, color: props.color, name: props.name } } } handleEditChange (e) { let { folder } = this.state folder.name = this.refs.nameInput.value this.setState({ folder }) } handleConfirmButtonClick (e) { let { storage, folder } = this.props dataApi .updateFolder(storage.key, folder.key, { color: this.state.folder.color, name: this.state.folder.name }) .then((storage) => { store.dispatch({ type: 'UPDATE_STORAGE', storage: storage }) this.setState({ status: 'IDLE' }) }) } handleColorButtonClick (e) { const folder = Object.assign({}, this.state.folder, { showColumnPicker: true, colorPickerPos: { left: 0, top: 0 } }) this.setState({ folder }, function() { // After the color picker has been painted, re-calculate its position // by comparing its dimensions to the host dimensions. const { hostBoundingBox } = this.props; const colorPickerNode = ReactDOM.findDOMNode(this.refs.colorPicker) const colorPickerBox = colorPickerNode.getBoundingClientRect() const offsetTop = hostBoundingBox.bottom - colorPickerBox.bottom const folder = Object.assign({}, this.state.folder, { colorPickerPos: { left: 25, top: offsetTop < 0 ? offsetTop - 5 : 0 // subtract 5px for aestetics } }) this.setState({ folder }) }) } handleColorChange (color) { const folder = Object.assign({}, this.state.folder, { color: color.hex }) this.setState({ folder }) } handleColorPickerClose (event) { const folder = Object.assign({}, this.state.folder, { showColumnPicker: false }) this.setState({ folder }) } handleCancelButtonClick (e) { this.setState({ status: 'IDLE' }) } renderEdit (e) { const popover = { position: 'absolute', zIndex: 2 } const cover = { position: 'fixed', top: 0, right: 0, bottom: 0, left: 0 } const pickerStyle = Object.assign({}, { position: 'absolute' }, this.state.folder.colorPickerPos) return (
this.handleEditChange(e)} />
) } handleDeleteConfirmButtonClick (e) { let { storage, folder } = this.props dataApi .removeFolder(storage.key, folder.key) .then((storage) => { store.dispatch({ type: 'REMOVE_FOLDER', key: folder.key, storage: storage }) }) } renderDelete () { return (
Are you sure to delete this folder?
) } handleEditButtonClick (e) { let { folder: propsFolder } = this.props let { folder: stateFolder } = this.state const folder = Object.assign({}, stateFolder, propsFolder) this.setState({ status: 'EDIT', folder }, () => { this.refs.nameInput.select() }) } handleDeleteButtonClick (e) { this.setState({ status: 'DELETE' }) } renderIdle () { let { folder } = this.props return (
this.handleEditButtonClick(e)} >
{folder.name} ({folder.key})
) } render () { switch (this.state.status) { case 'DELETE': return this.renderDelete() case 'EDIT': return this.renderEdit() case 'IDLE': default: return this.renderIdle() } } } const FolderItem = CSSModules(UnstyledFolderItem, styles) class StorageItem extends React.Component { constructor (props) { super(props) this.state = { isLabelEditing: false } } handleNewFolderButtonClick (e) { let { storage } = this.props let input = { name: 'Untitled', color: consts.FOLDER_COLORS[Math.floor(Math.random() * 7) % 7] } dataApi.createFolder(storage.key, input) .then((storage) => { store.dispatch({ type: 'ADD_FOLDER', storage: storage }) }) .catch((err) => { console.error(err) }) } handleExternalButtonClick () { let { storage } = this.props shell.showItemInFolder(storage.path) } handleUnlinkButtonClick (e) { let { storage } = this.props dataApi.removeStorage(storage.key) .then(() => { store.dispatch({ type: 'REMOVE_STORAGE', key: storage.key }) }) .catch((err) => { console.error(err) }) } handleLabelClick (e) { let { storage } = this.props this.setState({ isLabelEditing: true, name: storage.name }, () => { this.refs.label.focus() }) } handleLabelChange (e) { this.setState({ name: this.refs.label.value }) } handleLabelBlur (e) { let { storage } = this.props dataApi .renameStorage(storage.key, this.state.name) .then((storage) => { store.dispatch({ type: 'RENAME_STORAGE', storage: storage }) this.setState({ isLabelEditing: false }) }) } render () { let { storage, hostBoundingBox } = this.props let folderList = storage.folders.map((folder) => { return }) return (
{this.state.isLabelEditing ?
this.handleLabelChange(e)} onBlur={(e) => this.handleLabelBlur(e)} />
:
this.handleLabelClick(e)} >   {storage.name}  ({storage.path}) 
}
{folderList.length > 0 ? folderList :
No Folders
}
) } } StorageItem.propTypes = { hostBoundingBox: PropTypes.shape({ bottom: PropTypes.number, height: PropTypes.number, left: PropTypes.number, right: PropTypes.number, top: PropTypes.number, width: PropTypes.number }), storage: PropTypes.shape({ key: PropTypes.string }), folder: PropTypes.shape({ key: PropTypes.string, color: PropTypes.string, name: PropTypes.string }) } export default CSSModules(StorageItem, styles)