mirror of
https://github.com/Foundry376/Mailspring.git
synced 2025-01-04 07:10:06 +08:00
1a3cca8d0a
* Remove the composer contenteditable, replace with basic <textarea> * Beginning broader cleanup of draft session * DraftJS composer with color, style support * Serialization/unserialization of basic styles, toolbar working * WIP * Switch to draft-js-plugins approach, need to revisit HTML * Move HTML conversion functionality into plugins * Add spellcheck context menu to editor * Initial work on quoted text * Further work on quoted text * BLOCK approach * Entity approach - better, does not bump out to top level * Hiding and showing quoted text via CSS * Get rid of ability to inject another subject line component * Clean up specs, DraftFactory to ES6 * Remove old initial focus hack * Fix focusing, initial text selection * Remove participant “collapsing” support, it can be confusing * Correctly terminate links on carriage returns * Initial signature support, allow removal of uneditable blocks * Sync body string with body editorstate * Simplify draft editor session, finish signatures * Templates * Minor fixes * Simplify link/open tracking, ensure it works * Reorg composer, rework template editor * Omg the slowness is all the stupid emoji button * Polish and small fixes * Performance improvements, new templates UI * Don’t assume nodes are elements * Fix for sending drafts twice due to back-to-back saves * Fix order of operations on app quit to save drafts reliably * Improve DraftJS-Convert whitespace handling * Use contentID throughout attachment lifecycle * Try to fix images * Switch to Slate instead of DraftJS… much better * Fix newline handling * Bug fixes * Cleanup * Finish templates plugin * Clean up text editing / support for Gmail email styles * Support for color + size on the same node, clean trailing whitespace * Restore emoji typeahead / emoji picker * Fix scrolling in template editor * Fix specs * Fix newlines * Re-implement spellcheck to be faster * Make spellcheck decorator changes invisible to the undo/redo stack * Remove comment * Polish themplates panel * Fix #521
108 lines
2.9 KiB
JavaScript
108 lines
2.9 KiB
JavaScript
/* eslint react/sort-comp: 0 */
|
|
import _ from 'underscore';
|
|
import React from 'react';
|
|
import {
|
|
Message,
|
|
DraftStore,
|
|
WorkspaceStore,
|
|
ComponentRegistry,
|
|
InflatesDraftClientId,
|
|
} from 'mailspring-exports';
|
|
import ComposeButton from './compose-button';
|
|
import ComposerView from './composer-view';
|
|
|
|
const ComposerViewForDraftClientId = InflatesDraftClientId(ComposerView);
|
|
|
|
class ComposerWithWindowProps extends React.Component {
|
|
static displayName = 'ComposerWithWindowProps';
|
|
static containerRequired = false;
|
|
|
|
constructor(props) {
|
|
super(props);
|
|
|
|
// We'll now always have windowProps by the time we construct this.
|
|
const windowProps = AppEnv.getWindowProps();
|
|
const { draftJSON, headerMessageId } = windowProps;
|
|
if (!draftJSON) {
|
|
throw new Error('Initialize popout composer windows with valid draftJSON');
|
|
}
|
|
const draft = new Message().fromJSON(draftJSON);
|
|
DraftStore._createSession(headerMessageId, draft);
|
|
this.state = windowProps;
|
|
}
|
|
|
|
componentWillUnmount() {
|
|
if (this._usub) {
|
|
this._usub();
|
|
}
|
|
}
|
|
|
|
componentDidUpdate() {
|
|
this._composerComponent.focus();
|
|
}
|
|
|
|
_onDraftReady = () => {
|
|
this._composerComponent.focus().then(() => {
|
|
AppEnv.displayWindow();
|
|
|
|
if (this.state.errorMessage) {
|
|
this._showInitialErrorDialog(this.state.errorMessage, this.state.errorDetail);
|
|
}
|
|
});
|
|
};
|
|
|
|
render() {
|
|
return (
|
|
<ComposerViewForDraftClientId
|
|
ref={cm => {
|
|
this._composerComponent = cm;
|
|
}}
|
|
onDraftReady={this._onDraftReady}
|
|
headerMessageId={this.state.headerMessageId}
|
|
className="composer-full-window"
|
|
/>
|
|
);
|
|
}
|
|
|
|
_showInitialErrorDialog(msg, detail) {
|
|
// We delay so the view has time to update the restored draft. If we
|
|
// don't delay the modal may come up in a state where the draft looks
|
|
// like it hasn't been restored or has been lost.
|
|
_.delay(() => {
|
|
AppEnv.showErrorDialog({ title: 'Error', message: msg }, { detail: detail });
|
|
}, 100);
|
|
}
|
|
}
|
|
|
|
export function activate() {
|
|
if (AppEnv.isMainWindow()) {
|
|
ComponentRegistry.register(ComposerViewForDraftClientId, {
|
|
role: 'Composer',
|
|
});
|
|
ComponentRegistry.register(ComposeButton, {
|
|
location: WorkspaceStore.Location.RootSidebar.Toolbar,
|
|
});
|
|
} else if (AppEnv.isThreadWindow()) {
|
|
ComponentRegistry.register(ComposerViewForDraftClientId, {
|
|
role: 'Composer',
|
|
});
|
|
} else {
|
|
AppEnv.getCurrentWindow().setMinimumSize(480, 250);
|
|
ComponentRegistry.register(ComposerWithWindowProps, {
|
|
location: WorkspaceStore.Location.Center,
|
|
});
|
|
}
|
|
}
|
|
|
|
export function deactivate() {
|
|
if (AppEnv.isMainWindow()) {
|
|
ComponentRegistry.unregister(ComposerViewForDraftClientId);
|
|
ComponentRegistry.unregister(ComposeButton);
|
|
} else {
|
|
ComponentRegistry.unregister(ComposerWithWindowProps);
|
|
}
|
|
}
|
|
|
|
export function serialize() {
|
|
return this.state;
|
|
}
|