js/ui/write/postPreview.js
import Data from '~/models/Data';
import ForeignChildInteractor from '~/interactors/ForeignChildInteractor';
import ErrorManager from '~/helpers/ErrorManager';
import * as PreviewKey from '~/helpers/PreviewKey';
const PREVIEW_TITLE = document.getElementById("post-title");
const PREVIEW_BODY = document.getElementById("post-body");
const NO_TITLE = (
<span class="dim">No Title...</span>
);
const NO_BODY = (
<div class="preview-no-body">
<svg namespace="http://www.w3.org/2000/svg" viewBox="0 0 16 16">
<path namespace="http://www.w3.org/2000/svg" d="M 4 2 L 4 11 L 2 11 L 2 12.5 C 2 13.328 2.672 14 3.5 14 L 11.5 14 C 11.909962 14 12.301599 13.855814 12.578125 13.580078 C 12.854651 13.304342 13 12.912335 13 12.5 L 13 2 L 4 2 z M 5 3 L 12 3 L 12 12.5 C 12 12.690665 11.94482 12.79758 11.871094 12.871094 C 11.79737 12.944607 11.689038 13 11.5 13 C 11.172 13 11 12.686 11 12.375 L 11 11 L 5 11 L 5 3 z" />
</svg>
<h3>Live Post Preview</h3>
<span>Preview will be automatically refreshed as you edit the post.</span>
</div>
);
let id;
if (id = Data.shared.valueForKey('previewId')) {
let interactor = new ForeignChildInteractor(id);
interactor.watch(
PreviewKey.Title,
(value) => {
let realTitle = value.trim();
while (PREVIEW_TITLE.firstChild) PREVIEW_TITLE.removeChild(PREVIEW_TITLE.firstChild);
if (realTitle) {
document.title = realTitle;
PREVIEW_TITLE.appendChild(document.createTextNode(realTitle));
} else {
document.title = "Post Preview";
PREVIEW_TITLE.appendChild(NO_TITLE);
}
}
);
import('#/markdown-renderer')
.then(markdown => {
interactor.watch(
PreviewKey.Body,
(value) => {
if (value.trim()) {
PREVIEW_BODY.innerHTML = markdown.render(value);
} else {
while (PREVIEW_BODY.firstChild) PREVIEW_BODY.removeChild(PREVIEW_BODY.firstChild);
PREVIEW_BODY.appendChild(NO_BODY);
}
}
);
})
.catch(error => {
ErrorManager.unhandled(error);
});
}