react-hooks-core 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,479 @@
1
+ 'use strict';
2
+
3
+ var react = require('react');
4
+
5
+ // src/browser/hooks/useDeviceDetect.ts
6
+ function useDeviceDetect(options) {
7
+ const { userAgent: customUserAgent, ssrMode = false } = options || {};
8
+ const deviceInfo = react.useMemo(() => {
9
+ if (ssrMode) {
10
+ return getDefaultDeviceInfo();
11
+ }
12
+ const isBrowser = typeof window !== "undefined" && typeof navigator !== "undefined";
13
+ if (!isBrowser) {
14
+ return getDefaultDeviceInfo();
15
+ }
16
+ try {
17
+ const ua = customUserAgent || navigator.userAgent;
18
+ return detectDevice(ua);
19
+ } catch (error) {
20
+ console.warn("Error detecting device:", error);
21
+ return getDefaultDeviceInfo();
22
+ }
23
+ }, [customUserAgent, ssrMode]);
24
+ return deviceInfo;
25
+ }
26
+ function getDefaultDeviceInfo() {
27
+ return {
28
+ isMobile: false,
29
+ isTablet: false,
30
+ isDesktop: true,
31
+ isIOS: false,
32
+ isAndroid: false,
33
+ isWindows: false,
34
+ isMacOS: false,
35
+ isLinux: false,
36
+ isBrowser: false,
37
+ userAgent: ""
38
+ };
39
+ }
40
+ function detectDevice(userAgent) {
41
+ const ua = userAgent.toLowerCase();
42
+ const mobileRegex = /android|webos|iphone|ipod|blackberry|iemobile|opera mini/i;
43
+ const isMobile = mobileRegex.test(ua);
44
+ const tabletRegex = /ipad|android(?!.*mobile)|tablet|kindle|silk/i;
45
+ const isTablet = tabletRegex.test(ua);
46
+ const isDesktop = !isMobile && !isTablet;
47
+ const isIOS = /iphone|ipad|ipod/i.test(ua);
48
+ const isAndroid = /android/i.test(ua);
49
+ const isWindows = /windows|win32|win64/i.test(ua);
50
+ const isMacOS = /macintosh|mac os x/i.test(ua);
51
+ const isLinux = /linux/i.test(ua) && !isAndroid;
52
+ return {
53
+ isMobile,
54
+ isTablet,
55
+ isDesktop,
56
+ isIOS,
57
+ isAndroid,
58
+ isWindows,
59
+ isMacOS,
60
+ isLinux,
61
+ isBrowser: true,
62
+ userAgent
63
+ };
64
+ }
65
+ function useOnline(options) {
66
+ const { onChange } = options || {};
67
+ const [isOnline, setIsOnline] = react.useState(() => {
68
+ if (typeof window === "undefined" || typeof navigator === "undefined") {
69
+ return true;
70
+ }
71
+ try {
72
+ return navigator.onLine ?? true;
73
+ } catch (error) {
74
+ console.warn("Error checking online status:", error);
75
+ return true;
76
+ }
77
+ });
78
+ const onChangeRef = react.useRef(onChange);
79
+ react.useEffect(() => {
80
+ onChangeRef.current = onChange;
81
+ }, [onChange]);
82
+ const handleOnline = react.useCallback(() => {
83
+ setIsOnline(true);
84
+ onChangeRef.current?.(true);
85
+ }, []);
86
+ const handleOffline = react.useCallback(() => {
87
+ setIsOnline(false);
88
+ onChangeRef.current?.(false);
89
+ }, []);
90
+ react.useEffect(() => {
91
+ if (typeof window === "undefined") {
92
+ return;
93
+ }
94
+ try {
95
+ window.addEventListener("online", handleOnline);
96
+ window.addEventListener("offline", handleOffline);
97
+ return () => {
98
+ window.removeEventListener("online", handleOnline);
99
+ window.removeEventListener("offline", handleOffline);
100
+ };
101
+ } catch (error) {
102
+ console.warn("Error setting up online/offline listeners:", error);
103
+ return void 0;
104
+ }
105
+ }, [handleOnline, handleOffline]);
106
+ return isOnline;
107
+ }
108
+ function useIdle(timeout, options) {
109
+ const {
110
+ events = ["mousemove", "mousedown", "keydown", "touchstart", "scroll"],
111
+ initialState = false,
112
+ onIdle,
113
+ onActive
114
+ } = options || {};
115
+ const [isIdle, setIsIdle] = react.useState(initialState);
116
+ const timerRef = react.useRef(null);
117
+ const onIdleRef = react.useRef(onIdle);
118
+ const onActiveRef = react.useRef(onActive);
119
+ react.useEffect(() => {
120
+ onIdleRef.current = onIdle;
121
+ onActiveRef.current = onActive;
122
+ }, [onIdle, onActive]);
123
+ const handleActivity = react.useCallback(() => {
124
+ if (timerRef.current) {
125
+ clearTimeout(timerRef.current);
126
+ }
127
+ if (isIdle) {
128
+ setIsIdle(false);
129
+ onActiveRef.current?.();
130
+ }
131
+ timerRef.current = setTimeout(() => {
132
+ setIsIdle(true);
133
+ onIdleRef.current?.();
134
+ }, timeout);
135
+ }, [timeout, isIdle]);
136
+ react.useEffect(() => {
137
+ if (typeof window === "undefined") {
138
+ return;
139
+ }
140
+ try {
141
+ timerRef.current = setTimeout(() => {
142
+ setIsIdle(true);
143
+ onIdleRef.current?.();
144
+ }, timeout);
145
+ events.forEach((event) => {
146
+ window.addEventListener(event, handleActivity);
147
+ });
148
+ return () => {
149
+ if (timerRef.current) {
150
+ clearTimeout(timerRef.current);
151
+ }
152
+ events.forEach((event) => {
153
+ window.removeEventListener(event, handleActivity);
154
+ });
155
+ };
156
+ } catch (error) {
157
+ console.warn("Error setting up idle detection:", error);
158
+ return void 0;
159
+ }
160
+ }, [timeout, events, handleActivity]);
161
+ return isIdle;
162
+ }
163
+ function useMediaQuery(query, options) {
164
+ const { defaultValue = false, onChange } = options || {};
165
+ const [matches, setMatches] = react.useState(() => {
166
+ if (typeof window === "undefined" || !window.matchMedia) {
167
+ return defaultValue;
168
+ }
169
+ try {
170
+ const mediaQuery = window.matchMedia(query);
171
+ return mediaQuery.matches;
172
+ } catch {
173
+ return defaultValue;
174
+ }
175
+ });
176
+ const onChangeRef = react.useRef(onChange);
177
+ react.useEffect(() => {
178
+ onChangeRef.current = onChange;
179
+ }, [onChange]);
180
+ react.useEffect(() => {
181
+ if (typeof window === "undefined" || !window.matchMedia) {
182
+ return;
183
+ }
184
+ try {
185
+ const mediaQuery = window.matchMedia(query);
186
+ const handleChange = (event) => {
187
+ const newMatches = event.matches;
188
+ setMatches(newMatches);
189
+ onChangeRef.current?.(newMatches);
190
+ };
191
+ if (mediaQuery.addEventListener) {
192
+ mediaQuery.addEventListener("change", handleChange);
193
+ } else {
194
+ mediaQuery.addListener(handleChange);
195
+ }
196
+ return () => {
197
+ if (mediaQuery.removeEventListener) {
198
+ mediaQuery.removeEventListener("change", handleChange);
199
+ } else {
200
+ mediaQuery.removeListener(handleChange);
201
+ }
202
+ };
203
+ } catch (error) {
204
+ console.warn("Error setting up media query listener:", error);
205
+ return void 0;
206
+ }
207
+ }, [query]);
208
+ return matches;
209
+ }
210
+ function useNetworkSpeed(options) {
211
+ const { onChange } = options || {};
212
+ const [networkInfo, setNetworkInfo] = react.useState(() => {
213
+ if (typeof window === "undefined" || !("connection" in navigator)) {
214
+ return {
215
+ effectiveType: "unknown",
216
+ downlink: 0,
217
+ rtt: 0,
218
+ saveData: false
219
+ };
220
+ }
221
+ try {
222
+ const conn = navigator.connection || navigator.mozConnection || navigator.webkitConnection;
223
+ return {
224
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
225
+ effectiveType: conn?.effectiveType || "unknown",
226
+ downlink: conn?.downlink || 0,
227
+ rtt: conn?.rtt || 0,
228
+ saveData: conn?.saveData || false
229
+ };
230
+ } catch (error) {
231
+ console.warn("Error reading network information:", error);
232
+ return {
233
+ effectiveType: "unknown",
234
+ downlink: 0,
235
+ rtt: 0,
236
+ saveData: false
237
+ };
238
+ }
239
+ });
240
+ const onChangeRef = react.useRef(onChange);
241
+ react.useEffect(() => {
242
+ onChangeRef.current = onChange;
243
+ }, [onChange]);
244
+ react.useEffect(() => {
245
+ if (typeof window === "undefined" || !("connection" in navigator)) {
246
+ return;
247
+ }
248
+ try {
249
+ const conn = navigator.connection || navigator.mozConnection || navigator.webkitConnection;
250
+ if (!conn) {
251
+ return;
252
+ }
253
+ const handleChange = () => {
254
+ const newInfo = {
255
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
256
+ effectiveType: conn.effectiveType || "unknown",
257
+ downlink: conn.downlink || 0,
258
+ rtt: conn.rtt || 0,
259
+ saveData: conn.saveData || false
260
+ };
261
+ setNetworkInfo(newInfo);
262
+ onChangeRef.current?.(newInfo);
263
+ };
264
+ conn.addEventListener("change", handleChange);
265
+ return () => {
266
+ conn.removeEventListener("change", handleChange);
267
+ };
268
+ } catch (error) {
269
+ console.warn("Error setting up network speed monitoring:", error);
270
+ return void 0;
271
+ }
272
+ }, []);
273
+ return networkInfo;
274
+ }
275
+ function useGeolocation(options) {
276
+ const {
277
+ enabled = false,
278
+ watch = false,
279
+ enableHighAccuracy = false,
280
+ timeout = 5e3,
281
+ maximumAge = 0,
282
+ onSuccess,
283
+ onError
284
+ } = options || {};
285
+ const [state, setState] = react.useState({
286
+ loading: false,
287
+ error: null,
288
+ coordinates: null
289
+ });
290
+ const onSuccessRef = react.useRef(onSuccess);
291
+ const onErrorRef = react.useRef(onError);
292
+ const watchIdRef = react.useRef(null);
293
+ react.useEffect(() => {
294
+ onSuccessRef.current = onSuccess;
295
+ onErrorRef.current = onError;
296
+ }, [onSuccess, onError]);
297
+ react.useEffect(() => {
298
+ if (!enabled) {
299
+ return;
300
+ }
301
+ if (typeof window === "undefined" || !navigator.geolocation) {
302
+ setState({
303
+ loading: false,
304
+ error: {
305
+ code: 2,
306
+ message: "Geolocation is not supported",
307
+ PERMISSION_DENIED: 1,
308
+ POSITION_UNAVAILABLE: 2,
309
+ TIMEOUT: 3
310
+ },
311
+ coordinates: null
312
+ });
313
+ return;
314
+ }
315
+ setState((prev) => ({ ...prev, loading: true, error: null }));
316
+ const handleSuccess = (position) => {
317
+ const coordinates = {
318
+ latitude: position.coords.latitude,
319
+ longitude: position.coords.longitude,
320
+ accuracy: position.coords.accuracy,
321
+ altitude: position.coords.altitude,
322
+ altitudeAccuracy: position.coords.altitudeAccuracy,
323
+ heading: position.coords.heading,
324
+ speed: position.coords.speed
325
+ };
326
+ setState({
327
+ loading: false,
328
+ error: null,
329
+ coordinates
330
+ });
331
+ onSuccessRef.current?.(coordinates);
332
+ };
333
+ const handleError = (error) => {
334
+ let errorMessage = error.message;
335
+ if (error.message.includes("403") || error.message.includes("Network location provider")) {
336
+ errorMessage = "Network location service unavailable. Please check your internet connection or enable GPS.";
337
+ } else if (error.message.includes("timeout") || error.code === 3) {
338
+ errorMessage = "Location request timed out. Please try again.";
339
+ } else if (error.code === 1) {
340
+ errorMessage = "Location permission denied. Please enable location access in your browser settings.";
341
+ } else if (error.code === 2) {
342
+ errorMessage = "Location unavailable. Please check your device location settings.";
343
+ }
344
+ const enhancedError = {
345
+ ...error,
346
+ message: errorMessage
347
+ };
348
+ setState({
349
+ loading: false,
350
+ error: enhancedError,
351
+ coordinates: null
352
+ });
353
+ onErrorRef.current?.(enhancedError);
354
+ };
355
+ const positionOptions = {
356
+ enableHighAccuracy,
357
+ timeout,
358
+ maximumAge
359
+ };
360
+ try {
361
+ if (watch) {
362
+ watchIdRef.current = navigator.geolocation.watchPosition(
363
+ handleSuccess,
364
+ handleError,
365
+ positionOptions
366
+ );
367
+ } else {
368
+ navigator.geolocation.getCurrentPosition(handleSuccess, handleError, positionOptions);
369
+ }
370
+ return () => {
371
+ if (watchIdRef.current !== null) {
372
+ navigator.geolocation.clearWatch(watchIdRef.current);
373
+ watchIdRef.current = null;
374
+ }
375
+ };
376
+ } catch (error) {
377
+ console.warn("Error accessing geolocation:", error);
378
+ setState({
379
+ loading: false,
380
+ error: {
381
+ code: 2,
382
+ message: "Failed to access geolocation",
383
+ PERMISSION_DENIED: 1,
384
+ POSITION_UNAVAILABLE: 2,
385
+ TIMEOUT: 3
386
+ },
387
+ coordinates: null
388
+ });
389
+ return void 0;
390
+ }
391
+ }, [enabled, watch, enableHighAccuracy, timeout, maximumAge]);
392
+ return state;
393
+ }
394
+ function useBattery(options) {
395
+ const { onChange } = options || {};
396
+ const [batteryStatus, setBatteryStatus] = react.useState({
397
+ level: 1,
398
+ charging: false,
399
+ chargingTime: Infinity,
400
+ dischargingTime: Infinity,
401
+ supported: false
402
+ });
403
+ const onChangeRef = react.useRef(onChange);
404
+ const batteryRef = react.useRef(null);
405
+ react.useEffect(() => {
406
+ onChangeRef.current = onChange;
407
+ }, [onChange]);
408
+ react.useEffect(() => {
409
+ if (typeof window === "undefined" || !("getBattery" in navigator)) {
410
+ return;
411
+ }
412
+ let mounted = true;
413
+ const updateBatteryStatus = (battery) => {
414
+ if (!mounted || !battery) return;
415
+ const newStatus = {
416
+ level: typeof battery.level === "number" ? battery.level : 1,
417
+ charging: typeof battery.charging === "boolean" ? battery.charging : false,
418
+ chargingTime: typeof battery.chargingTime === "number" ? battery.chargingTime : Infinity,
419
+ dischargingTime: typeof battery.dischargingTime === "number" ? battery.dischargingTime : Infinity,
420
+ supported: true
421
+ };
422
+ setBatteryStatus(newStatus);
423
+ onChangeRef.current?.(newStatus);
424
+ };
425
+ const initBattery = async () => {
426
+ try {
427
+ const battery = await navigator.getBattery();
428
+ if (!battery || typeof battery !== "object") {
429
+ throw new Error("Invalid battery object");
430
+ }
431
+ batteryRef.current = battery;
432
+ if (!mounted) return void 0;
433
+ updateBatteryStatus(battery);
434
+ const handleLevelChange = () => updateBatteryStatus(battery);
435
+ const handleChargingChange = () => updateBatteryStatus(battery);
436
+ const handleChargingTimeChange = () => updateBatteryStatus(battery);
437
+ const handleDischargingTimeChange = () => updateBatteryStatus(battery);
438
+ battery.addEventListener("levelchange", handleLevelChange);
439
+ battery.addEventListener("chargingchange", handleChargingChange);
440
+ battery.addEventListener("chargingtimechange", handleChargingTimeChange);
441
+ battery.addEventListener("dischargingtimechange", handleDischargingTimeChange);
442
+ return () => {
443
+ battery.removeEventListener("levelchange", handleLevelChange);
444
+ battery.removeEventListener("chargingchange", handleChargingChange);
445
+ battery.removeEventListener("chargingtimechange", handleChargingTimeChange);
446
+ battery.removeEventListener("dischargingtimechange", handleDischargingTimeChange);
447
+ };
448
+ } catch (error) {
449
+ console.warn("Error accessing battery status:", error);
450
+ if (mounted) {
451
+ setBatteryStatus({
452
+ level: 1,
453
+ charging: false,
454
+ chargingTime: Infinity,
455
+ dischargingTime: Infinity,
456
+ supported: false
457
+ });
458
+ }
459
+ return void 0;
460
+ }
461
+ };
462
+ const cleanup = initBattery();
463
+ return () => {
464
+ mounted = false;
465
+ cleanup.then((cleanupFn) => cleanupFn?.());
466
+ };
467
+ }, []);
468
+ return batteryStatus;
469
+ }
470
+
471
+ exports.useBattery = useBattery;
472
+ exports.useDeviceDetect = useDeviceDetect;
473
+ exports.useGeolocation = useGeolocation;
474
+ exports.useIdle = useIdle;
475
+ exports.useMediaQuery = useMediaQuery;
476
+ exports.useNetworkSpeed = useNetworkSpeed;
477
+ exports.useOnline = useOnline;
478
+ //# sourceMappingURL=chunk-QCPNR33K.js.map
479
+ //# sourceMappingURL=chunk-QCPNR33K.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/browser/hooks/useDeviceDetect.ts","../src/browser/hooks/useOnline.ts","../src/browser/hooks/useIdle.ts","../src/browser/hooks/useMediaQuery.ts","../src/browser/hooks/useNetworkSpeed.ts","../src/browser/hooks/useGeolocation.ts","../src/browser/hooks/useBattery.ts"],"names":["useMemo","useState","useRef","useEffect","useCallback"],"mappings":"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","file":"chunk-QCPNR33K.js","sourcesContent":["import { useMemo } from 'react'\nimport type { IDeviceDetect, IDeviceDetectOptions } from '../interface'\n\n/**\n * Detects device type and operating system\n *\n * @template IDeviceDetect\n * @param {IDeviceDetectOptions} options - Optional configuration\n * @returns {IDeviceDetect} Device detection result\n *\n * @example\n * ```tsx\n * function App() {\n * const { isMobile, isIOS, isAndroid } = useDeviceDetect()\n *\n * if (isMobile) {\n * return <MobileLayout />\n * }\n * return <DesktopLayout />\n * }\n * ```\n *\n * @see https://github.com/yourusername/react-hookify#usedevicedetect\n */\nexport function useDeviceDetect(options?: IDeviceDetectOptions): IDeviceDetect {\n const { userAgent: customUserAgent, ssrMode = false } = options || {}\n\n const deviceInfo = useMemo(() => {\n // SSR mode - return default values\n if (ssrMode) {\n return getDefaultDeviceInfo()\n }\n\n // Check if running in browser\n const isBrowser = typeof window !== 'undefined' && typeof navigator !== 'undefined'\n\n if (!isBrowser) {\n return getDefaultDeviceInfo()\n }\n\n try {\n const ua = customUserAgent || navigator.userAgent\n return detectDevice(ua)\n } catch (error) {\n console.warn('Error detecting device:', error)\n return getDefaultDeviceInfo()\n }\n }, [customUserAgent, ssrMode])\n\n return deviceInfo\n}\n\n/**\n * Default device info for SSR\n */\nfunction getDefaultDeviceInfo(): IDeviceDetect {\n return {\n isMobile: false,\n isTablet: false,\n isDesktop: true,\n isIOS: false,\n isAndroid: false,\n isWindows: false,\n isMacOS: false,\n isLinux: false,\n isBrowser: false,\n userAgent: '',\n }\n}\n\n/**\n * Detect device from user agent string\n */\nfunction detectDevice(userAgent: string): IDeviceDetect {\n const ua = userAgent.toLowerCase()\n\n // Mobile detection\n const mobileRegex = /android|webos|iphone|ipod|blackberry|iemobile|opera mini/i\n const isMobile = mobileRegex.test(ua)\n\n // Tablet detection\n const tabletRegex = /ipad|android(?!.*mobile)|tablet|kindle|silk/i\n const isTablet = tabletRegex.test(ua)\n\n // Desktop\n const isDesktop = !isMobile && !isTablet\n\n // OS detection\n const isIOS = /iphone|ipad|ipod/i.test(ua)\n const isAndroid = /android/i.test(ua)\n const isWindows = /windows|win32|win64/i.test(ua)\n const isMacOS = /macintosh|mac os x/i.test(ua)\n const isLinux = /linux/i.test(ua) && !isAndroid\n\n return {\n isMobile,\n isTablet,\n isDesktop,\n isIOS,\n isAndroid,\n isWindows,\n isMacOS,\n isLinux,\n isBrowser: true,\n userAgent,\n }\n}\n","import { useState, useEffect, useCallback, useRef } from 'react'\nimport type { IOnlineOptions } from '../interface'\n\n/**\n * Detects online/offline network status\n *\n * @param {IOnlineOptions} options - Optional configuration\n * @returns {boolean} True if online, false if offline\n *\n * @example\n * ```tsx\n * function App() {\n * const isOnline = useOnline()\n *\n * if (!isOnline) {\n * return <div>You are offline</div>\n * }\n * return <div>You are online</div>\n * }\n * ```\n *\n * @see https://github.com/yourusername/react-hookify#useonline\n */\nexport function useOnline(options?: IOnlineOptions): boolean {\n const { onChange } = options || {}\n\n // SSR-safe initialization\n const [isOnline, setIsOnline] = useState<boolean>(() => {\n if (typeof window === 'undefined' || typeof navigator === 'undefined') {\n return true // Default to online during SSR\n }\n\n try {\n return navigator.onLine ?? true // Default to true if undefined\n } catch (error) {\n console.warn('Error checking online status:', error)\n return true\n }\n })\n\n // Store onChange callback in ref to avoid effect re-runs\n const onChangeRef = useRef(onChange)\n\n useEffect(() => {\n onChangeRef.current = onChange\n }, [onChange])\n\n const handleOnline = useCallback(() => {\n setIsOnline(true)\n onChangeRef.current?.(true)\n }, [])\n\n const handleOffline = useCallback(() => {\n setIsOnline(false)\n onChangeRef.current?.(false)\n }, [])\n\n useEffect(() => {\n // Check if running in browser\n if (typeof window === 'undefined') {\n return\n }\n\n try {\n // Set up event listeners\n window.addEventListener('online', handleOnline)\n window.addEventListener('offline', handleOffline)\n\n // Cleanup on unmount\n return () => {\n window.removeEventListener('online', handleOnline)\n window.removeEventListener('offline', handleOffline)\n }\n } catch (error) {\n console.warn('Error setting up online/offline listeners:', error)\n return undefined\n }\n }, [handleOnline, handleOffline])\n\n return isOnline\n}\n","import { useState, useEffect, useRef, useCallback } from 'react'\nimport type { IIdleOptions } from '../interface'\n\n/**\n * Detects user inactivity after a specified timeout\n *\n * @param {number} timeout - Idle timeout in milliseconds\n * @param {IIdleOptions} options - Optional configuration\n * @returns {boolean} True if user is idle, false if active\n *\n * @example\n * ```tsx\n * function App() {\n * const isIdle = useIdle(300000) // 5 minutes\n *\n * useEffect(() => {\n * if (isIdle) {\n * console.log('User is idle - pausing operations')\n * }\n * }, [isIdle])\n * }\n * ```\n *\n * @see https://github.com/yourusername/react-hookify#useidle\n */\nexport function useIdle(timeout: number, options?: IIdleOptions): boolean {\n const {\n events = ['mousemove', 'mousedown', 'keydown', 'touchstart', 'scroll'],\n initialState = false,\n onIdle,\n onActive,\n } = options || {}\n\n const [isIdle, setIsIdle] = useState<boolean>(initialState)\n const timerRef = useRef<NodeJS.Timeout | null>(null)\n const onIdleRef = useRef(onIdle)\n const onActiveRef = useRef(onActive)\n\n // Update callback refs\n useEffect(() => {\n onIdleRef.current = onIdle\n onActiveRef.current = onActive\n }, [onIdle, onActive])\n\n const handleActivity = useCallback(() => {\n // Clear existing timer\n if (timerRef.current) {\n clearTimeout(timerRef.current)\n }\n\n // Set user as active if they were idle\n if (isIdle) {\n setIsIdle(false)\n onActiveRef.current?.()\n }\n\n // Set new timer for idle state\n timerRef.current = setTimeout(() => {\n setIsIdle(true)\n onIdleRef.current?.()\n }, timeout)\n }, [timeout, isIdle])\n\n useEffect(() => {\n // Check if running in browser\n if (typeof window === 'undefined') {\n return\n }\n\n try {\n // Set initial timer\n timerRef.current = setTimeout(() => {\n setIsIdle(true)\n onIdleRef.current?.()\n }, timeout)\n\n // Add event listeners for user activity\n events.forEach((event) => {\n window.addEventListener(event, handleActivity)\n })\n\n // Cleanup on unmount\n return () => {\n if (timerRef.current) {\n clearTimeout(timerRef.current)\n }\n events.forEach((event) => {\n window.removeEventListener(event, handleActivity)\n })\n }\n } catch (error) {\n console.warn('Error setting up idle detection:', error)\n return undefined\n }\n }, [timeout, events, handleActivity])\n\n return isIdle\n}\n","import { useState, useEffect, useRef } from 'react'\nimport type { IMediaQueryOptions } from '../interface'\n\n/**\n * Listens to CSS media queries and returns match status\n *\n * @param {string} query - CSS media query string\n * @param {IMediaQueryOptions} options - Optional configuration\n * @returns {boolean} True if media query matches, false otherwise\n *\n * @example\n * ```tsx\n * function App() {\n * const isMobile = useMediaQuery('(max-width: 768px)')\n * const isDark = useMediaQuery('(prefers-color-scheme: dark)')\n *\n * return (\n * <div>\n * {isMobile ? <MobileNav /> : <DesktopNav />}\n * </div>\n * )\n * }\n * ```\n *\n * @see https://github.com/yourusername/react-hookify#usemediaquery\n */\nexport function useMediaQuery(query: string, options?: IMediaQueryOptions): boolean {\n const { defaultValue = false, onChange } = options || {}\n\n // Initialize with default value for SSR, or actual value in browser\n const [matches, setMatches] = useState<boolean>(() => {\n if (typeof window === 'undefined' || !window.matchMedia) {\n return defaultValue\n }\n\n try {\n const mediaQuery = window.matchMedia(query)\n return mediaQuery.matches\n } catch {\n return defaultValue\n }\n })\n\n const onChangeRef = useRef(onChange)\n\n // Update onChange ref\n useEffect(() => {\n onChangeRef.current = onChange\n }, [onChange])\n\n useEffect(() => {\n // Check if running in browser\n if (typeof window === 'undefined' || !window.matchMedia) {\n return\n }\n\n try {\n // Create MediaQueryList object\n const mediaQuery = window.matchMedia(query)\n\n // Event handler for media query changes\n const handleChange = (event: MediaQueryListEvent) => {\n const newMatches = event.matches\n setMatches(newMatches)\n onChangeRef.current?.(newMatches)\n }\n\n // Add event listener\n // Note: Some older browsers use addListener instead of addEventListener\n if (mediaQuery.addEventListener) {\n mediaQuery.addEventListener('change', handleChange)\n } else {\n // Fallback for older browsers\n // @ts-ignore - addListener is deprecated but still needed for old browsers\n mediaQuery.addListener(handleChange)\n }\n\n // Cleanup\n return () => {\n if (mediaQuery.removeEventListener) {\n mediaQuery.removeEventListener('change', handleChange)\n } else {\n // Fallback for older browsers\n // @ts-ignore - removeListener is deprecated but still needed for old browsers\n mediaQuery.removeListener(handleChange)\n }\n }\n } catch (error) {\n console.warn('Error setting up media query listener:', error)\n return undefined\n }\n }, [query])\n\n return matches\n}\n","import { useState, useEffect, useRef } from 'react'\nimport type { INetworkSpeed, INetworkSpeedOptions } from '../interface'\n\n/**\n * Monitors network connection speed and type\n *\n * @param {INetworkSpeedOptions} options - Optional configuration\n * @returns {INetworkSpeed} Network speed information\n */\nexport function useNetworkSpeed(options?: INetworkSpeedOptions): INetworkSpeed {\n const { onChange } = options || {}\n\n const [networkInfo, setNetworkInfo] = useState<INetworkSpeed>(() => {\n if (typeof window === 'undefined' || !('connection' in navigator)) {\n return {\n effectiveType: 'unknown',\n downlink: 0,\n rtt: 0,\n saveData: false,\n }\n }\n\n try {\n // @ts-ignore - NetworkInformation is not in TypeScript lib yet\n const conn = navigator.connection || navigator.mozConnection || navigator.webkitConnection\n\n return {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n effectiveType: (conn?.effectiveType || 'unknown') as any,\n downlink: conn?.downlink || 0,\n rtt: conn?.rtt || 0,\n saveData: conn?.saveData || false,\n }\n } catch (error) {\n console.warn('Error reading network information:', error)\n return {\n effectiveType: 'unknown',\n downlink: 0,\n rtt: 0,\n saveData: false,\n }\n }\n })\n\n const onChangeRef = useRef(onChange)\n\n useEffect(() => {\n onChangeRef.current = onChange\n }, [onChange])\n\n useEffect(() => {\n if (typeof window === 'undefined' || !('connection' in navigator)) {\n return\n }\n\n try {\n // @ts-ignore - NetworkInformation is not in TypeScript lib yet\n const conn = navigator.connection || navigator.mozConnection || navigator.webkitConnection\n\n if (!conn) {\n return\n }\n\n const handleChange = () => {\n const newInfo: INetworkSpeed = {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n effectiveType: (conn.effectiveType || 'unknown') as any,\n downlink: conn.downlink || 0,\n rtt: conn.rtt || 0,\n saveData: conn.saveData || false,\n }\n\n setNetworkInfo(newInfo)\n onChangeRef.current?.(newInfo)\n }\n\n conn.addEventListener('change', handleChange)\n\n return () => {\n conn.removeEventListener('change', handleChange)\n }\n } catch (error) {\n console.warn('Error setting up network speed monitoring:', error)\n return undefined\n }\n }, [])\n\n return networkInfo\n}\n","import { useState, useEffect, useRef } from 'react'\nimport type { IGeolocation, IGeolocationCoordinates, IGeolocationOptions } from '../interface'\n\n/**\n * Access user's geolocation with permission handling\n *\n * @param {IGeolocationOptions} options - Optional configuration\n * @returns {IGeolocation} Geolocation state with coordinates, loading, and error\n */\nexport function useGeolocation(options?: IGeolocationOptions): IGeolocation {\n const {\n enabled = false,\n watch = false,\n enableHighAccuracy = false,\n timeout = 5000,\n maximumAge = 0,\n onSuccess,\n onError,\n } = options || {}\n\n const [state, setState] = useState<IGeolocation>({\n loading: false,\n error: null,\n coordinates: null,\n })\n\n const onSuccessRef = useRef(onSuccess)\n const onErrorRef = useRef(onError)\n const watchIdRef = useRef<number | null>(null)\n\n useEffect(() => {\n onSuccessRef.current = onSuccess\n onErrorRef.current = onError\n }, [onSuccess, onError])\n\n useEffect(() => {\n // Don't request location if not enabled\n if (!enabled) {\n return\n }\n\n // Check if running in browser\n if (typeof window === 'undefined' || !navigator.geolocation) {\n setState({\n loading: false,\n error: {\n code: 2,\n message: 'Geolocation is not supported',\n PERMISSION_DENIED: 1,\n POSITION_UNAVAILABLE: 2,\n TIMEOUT: 3,\n } as GeolocationPositionError,\n coordinates: null,\n })\n return\n }\n\n // Set loading state when request starts\n setState((prev) => ({ ...prev, loading: true, error: null }))\n\n const handleSuccess = (position: GeolocationPosition) => {\n const coordinates: IGeolocationCoordinates = {\n latitude: position.coords.latitude,\n longitude: position.coords.longitude,\n accuracy: position.coords.accuracy,\n altitude: position.coords.altitude,\n altitudeAccuracy: position.coords.altitudeAccuracy,\n heading: position.coords.heading,\n speed: position.coords.speed,\n }\n\n setState({\n loading: false,\n error: null,\n coordinates,\n })\n\n onSuccessRef.current?.(coordinates)\n }\n\n const handleError = (error: GeolocationPositionError) => {\n // Improve error messages for common issues\n let errorMessage = error.message\n\n // Handle network location provider errors (403, etc.)\n if (error.message.includes('403') || error.message.includes('Network location provider')) {\n errorMessage =\n 'Network location service unavailable. Please check your internet connection or enable GPS.'\n } else if (error.message.includes('timeout') || error.code === 3) {\n errorMessage = 'Location request timed out. Please try again.'\n } else if (error.code === 1) {\n errorMessage =\n 'Location permission denied. Please enable location access in your browser settings.'\n } else if (error.code === 2) {\n errorMessage = 'Location unavailable. Please check your device location settings.'\n }\n\n const enhancedError = {\n ...error,\n message: errorMessage,\n } as GeolocationPositionError\n\n setState({\n loading: false,\n error: enhancedError,\n coordinates: null,\n })\n\n onErrorRef.current?.(enhancedError)\n }\n\n const positionOptions: PositionOptions = {\n enableHighAccuracy,\n timeout,\n maximumAge,\n }\n\n try {\n if (watch) {\n // Watch position continuously\n watchIdRef.current = navigator.geolocation.watchPosition(\n handleSuccess,\n handleError,\n positionOptions\n )\n } else {\n // Get position once\n navigator.geolocation.getCurrentPosition(handleSuccess, handleError, positionOptions)\n }\n\n // Cleanup\n return () => {\n if (watchIdRef.current !== null) {\n navigator.geolocation.clearWatch(watchIdRef.current)\n watchIdRef.current = null\n }\n }\n } catch (error) {\n console.warn('Error accessing geolocation:', error)\n setState({\n loading: false,\n error: {\n code: 2,\n message: 'Failed to access geolocation',\n PERMISSION_DENIED: 1,\n POSITION_UNAVAILABLE: 2,\n TIMEOUT: 3,\n } as GeolocationPositionError,\n coordinates: null,\n })\n return undefined\n }\n }, [enabled, watch, enableHighAccuracy, timeout, maximumAge])\n\n return state\n}\n","import { useState, useEffect, useRef } from 'react'\nimport type { IBattery, IBatteryOptions } from '../interface'\n\n/**\n * Monitors device battery status\n *\n * @param {IBatteryOptions} options - Optional configuration\n * @returns {IBattery} Battery status information\n */\nexport function useBattery(options?: IBatteryOptions): IBattery {\n const { onChange } = options || {}\n\n const [batteryStatus, setBatteryStatus] = useState<IBattery>({\n level: 1,\n charging: false,\n chargingTime: Infinity,\n dischargingTime: Infinity,\n supported: false,\n })\n\n const onChangeRef = useRef(onChange)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const batteryRef = useRef<any>(null)\n\n useEffect(() => {\n onChangeRef.current = onChange\n }, [onChange])\n\n useEffect(() => {\n // Check if running in browser and Battery API is supported\n if (typeof window === 'undefined' || !('getBattery' in navigator)) {\n return\n }\n\n let mounted = true\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const updateBatteryStatus = (battery: any) => {\n if (!mounted || !battery) return\n\n const newStatus: IBattery = {\n level: typeof battery.level === 'number' ? battery.level : 1,\n charging: typeof battery.charging === 'boolean' ? battery.charging : false,\n chargingTime: typeof battery.chargingTime === 'number' ? battery.chargingTime : Infinity,\n dischargingTime:\n typeof battery.dischargingTime === 'number' ? battery.dischargingTime : Infinity,\n supported: true,\n }\n\n setBatteryStatus(newStatus)\n onChangeRef.current?.(newStatus)\n }\n\n const initBattery = async () => {\n try {\n // @ts-ignore - getBattery is not in TypeScript lib yet\n const battery = await navigator.getBattery()\n\n // Validate battery object\n if (!battery || typeof battery !== 'object') {\n throw new Error('Invalid battery object')\n }\n\n batteryRef.current = battery\n\n if (!mounted) return undefined\n\n // Set initial status\n updateBatteryStatus(battery)\n\n // Add event listeners for battery changes\n const handleLevelChange = () => updateBatteryStatus(battery)\n const handleChargingChange = () => updateBatteryStatus(battery)\n const handleChargingTimeChange = () => updateBatteryStatus(battery)\n const handleDischargingTimeChange = () => updateBatteryStatus(battery)\n\n battery.addEventListener('levelchange', handleLevelChange)\n battery.addEventListener('chargingchange', handleChargingChange)\n battery.addEventListener('chargingtimechange', handleChargingTimeChange)\n battery.addEventListener('dischargingtimechange', handleDischargingTimeChange)\n\n // Cleanup function\n return () => {\n battery.removeEventListener('levelchange', handleLevelChange)\n battery.removeEventListener('chargingchange', handleChargingChange)\n battery.removeEventListener('chargingtimechange', handleChargingTimeChange)\n battery.removeEventListener('dischargingtimechange', handleDischargingTimeChange)\n }\n } catch (error) {\n console.warn('Error accessing battery status:', error)\n if (mounted) {\n setBatteryStatus({\n level: 1,\n charging: false,\n chargingTime: Infinity,\n dischargingTime: Infinity,\n supported: false,\n })\n }\n return undefined\n }\n }\n\n const cleanup = initBattery()\n\n return () => {\n mounted = false\n cleanup.then((cleanupFn) => cleanupFn?.())\n }\n }, [])\n\n return batteryStatus\n}\n"]}
@@ -0,0 +1 @@
1
+ export { ConnectionType, IBattery, IBatteryOptions, IDeviceDetect, IDeviceDetectOptions, IGeolocation, IGeolocationCoordinates, IGeolocationOptions, IIdleOptions, IMediaQueryOptions, INetworkSpeed, INetworkSpeedOptions, IOnlineOptions, useBattery, useDeviceDetect, useGeolocation, useIdle, useMediaQuery, useNetworkSpeed, useOnline } from './browser/index.mjs';
@@ -0,0 +1 @@
1
+ export { ConnectionType, IBattery, IBatteryOptions, IDeviceDetect, IDeviceDetectOptions, IGeolocation, IGeolocationCoordinates, IGeolocationOptions, IIdleOptions, IMediaQueryOptions, INetworkSpeed, INetworkSpeedOptions, IOnlineOptions, useBattery, useDeviceDetect, useGeolocation, useIdle, useMediaQuery, useNetworkSpeed, useOnline } from './browser/index.js';
package/dist/index.js ADDED
@@ -0,0 +1,36 @@
1
+ 'use strict';
2
+
3
+ var chunkQCPNR33K_js = require('./chunk-QCPNR33K.js');
4
+
5
+
6
+
7
+ Object.defineProperty(exports, "useBattery", {
8
+ enumerable: true,
9
+ get: function () { return chunkQCPNR33K_js.useBattery; }
10
+ });
11
+ Object.defineProperty(exports, "useDeviceDetect", {
12
+ enumerable: true,
13
+ get: function () { return chunkQCPNR33K_js.useDeviceDetect; }
14
+ });
15
+ Object.defineProperty(exports, "useGeolocation", {
16
+ enumerable: true,
17
+ get: function () { return chunkQCPNR33K_js.useGeolocation; }
18
+ });
19
+ Object.defineProperty(exports, "useIdle", {
20
+ enumerable: true,
21
+ get: function () { return chunkQCPNR33K_js.useIdle; }
22
+ });
23
+ Object.defineProperty(exports, "useMediaQuery", {
24
+ enumerable: true,
25
+ get: function () { return chunkQCPNR33K_js.useMediaQuery; }
26
+ });
27
+ Object.defineProperty(exports, "useNetworkSpeed", {
28
+ enumerable: true,
29
+ get: function () { return chunkQCPNR33K_js.useNetworkSpeed; }
30
+ });
31
+ Object.defineProperty(exports, "useOnline", {
32
+ enumerable: true,
33
+ get: function () { return chunkQCPNR33K_js.useOnline; }
34
+ });
35
+ //# sourceMappingURL=index.js.map
36
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
package/dist/index.mjs ADDED
@@ -0,0 +1,3 @@
1
+ export { useBattery, useDeviceDetect, useGeolocation, useIdle, useMediaQuery, useNetworkSpeed, useOnline } from './chunk-MWZHFSNO.mjs';
2
+ //# sourceMappingURL=index.mjs.map
3
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"index.mjs"}