siyuan/app/src/mobile/editor.ts

113 lines
4.9 KiB
TypeScript

import {Protyle} from "../protyle";
import {setEditor} from "./util/setEmpty";
import {closePanel} from "./util/closePanel";
import {Constants} from "../constants";
import {fetchPost} from "../util/fetch";
import {onGet} from "../protyle/util/onGet";
import {addLoading} from "../protyle/ui/initUI";
import {scrollCenter} from "../util/highlightById";
import {isInEmbedBlock} from "../protyle/util/hasClosest";
import {setEditMode} from "../protyle/util/setEditMode";
import {hideElements} from "../protyle/ui/hideElements";
import {pushBack} from "./util/MobileBackFoward";
import {setStorageVal} from "../protyle/util/compatibility";
import {showMessage} from "../dialog/message";
import {App} from "../index";
import {getDocByScroll, saveScroll} from "../protyle/scroll/saveScroll";
export const getCurrentEditor = () => {
return window.siyuan.mobile.popEditor || window.siyuan.mobile.editor;
};
export const openMobileFileById = (app: App, id: string, action: TProtyleAction[] = [Constants.CB_GET_HL]) => {
window.siyuan.storage[Constants.LOCAL_DOCINFO] = {id};
setStorageVal(Constants.LOCAL_DOCINFO, window.siyuan.storage[Constants.LOCAL_DOCINFO]);
const avPanelElement = document.querySelector(".av__panel");
if (avPanelElement && !avPanelElement.classList.contains("fn__none")) {
avPanelElement.dispatchEvent(new CustomEvent("click", {detail: "close"}));
}
if (window.siyuan.mobile.editor) {
saveScroll(window.siyuan.mobile.editor.protyle);
hideElements(["toolbar", "hint", "util"], window.siyuan.mobile.editor.protyle);
if (window.siyuan.mobile.editor.protyle.contentElement.classList.contains("fn__none")) {
setEditMode(window.siyuan.mobile.editor.protyle, "wysiwyg");
}
let blockElement;
Array.from(window.siyuan.mobile.editor.protyle.wysiwyg.element.querySelectorAll(`[data-node-id="${id}"]`)).find((item: HTMLElement) => {
if (!isInEmbedBlock(item)) {
blockElement = item;
return true;
}
});
if (blockElement) {
pushBack();
scrollCenter(window.siyuan.mobile.editor.protyle, blockElement, true);
closePanel();
return;
}
}
fetchPost("/api/block/getBlockInfo", {id}, (data) => {
if (data.code === 3) {
showMessage(data.msg);
return;
}
const protyleOptions: IProtyleOptions = {
blockId: id,
rootId: data.data.rootID,
action,
render: {
scroll: true,
title: true,
background: true,
gutter: true,
},
typewriterMode: true,
preview: {
actions: ["mp-wechat", "zhihu", "yuque"]
}
};
if (window.siyuan.mobile.editor) {
window.siyuan.mobile.editor.protyle.title.element.removeAttribute("data-render");
pushBack();
addLoading(window.siyuan.mobile.editor.protyle);
if (window.siyuan.mobile.editor.protyle.block.rootID !== data.data.rootID) {
window.siyuan.mobile.editor.protyle.wysiwyg.element.innerHTML = "";
}
if (action.includes(Constants.CB_GET_SCROLL) && window.siyuan.storage[Constants.LOCAL_FILEPOSITION][data.data.rootID]) {
getDocByScroll({
protyle: window.siyuan.mobile.editor.protyle,
scrollAttr: window.siyuan.storage[Constants.LOCAL_FILEPOSITION][data.data.rootID],
mergedOptions: protyleOptions,
cb() {
app.plugins.forEach(item => {
item.eventBus.emit("switch-protyle", {protyle: window.siyuan.mobile.editor.protyle});
});
}
});
} else {
fetchPost("/api/filetree/getDoc", {
id,
size: action.includes(Constants.CB_GET_ALL) ? Constants.SIZE_GET_MAX : window.siyuan.config.editor.dynamicLoadBlocks,
mode: action.includes(Constants.CB_GET_CONTEXT) ? 3 : 0,
}, getResponse => {
onGet({
data: getResponse,
protyle: window.siyuan.mobile.editor.protyle,
action,
afterCB() {
app.plugins.forEach(item => {
item.eventBus.emit("switch-protyle", {protyle: window.siyuan.mobile.editor.protyle});
});
}
});
});
}
window.siyuan.mobile.editor.protyle.undo.clear();
} else {
window.siyuan.mobile.editor = new Protyle(app, document.getElementById("editor"), protyleOptions);
}
setEditor();
closePanel();
});
};