From 476bab9333920bfa760b68b1c6b9c2de16feada2 Mon Sep 17 00:00:00 2001 From: Tom Moor Date: Sun, 27 Jan 2019 12:30:53 +0000 Subject: [PATCH] Fixes: Welcome email dashboard location (#886) * Fixes: Welcome email dashboard location Updated logo in email * :green_heart: --- public/email/header-logo.png | Bin 7748 -> 1882 bytes server/__snapshots__/mailer.test.js.snap | 4 ++-- server/emails/WelcomeEmail.js | 14 ++++++++------ server/emails/components/Body.js | 2 +- server/emails/components/Header.js | 4 ++-- server/mailer.js | 6 +++--- server/mailer.test.js | 5 ++++- server/models/User.js | 7 +++++-- 8 files changed, 25 insertions(+), 17 deletions(-) diff --git a/public/email/header-logo.png b/public/email/header-logo.png index 8340b6a3e555f96de1568c1e84a9b2f0cfaea58c..304d33dee440a12f3630be7fe7c850c403b0abba 100644 GIT binary patch literal 1882 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 KMNUMnLSTZgQ|46w diff --git a/server/__snapshots__/mailer.test.js.snap b/server/__snapshots__/mailer.test.js.snap index c7071644..c1283272 100644 --- a/server/__snapshots__/mailer.test.js.snap +++ b/server/__snapshots__/mailer.test.js.snap @@ -43,7 +43,7 @@ Object { Outline is a place for your team to build and share knowledge. -
 
\\"Outline\\"
 

Welcome to Outline!

Outline is a place for your team to build and share knowledge.

To get started, head to your dashboard and try creating a collection to help document your workflow, create playbooks or help with team onboarding.

You can also import existing Markdown documents by dragging and dropping them to your collections.

 

View my dashboard

 
OutlineTwitterSpectrum
+
 
\\"Outline\\"
 

Welcome to Outline!

Outline is a place for your team to build and share knowledge.

To get started, head to your dashboard and try creating a collection to help document your workflow, create playbooks or help with team onboarding.

You can also import existing Markdown documents by dragging and dropping them to your collections.

 

View my dashboard

 
OutlineTwitterSpectrum
@@ -61,7 +61,7 @@ To get started, head to your dashboard and try creating a collection to help doc You can also import existing Markdown documents by dragging and dropping them to your collections. -http://localhost:3000/dashboard +http://example.com/dashboard ", "to": "user@example.com", } diff --git a/server/emails/WelcomeEmail.js b/server/emails/WelcomeEmail.js index 29caabfb..62b106d2 100644 --- a/server/emails/WelcomeEmail.js +++ b/server/emails/WelcomeEmail.js @@ -8,7 +8,11 @@ import Header from './components/Header'; import Footer from './components/Footer'; import EmptySpace from './components/EmptySpace'; -export const welcomeEmailText = ` +export type Props = { + teamUrl: string, +}; + +export const welcomeEmailText = ({ teamUrl }: Props) => ` Welcome to Outline! Outline is a place for your team to build and share knowledge. @@ -17,10 +21,10 @@ To get started, head to your dashboard and try creating a collection to help doc You can also import existing Markdown documents by dragging and dropping them to your collections. -${process.env.URL}/dashboard +${teamUrl}/dashboard `; -export const WelcomeEmail = () => { +export const WelcomeEmail = ({ teamUrl }: Props) => { return (
@@ -39,9 +43,7 @@ export const WelcomeEmail = () => {

- +

diff --git a/server/emails/components/Body.js b/server/emails/components/Body.js index 2adc4286..06c494e6 100644 --- a/server/emails/components/Body.js +++ b/server/emails/components/Body.js @@ -14,7 +14,7 @@ export default ({ children }: Props) => { - + {children} diff --git a/server/emails/components/Header.js b/server/emails/components/Header.js index f64849c7..fd25e4cb 100644 --- a/server/emails/components/Header.js +++ b/server/emails/components/Header.js @@ -13,8 +13,8 @@ export default () => { Outline diff --git a/server/mailer.js b/server/mailer.js index 274a8b33..f417b4fe 100644 --- a/server/mailer.js +++ b/server/mailer.js @@ -83,14 +83,14 @@ export class Mailer { } }; - welcome = async (opts: { to: string }) => { + welcome = async (opts: { to: string, teamUrl: string }) => { this.sendMail({ to: opts.to, title: 'Welcome to Outline', previewText: 'Outline is a place for your team to build and share knowledge.', - html: , - text: welcomeEmailText, + html: , + text: welcomeEmailText(opts), }); }; diff --git a/server/mailer.test.js b/server/mailer.test.js index 7d2f6e68..fc0d4945 100644 --- a/server/mailer.test.js +++ b/server/mailer.test.js @@ -16,7 +16,10 @@ describe('Mailer', () => { }); test('#welcome', () => { - fakeMailer.welcome({ to: 'user@example.com' }); + fakeMailer.welcome({ + to: 'user@example.com', + teamUrl: 'http://example.com', + }); expect(sendMailOutput).toMatchSnapshot(); }); }); diff --git a/server/models/User.js b/server/models/User.js index f2070f9c..e5ef8d4c 100644 --- a/server/models/User.js +++ b/server/models/User.js @@ -6,7 +6,7 @@ import subMinutes from 'date-fns/sub_minutes'; import { DataTypes, sequelize, encryptedFields } from '../sequelize'; import { publicS3Endpoint, uploadToS3FromUrl } from '../utils/s3'; import { sendEmail } from '../mailer'; -import { Star, Collection, NotificationSetting, ApiKey } from '.'; +import { Star, Team, Collection, NotificationSetting, ApiKey } from '.'; const User = sequelize.define( 'user', @@ -158,7 +158,10 @@ User.beforeDestroy(checkLastAdmin); User.beforeDestroy(removeIdentifyingInfo); User.beforeSave(uploadAvatar); User.beforeCreate(setRandomJwtSecret); -User.afterCreate(user => sendEmail('welcome', user.email)); +User.afterCreate(async user => { + const team = await Team.findById(user.teamId); + sendEmail('welcome', user.email, { teamUrl: team.url }); +}); // By default when a user signs up we subscribe them to email notifications // when documents they created are edited by other team members and onboarding