mirror of
https://github.com/BoostIo/Boostnote
synced 2025-12-11 08:46:20 +00:00
150 lines
3.1 KiB
JavaScript
150 lines
3.1 KiB
JavaScript
import React from 'react'
|
|
import CSSModules from 'browser/lib/CSSModules'
|
|
import styles from './SnippetTab.styl'
|
|
import context from 'browser/lib/context'
|
|
import i18n from 'browser/lib/i18n'
|
|
|
|
class SnippetTab extends React.Component {
|
|
constructor(props) {
|
|
super(props)
|
|
|
|
this.state = {
|
|
isRenaming: false,
|
|
name: props.snippet.name
|
|
}
|
|
}
|
|
|
|
componentWillUpdate(nextProps) {
|
|
if (nextProps.snippet.name !== this.props.snippet.name) {
|
|
this.setState({
|
|
name: nextProps.snippet.name
|
|
})
|
|
}
|
|
}
|
|
|
|
handleClick(e) {
|
|
this.props.onClick(e)
|
|
}
|
|
|
|
handleContextMenu(e) {
|
|
context.popup([
|
|
{
|
|
label: i18n.__('Rename'),
|
|
click: e => this.handleRenameClick(e)
|
|
}
|
|
])
|
|
}
|
|
|
|
handleRenameClick(e) {
|
|
this.startRenaming()
|
|
}
|
|
|
|
handleNameInputBlur(e) {
|
|
this.handleRename()
|
|
}
|
|
|
|
handleNameInputChange(e) {
|
|
this.setState({
|
|
name: e.target.value
|
|
})
|
|
}
|
|
|
|
handleNameInputKeyDown(e) {
|
|
switch (e.keyCode) {
|
|
case 13:
|
|
this.handleRename()
|
|
break
|
|
case 27:
|
|
this.setState((prevState, props) => ({
|
|
name: props.snippet.name,
|
|
isRenaming: false
|
|
}))
|
|
break
|
|
}
|
|
}
|
|
|
|
handleRename() {
|
|
this.setState(
|
|
{
|
|
isRenaming: false
|
|
},
|
|
() => {
|
|
if (this.props.snippet.name !== this.state.name) {
|
|
this.props.onRename(this.state.name)
|
|
}
|
|
}
|
|
)
|
|
}
|
|
|
|
handleDeleteButtonClick(e) {
|
|
this.props.onDelete(e)
|
|
}
|
|
|
|
startRenaming() {
|
|
this.setState(
|
|
{
|
|
isRenaming: true
|
|
},
|
|
() => {
|
|
this.refs.name.focus()
|
|
this.refs.name.select()
|
|
}
|
|
)
|
|
}
|
|
|
|
handleDragStart(e) {
|
|
e.dataTransfer.dropEffect = 'move'
|
|
this.props.onDragStart(e)
|
|
}
|
|
|
|
handleDrop(e) {
|
|
this.props.onDrop(e)
|
|
}
|
|
|
|
render() {
|
|
const { isActive, snippet, isDeletable } = this.props
|
|
return (
|
|
<div styleName={isActive ? 'root--active' : 'root'}>
|
|
{!this.state.isRenaming ? (
|
|
<button
|
|
styleName='button'
|
|
onClick={e => this.handleClick(e)}
|
|
onDoubleClick={e => this.handleRenameClick(e)}
|
|
onContextMenu={e => this.handleContextMenu(e)}
|
|
onDragStart={e => this.handleDragStart(e)}
|
|
onDrop={e => this.handleDrop(e)}
|
|
draggable='true'
|
|
>
|
|
{snippet.name.trim().length > 0 ? (
|
|
snippet.name
|
|
) : (
|
|
<span>{i18n.__('Unnamed')}</span>
|
|
)}
|
|
</button>
|
|
) : (
|
|
<input
|
|
styleName='input'
|
|
ref='name'
|
|
value={this.state.name}
|
|
onChange={e => this.handleNameInputChange(e)}
|
|
onBlur={e => this.handleNameInputBlur(e)}
|
|
onKeyDown={e => this.handleNameInputKeyDown(e)}
|
|
/>
|
|
)}
|
|
{isDeletable && (
|
|
<button
|
|
styleName='deleteButton'
|
|
onClick={e => this.handleDeleteButtonClick(e)}
|
|
>
|
|
<i className='fa fa-times' />
|
|
</button>
|
|
)}
|
|
</div>
|
|
)
|
|
}
|
|
}
|
|
|
|
SnippetTab.propTypes = {}
|
|
|
|
export default CSSModules(SnippetTab, styles)
|