Files
file-one/platform.ts

79 lines
1.9 KiB
TypeScript

export enum Platform {
Windows = 'windows',
MacOS = 'macos',
Linux = 'linux',
Android = 'android',
iOS = 'ios'
}
// Internal global variables (computed once at module load)
let _isWindows = false
let _isMacOS = false
let _isLinux = false
let _isAndroid = false
let _isIOS = false
let _isMobile = false
let _userAgent: string | undefined
let _platform: Platform = Platform.Linux // Default fallback
interface INavigator {
userAgent: string
maxTouchPoints?: number
}
declare const navigator: INavigator
// Platform detection logic (runs once at module load)
if (typeof navigator === "object") {
_userAgent = navigator.userAgent
// iOS detection (must come before macOS since iOS contains "Mac")
if (
/iPad|iPhone|iPod/.test(_userAgent) ||
(/Macintosh/.test(_userAgent) &&
navigator.maxTouchPoints &&
navigator.maxTouchPoints > 0)
) {
_isIOS = true
_platform = Platform.iOS
_isMobile = /iPhone|iPod/.test(_userAgent) || /Mobi/.test(_userAgent)
}
// Android detection
else if (/Android/.test(_userAgent)) {
_isAndroid = true
_platform = Platform.Android
_isMobile = true
}
// Windows detection
else if (/Windows/.test(_userAgent)) {
_isWindows = true
_platform = Platform.Windows
_isMobile = /Mobi/.test(_userAgent)
}
// macOS detection
else if (/Macintosh|Mac OS X/.test(_userAgent)) {
_isMacOS = true
_platform = Platform.MacOS
_isMobile = false
}
// Linux detection
else if (/Linux/.test(_userAgent)) {
_isLinux = true
_platform = Platform.Linux
_isMobile = /Mobi/.test(_userAgent)
}
// Fallback - check for mobile
else {
_isMobile = /Mobi/.test(_userAgent)
}
}
// Exported constants (computed once)
export const isWindows = _isWindows
export const isMacOS = _isMacOS
export const isLinux = _isLinux
export const isAndroid = _isAndroid
export const isIOS = _isIOS
export const isMobile = _isMobile
export const platform = _platform
export const userAgent = _userAgent