diff --git a/app/src/config/about.ts b/app/src/config/about.ts index ecf4a12f4..3103fd099 100644 --- a/app/src/config/about.ts +++ b/app/src/config/about.ts @@ -7,7 +7,7 @@ import {fetchPost} from "../util/fetch"; import {setAccessAuthCode, setProxy} from "./util/about"; import {exportLayout} from "../layout/util"; import {exitSiYuan, processSync} from "../dialog/processSystem"; -import {openByMobile, writeText} from "../protyle/util/compatibility"; +import {isInAndroid, isInIOS, openByMobile, writeText} from "../protyle/util/compatibility"; import {showMessage} from "../dialog/message"; import {Dialog} from "../dialog"; import {confirmDialog} from "../dialog/confirmDialog"; @@ -149,7 +149,7 @@ export const about = { ${window.siyuan.languages.checkUpdate}
- diff --git a/app/src/dialog/processSystem.ts b/app/src/dialog/processSystem.ts index 5a180c3a8..35aa70465 100644 --- a/app/src/dialog/processSystem.ts +++ b/app/src/dialog/processSystem.ts @@ -22,6 +22,7 @@ import {setEmpty} from "../mobile/util/setEmpty"; import {hideElements} from "../protyle/ui/hideElements"; import {App} from "../index"; import {saveScroll} from "../protyle/scroll/saveScroll"; +import {isInAndroid, isInIOS} from "../protyle/util/compatibility"; const updateTitle = (rootID: string, tab: Tab) => { fetchPost("/api/block/getDocInfo", { @@ -141,7 +142,7 @@ export const kernelError = () => { return; } let iosReStart = ""; - if (window.siyuan.config.system.container === "ios" && window.webkit?.messageHandlers) { + if (isInIOS()) { iosReStart = `
`; } const dialog = new Dialog({ @@ -181,7 +182,7 @@ export const exitSiYuan = () => { /// #if !BROWSER ipcRenderer.send(Constants.SIYUAN_QUIT, location.port); /// #else - if (["ios", "android"].includes(window.siyuan.config.system.container) && (window.webkit?.messageHandlers || window.JSAndroid)) { + if (isInIOS() || isInAndroid()) { window.location.href = "siyuan://api/system/exit"; } /// #endif @@ -221,7 +222,7 @@ export const exitSiYuan = () => { /// #if !BROWSER ipcRenderer.send(Constants.SIYUAN_QUIT, location.port); /// #else - if (["ios", "android"].includes(window.siyuan.config.system.container) && (window.webkit?.messageHandlers || window.JSAndroid)) { + if (isInIOS() || isInAndroid()) { window.location.href = "siyuan://api/system/exit"; } /// #endif diff --git a/app/src/menus/util.ts b/app/src/menus/util.ts index 17f0381f4..df681c60a 100644 --- a/app/src/menus/util.ts +++ b/app/src/menus/util.ts @@ -11,7 +11,7 @@ import {Constants} from "../constants"; import {openNewWindowById} from "../window/openNewWindow"; import {MenuItem} from "./Menu"; import {App} from "../index"; -import {updateHotkeyTip} from "../protyle/util/compatibility"; +import {isInAndroid, updateHotkeyTip} from "../protyle/util/compatibility"; export const exportAsset = (src: string) => { /// #if !BROWSER @@ -105,7 +105,7 @@ export const openEditorTab = (app: App, id: string, notebookId?: string, pathStr }; export const copyPNG = (imgElement: HTMLImageElement) => { - if ("android" === window.siyuan.config.system.container && window.JSAndroid) { + if (isInAndroid()) { window.JSAndroid.writeImageClipboard(imgElement.getAttribute("src")); return; } else { diff --git a/app/src/menus/workspace.ts b/app/src/menus/workspace.ts index 691ab0cf2..4a875e5fc 100644 --- a/app/src/menus/workspace.ts +++ b/app/src/menus/workspace.ts @@ -8,7 +8,7 @@ import {getOpenNotebookCount, originalPath, pathPosix} from "../util/pathName"; import {mountHelp, newDailyNote} from "../util/mount"; import {fetchPost} from "../util/fetch"; import {Constants} from "../constants"; -import {setStorageVal, writeText} from "../protyle/util/compatibility"; +import {isInAndroid, isInIOS, setStorageVal, writeText} from "../protyle/util/compatibility"; import {openCard} from "../card/openCard"; import {openSetting} from "../config"; import {getAllDocks} from "../layout/getAll"; @@ -23,6 +23,7 @@ import {Dialog} from "../dialog"; import {hasClosestByClassName} from "../protyle/util/hasClosest"; import {confirmDialog} from "../dialog/confirmDialog"; import {App} from "../index"; +import {isBrowser} from "../util/functions"; const togglePinDock = (dock: Dock, icon: string) => { return { @@ -204,12 +205,14 @@ export const workspaceMenu = (app: App, rect: DOMRect) => { }); }); /// #endif - window.siyuan.menus.menu.append(new MenuItem({ - label: window.siyuan.languages.workspaceList, - icon: "iconWorkspace", - type: "submenu", - submenu: workspaceSubMenu, - }).element); + if (!isBrowser() || isInIOS() || isInAndroid()) { + window.siyuan.menus.menu.append(new MenuItem({ + label: window.siyuan.languages.workspaceList, + icon: "iconWorkspace", + type: "submenu", + submenu: workspaceSubMenu, + }).element); + } } const layoutSubMenu: IMenu[] = [{ iconHTML: Constants.ZWSP, diff --git a/app/src/mobile/index.ts b/app/src/mobile/index.ts index 5b9edef90..e8b31c4ad 100644 --- a/app/src/mobile/index.ts +++ b/app/src/mobile/index.ts @@ -15,7 +15,7 @@ import {bootSync} from "../dialog/processSystem"; import {initMessage, showMessage} from "../dialog/message"; import {goBack} from "./util/MobileBackFoward"; import {hideKeyboardToolbar, showKeyboardToolbar} from "./util/keyboardToolbar"; -import {getLocalStorage, writeText} from "../protyle/util/compatibility"; +import {getLocalStorage, isInAndroid, writeText} from "../protyle/util/compatibility"; import {openMobileFileById} from "./editor"; import {getSearch} from "../util/functions"; import {initRightMenu} from "./menu"; diff --git a/app/src/mobile/menu/index.ts b/app/src/mobile/menu/index.ts index 867c78cc2..ab5daf740 100644 --- a/app/src/mobile/menu/index.ts +++ b/app/src/mobile/menu/index.ts @@ -16,7 +16,7 @@ import {initAbout} from "../settings/about"; import {getRecentDocs} from "./getRecentDocs"; import {initEditor} from "../settings/editor"; import {App} from "../../index"; -import {isHuawei} from "../../protyle/util/compatibility"; +import {isHuawei, isInAndroid, isInIOS} from "../../protyle/util/compatibility"; export const popMenu = () => { activeBlur(); @@ -77,7 +77,7 @@ export const initRightMenu = (app: App) => { - -
+
${window.siyuan.languages.workspaceList}
diff --git a/app/src/mobile/util/touch.ts b/app/src/mobile/util/touch.ts index 41f7356b8..7cfb754b5 100644 --- a/app/src/mobile/util/touch.ts +++ b/app/src/mobile/util/touch.ts @@ -4,6 +4,7 @@ import {popMenu} from "../menu"; import {activeBlur, hideKeyboardToolbar} from "./keyboardToolbar"; import {getCurrentEditor} from "../editor"; import {fileAnnotationRefMenu, linkMenu, refMenu, tagMenu} from "../../menus/protyle"; +import {isInIOS} from "../../protyle/util/compatibility"; let clientX: number; let clientY: number; @@ -27,7 +28,7 @@ export const handleTouchEnd = (event: TouchEvent) => { const editor = getCurrentEditor(); const target = event.target as HTMLElement; if (editor && typeof yDiff === "undefined" && new Date().getTime() - time > 900 && - target.tagName === "SPAN" && window.webkit?.messageHandlers && + target.tagName === "SPAN" && isInIOS() && !hasClosestByAttribute(target, "data-type", "NodeBlockQueryEmbed")) { // ios 长按行内元素弹出菜单 const types = (target.getAttribute("data-type") || "").split(" "); diff --git a/app/src/protyle/breadcrumb/index.ts b/app/src/protyle/breadcrumb/index.ts index be22e5f07..f3b815e1d 100644 --- a/app/src/protyle/breadcrumb/index.ts +++ b/app/src/protyle/breadcrumb/index.ts @@ -30,6 +30,7 @@ import {Menu} from "../../plugin/Menu"; import {getNoContainerElement} from "../wysiwyg/getBlock"; import {openTitleMenu} from "../header/openTitleMenu"; import {emitOpenMenu} from "../../plugin/EventBus"; +import {isInAndroid} from "../util/compatibility"; export class Breadcrumb { public element: HTMLElement; @@ -266,7 +267,7 @@ export class Breadcrumb { window.siyuan.menus.menu.remove(); }); window.siyuan.menus.menu.append(uploadMenu); - if (window.siyuan.config.system.container !== "android" || !window.JSAndroid) { + if (!isInAndroid()) { window.siyuan.menus.menu.append(new MenuItem({ current: this.mediaRecorder && this.mediaRecorder.isRecording, icon: "iconRecord", diff --git a/app/src/protyle/util/compatibility.ts b/app/src/protyle/util/compatibility.ts index 3a37bcc7b..9f20c262b 100644 --- a/app/src/protyle/util/compatibility.ts +++ b/app/src/protyle/util/compatibility.ts @@ -8,7 +8,7 @@ export const openByMobile = (uri: string) => { } if (window.siyuan.config.system.container === "ios") { window.location.href = uri; - } else if (window.siyuan.config.system.container === "android" && window.JSAndroid) { + } else if (isInAndroid()) { window.JSAndroid.openExternal(uri); } else { window.open(uri); @@ -16,7 +16,7 @@ export const openByMobile = (uri: string) => { }; export const readText = () => { - if ("android" === window.siyuan.config.system.container && window.JSAndroid) { + if (isInAndroid()) { return window.JSAndroid.readClipboard(); } return navigator.clipboard.readText(); @@ -29,19 +29,19 @@ export const writeText = (text: string) => { } try { // navigator.clipboard.writeText 抛出异常不进入 catch,这里需要先处理移动端复制 - if ("android" === window.siyuan.config.system.container && window.JSAndroid) { + if (isInAndroid()) { window.JSAndroid.writeClipboard(text); return; } - if ("ios" === window.siyuan.config.system.container && window.webkit?.messageHandlers) { + if (isInIOS()) { window.webkit.messageHandlers.setClipboard.postMessage(text); return; } navigator.clipboard.writeText(text); } catch (e) { - if (window.siyuan.config.system.container === "ios" && window.webkit?.messageHandlers) { + if (isInIOS()) { window.webkit.messageHandlers.setClipboard.postMessage(text); - } else if (window.siyuan.config.system.container === "android" && window.JSAndroid) { + } else if (isInAndroid()) { window.JSAndroid.writeClipboard(text); } else { const textElement = document.createElement("textarea"); @@ -97,6 +97,14 @@ export const isMac = () => { return navigator.platform.toUpperCase().indexOf("MAC") > -1; }; +export const isInAndroid = () => { + return window.siyuan.config.system.container === "android" && window.JSAndroid +} + +export const isInIOS = () => { + return window.siyuan.config.system.container === "ios" && window.webkit?.messageHandlers +} + // Mac,Windows 快捷键展示 export const updateHotkeyTip = (hotkey: string) => { if (/Mac/.test(navigator.platform) || navigator.platform === "iPhone") { diff --git a/app/src/protyle/wysiwyg/index.ts b/app/src/protyle/wysiwyg/index.ts index 0a477f455..2abce4a31 100644 --- a/app/src/protyle/wysiwyg/index.ts +++ b/app/src/protyle/wysiwyg/index.ts @@ -65,7 +65,7 @@ import {openGlobalSearch} from "../../search/util"; import {popSearch} from "../../mobile/menu/search"; /// #endif import {BlockPanel} from "../../block/Panel"; -import {isCtrl, openByMobile} from "../util/compatibility"; +import {isCtrl, isInAndroid, isInIOS, openByMobile} from "../util/compatibility"; import {MenuItem} from "../../menus/Menu"; import {fetchPost} from "../../util/fetch"; import {onGet} from "../util/onGet"; @@ -2080,7 +2080,7 @@ export class WYSIWYG { /// #if !MOBILE pushBack(protyle, newRange); /// #endif - }, (isMobile() || window.webkit?.messageHandlers) ? 520 : 0); // Android/iPad 双击慢了出不来 + }, (isMobile() || isInIOS()) ? 520 : 0); // Android/iPad 双击慢了出不来 protyle.hint.enableExtend = false; if (event.shiftKey) { event.preventDefault(); diff --git a/app/src/util/assets.ts b/app/src/util/assets.ts index 07ab3039e..634747519 100644 --- a/app/src/util/assets.ts +++ b/app/src/util/assets.ts @@ -7,6 +7,7 @@ import {exportLayout} from "../layout/util"; /// #endif import {fetchPost} from "./fetch"; import {appearance} from "../config/appearance"; +import {isInAndroid, isInIOS} from "../protyle/util/compatibility"; const loadThirdIcon = (iconURL: string, data: IAppearance) => { addScript(iconURL, "iconDefaultScript").then(() => { @@ -289,8 +290,7 @@ export const setMode = (modeElementValue: number) => { }; const updateMobileTheme = (OSTheme: string) => { - if ((window.siyuan.config.system.container === "ios" && window.webkit?.messageHandlers) || - (window.siyuan.config.system.container === "android" && window.JSAndroid)) { + if (isInIOS() || isInAndroid()) { setTimeout(() => { const backgroundColor = getComputedStyle(document.body).getPropertyValue("--b3-theme-background").trim(); let mode = window.siyuan.config.appearance.mode; @@ -301,9 +301,9 @@ const updateMobileTheme = (OSTheme: string) => { mode = 0; } } - if (window.siyuan.config.system.container === "ios" && window.webkit?.messageHandlers) { + if (isInIOS()) { window.webkit.messageHandlers.changeStatusBar.postMessage((backgroundColor || (mode === 0 ? "#fff" : "#1e1e1e")) + " " + mode); - } else if (window.siyuan.config.system.container === "android" && window.JSAndroid) { + } else if (isInAndroid()) { window.JSAndroid.changeStatusBarColor(backgroundColor, mode); } }, 500); // 移动端需要加载完才可以获取到颜色