@andre1502/react-utilities 0.9.7 → 1.0.2
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.
- package/dist/Config/Config.js +6 -7
- package/dist/Config/Config.js.map +1 -1
- package/dist/Config/GoogleAuth.js +1 -1
- package/dist/Config/GoogleAuth.js.map +1 -1
- package/dist/Config/Sitemap.js +1 -1
- package/dist/Config/Sitemap.js.map +1 -1
- package/dist/EnvironmentEnum-BjXsfSRZ.js.map +1 -1
- package/dist/EnvironmentEnum-UcQ6Il1O.js.map +1 -1
- package/dist/Format/NumberParser.js.map +1 -1
- package/dist/Hooks/useDevice.d.ts +3 -0
- package/dist/Hooks/useDevice.js +47 -0
- package/dist/Hooks/useDevice.js.map +1 -0
- package/dist/Hooks/useSEStore.d.ts +5 -0
- package/dist/Hooks/useSound.d.ts +9 -0
- package/dist/Hooks/useSound.js +47 -0
- package/dist/Hooks/useSound.js.map +1 -0
- package/dist/Hooks/useWebSocket.d.ts +9 -0
- package/dist/Hooks/useWebSocket.js +120 -0
- package/dist/Hooks/useWebSocket.js.map +1 -0
- package/dist/I18n/I18n.d.ts +1 -1
- package/dist/I18n/I18n.js +9 -5
- package/dist/I18n/I18n.js.map +1 -1
- package/dist/NumberFormat-CvvBWhHc.js.map +1 -1
- package/dist/NumberFormat-glmpbk7E.js.map +1 -1
- package/dist/React-BaJ1KfGF.js.map +1 -1
- package/dist/React-qUl0CBmE.js.map +1 -1
- package/dist/ReactNative-Ckbnh5vm.js +1770 -0
- package/dist/ReactNative-Ckbnh5vm.js.map +1 -0
- package/dist/ReactNative-DLA9Xwp4.js +1792 -0
- package/dist/ReactNative-DLA9Xwp4.js.map +1 -0
- package/dist/Sentry/Build.js +1 -1
- package/dist/Sentry/Build.js.map +1 -1
- package/dist/Sentry/React.js.map +1 -1
- package/dist/Sentry/ReactNative.js +3 -3
- package/dist/Sentry/ReactNative.js.map +1 -1
- package/dist/Utils/Array.d.ts +3 -0
- package/dist/Utils/Array.js +26 -0
- package/dist/Utils/Array.js.map +1 -0
- package/dist/Utils/Files.js +2 -2
- package/dist/Utils/Files.js.map +1 -1
- package/dist/Utils/Pagination.d.ts +3 -0
- package/dist/Utils/Pagination.js +32 -0
- package/dist/Utils/Pagination.js.map +1 -0
- package/dist/Utils/Utils.d.ts +11 -0
- package/dist/Utils/Utils.js +101 -0
- package/dist/Utils/Utils.js.map +1 -0
- package/dist/Utils-BC1fDy39.js +74 -0
- package/dist/Utils-BC1fDy39.js.map +1 -0
- package/dist/Utils-Cq948gfa.js.map +1 -1
- package/dist/Utils-D7KRF8VU.js +64 -0
- package/dist/Utils-D7KRF8VU.js.map +1 -0
- package/dist/Utils-Dilye04y.js.map +1 -1
- package/dist/config-cli.cjs +6 -6
- package/dist/config-cli.cjs.map +1 -1
- package/dist/config-cli.js +3 -3
- package/dist/config-cli.js.map +1 -1
- package/dist/config-cli.mjs +6 -5
- package/dist/config-cli.mjs.map +1 -1
- package/dist/enums/CurrencySymbolEnum.js +4 -2
- package/dist/enums/CurrencySymbolEnum.js.map +1 -1
- package/dist/enums/DeviceEnum.d.ts +4 -0
- package/dist/enums/DeviceEnum.js +12 -0
- package/dist/enums/DeviceEnum.js.map +1 -0
- package/dist/hooks.cjs +13 -0
- package/dist/hooks.cjs.map +1 -0
- package/dist/hooks.d.ts +9 -0
- package/dist/hooks.js +87 -0
- package/dist/hooks.js.map +1 -0
- package/dist/hooks.mjs +4 -0
- package/dist/hooks.mjs.map +1 -0
- package/dist/i18n.cjs +3104 -6
- package/dist/i18n.cjs.map +1 -1
- package/dist/i18n.mjs +3104 -2
- package/dist/i18n.mjs.map +1 -1
- package/dist/index-cli.cjs +2 -1
- package/dist/index-cli.cjs.map +1 -1
- package/dist/index-cli.mjs +2 -1
- package/dist/index-cli.mjs.map +1 -1
- package/dist/index-rn.cjs +5 -5
- package/dist/index-rn.mjs +3 -3
- package/dist/index.cjs +26 -4
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +6 -2
- package/dist/index.mjs.map +1 -1
- package/dist/sentry-cli.cjs.map +1 -1
- package/dist/sentry-cli.js +1 -1
- package/dist/sentry-cli.js.map +1 -1
- package/dist/sentry-cli.mjs.map +1 -1
- package/dist/sentry-rn.cjs +1 -1
- package/dist/sentry-rn.mjs +1 -1
- package/dist/useWebSocket-GlUpioz3.js +168 -0
- package/dist/useWebSocket-GlUpioz3.js.map +1 -0
- package/dist/useWebSocket-vgu8TAsa.js +163 -0
- package/dist/useWebSocket-vgu8TAsa.js.map +1 -0
- package/dist/utils.cjs +59 -0
- package/dist/utils.cjs.map +1 -0
- package/dist/utils.d.ts +3 -0
- package/dist/utils.js +39 -0
- package/dist/utils.js.map +1 -0
- package/dist/utils.mjs +43 -0
- package/dist/utils.mjs.map +1 -0
- package/package.json +52 -41
- package/src/Config/Config.ts +7 -5
- package/src/Hooks/useDevice.ts +34 -0
- package/src/Hooks/useSEStore.tsx +29 -0
- package/src/Hooks/useSound.ts +44 -0
- package/src/Hooks/useWebSocket.ts +115 -0
- package/src/I18n/I18n.ts +1 -4
- package/src/Sentry/ReactNative.ts +2 -5
- package/src/Utils/Array.ts +23 -0
- package/src/Utils/Pagination.ts +42 -0
- package/src/Utils/Utils.ts +79 -0
- package/src/enums/DeviceEnum.ts +4 -0
- package/src/hooks.ts +11 -0
- package/src/index.ts +2 -0
- package/src/utils.ts +3 -0
- package/dist/I18n-BIBLVzaQ.js +0 -3313
- package/dist/I18n-BIBLVzaQ.js.map +0 -1
- package/dist/I18n-tdxuTc45.js +0 -3316
- package/dist/I18n-tdxuTc45.js.map +0 -1
- package/dist/ReactNative-CqUrY2ZJ.js +0 -3856
- package/dist/ReactNative-CqUrY2ZJ.js.map +0 -1
- package/dist/ReactNative-mNnws-b5.js +0 -3834
- package/dist/ReactNative-mNnws-b5.js.map +0 -1
@@ -0,0 +1,115 @@
|
|
1
|
+
import { useEffect, useRef, useState } from 'react';
|
2
|
+
|
3
|
+
type WebSocketRef = WebSocket | null;
|
4
|
+
|
5
|
+
interface WebSocketOutput {
|
6
|
+
isConnected: boolean;
|
7
|
+
isError: boolean;
|
8
|
+
connect: (url: string) => void;
|
9
|
+
messages: string[];
|
10
|
+
clearMessages: () => void;
|
11
|
+
}
|
12
|
+
|
13
|
+
const useWebSocket = (): WebSocketOutput => {
|
14
|
+
const pingInterval = 30000; // Default ping every 30 seconds
|
15
|
+
const [url, setUrl] = useState('');
|
16
|
+
const [isConnected, setIsConnected] = useState<boolean>(false);
|
17
|
+
const [isError, setIsError] = useState<boolean>(false);
|
18
|
+
const [messages, setMessages] = useState<string[]>([]);
|
19
|
+
const socketRef = useRef<WebSocketRef>(null);
|
20
|
+
const heartbeatIntervalRef = useRef<number>(undefined);
|
21
|
+
|
22
|
+
const connect = (newUrl: string) => {
|
23
|
+
if (newUrl && url !== newUrl) {
|
24
|
+
setUrl(newUrl);
|
25
|
+
}
|
26
|
+
};
|
27
|
+
|
28
|
+
const clearMessages = () => {
|
29
|
+
setMessages([]);
|
30
|
+
};
|
31
|
+
|
32
|
+
// Connect WebSocket after login
|
33
|
+
useEffect(() => {
|
34
|
+
if (url) {
|
35
|
+
// Open WebSocket connection
|
36
|
+
if (socketRef.current === null) {
|
37
|
+
socketRef.current = new WebSocket(url);
|
38
|
+
} else if (socketRef.current.url !== url) {
|
39
|
+
socketRef.current.close();
|
40
|
+
socketRef.current = new WebSocket(url);
|
41
|
+
}
|
42
|
+
|
43
|
+
socketRef.current.onopen = (event: Event) => {
|
44
|
+
// console.log('WebSocket onopen', 'event', event);
|
45
|
+
|
46
|
+
setIsError(false);
|
47
|
+
setIsConnected(true);
|
48
|
+
|
49
|
+
heartbeatIntervalRef.current = window.setInterval(() => {
|
50
|
+
if (socketRef.current?.readyState === WebSocket.OPEN) {
|
51
|
+
socketRef.current?.send('ping');
|
52
|
+
}
|
53
|
+
}, pingInterval);
|
54
|
+
};
|
55
|
+
|
56
|
+
socketRef.current.onmessage = (event: MessageEvent) => {
|
57
|
+
console.log('WebSocket onmessage', 'event.data', event.data);
|
58
|
+
|
59
|
+
if (event.data === 'ping') {
|
60
|
+
socketRef.current?.send('pong');
|
61
|
+
return;
|
62
|
+
}
|
63
|
+
|
64
|
+
setTimeout(() => {
|
65
|
+
setMessages((prev) => {
|
66
|
+
if (!prev.includes(event.data)) {
|
67
|
+
prev.push(event.data);
|
68
|
+
}
|
69
|
+
|
70
|
+
return prev;
|
71
|
+
});
|
72
|
+
}, 1000);
|
73
|
+
};
|
74
|
+
|
75
|
+
socketRef.current.onerror = (error: Event) => {
|
76
|
+
console.error('WebSocket onerror:', 'error', error);
|
77
|
+
|
78
|
+
setIsError(true);
|
79
|
+
setIsConnected(false);
|
80
|
+
};
|
81
|
+
|
82
|
+
socketRef.current.onclose = (event: CloseEvent) => {
|
83
|
+
// console.log('WebSocket onclose', 'event', event);
|
84
|
+
|
85
|
+
if (event.wasClean) {
|
86
|
+
// console.log(
|
87
|
+
// `[close] Connection closed cleanly, code=${event.code} reason=${event.reason}`,
|
88
|
+
// );
|
89
|
+
} else {
|
90
|
+
// e.g. server process killed or network down, event.code is usually 1006 in this case
|
91
|
+
console.warn(
|
92
|
+
`[close] Connection died, code=${event.code} reason=${event.reason}`,
|
93
|
+
);
|
94
|
+
|
95
|
+
setIsError(true);
|
96
|
+
}
|
97
|
+
|
98
|
+
setIsConnected(false);
|
99
|
+
};
|
100
|
+
}
|
101
|
+
|
102
|
+
// Cleanup on unmount or logout
|
103
|
+
return () => {
|
104
|
+
if (socketRef.current) {
|
105
|
+
socketRef.current.close();
|
106
|
+
}
|
107
|
+
|
108
|
+
clearInterval(heartbeatIntervalRef.current);
|
109
|
+
};
|
110
|
+
}, [url]);
|
111
|
+
|
112
|
+
return { isConnected, isError, connect, messages, clearMessages };
|
113
|
+
};
|
114
|
+
|
115
|
+
export default useWebSocket;
|
package/src/I18n/I18n.ts
CHANGED
@@ -3,10 +3,7 @@ import ChainedBackend from 'i18next-chained-backend';
|
|
3
3
|
import HttpBackend from 'i18next-http-backend';
|
4
4
|
import LocalStorageBackend from 'i18next-localstorage-backend';
|
5
5
|
import ResourcesToBackend from 'i18next-resources-to-backend';
|
6
|
-
|
7
|
-
const getV = (divider: number): number => {
|
8
|
-
return Math.floor(Date.now() / divider);
|
9
|
-
};
|
6
|
+
import { getV } from '../utils';
|
10
7
|
|
11
8
|
export interface InitI18nProps {
|
12
9
|
initReactI18next: ThirdPartyModule;
|
@@ -1,7 +1,4 @@
|
|
1
|
-
import {
|
2
|
-
captureConsoleIntegration,
|
3
|
-
httpClientIntegration,
|
4
|
-
} from '@sentry/integrations';
|
1
|
+
import { captureConsoleIntegration } from '@sentry/core';
|
5
2
|
import * as Sentry from '@sentry/react-native';
|
6
3
|
import { InitOptionsRN } from '../interfaces/Sentry/InitOptionsRN';
|
7
4
|
import { StringRegexArr } from '../types/Sentry/OptionType';
|
@@ -36,7 +33,7 @@ const initSentry = (options: InitOptionsRN): void => {
|
|
36
33
|
options?.httpClientIntegrationOptions?.failedRequestTargets
|
37
34
|
) {
|
38
35
|
integrations.push(
|
39
|
-
httpClientIntegration({
|
36
|
+
Sentry.httpClientIntegration({
|
40
37
|
failedRequestStatusCodes:
|
41
38
|
options.httpClientIntegrationOptions.failedRequestStatusCodes,
|
42
39
|
failedRequestTargets:
|
@@ -0,0 +1,23 @@
|
|
1
|
+
export const padArrayStart = (
|
2
|
+
array: string[],
|
3
|
+
targetLength: number,
|
4
|
+
padValue: string,
|
5
|
+
): string[] => {
|
6
|
+
const padding = Array(Math.max(targetLength - array.length, 0)).fill(
|
7
|
+
padValue,
|
8
|
+
);
|
9
|
+
return [...padding, ...array];
|
10
|
+
};
|
11
|
+
|
12
|
+
export const sliceFromEnd = (
|
13
|
+
array: string[],
|
14
|
+
positionFromEnd: number,
|
15
|
+
): string[] => {
|
16
|
+
if (positionFromEnd <= 0) return []; // If position is 0 or negative, return an empty array
|
17
|
+
|
18
|
+
return array.slice(-positionFromEnd);
|
19
|
+
};
|
20
|
+
|
21
|
+
export const joinWithoutFalsy = (array: string[], separator = ','): string => {
|
22
|
+
return array.filter(Boolean).join(separator);
|
23
|
+
};
|
@@ -0,0 +1,42 @@
|
|
1
|
+
export const getItemRow = (index: number, page?: number, pageSize?: number) => {
|
2
|
+
page = page ?? 0;
|
3
|
+
|
4
|
+
if (page > 0) {
|
5
|
+
page = page - 1;
|
6
|
+
}
|
7
|
+
|
8
|
+
return (pageSize ?? 0) * page + index + 1;
|
9
|
+
};
|
10
|
+
|
11
|
+
export const getNextPage = (
|
12
|
+
page?: number,
|
13
|
+
pageSize?: number,
|
14
|
+
totalRecords?: number,
|
15
|
+
): number | undefined => {
|
16
|
+
let totalPage = 0;
|
17
|
+
|
18
|
+
page = (page ?? 0) + 1;
|
19
|
+
|
20
|
+
if (pageSize && totalRecords) {
|
21
|
+
totalPage = Math.ceil(totalRecords / pageSize);
|
22
|
+
}
|
23
|
+
|
24
|
+
if (page > totalPage) {
|
25
|
+
page = undefined;
|
26
|
+
}
|
27
|
+
|
28
|
+
return page;
|
29
|
+
};
|
30
|
+
|
31
|
+
export const getTotalPages = (
|
32
|
+
pageSize?: number,
|
33
|
+
totalRecords?: number,
|
34
|
+
): number => {
|
35
|
+
let totalPage = 0;
|
36
|
+
|
37
|
+
if (pageSize && totalRecords) {
|
38
|
+
totalPage = Math.ceil(totalRecords / pageSize);
|
39
|
+
}
|
40
|
+
|
41
|
+
return totalPage || 1;
|
42
|
+
};
|
@@ -0,0 +1,79 @@
|
|
1
|
+
export const getV = (divider: number): number => {
|
2
|
+
return Math.floor(Date.now() / divider);
|
3
|
+
};
|
4
|
+
|
5
|
+
// pad value with zero
|
6
|
+
export const padNumber = (value: number, padded: string | undefined = '0') => {
|
7
|
+
return (padded + Math.floor(value)).slice(-2);
|
8
|
+
};
|
9
|
+
|
10
|
+
export const getLastPathName = (pathName: string) => {
|
11
|
+
const tmpPathName = pathName.split('/');
|
12
|
+
|
13
|
+
return tmpPathName[tmpPathName.length - 1] || 'bet';
|
14
|
+
};
|
15
|
+
|
16
|
+
export function parseQueryString(fullString: string): {
|
17
|
+
originValue: string;
|
18
|
+
} & Record<string, string> {
|
19
|
+
const [originValue, queryString] = fullString.split('?');
|
20
|
+
const params: { [key: string]: string } = {};
|
21
|
+
|
22
|
+
if (queryString) {
|
23
|
+
queryString.split('&').forEach((param) => {
|
24
|
+
const [key, value] = param.split('=');
|
25
|
+
params[key] = value;
|
26
|
+
});
|
27
|
+
}
|
28
|
+
|
29
|
+
return { originValue, ...params };
|
30
|
+
}
|
31
|
+
|
32
|
+
export const getUniquePermutations = (
|
33
|
+
array: string[],
|
34
|
+
length: number,
|
35
|
+
): string[][] => {
|
36
|
+
if (length === 1) return array.map((item) => [item]);
|
37
|
+
|
38
|
+
const permutations = new Set<string>(); // Use Set to prevent duplicates
|
39
|
+
for (let i = 0; i < array.length; i++) {
|
40
|
+
const current = array[i];
|
41
|
+
const remaining = array.slice(0, i).concat(array.slice(i + 1));
|
42
|
+
const subPermutations = getUniquePermutations(remaining, length - 1);
|
43
|
+
subPermutations.forEach((perm) => {
|
44
|
+
permutations.add([current, ...perm].join(',')); // Join to ensure uniqueness
|
45
|
+
});
|
46
|
+
}
|
47
|
+
|
48
|
+
// Convert back to array format
|
49
|
+
return [...permutations].map((perm) => perm.split(','));
|
50
|
+
};
|
51
|
+
|
52
|
+
export const getKeyByValue = <T>(
|
53
|
+
object: Record<string, T>,
|
54
|
+
value: T,
|
55
|
+
): string | undefined => {
|
56
|
+
return Object.keys(object).find((key) => object[key] === value);
|
57
|
+
};
|
58
|
+
|
59
|
+
export const autoBlur = () => {
|
60
|
+
setTimeout(() => {
|
61
|
+
if (document.activeElement instanceof HTMLElement) {
|
62
|
+
document.activeElement.blur();
|
63
|
+
}
|
64
|
+
}, 0);
|
65
|
+
};
|
66
|
+
|
67
|
+
export const isValidHttpUrl = (url: string) => {
|
68
|
+
try {
|
69
|
+
const newUrl = new URL(url);
|
70
|
+
|
71
|
+
return newUrl.protocol === 'http:' || newUrl.protocol === 'https:';
|
72
|
+
} catch (err) {
|
73
|
+
return false;
|
74
|
+
}
|
75
|
+
};
|
76
|
+
|
77
|
+
export const isHiddenKey = (key: string) => {
|
78
|
+
return key.startsWith('__');
|
79
|
+
};
|
package/src/hooks.ts
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
import useDevice from './Hooks/useDevice';
|
2
|
+
import useSEStore from './Hooks/useSEStore';
|
3
|
+
import useSound from './Hooks/useSound';
|
4
|
+
import useWebSocket from './Hooks/useWebSocket';
|
5
|
+
|
6
|
+
export * from './Hooks/useDevice';
|
7
|
+
export * from './Hooks/useSEStore';
|
8
|
+
export * from './Hooks/useSound';
|
9
|
+
export * from './Hooks/useWebSocket';
|
10
|
+
|
11
|
+
export { useDevice, useSEStore, useSound, useWebSocket };
|
package/src/index.ts
CHANGED
package/src/utils.ts
ADDED