From 0b4127bc4b3a5284af34f3ba0d59817b94328895 Mon Sep 17 00:00:00 2001 From: Ben Gotow Date: Mon, 4 Apr 2016 18:21:39 -0700 Subject: [PATCH] fix(composer): Show when rendered, send draft JSON to composer windows --- .../decorators/inflate-draft-client-id.es6 | 4 +++- internal_packages/composer/lib/main.es6 | 23 ++++++++++++++----- .../composer/stylesheets/composer.less | 1 + .../database-setup-query-builder-spec.coffee | 4 ++-- spec/stores/draft-store-spec.es6 | 5 ++-- src/browser/window-manager.coffee | 2 -- src/flux/stores/draft-store.coffee | 11 ++++++--- 7 files changed, 34 insertions(+), 16 deletions(-) diff --git a/internal_packages/composer/lib/decorators/inflate-draft-client-id.es6 b/internal_packages/composer/lib/decorators/inflate-draft-client-id.es6 index 5e9319fc2..56cd66f37 100644 --- a/internal_packages/composer/lib/decorators/inflate-draft-client-id.es6 +++ b/internal_packages/composer/lib/decorators/inflate-draft-client-id.es6 @@ -75,8 +75,10 @@ export default ComposedComponent => class extends React.Component { } } + // Returns a promise for use in composer/main.es6, to show the window + // once the composer is rendered and focused. focus() { - Utils.waitFor(() => this.refs.composed).then(() => + return Utils.waitFor(() => this.refs.composed).then(() => this.refs.composed.focus() ).catch(() => { }); diff --git a/internal_packages/composer/lib/main.es6 b/internal_packages/composer/lib/main.es6 index 6e5954e22..091ddd37c 100644 --- a/internal_packages/composer/lib/main.es6 +++ b/internal_packages/composer/lib/main.es6 @@ -4,6 +4,8 @@ import React from 'react'; import {remote} from 'electron'; import { + Message, + DraftStore, ComponentRegistry, WorkspaceStore, } from 'nylas-exports'; @@ -24,13 +26,19 @@ class ComposerWithWindowProps extends React.Component { componentDidMount() { if (this.state.draftClientId) { - this.focusComposer(); + this.ready(); } this.unlisten = NylasEnv.onWindowPropsReceived((windowProps) => { - const {errorMessage} = windowProps; - this.setState(windowProps); - this.focusComposer(); + const {errorMessage, draftJSON, draftClientId} = windowProps; + + if (draftJSON) { + const draft = new Message().fromJSON(draftJSON); + DraftStore._createSession(draftClientId, draft); + } + + this.setState({draftClientId}); + this.ready(); if (errorMessage) { this._showInitialErrorDialog(errorMessage); } @@ -43,8 +51,11 @@ class ComposerWithWindowProps extends React.Component { } } - focusComposer = () => { - this.refs.composer.focus(); + ready = () => { + this.refs.composer.focus().then(() => { + NylasEnv.getCurrentWindow().show() + NylasEnv.getCurrentWindow().focus() + }); } render() { diff --git a/internal_packages/composer/stylesheets/composer.less b/internal_packages/composer/stylesheets/composer.less index 6d57f0067..05e6551e8 100644 --- a/internal_packages/composer/stylesheets/composer.less +++ b/internal_packages/composer/stylesheets/composer.less @@ -359,6 +359,7 @@ body.platform-win32 { .button-dropdown { margin-left: 10px; + padding-top: 11px; vertical-align: -webkit-baseline-middle; &:hover { diff --git a/spec/stores/database-setup-query-builder-spec.coffee b/spec/stores/database-setup-query-builder-spec.coffee index b08d6c893..135ecb213 100644 --- a/spec/stores/database-setup-query-builder-spec.coffee +++ b/spec/stores/database-setup-query-builder-spec.coffee @@ -32,8 +32,8 @@ describe "DatabaseSetupQueryBuilder", -> 'CREATE TABLE IF NOT EXISTS `TestModel` (id TEXT PRIMARY KEY,data BLOB,client_id TEXT,server_id TEXT)', 'CREATE UNIQUE INDEX IF NOT EXISTS `TestModel_id` ON `TestModel` (`id`)', 'CREATE TABLE IF NOT EXISTS `TestModelCategory` (id TEXT KEY, `value` TEXT)' - 'CREATE INDEX IF NOT EXISTS `TestModel_Category_id` ON `TestModelCategory` (`id` ASC)' - 'CREATE UNIQUE INDEX IF NOT EXISTS `TestModel_Category_val_id` ON `TestModelCategory` (`value` ASC, `id` ASC)', + 'CREATE INDEX IF NOT EXISTS `TestModelCategory_id` ON `TestModelCategory` (`id` ASC)' + 'CREATE UNIQUE INDEX IF NOT EXISTS `TestModelCategory_val_id` ON `TestModelCategory` (`value` ASC, `id` ASC)', ] for query,i in queries expect(query).toBe(expected[i]) diff --git a/spec/stores/draft-store-spec.es6 b/spec/stores/draft-store-spec.es6 index 772877964..005d7c4d7 100644 --- a/spec/stores/draft-store-spec.es6 +++ b/spec/stores/draft-store-spec.es6 @@ -50,6 +50,7 @@ describe("DraftStore", () => { describe("creating and opening drafts", () => { beforeEach(() => { const draft = new Message({id: "A", subject: "B", clientId: "A", body: "123"}); + this.newDraft = draft; spyOn(DraftFactory, "createDraftForReply").andReturn(Promise.resolve(draft)); spyOn(DraftFactory, "createOrUpdateDraftForReply").andReturn(Promise.resolve(draft)); spyOn(DraftFactory, "createDraftForForward").andReturn(Promise.resolve(draft)); @@ -135,7 +136,7 @@ describe("DraftStore", () => { expect(NylasEnv.newWindow).toHaveBeenCalledWith({ title: 'Message', windowType: "composer", - windowProps: { draftClientId: "A" }, + windowProps: { draftClientId: "A", draftJSON: this.newDraft.toJSON() }, }); }); }); @@ -155,7 +156,7 @@ describe("DraftStore", () => { expect(NylasEnv.newWindow).toHaveBeenCalledWith({ title: 'Message', windowType: "composer", - windowProps: { draftClientId: "A" }, + windowProps: { draftClientId: "A", draftJSON: this.newDraft.toJSON() }, }); }); }); diff --git a/src/browser/window-manager.coffee b/src/browser/window-manager.coffee index 666cb0cd9..5fae1cfdd 100644 --- a/src/browser/window-manager.coffee +++ b/src/browser/window-manager.coffee @@ -359,8 +359,6 @@ class WindowManager if options.bounds win.browserWindow.setBounds options.bounds - win.showWhenLoaded() - @_replenishHotWindows() return win diff --git a/src/flux/stores/draft-store.coffee b/src/flux/stores/draft-store.coffee index baf481556..34f8647fd 100644 --- a/src/flux/stores/draft-store.coffee +++ b/src/flux/stores/draft-store.coffee @@ -113,7 +113,7 @@ class DraftStore sessionForClientId: (clientId) => if not clientId throw new Error("DraftStore::sessionForClientId requires a clientId") - @_draftSessions[clientId] ?= new DraftStoreProxy(clientId) + @_draftSessions[clientId] ?= @_createSession(clientId) @_draftSessions[clientId].prepare() # Public: Look up the sending state of the given draftClientId. @@ -247,7 +247,7 @@ class DraftStore # Optimistically create a draft session and hand it the draft so that it # doesn't need to do a query for it a second from now when the composer wants it. - @_draftSessions[draft.clientId] = new DraftStoreProxy(draft.clientId, draft) + @_createSession(draft.clientId, draft) DatabaseStore.inTransaction (t) => t.persistModel(draft) @@ -258,6 +258,9 @@ class DraftStore Actions.focusDraft({draftClientId: draft.clientId}) .thenReturn({draftClientId: draft.clientId, draft: draft}) + _createSession: (clientId, draft) => + @_draftSessions[clientId] = new DraftStoreProxy(clientId, draft) + _onPopoutBlankDraft: => DraftFactory.createDraft().then (draft) => @_finalizeAndPersistNewMessage(draft).then ({draftClientId}) => @@ -267,9 +270,11 @@ class DraftStore if not draftClientId? throw new Error("DraftStore::onPopoutDraftId - You must provide a draftClientId") + draftJSON = null save = Promise.resolve() if @_draftSessions[draftClientId] save = @_draftSessions[draftClientId].changes.commit() + draftJSON = @_draftSessions[draftClientId].draft().toJSON() title = if options.newDraft then "New Message" else "Message" @@ -283,7 +288,7 @@ class DraftStore NylasEnv.newWindow title: title windowType: "composer" - windowProps: _.extend(options, {draftClientId}) + windowProps: _.extend(options, {draftClientId, draftJSON}) _onHandleMailtoLink: (event, urlString) => DraftFactory.createDraftForMailto(urlString).then (draft) =>