mirror of
https://github.com/Foundry376/Mailspring.git
synced 2024-11-12 04:25:31 +08:00
110 lines
3.5 KiB
CoffeeScript
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()
|