Mailspring/internal_packages/message-templates/lib/template-store.coffee

95 lines
2.7 KiB
CoffeeScript

Reflux = require 'reflux'
_ = require 'underscore-plus'
{DatabaseStore, DraftStore, Actions, Message} = require 'inbox-exports'
path = require 'path'
fs = require 'fs-plus'
TemplateStore = Reflux.createStore
init: ->
@_setStoreDefaults()
@_registerListeners()
@_templatesDir = path.join(atom.getConfigDirPath(), 'templates')
# I know this is a bit of pain but don't do anything that
# could possibly slow down app launch
fs.exists @_templatesDir, (exists) =>
if exists
@_populate()
fs.watch @_templatesDir, => @_populate()
else
fs.mkdir @_templatesDir, =>
fs.watch @_templatesDir, => @_populate()
########### PUBLIC #####################################################
items: ->
@_items
templatesDirectory: ->
@_templatesDir
########### PRIVATE ####################################################
_setStoreDefaults: ->
@_items = []
_registerListeners: ->
@listenTo Actions.insertTemplateId, @_onInsertTemplateId
@listenTo Actions.createTemplate, @_onCreateTemplate
@listenTo Actions.showTemplates, @_onShowTemplates
_populate: ->
fs.readdir @_templatesDir, (err, filenames) =>
@_items = []
for filename in filenames
continue if filename[0] is '.'
displayname = path.basename(filename, path.extname(filename))
@_items.push
id: filename,
name: displayname,
path: path.join(@_templatesDir, filename)
@trigger(@)
_onCreateTemplate: ({draftLocalId, name, contents} = {}) ->
if draftLocalId
session = DraftStore.sessionForLocalId(draftLocalId)
session.prepare().finally =>
draft = session.draft()
if draft
name ?= draft.subject
contents ?= draft.body
@_writeTemplate(name, contents)
else
@_writeTemplate(name, contents)
_onShowTemplates: ->
# show in finder how?
shell = require 'shell'
shell.showItemInFolder(@_items[0]?.path || @_templatesDir)
_writeTemplate: (name, contents) ->
throw new Error("You must provide a template name") unless name
throw new Error("You must provide template contents") unless contents
filename = "#{name}.html"
templatePath = path.join(@_templatesDir, filename)
fs.writeFile templatePath, contents, (err) =>
@_items.push
id: filename,
name: name,
path: templatePath
@trigger(@)
_onInsertTemplateId: ({templateId, draftLocalId} = {}) ->
template = _.find @_items, (item) -> item.id is templateId
return unless template
fs.readFile template.path, (err, data) ->
body = data.toString()
session = DraftStore.sessionForLocalId(draftLocalId)
session.changes.add(body: body)
module.exports = TemplateStore