1
import UAParser from 'ua-parser-js';
3
import { isOnServerSide } from '@/utils/env';
5
export const getParser = () => {
6
if (isOnServerSide) return new UAParser('Node');
8
let ua = navigator.userAgent;
9
return new UAParser(ua);
12
export const getPlatform = () => {
13
return getParser().getOS().name;
16
export const getBrowser = () => {
17
return getParser().getResult().browser.name;
20
export const browserInfo = {
21
browser: getBrowser(),
22
isMobile: getParser().getDevice().type === 'mobile',
23
os: getParser().getOS().name,
26
export const isMacOS = () => getPlatform() === 'Mac OS';
28
export const isInStandaloneMode = () => {
29
if (isOnServerSide) return false;
31
window.matchMedia('(display-mode: standalone)').matches ||
32
('standalone' in navigator && (navigator as any).standalone === true)
36
export const isSonomaOrLaterSafari = () => {
37
if (isOnServerSide) return false;
39
// refs: https://github.com/khmyznikov/pwa-install/blob/0904788b9d0e34399846f6cb7dbb5efeabb62c20/src/utils.ts#L24
40
const userAgent = navigator.userAgent.toLowerCase();
41
if (navigator.maxTouchPoints || !/macintosh/.test(userAgent)) return false;
43
// check safari version >= 17
44
const version = /version\/(\d{2})\./.exec(userAgent);
45
if (!version || !version[1] || !(parseInt(version[1]) >= 17)) return false;
48
// hacky way to detect Sonoma
49
const audioCheck = document.createElement('audio').canPlayType('audio/wav; codecs="1"');
50
const webGLCheck = new OffscreenCanvas(1, 1).getContext('webgl');
51
return Boolean(audioCheck) && Boolean(webGLCheck);