1 | import { NativeEventEmitter, NativeModules } from 'react-native';
|
2 |
|
3 | const deviceInfoEmitter = new NativeEventEmitter(NativeModules.RNDeviceInfo);
|
4 |
|
5 | let batteryCharging = false,
|
6 | batteryLevel = -1,
|
7 | powerState = {};
|
8 |
|
9 | const _readPowerState = (battery) => {
|
10 | const { level, charging, chargingtime, dischargingtime } = battery;
|
11 |
|
12 | return {
|
13 | batteryLevel: level,
|
14 | lowPowerMode: false,
|
15 | batteryState: level === 1 ? 'full' : charging ? 'charging' : 'unplugged',
|
16 | chargingtime,
|
17 | dischargingtime,
|
18 | };
|
19 | };
|
20 |
|
21 | export const getMaxMemorySync = () => {
|
22 | if (window.performance && window.performance.memory) {
|
23 | return window.performance.memory.jsHeapSizeLimit;
|
24 | }
|
25 | return -1;
|
26 | };
|
27 |
|
28 | export const getInstallReferrerSync = () => {
|
29 | return document.referrer;
|
30 | };
|
31 |
|
32 | export const isAirplaneModeSync = () => {
|
33 | return !!navigator.onLine;
|
34 | };
|
35 |
|
36 | export const getUserAgentSync = () => {
|
37 | return window.navigator.userAgent;
|
38 | };
|
39 |
|
40 | export const isLocationEnabledSync = () => {
|
41 | return !!navigator.geolocation;
|
42 | };
|
43 |
|
44 | export const getTotalMemorySync = () => {
|
45 | if (navigator.deviceMemory) {
|
46 | return navigator.deviceMemory * 1000000000;
|
47 | }
|
48 | return -1;
|
49 | };
|
50 |
|
51 | export const getUsedMemorySync = () => {
|
52 | if (window.performance && window.performance.memory) {
|
53 | return window.performance.memory.usedJSHeapSize;
|
54 | }
|
55 | return -1;
|
56 | };
|
57 |
|
58 | const init = () => {
|
59 | if (typeof navigator === 'undefined' || !navigator.getBattery) return;
|
60 |
|
61 | navigator.getBattery().then((battery) => {
|
62 | batteryCharging = battery.charging;
|
63 |
|
64 | battery.addEventListener('chargingchange', () => {
|
65 | const { charging } = battery;
|
66 |
|
67 | batteryCharging = charging;
|
68 | powerState = _readPowerState(battery);
|
69 |
|
70 | deviceInfoEmitter.emit('RNDeviceInfo_powerStateDidChange', powerState);
|
71 | });
|
72 |
|
73 | battery.addEventListener('levelchange', () => {
|
74 | const { level } = battery;
|
75 |
|
76 | batteryLevel = level;
|
77 | powerState = _readPowerState(battery);
|
78 |
|
79 | deviceInfoEmitter.emit('RNDeviceInfo_batteryLevelDidChange', level);
|
80 | if (level < 0.2) {
|
81 | deviceInfoEmitter.emit('RNDeviceInfo_batteryLevelIsLow', level);
|
82 | }
|
83 | });
|
84 | });
|
85 | };
|
86 |
|
87 | const getBaseOsSync = () => {
|
88 | const userAgent = window.navigator.userAgent,
|
89 | platform = window.navigator.platform,
|
90 | macosPlatforms = ['Macintosh', 'MacIntel', 'MacPPC', 'Mac68K'],
|
91 | windowsPlatforms = ['Win32', 'Win64', 'Windows', 'WinCE'],
|
92 | iosPlatforms = ['iPhone', 'iPad', 'iPod'];
|
93 |
|
94 | let os = platform;
|
95 |
|
96 | if (macosPlatforms.indexOf(platform) !== -1) {
|
97 | os = 'Mac OS';
|
98 | } else if (iosPlatforms.indexOf(platform) !== -1) {
|
99 | os = 'iOS';
|
100 | } else if (windowsPlatforms.indexOf(platform) !== -1) {
|
101 | os = 'Windows';
|
102 | } else if (/Android/.test(userAgent)) {
|
103 | os = 'Android';
|
104 | } else if (!os && /Linux/.test(platform)) {
|
105 | os = 'Linux';
|
106 | }
|
107 |
|
108 | return os;
|
109 | };
|
110 |
|
111 | init();
|
112 |
|
113 |
|
114 |
|
115 |
|
116 | export const getInstallReferrer = async () => {
|
117 | return getInstallReferrerSync();
|
118 | };
|
119 |
|
120 | export const getUserAgent = async () => {
|
121 | return getUserAgentSync();
|
122 | };
|
123 |
|
124 | export const isBatteryCharging = async () => {
|
125 | if (navigator.getBattery) {
|
126 | return navigator.getBattery().then(battery => battery.charging);
|
127 | }
|
128 | return false;
|
129 | };
|
130 |
|
131 | export const isBatteryChargingSync = () => {
|
132 | return batteryCharging;
|
133 | };
|
134 |
|
135 | export const isCameraPresent = async () => {
|
136 | if (navigator.mediaDevices && navigator.mediaDevices.enumerateDevices) {
|
137 | return navigator.mediaDevices.enumerateDevices().then(devices => {
|
138 | return !!devices.find((d) => d.kind === 'videoinput');
|
139 | });
|
140 | }
|
141 | return false;
|
142 | };
|
143 |
|
144 | export const isCameraPresentSync = () => {
|
145 | console.log(
|
146 | '[react-native-device-info] isCameraPresentSync not supported - please use isCameraPresent'
|
147 | );
|
148 | return false;
|
149 | };
|
150 |
|
151 | export const getBatteryLevel = async () => {
|
152 | if (navigator.getBattery) {
|
153 | return navigator.getBattery().then(battery => battery.level);
|
154 | }
|
155 | return -1;
|
156 | };
|
157 |
|
158 | export const getBatteryLevelSync = () => {
|
159 | return batteryLevel;
|
160 | };
|
161 |
|
162 | export const isLocationEnabled = async () => {
|
163 | return isLocationEnabledSync();
|
164 | };
|
165 |
|
166 | export const isAirplaneMode = async () => {
|
167 | return isAirplaneModeSync();
|
168 | };
|
169 |
|
170 | export const getBaseOs = async () => {
|
171 | return getBaseOsSync();
|
172 | };
|
173 |
|
174 | export const getTotalDiskCapacity = async () => {
|
175 | if (navigator.storage && navigator.storage.estimate) {
|
176 | return navigator.storage.estimate().then(({ quota }) => quota)
|
177 | }
|
178 | return -1;
|
179 | };
|
180 |
|
181 | export const getTotalDiskCapacitySync = () => {
|
182 | console.log(
|
183 | '[react-native-device-info] getTotalDiskCapacitySync not supported - please use getTotalDiskCapacity'
|
184 | );
|
185 | return -1;
|
186 | };
|
187 |
|
188 | export const getFreeDiskStorage = async () => {
|
189 | if (navigator.storage && navigator.storage.estimate) {
|
190 | return navigator.storage.estimate().then(({ quota, usage }) => quota - usage)
|
191 | }
|
192 | return -1;
|
193 | };
|
194 |
|
195 | export const getFreeDiskStorageSync = () => {
|
196 | console.log(
|
197 | '[react-native-device-info] getFreeDiskStorageSync not supported - please use getFreeDiskStorage'
|
198 | );
|
199 | return -1;
|
200 | };
|
201 |
|
202 | export const getMaxMemory = async () => {
|
203 | return getMaxMemorySync();
|
204 | };
|
205 |
|
206 | export const getUsedMemory = async () => {
|
207 | return getUsedMemorySync();
|
208 | };
|
209 |
|
210 | export const getTotalMemory = async () => {
|
211 | return getTotalMemorySync();
|
212 | };
|
213 |
|
214 | export const getPowerState = async () => {
|
215 | if (navigator.getBattery) {
|
216 | return navigator.getBattery().then((battery) => _readPowerState(battery))
|
217 | }
|
218 | return {};
|
219 | };
|
220 |
|
221 | export const getPowerStateSync = () => {
|
222 | return powerState;
|
223 | };
|