import { MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN, MOBILE_SCREEN_MAX_WIDTH, MOBILE_SCREEN_LANDSCAPE_MAX_HEIGHT, MOBILE_SCREEN_LANDSCAPE_MAX_WIDTH, IS_TEST, SUPPORTED_VIDEO_CONTENT_TYPES, VIDEO_MOV_TYPE, } from '../config'; export * from './environmentWebp'; export * from './environmentSystemTheme'; export function getPlatform() { const { userAgent, platform } = window.navigator; const macosPlatforms = ['Macintosh', 'MacIntel', 'MacPPC', 'Mac68K']; const windowsPlatforms = ['Win32', 'Win64', 'Windows', 'WinCE']; const iosPlatforms = ['iPhone', 'iPad', 'iPod']; let os: 'macOS' | 'iOS' | 'Windows' | 'Android' | 'Linux' | undefined; if (macosPlatforms.indexOf(platform) !== -1) { os = 'macOS'; } else if (iosPlatforms.indexOf(platform) !== -1) { os = 'iOS'; } else if (windowsPlatforms.indexOf(platform) !== -1) { os = 'Windows'; } else if (/Android/.test(userAgent)) { os = 'Android'; } else if (/Linux/.test(platform)) { os = 'Linux'; } return os; } export const PLATFORM_ENV = getPlatform(); export const IS_MAC_OS = PLATFORM_ENV === 'macOS'; export const IS_IOS = PLATFORM_ENV === 'iOS'; export const IS_ANDROID = PLATFORM_ENV === 'Android'; export const IS_SAFARI = /^((?!chrome|android).)*safari/i.test(navigator.userAgent); export const IS_FIREFOX = /firefox|iceweasel/i.test(navigator.userAgent); export const IS_PWA = window.matchMedia('(display-mode: standalone)').matches || (window.navigator as any).standalone || document.referrer.includes('android-app://'); export const IS_TOUCH_ENV = window.matchMedia('(pointer: coarse)').matches; // Keep in mind the landscape orientation export const IS_SINGLE_COLUMN_LAYOUT = window.innerWidth <= MOBILE_SCREEN_MAX_WIDTH || ( window.innerWidth <= MOBILE_SCREEN_LANDSCAPE_MAX_WIDTH && window.innerHeight <= MOBILE_SCREEN_LANDSCAPE_MAX_HEIGHT ); // Special layout, 1 column while chat opened, 2 columns while collapsed export const IS_TABLET_COLUMN_LAYOUT = !IS_SINGLE_COLUMN_LAYOUT && ( window.innerWidth <= MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN ); export const IS_VOICE_RECORDING_SUPPORTED = Boolean( navigator.mediaDevices && 'getUserMedia' in navigator.mediaDevices && ( window.AudioContext || (window as any).webkitAudioContext ), ); export const IS_SMOOTH_SCROLL_SUPPORTED = 'scrollBehavior' in document.documentElement.style; export const IS_EMOJI_SUPPORTED = PLATFORM_ENV && (IS_MAC_OS || IS_IOS); export const IS_SERVICE_WORKER_SUPPORTED = 'serviceWorker' in navigator; // TODO Consider failed service worker export const IS_PROGRESSIVE_SUPPORTED = IS_SERVICE_WORKER_SUPPORTED; export const IS_STREAMING_SUPPORTED = 'MediaSource' in window; export const IS_OPUS_SUPPORTED = Boolean((new Audio()).canPlayType('audio/ogg; codecs=opus')); export const IS_CANVAS_FILTER_SUPPORTED = ( !IS_TEST && 'filter' in (document.createElement('canvas').getContext('2d') || {}) ); export const LAYERS_ANIMATION_NAME = IS_ANDROID ? 'slide-fade' : IS_IOS ? 'slide-layers' : 'push-slide'; const TEST_VIDEO = document.createElement('video'); export const IS_MOV_SUPPORTED = Boolean( TEST_VIDEO.canPlayType(VIDEO_MOV_TYPE).replace('no', '') || IS_IOS, // IOS reports '', but still plays .mov files ); if (IS_MOV_SUPPORTED) SUPPORTED_VIDEO_CONTENT_TYPES.add(VIDEO_MOV_TYPE); export const DPR = window.devicePixelRatio || 1; export const MASK_IMAGE_DISABLED = true;