Mailspring/examples/N1-Composer-Templates/lib/template-store.coffee

110 lines
3.5 KiB
CoffeeScript

{DatabaseStore, DraftStore, Actions, Message, React} = require 'nylas-exports'
NylasStore = require 'nylas-store'
shell = require 'shell'
path = require 'path'
fs = require 'fs'
class TemplateStore extends NylasStore
constructor: ->
@_setStoreDefaults()
@_registerListeners()
@_templatesDir = path.join(atom.getConfigDirPath(), 'templates')
@_welcomeName = 'Welcome to Templates.html'
@_welcomePath = path.join(__dirname, '..', 'assets', @_welcomeName)
# 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.readFile @_welcomePath, (err, welcome) =>
fs.writeFile path.join(@_templatesDir, @_welcomeName), welcome, (err) =>
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: ({draftClientId, name, contents} = {}) =>
if draftClientId
DraftStore.sessionForClientId(draftClientId).then (session) =>
draft = session.draft()
name ?= draft.subject
contents ?= draft.body
if not name or name.length is 0
return @_displayError("Give your draft a subject to name your template.")
if not contents or contents.length is 0
return @_displayError("To create a template you need to fill the body of the current draft.")
@_writeTemplate(name, contents)
else
if not name or name.length is 0
return @_displayError("You must provide a name for your template.")
if not contents or contents.length is 0
return @_displayError("You must provide contents for your template.")
@_writeTemplate(name, contents)
_onShowTemplates: =>
shell.showItemInFolder(@_items[0]?.path || @_templatesDir)
_displayError: (message) =>
dialog = require('remote').require('dialog')
dialog.showErrorBox('Template Creation Error', message)
_writeTemplate: (name, contents) =>
filename = "#{name}.html"
templatePath = path.join(@_templatesDir, filename)
fs.writeFile templatePath, contents, (err) =>
@_displayError(err) if err
shell.showItemInFolder(templatePath)
@_items.push
id: filename,
name: name,
path: templatePath
@trigger(@)
_onInsertTemplateId: ({templateId, draftClientId} = {}) =>
template = null
for item in @_items
template = item if item.id is templateId
return unless template
fs.readFile template.path, (err, data) ->
body = data.toString()
DraftStore.sessionForClientId(draftClientId).then (session) ->
session.changes.add(body: body)
module.exports = new TemplateStore()