The Node.js® Website
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;