@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.
Files changed (127) hide show
  1. package/dist/Config/Config.js +6 -7
  2. package/dist/Config/Config.js.map +1 -1
  3. package/dist/Config/GoogleAuth.js +1 -1
  4. package/dist/Config/GoogleAuth.js.map +1 -1
  5. package/dist/Config/Sitemap.js +1 -1
  6. package/dist/Config/Sitemap.js.map +1 -1
  7. package/dist/EnvironmentEnum-BjXsfSRZ.js.map +1 -1
  8. package/dist/EnvironmentEnum-UcQ6Il1O.js.map +1 -1
  9. package/dist/Format/NumberParser.js.map +1 -1
  10. package/dist/Hooks/useDevice.d.ts +3 -0
  11. package/dist/Hooks/useDevice.js +47 -0
  12. package/dist/Hooks/useDevice.js.map +1 -0
  13. package/dist/Hooks/useSEStore.d.ts +5 -0
  14. package/dist/Hooks/useSound.d.ts +9 -0
  15. package/dist/Hooks/useSound.js +47 -0
  16. package/dist/Hooks/useSound.js.map +1 -0
  17. package/dist/Hooks/useWebSocket.d.ts +9 -0
  18. package/dist/Hooks/useWebSocket.js +120 -0
  19. package/dist/Hooks/useWebSocket.js.map +1 -0
  20. package/dist/I18n/I18n.d.ts +1 -1
  21. package/dist/I18n/I18n.js +9 -5
  22. package/dist/I18n/I18n.js.map +1 -1
  23. package/dist/NumberFormat-CvvBWhHc.js.map +1 -1
  24. package/dist/NumberFormat-glmpbk7E.js.map +1 -1
  25. package/dist/React-BaJ1KfGF.js.map +1 -1
  26. package/dist/React-qUl0CBmE.js.map +1 -1
  27. package/dist/ReactNative-Ckbnh5vm.js +1770 -0
  28. package/dist/ReactNative-Ckbnh5vm.js.map +1 -0
  29. package/dist/ReactNative-DLA9Xwp4.js +1792 -0
  30. package/dist/ReactNative-DLA9Xwp4.js.map +1 -0
  31. package/dist/Sentry/Build.js +1 -1
  32. package/dist/Sentry/Build.js.map +1 -1
  33. package/dist/Sentry/React.js.map +1 -1
  34. package/dist/Sentry/ReactNative.js +3 -3
  35. package/dist/Sentry/ReactNative.js.map +1 -1
  36. package/dist/Utils/Array.d.ts +3 -0
  37. package/dist/Utils/Array.js +26 -0
  38. package/dist/Utils/Array.js.map +1 -0
  39. package/dist/Utils/Files.js +2 -2
  40. package/dist/Utils/Files.js.map +1 -1
  41. package/dist/Utils/Pagination.d.ts +3 -0
  42. package/dist/Utils/Pagination.js +32 -0
  43. package/dist/Utils/Pagination.js.map +1 -0
  44. package/dist/Utils/Utils.d.ts +11 -0
  45. package/dist/Utils/Utils.js +101 -0
  46. package/dist/Utils/Utils.js.map +1 -0
  47. package/dist/Utils-BC1fDy39.js +74 -0
  48. package/dist/Utils-BC1fDy39.js.map +1 -0
  49. package/dist/Utils-Cq948gfa.js.map +1 -1
  50. package/dist/Utils-D7KRF8VU.js +64 -0
  51. package/dist/Utils-D7KRF8VU.js.map +1 -0
  52. package/dist/Utils-Dilye04y.js.map +1 -1
  53. package/dist/config-cli.cjs +6 -6
  54. package/dist/config-cli.cjs.map +1 -1
  55. package/dist/config-cli.js +3 -3
  56. package/dist/config-cli.js.map +1 -1
  57. package/dist/config-cli.mjs +6 -5
  58. package/dist/config-cli.mjs.map +1 -1
  59. package/dist/enums/CurrencySymbolEnum.js +4 -2
  60. package/dist/enums/CurrencySymbolEnum.js.map +1 -1
  61. package/dist/enums/DeviceEnum.d.ts +4 -0
  62. package/dist/enums/DeviceEnum.js +12 -0
  63. package/dist/enums/DeviceEnum.js.map +1 -0
  64. package/dist/hooks.cjs +13 -0
  65. package/dist/hooks.cjs.map +1 -0
  66. package/dist/hooks.d.ts +9 -0
  67. package/dist/hooks.js +87 -0
  68. package/dist/hooks.js.map +1 -0
  69. package/dist/hooks.mjs +4 -0
  70. package/dist/hooks.mjs.map +1 -0
  71. package/dist/i18n.cjs +3104 -6
  72. package/dist/i18n.cjs.map +1 -1
  73. package/dist/i18n.mjs +3104 -2
  74. package/dist/i18n.mjs.map +1 -1
  75. package/dist/index-cli.cjs +2 -1
  76. package/dist/index-cli.cjs.map +1 -1
  77. package/dist/index-cli.mjs +2 -1
  78. package/dist/index-cli.mjs.map +1 -1
  79. package/dist/index-rn.cjs +5 -5
  80. package/dist/index-rn.mjs +3 -3
  81. package/dist/index.cjs +26 -4
  82. package/dist/index.cjs.map +1 -1
  83. package/dist/index.d.ts +2 -0
  84. package/dist/index.js +22 -0
  85. package/dist/index.js.map +1 -1
  86. package/dist/index.mjs +6 -2
  87. package/dist/index.mjs.map +1 -1
  88. package/dist/sentry-cli.cjs.map +1 -1
  89. package/dist/sentry-cli.js +1 -1
  90. package/dist/sentry-cli.js.map +1 -1
  91. package/dist/sentry-cli.mjs.map +1 -1
  92. package/dist/sentry-rn.cjs +1 -1
  93. package/dist/sentry-rn.mjs +1 -1
  94. package/dist/useWebSocket-GlUpioz3.js +168 -0
  95. package/dist/useWebSocket-GlUpioz3.js.map +1 -0
  96. package/dist/useWebSocket-vgu8TAsa.js +163 -0
  97. package/dist/useWebSocket-vgu8TAsa.js.map +1 -0
  98. package/dist/utils.cjs +59 -0
  99. package/dist/utils.cjs.map +1 -0
  100. package/dist/utils.d.ts +3 -0
  101. package/dist/utils.js +39 -0
  102. package/dist/utils.js.map +1 -0
  103. package/dist/utils.mjs +43 -0
  104. package/dist/utils.mjs.map +1 -0
  105. package/package.json +52 -41
  106. package/src/Config/Config.ts +7 -5
  107. package/src/Hooks/useDevice.ts +34 -0
  108. package/src/Hooks/useSEStore.tsx +29 -0
  109. package/src/Hooks/useSound.ts +44 -0
  110. package/src/Hooks/useWebSocket.ts +115 -0
  111. package/src/I18n/I18n.ts +1 -4
  112. package/src/Sentry/ReactNative.ts +2 -5
  113. package/src/Utils/Array.ts +23 -0
  114. package/src/Utils/Pagination.ts +42 -0
  115. package/src/Utils/Utils.ts +79 -0
  116. package/src/enums/DeviceEnum.ts +4 -0
  117. package/src/hooks.ts +11 -0
  118. package/src/index.ts +2 -0
  119. package/src/utils.ts +3 -0
  120. package/dist/I18n-BIBLVzaQ.js +0 -3313
  121. package/dist/I18n-BIBLVzaQ.js.map +0 -1
  122. package/dist/I18n-tdxuTc45.js +0 -3316
  123. package/dist/I18n-tdxuTc45.js.map +0 -1
  124. package/dist/ReactNative-CqUrY2ZJ.js +0 -3856
  125. package/dist/ReactNative-CqUrY2ZJ.js.map +0 -1
  126. package/dist/ReactNative-mNnws-b5.js +0 -3834
  127. 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
+ };
@@ -0,0 +1,4 @@
1
+ export enum DeviceEnum {
2
+ PC = 'pc',
3
+ MOBILE = 'mobile',
4
+ }
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
@@ -1,3 +1,5 @@
1
1
  export * from './format';
2
+ export * from './hooks';
2
3
  export * from './i18n';
3
4
  export * from './sentry';
5
+ export * from './utils';
package/src/utils.ts ADDED
@@ -0,0 +1,3 @@
1
+ export * from './Utils/Array';
2
+ export * from './Utils/Pagination';
3
+ export * from './Utils/Utils';