@andre1502/react-utilities 0.9.6 → 1.0.1
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 +2 -4
- 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 +13 -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 +10 -0
- package/dist/Utils/Utils.js +98 -0
- package/dist/Utils/Utils.js.map +1 -0
- package/dist/Utils-Bnk2KHAB.js +70 -0
- package/dist/Utils-Bnk2KHAB.js.map +1 -0
- package/dist/Utils-Cq948gfa.js.map +1 -1
- package/dist/Utils-DLJ3-s9J.js +61 -0
- package/dist/Utils-DLJ3-s9J.js.map +1 -0
- package/dist/Utils-Dilye04y.js.map +1 -1
- package/dist/config-cli.cjs +2 -3
- 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 +2 -2
- 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 +1 -1
- package/dist/index-cli.mjs +1 -1
- package/dist/index-rn.cjs +5 -5
- package/dist/index-rn.mjs +3 -3
- package/dist/index.cjs +25 -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 +58 -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 +51 -40
- package/src/Config/Config.ts +2 -2
- 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 +6 -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 +75 -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-DmYkVPZM.js +0 -3308
- package/dist/I18n-DmYkVPZM.js.map +0 -1
- package/dist/I18n-zYe_O_Pr.js +0 -3311
- package/dist/I18n-zYe_O_Pr.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;
|
@@ -116,6 +113,11 @@ const initI18n = ({
|
|
116
113
|
bindI18nStore: 'added', // this way, when the HttpBackend delivers new translations (thanks to refreshAndUpdateStore), the UI gets updated
|
117
114
|
},
|
118
115
|
};
|
116
|
+
} else {
|
117
|
+
config = {
|
118
|
+
...config,
|
119
|
+
resources: resources,
|
120
|
+
};
|
119
121
|
}
|
120
122
|
|
121
123
|
if (!i18next.isInitialized) {
|
@@ -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,75 @@
|
|
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
|
+
};
|
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