monadic_react
Version:
A monadic library for easily composing React-based libraries.
308 lines • 31.9 kB
JavaScript
"use strict";
var __extends = (this && this.__extends) || (function () {
var extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
return function (d, b) {
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
var __assign = (this && this.__assign) || Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
Object.defineProperty(exports, "__esModule", { value: true });
var React = require("react");
var draft_js_1 = require("draft-js");
var Draft = require("draft-js");
var core_1 = require("./core");
var katex = require("katex");
var DraftEditor = /** @class */ (function (_super) {
__extends(DraftEditor, _super);
function DraftEditor(props, context) {
var _this = _super.call(this, props, context) || this;
_this.editor = null;
_this.state = { editor_state: _this.props.initial_state };
return _this;
}
DraftEditor.serialize_state = function (editor_state) {
return JSON.stringify(Draft.convertToRaw(editor_state.getCurrentContent()));
};
DraftEditor.deserialize_state = function (raw_content) {
try {
return draft_js_1.EditorState.createWithContent(Draft.convertFromRaw(JSON.parse(raw_content)), DraftEditor.decorator());
}
catch (e) {
return DraftEditor.empty_state();
}
};
DraftEditor.empty_state = function () {
return draft_js_1.EditorState.createEmpty(DraftEditor.decorator());
};
DraftEditor.prototype.onChange = function (new_editor_state, on_success) {
var _this = this;
if (this.props.editable) {
this.setState(__assign({}, this.state, { editor_state: new_editor_state }), function () {
if (on_success)
on_success();
_this.props.set_state(new_editor_state);
});
}
};
DraftEditor.prototype.toggle_block_type = function (block_type) {
var _this = this;
this.onChange(draft_js_1.RichUtils.toggleBlockType(this.state.editor_state, block_type), function () { return _this.editor.focus(); });
};
DraftEditor.prototype.toggle_style = function (command) {
this.handleKeyCommand(command);
};
DraftEditor.prototype.handleKeyCommand = function (command) {
var _this = this;
var new_state = draft_js_1.RichUtils.handleKeyCommand(this.state.editor_state, command);
if (new_state) {
this.onChange(new_state, function () {
_this.editor.focus();
});
return "handled";
}
return "not-handled";
};
DraftEditor.prototype.insert_media = function (contentState, url, url_type) {
var _this = this;
var selectionState = this.state.editor_state.getSelection();
var new_content_state = contentState.createEntity(url_type, 'IMMUTABLE', { src: url });
var entity_key = new_content_state.getLastCreatedEntityKey();
var new_editor_state = draft_js_1.AtomicBlockUtils.insertAtomicBlock(this.state.editor_state, entity_key, ' ');
// new_content_state = new_editor_state.getCurrentContent()
// var anchorKey = selectionState.getAnchorKey();
// var currentContentBlock = new_content_state.getBlockForKey(anchorKey)
// let blockMap = new_content_state.getBlockMap()
// let newBlockMap = currentContentBlock.getText() == "" ? blockMap.remove(currentContentBlock.getKey()) : blockMap
// const newContentState = contentState.set('blockMap', newBlockMap) as ContentState;
// let newEditorState = EditorState.createWithContent(newContentState)
var newEditorState = new_editor_state;
this.setState(__assign({}, this.state, { editor_state: newEditorState }), function () {
_this.props.set_state(new_editor_state);
});
};
DraftEditor.prototype.insert_link = function (contentState, url) {
var _this = this;
var contentStateWithEntity = contentState.createEntity('LINK', 'IMMUTABLE', { url: url });
var entityKey = contentStateWithEntity.getLastCreatedEntityKey();
var newEditorState = draft_js_1.RichUtils.toggleLink(this.state.editor_state, this.state.editor_state.getSelection(), entityKey);
this.setState(__assign({}, this.state, { editor_state: newEditorState }), function () {
_this.props.set_state(newEditorState);
});
};
DraftEditor.prototype.render = function () {
var _this = this;
return (React.createElement("div", { className: "editor__inner" },
this.props.editable ?
React.createElement(SlideEditorButtonsBar, { toggle_style: function (s) { return _this.toggle_style(s); }, toggle_block_type: function (s) { return _this.toggle_block_type(s); }, insert_media: function (url, url_type) {
return _this.insert_media(_this.state.editor_state.getCurrentContent(), url, url_type);
}, insert_link: function (url) { return _this.insert_link(_this.state.editor_state.getCurrentContent(), url); } })
:
null,
React.createElement("div", { className: "slide__text__editor" },
React.createElement(draft_js_1.Editor, { editorState: this.state.editor_state, onBlur: function () { }, onChange: function (es) { return _this.onChange(es); }, handleKeyCommand: function (c) { return _this.handleKeyCommand(c); }, readOnly: !this.props.editable, blockRendererFn: mediaBlockRenderer(this.state.editor_state.getCurrentContent(), this.props.editable), ref: function (editor) { return _this.editor = editor; }, spellCheck: true }))));
};
DraftEditor.decorator = function () { return new draft_js_1.CompositeDecorator([
{
strategy: DraftEditor.findLinkentities,
component: Link,
},
]); };
DraftEditor.findLinkentities = function (contentBlock, callback) {
contentBlock.findEntityRanges(function (character) {
var entityKey = character.getEntity();
return (entityKey !== null &&
draft_js_1.Entity.get(entityKey).getType() === 'LINK');
}, callback);
};
return DraftEditor;
}(React.Component));
function mediaBlockRenderer(contentState, editable) {
return function (block) {
if (block.getType() === 'atomic') {
return {
component: Media(editable),
editable: false,
};
}
return null;
};
}
var Math = /** @class */ (function (_super) {
__extends(Math, _super);
function Math(props) {
return _super.call(this, props) || this;
}
Math.prototype.onClick = function () {
if (!this.props.editable) {
return;
}
var block = this.props.block;
var contentState = this.props.contentState;
var newTex = prompt("Enter your tex here", this.props.src) || this.props.src;
var entityKey = block.getEntityAt(0);
contentState.mergeEntityData(entityKey, { src: newTex });
};
Math.prototype.render = function () {
var _this = this;
return React.createElement("div", null,
React.createElement(MathOutput, { content: this.props.src, onClick: function () { return _this.onClick(); } }));
};
return Math;
}(React.Component));
var MathOutput = /** @class */ (function (_super) {
__extends(MathOutput, _super);
function MathOutput(props) {
var _this = _super.call(this, props) || this;
_this._timer = null;
_this._container = null;
return _this;
}
MathOutput.prototype._update = function () {
var _this = this;
if (this._timer) {
clearTimeout(this._timer);
}
this._timer = setTimeout(function () {
katex.render(_this.props.content, _this._container, { displayMode: false });
}, 0);
};
MathOutput.prototype.componentDidMount = function () {
this._update();
};
MathOutput.prototype.componentWillReceiveProps = function (props) {
if (props.src !== this.props.content) {
this._update();
}
};
MathOutput.prototype.componentWillUnmount = function () {
clearTimeout(this._timer);
this._timer = null;
};
MathOutput.prototype.render = function () {
var _this = this;
return React.createElement("span", { ref: function (c) { return _this._container = c; }, onClick: this.props.onClick });
};
return MathOutput;
}(React.Component));
var Image = function (props) {
return React.createElement("img", { src: props.src });
};
var Video = function (props) {
return React.createElement("video", { controls: true, src: props.src });
};
var YouTube = function (props) {
return (React.createElement("iframe", { width: "420", height: "315", src: props.src }));
};
var Link = function (props) {
var url = draft_js_1.Entity.get(props.entityKey).getData().url;
return (React.createElement("a", { href: url }, props.children));
};
var Media = function (editable) { return function (props) {
var entity = props.contentState.getEntity(props.block.getEntityAt(0));
var src = entity.getData().src;
var type = entity.getType();
if (type === 'image') {
return React.createElement(Image, { src: src });
}
else if (type === 'video') {
return React.createElement(Video, { src: src });
}
else if (type === 'youtube') {
return React.createElement(YouTube, { src: src });
}
else if (type === 'mathblock') {
return React.createElement(Math, { src: src, editable: editable, contentState: props.contentState, block: props.block });
}
return null;
}; };
var SlideEditorButtonsBar = /** @class */ (function (_super) {
__extends(SlideEditorButtonsBar, _super);
function SlideEditorButtonsBar(props, context) {
return _super.call(this, props, context) || this;
}
SlideEditorButtonsBar.prototype.render = function () {
var _this = this;
return (React.createElement("div", { style: { display: "inline-block" }, className: "text-editor__menu-bar" },
React.createElement("div", { className: "text-editor__menu-group" },
React.createElement("button", { className: "text-editor__menu-button text-editor__menu-button--bold", onClick: function () { return _this.props.toggle_style('bold'); } }),
React.createElement("button", { className: "text-editor__menu-button text-editor__menu-button--italic", onClick: function () { return _this.props.toggle_style('italic'); } }),
React.createElement("button", { className: "text-editor__menu-button text-editor__menu-button--underline", onClick: function () { return _this.props.toggle_style('underline'); } })),
React.createElement("div", { className: "text-editor__menu-group" },
React.createElement("button", { className: "text-editor__menu-button text-editor__menu-button--h1", onClick: function () { return _this.props.toggle_block_type('header-one'); } }),
React.createElement("button", { className: "text-editor__menu-button text-editor__menu-button--h2", onClick: function () { return _this.props.toggle_block_type('header-two'); } }),
React.createElement("button", { className: "text-editor__menu-button text-editor__menu-button--h3", onClick: function () { return _this.props.toggle_block_type('header-three'); } })),
React.createElement("div", { className: "text-editor__menu-group" },
React.createElement("button", { className: "text-editor__menu-button text-editor__menu-button--ul", onClick: function () { return _this.props.toggle_block_type('unordered-list-item'); } }),
React.createElement("button", { className: "text-editor__menu-button text-editor__menu-button--ol", onClick: function () { return _this.props.toggle_block_type('ordered-list-item'); } })),
React.createElement("div", { className: "text-editor__menu-group" },
React.createElement("button", { className: "text-editor__menu-button text-editor__menu-button--code", onClick: function () { return _this.props.toggle_block_type('code-block'); } }),
React.createElement("button", { className: "text-editor__menu-button text-editor__menu-button--blockquote", onClick: function () { return _this.props.toggle_block_type('blockquote'); } }),
React.createElement("button", { className: "text-editor__menu-button text-editor__menu-button--latex", onClick: function () { return _this.props.insert_media(prompt("Insert your latex code here"), "mathblock"); } }),
React.createElement("button", { className: "text-editor__menu-button text-editor__menu-button--image", onClick: function () { return _this.file_input.click(); } }),
React.createElement("button", { className: "text-editor__menu-button text-editor__menu-button--link", onClick: function () { return _this.props.insert_link(prompt("Insert your link here")); } })),
React.createElement("input", { type: "file", onChange: function (e) {
var file = e.target.files[0];
if (!file)
return;
var reader = new FileReader();
reader.onload = function (e) {
var contents = e.target.result;
_this.props.insert_media(contents, "image");
};
reader.readAsDataURL(file);
}, ref: function (file_input) { return _this.file_input = file_input; }, style: { display: "none" } })));
};
return SlideEditorButtonsBar;
}(React.Component));
var RichText = /** @class */ (function (_super) {
__extends(RichText, _super);
function RichText(props, context) {
var _this = _super.call(this, props, context) || this;
_this.state = { current_state: props.json_state };
return _this;
}
RichText.prototype.componentWillReceiveProps = function (new_props) {
var _this = this;
var new_state = new_props.json_state;
if (this.state.current_state != new_state) {
this.setState(__assign({}, this.state, { current_state: new_state }), function () {
return _this.props.cont(function () { })(_this.state.current_state);
});
}
};
RichText.prototype.componentWillMount = function () {
this.props.cont(function () { })(this.state.current_state);
};
RichText.prototype.render = function () {
var _this = this;
return React.createElement(DraftEditor, { initial_state: this.state.current_state ?
DraftEditor.deserialize_state(this.state.current_state) :
DraftEditor.empty_state(), set_state: function (s, on_success) {
var new_state = DraftEditor.serialize_state(s);
if (_this.state.current_state != new_state) {
_this.setState(__assign({}, _this.state, { current_state: new_state }), function () {
return _this.props.cont(function () { })(_this.state.current_state);
});
}
}, editable: this.props.mode == "edit" });
};
return RichText;
}(React.Component));
function rich_text(mode, key, dbg) {
return function (json_state) { return core_1.make_C(function (ctxt) { return function (cont) {
return (React.createElement(RichText, { kind: "rich text", debug_info: dbg, json_state: json_state, mode: mode, context: ctxt, cont: cont, key: key }));
}; }); };
}
exports.rich_text = rich_text;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmljaF90ZXh0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3JlYWN0X21vbmFkL3JpY2hfdGV4dC50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSw2QkFBK0I7QUFHL0IscUNBQXlKO0FBQ3pKLGdDQUFrQztBQUNsQywrQkFBbUU7QUFDbkUsNkJBQStCO0FBOEMvQjtJQUEwQiwrQkFBdUM7SUFDL0QscUJBQVksS0FBZ0IsRUFBRSxPQUFPO1FBQXJDLFlBQ0Usa0JBQU0sS0FBSyxFQUFFLE9BQU8sQ0FBQyxTQUd0QjtRQTRHRCxZQUFNLEdBQVcsSUFBSSxDQUFBO1FBN0duQixLQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsWUFBWSxFQUFFLEtBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLENBQUE7O0lBQ3pELENBQUM7SUFTTSwyQkFBZSxHQUF0QixVQUF1QixZQUF3QjtRQUM3QyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDLENBQUE7SUFDN0UsQ0FBQztJQUVNLDZCQUFpQixHQUF4QixVQUF5QixXQUFlO1FBQ3RDLElBQUk7WUFDRixPQUFPLHNCQUFXLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDLEVBQUUsV0FBVyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUE7U0FDN0c7UUFBQyxPQUFPLENBQUMsRUFBRTtZQUNWLE9BQU8sV0FBVyxDQUFDLFdBQVcsRUFBRSxDQUFBO1NBQ2pDO0lBQ0gsQ0FBQztJQWVNLHVCQUFXLEdBQWxCO1FBQ0UsT0FBTyxzQkFBVyxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQTtJQUN6RCxDQUFDO0lBRUQsOEJBQVEsR0FBUixVQUFTLGdCQUE0QixF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