Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
sagemathinc
GitHub Repository: sagemathinc/cocalc
Path: blob/master/src/packages/frontend/editors/slate/slate-react/utils/environment.ts
1698 views
1
import React from "react";
2
3
export const IS_REACT_VERSION_17_OR_ABOVE =
4
parseInt(React.version.split(".")[0], 10) >= 17;
5
6
export const IS_IOS =
7
typeof navigator !== "undefined" &&
8
typeof window !== "undefined" &&
9
/iPad|iPhone|iPod/.test(navigator.userAgent) &&
10
!window["MSStream"];
11
12
export const IS_APPLE =
13
typeof navigator !== "undefined" && /Mac OS X/.test(navigator.userAgent);
14
15
export const IS_ANDROID =
16
typeof navigator !== "undefined" && /Android/.test(navigator.userAgent);
17
18
export const IS_FIREFOX =
19
typeof navigator !== "undefined" &&
20
/^(?!.*Seamonkey)(?=.*Firefox).*/i.test(navigator.userAgent);
21
22
export const IS_SAFARI =
23
typeof navigator !== "undefined" &&
24
/Version\/[\d\.]+.*Safari/.test(navigator.userAgent);
25
26
// "modern" Edge was released at 79.x
27
export const IS_EDGE_LEGACY =
28
typeof navigator !== "undefined" &&
29
/Edge?\/(?:[0-6][0-9]|[0-7][0-8])(?:\.)/i.test(navigator.userAgent);
30
31
export const IS_CHROME =
32
typeof navigator !== "undefined" && /Chrome/i.test(navigator.userAgent);
33
34
// Native `beforeInput` events don't work well with react on Chrome 75
35
// and older, Chrome 76+ can use `beforeInput` though.
36
export const IS_CHROME_LEGACY =
37
typeof navigator !== "undefined" &&
38
/Chrome?\/(?:[0-7][0-5]|[0-6][0-9])(?:\.)/i.test(navigator.userAgent);
39
40
// Firefox did not support `beforeInput` until `v87`.
41
export const IS_FIREFOX_LEGACY =
42
typeof navigator !== "undefined" &&
43
/^(?!.*Seamonkey)(?=.*Firefox\/(?:[0-7][0-9]|[0-8][0-6])(?:\.)).*/i.test(
44
navigator.userAgent
45
);
46
47
// qq browser
48
export const IS_QQBROWSER =
49
typeof navigator !== "undefined" && /.*QQBrowser/.test(navigator.userAgent);
50
51
// UC mobile browser
52
export const IS_UC_MOBILE =
53
typeof navigator !== "undefined" && /.*UCBrowser/.test(navigator.userAgent);
54
55
// Wechat browser
56
export const IS_WECHATBROWSER =
57
typeof navigator !== "undefined" && /.*Wechat/.test(navigator.userAgent);
58
59
// Check if DOM is available as React does internally.
60
// https://github.com/facebook/react/blob/master/packages/shared/ExecutionEnvironment.js
61
export const CAN_USE_DOM = !!(
62
typeof window !== "undefined" &&
63
typeof window.document !== "undefined" &&
64
typeof window.document.createElement !== "undefined"
65
);
66
67
// COMPAT: Firefox/Edge Legacy don't support the `beforeinput` event
68
// Chrome Legacy doesn't support `beforeinput` correctly
69
export const HAS_BEFORE_INPUT_SUPPORT =
70
!IS_CHROME_LEGACY &&
71
!IS_EDGE_LEGACY &&
72
// globalThis is undefined in older browsers
73
typeof globalThis !== "undefined" &&
74
globalThis.InputEvent &&
75
// @ts-ignore The `getTargetRanges` property isn't recognized.
76
typeof globalThis.InputEvent.prototype.getTargetRanges === "function";
77
78