The Node.js® Website
at main 1.3 kB view raw
1'use client'; 2 3import { useEffect, useState } from 'react'; 4 5import type { UserOS } from '@/types/userOS'; 6import { detectOS } from '@/util/detectOS'; 7import { getArchitecture } from '@/util/getArchitecture'; 8import { getBitness } from '@/util/getBitness'; 9 10type UserOSState = { 11 os: UserOS; 12 bitness: number; 13 architecture: string; 14}; 15 16const useDetectOS = () => { 17 const [userOSState, setUserOSState] = useState<UserOSState>({ 18 os: 'OTHER', 19 bitness: 86, 20 architecture: 'ARM', 21 }); 22 23 useEffect(() => { 24 Promise.all([getBitness(), getArchitecture()]).then( 25 ([bitness, architecture]) => { 26 const userAgent: string | undefined = 27 (typeof navigator === 'object' && navigator.userAgent) || ''; 28 // Default bitness if unable to determine 29 const defaultBitness: number = 86; 30 // Regex to detect 64-bit architecture in user agent 31 const bitnessRegex = /WOW64|Win64|x86_64|x86-64|x64_64|x64;|AMD64/; 32 33 setUserOSState({ 34 os: detectOS(), 35 bitness: 36 bitness === '64' || bitnessRegex.test(userAgent) 37 ? 64 38 : defaultBitness, 39 architecture: architecture ? architecture : '', 40 }); 41 } 42 ); 43 }, []); 44 45 return userOSState; 46}; 47 48export default useDetectOS;