_ = require 'underscore' {Contenteditable, RetinaImg, Flexbox} = require 'nylas-component-kit' {AccountStore, Utils, React} = require 'nylas-exports' TemplateStore = require './template-store' TemplateEditor = require './template-editor' class PreferencesTemplates extends React.Component @displayName: 'PreferencesTemplates' constructor: (@props) -> @_templateSaveQueue = {} {templates, selectedTemplate, selectedTemplateName} = @_getStateFromStores() @state = editAsHTML: false editState: null templates: templates selectedTemplate: selectedTemplate selectedTemplateName: selectedTemplateName contents: null componentDidMount: -> @usub = TemplateStore.listen @_onChange componentWillUnmount: -> @usub() if @state.selectedTemplate? @_saveTemplateNow(@state.selectedTemplate.name, @state.contents) #SAVING AND LOADING TEMPLATES _loadTemplateContents: (template) => if template TemplateStore.getTemplateContents(template.id, (contents) => @setState({contents: contents}) ) _saveTemplateNow: (name, contents, callback) => TemplateStore.saveTemplate(name, contents, callback) _saveTemplateSoon: (name, contents) => @_templateSaveQueue[name] = contents @_saveTemplatesFromCache() __saveTemplatesFromCache: => for name, contents of @_templateSaveQueue @_saveTemplateNow(name, contents) @_templateSaveQueue = {} _saveTemplatesFromCache: _.debounce(PreferencesTemplates::__saveTemplatesFromCache, 500) # OVERALL STATE HANDLING _onChange: => @setState @_getStateFromStores() _getStateFromStores: -> templates = TemplateStore.items() #selectedTemplate = _.findWhere(templates, {id: @state?.selectedTemplate?.id}) || templates[0] selectedTemplate = @state?.selectedTemplate # deleted if selectedTemplate? and selectedTemplate.id not in _.pluck(templates, "id") selectedTemplate = null # none selected else if not selectedTemplate selectedTemplate = if templates.length > 0 then templates[0] else null @_loadTemplateContents(selectedTemplate) if selectedTemplate selectedTemplateName = @state?.selectedTemplateName || selectedTemplate.name return {templates, selectedTemplate, selectedTemplateName} # TEMPLATE CONTENT EDITING _onEditTemplate: (event) => html = event.target.value @setState contents: html if @state.selectedTemplate? @_saveTemplateSoon(@state.selectedTemplate.name, html) _onSelectTemplate: (event) => if @state.selectedTemplate? @_saveTemplateNow(@state.selectedTemplate.name, @state.contents) selectedTemplate = null for template in @state.templates if template.id == event.target.value selectedTemplate = template @setState selectedTemplate: selectedTemplate selectedTemplateName: selectedTemplate?.name contents: null @_loadTemplateContents(selectedTemplate) _renderTemplatePicker: -> options = @state.templates.map (template) -> _renderEditableTemplate: -> _renderHTMLTemplate: ->