Base model refactor (#810)

* Big upgrades

* WIP: Stash

* Stash, 30 flow errors left

* Downgrade mobx

* WIP

* When I understand the difference between class and instance methods

* 💚

* Fixes: File import
Model saving edge cases
pinning and starring docs
Collection editing
Upgrade mobx devtools

* Notification settings saving works

* Disabled settings

* Document mailer

* Working notifications

* Colletion created notification
Ensure not notified for own actions

* Tidy up

* Document updated event only for document creation
Add indexes
Notification setting on user creation

* Commentary

* Fixed: Notification setting on signup

* Fix document move / duplicate stale data
Add BaseModel.refresh method

* Fixes: Title in sidebar not updated after editing document

* 💚

* Improve / restore error handling
Better handle offline errors

* 👕
This commit is contained in:
Tom Moor
2018-12-04 22:24:30 -08:00
committed by GitHub
parent 67cd250316
commit 8cbcb77486
222 changed files with 2273 additions and 2361 deletions

View File

@@ -0,0 +1,57 @@
// @flow
import * as React from 'react';
import { User, Collection } from '../models';
import EmailTemplate from './components/EmailLayout';
import Body from './components/Body';
import Button from './components/Button';
import Heading from './components/Heading';
import Header from './components/Header';
import Footer from './components/Footer';
import EmptySpace from './components/EmptySpace';
export type Props = {
actor: User,
collection: Collection,
eventName: string,
};
export const collectionNotificationEmailText = ({
actor,
collection,
eventName = 'created',
}: Props) => `
"${document.title}" ${eventName}
${actor.name} ${eventName} the collection "${collection.name}"
Open Collection: ${process.env.URL}${collection.url}
`;
export const CollectionNotificationEmail = ({
actor,
collection,
eventName = 'created',
}: Props) => {
return (
<EmailTemplate>
<Header />
<Body>
<Heading>
"{collection.name}" {eventName}
</Heading>
<p>
{actor.name} {eventName} the collection "{collection.title}".
</p>
<EmptySpace height={10} />
<p>
<Button href={`${process.env.URL}${collection.url}`}>
Open Collection
</Button>
</p>
</Body>
<Footer />
</EmailTemplate>
);
};

View File

@@ -0,0 +1,66 @@
// @flow
import * as React from 'react';
import { User, Document, Collection } from '../models';
import EmailTemplate from './components/EmailLayout';
import Body from './components/Body';
import Button from './components/Button';
import Heading from './components/Heading';
import Header from './components/Header';
import Footer from './components/Footer';
import EmptySpace from './components/EmptySpace';
export type Props = {
actor: User,
document: Document,
collection: Collection,
eventName: string,
};
export const documentNotificationEmailText = ({
actor,
document,
collection,
eventName = 'published',
}: Props) => `
"${document.title}" ${eventName}
${actor.name} ${eventName} the document "${document.title}", in the ${
collection.name
} collection.
Open Document: ${process.env.URL}${document.url}
`;
export const DocumentNotificationEmail = ({
actor,
document,
collection,
eventName = 'published',
}: Props) => {
return (
<EmailTemplate>
<Header />
<Body>
<Heading>
"{document.title}" {eventName}
</Heading>
<p>
{actor.name} {eventName} the document "{document.title}", in the{' '}
{collection.name} collection.
</p>
<hr />
<EmptySpace height={10} />
<p>{document.getSummary()}</p>
<EmptySpace height={10} />
<p>
<Button href={`${process.env.URL}${document.url}`}>
Open Document
</Button>
</p>
</Body>
<Footer />
</EmailTemplate>
);
};

View File

@@ -2,26 +2,26 @@
import Koa from 'koa';
import Router from 'koa-router';
import { NotFoundError } from '../errors';
import Mailer from '../mailer';
import { Mailer } from '../mailer';
const emailPreviews = new Koa();
const router = new Router();
router.get('/:type/:format', async ctx => {
const previewMailer = new Mailer();
let mailerOutput;
previewMailer.transporter = {
let mailer = new Mailer();
mailer.transporter = {
sendMail: data => (mailerOutput = data),
};
switch (ctx.params.type) {
// case 'emailWithProperties':
// previewMailer.emailWithProperties('user@example.com', {...properties});
// mailer.emailWithProperties('user@example.com', {...properties});
// break;
default:
if (Object.getOwnPropertyNames(previewMailer).includes(ctx.params.type)) {
if (Object.getOwnPropertyNames(mailer).includes(ctx.params.type)) {
// $FlowIssue flow doesn't like this but we're ok with it
previewMailer[ctx.params.type]('user@example.com');
mailer[ctx.params.type]('user@example.com');
} else throw new NotFoundError('Email template could not be found');
}