mirror of
https://github.com/Foundry376/Mailspring.git
synced 2024-11-12 04:25:31 +08:00
886328ff7a
Great breakdown of React changes here: https://github.com/facebook/react/blob/master/CHANGELOG.md#0140-october-7-2015 Due to deprecation warnings, I don't think this will break third-party extensions unless they were doing really bad things.
116 lines
3 KiB
JavaScript
116 lines
3 KiB
JavaScript
import {Actions, React, ReactDOM} from 'nylas-exports';
|
|
import {Menu, RetinaImg} from 'nylas-component-kit';
|
|
import TemplateStore from './template-store';
|
|
|
|
class TemplatePicker extends React.Component {
|
|
static displayName = 'TemplatePicker';
|
|
|
|
static propTypes = {
|
|
draftClientId: React.PropTypes.string,
|
|
};
|
|
|
|
constructor() {
|
|
super();
|
|
this.state = {
|
|
searchValue: '',
|
|
templates: TemplateStore.items(),
|
|
};
|
|
}
|
|
|
|
componentDidMount() {
|
|
this.unsubscribe = TemplateStore.listen(this._onStoreChange.bind(this));
|
|
}
|
|
|
|
componentWillUnmount() {
|
|
if (this.unsubscribe) this.unsubscribe();
|
|
}
|
|
|
|
_filteredTemplates(search = this.state.searchValue) {
|
|
const items = TemplateStore.items();
|
|
|
|
if (!search.length) { return items; }
|
|
|
|
return items.filter((t)=> {
|
|
return t.name.toLowerCase().indexOf(search.toLowerCase()) === 0;
|
|
});
|
|
}
|
|
|
|
_onStoreChange() {
|
|
return this.setState({
|
|
templates: this._filteredTemplates(),
|
|
});
|
|
}
|
|
|
|
_onSearchValueChange = () => {
|
|
const newSearch = event.target.value;
|
|
return this.setState({
|
|
searchValue: newSearch,
|
|
templates: this._filteredTemplates(newSearch),
|
|
});
|
|
};
|
|
|
|
_onChooseTemplate = (template) => {
|
|
Actions.insertTemplateId({templateId: template.id, draftClientId: this.props.draftClientId});
|
|
Actions.closePopover()
|
|
};
|
|
|
|
_onManageTemplates = () => {
|
|
Actions.showTemplates();
|
|
};
|
|
|
|
_onNewTemplate = () => {
|
|
Actions.createTemplate({draftClientId: this.props.draftClientId});
|
|
};
|
|
|
|
_onClickButton = ()=> {
|
|
const buttonRect = ReactDOM.findDOMNode(this).getBoundingClientRect()
|
|
Actions.openPopover(
|
|
this._renderPopover(),
|
|
{originRect: buttonRect, direction: 'up'}
|
|
)
|
|
};
|
|
|
|
_renderPopover() {
|
|
const headerComponents = [
|
|
<input
|
|
type="text"
|
|
tabIndex="1"
|
|
key="textfield"
|
|
className="search"
|
|
value={this.state.searchValue}
|
|
onChange={this._onSearchValueChange} />,
|
|
];
|
|
|
|
const footerComponents = [
|
|
<div className="item" key="new" onMouseDown={this._onNewTemplate}>Save Draft as Template...</div>,
|
|
<div className="item" key="manage" onMouseDown={this._onManageTemplates}>Manage Templates...</div>,
|
|
];
|
|
|
|
return (
|
|
<Menu
|
|
className="template-picker"
|
|
headerComponents={headerComponents}
|
|
footerComponents={footerComponents}
|
|
items={this.state.templates}
|
|
itemKey={ (item)=> item.id }
|
|
itemContent={ (item)=> item.name }
|
|
onSelect={this._onChooseTemplate.bind(this)}
|
|
/>
|
|
);
|
|
}
|
|
|
|
render() {
|
|
return (
|
|
<button
|
|
className="btn btn-toolbar narrow pull-right"
|
|
onClick={this._onClickButton}
|
|
title="Insert email template…">
|
|
<RetinaImg url="nylas://composer-templates/assets/icon-composer-templates@2x.png" mode={RetinaImg.Mode.ContentIsMask}/>
|
|
|
|
<RetinaImg name="icon-composer-dropdown.png" mode={RetinaImg.Mode.ContentIsMask}/>
|
|
</button>
|
|
);
|
|
}
|
|
}
|
|
|
|
export default TemplatePicker;
|