forked from siyuan-note/siyuan
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathplatformUtils.ts
More file actions
104 lines (100 loc) · 4.06 KB
/
Copy pathplatformUtils.ts
File metadata and controls
104 lines (100 loc) · 4.06 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
import * as compatibility from "../protyle/util/compatibility";
/// #if !BROWSER
import {ipcRenderer} from "electron";
import {Constants} from "../constants";
/// #endif
export {openByMobile} from "../editor/openLink";
export const readText = compatibility.readText;
export const writeText = compatibility.writeText;
export const copyPlainText = compatibility.copyPlainText;
export const getEventName = compatibility.getEventName;
export const isOnlyMeta = compatibility.isOnlyMeta;
export const isNotCtrl = compatibility.isNotCtrl;
export const isHuawei = compatibility.isHuawei;
export const isIPhone = compatibility.isIPhone;
export const isIPad = compatibility.isIPad;
export const isMac = compatibility.isMac;
export const isInAndroid = compatibility.isInAndroid;
export const isInIOS = compatibility.isInIOS;
export const updateHotkeyTip = compatibility.updateHotkeyTip;
export const getLocalStorage = compatibility.getLocalStorage;
export const setStorageVal = compatibility.setStorageVal;
export const getStorageVal = (key: string): any => {
return window.siyuan.storage?.[key] ?? null; // 不存在时与接口响应一致使用 null
};
/**
* @param {string} [options.timeoutType="defalut"] 仅在 Windows 和 Linux 有效,"default" 表示使用默认的超时机制,"never" 表示通知将一直显示,直到用户手动关闭它。
* @returns 通知 id
*/
export const sendNotification = (options: {
channel?: string,
title?: string,
body?: string,
delayInSeconds?: number,
timeoutType?: "default" | "never"
}): Promise<number> => {
return new Promise((resolve) => {
const title = options.title || "";
const body = options.body || "";
const delayInSeconds = options.delayInSeconds || 0;
if (!title.trim() && !body.trim()) {
// 不能同时为空
resolve(-1);
return;
}
/// #if BROWSER
const channel = options.channel || "SiYuan Notifications";
if (window.JSAndroid && window.JSAndroid.sendNotification) {
const id = window.JSAndroid.sendNotification(channel, title, body, delayInSeconds);
resolve(id);
} else if (window.JSHarmony && window.JSHarmony.sendNotification) {
const id = window.JSHarmony.sendNotification(channel, title, body, delayInSeconds);
resolve(id);
} else if (window.webkit && window.webkit.messageHandlers && window.webkit.messageHandlers.sendNotification) {
const callbackId = "cb_" + Date.now();
// 定义临时回调
if (!window.webkit.nativeCallbacks) {
window.webkit.nativeCallbacks = {};
}
window.webkit.nativeCallbacks[callbackId] = (id: number) => {
delete window.webkit.nativeCallbacks[callbackId];
resolve(id);
};
window.webkit.messageHandlers.sendNotification.postMessage({
title,
body,
delay: delayInSeconds,
callback: `window.webkit.nativeCallbacks.${callbackId}`
});
} else {
resolve(-1);
}
/// #else
const timeoutId = window.setTimeout(() => {
ipcRenderer.send(Constants.SIYUAN_CMD, {
cmd: "notification",
title,
body,
timeoutType: options.timeoutType || "default"
});
}, delayInSeconds * 1000);
resolve(timeoutId);
/// #endif
});
};
export const cancelNotification = (id: number) => {
if (id < 0) {
return;
}
/// #if BROWSER
if (window.JSAndroid && window.JSAndroid.cancelNotification) {
window.JSAndroid.cancelNotification(id);
} else if (window.JSHarmony && window.JSHarmony.cancelNotification) {
window.JSHarmony.cancelNotification(id);
} else if (window.webkit && window.webkit.messageHandlers && window.webkit.messageHandlers.cancelNotification) {
window.webkit.messageHandlers.cancelNotification.postMessage(id);
}
/// else
clearTimeout(id);
/// #endif
};