@addev-be/ui 0.11.7 → 0.12.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.
Files changed (186) hide show
  1. package/assets/icons/arrow-down-1-9.svg +1 -1
  2. package/assets/icons/arrow-down-a-z.svg +1 -1
  3. package/assets/icons/arrow-up-z-a.svg +1 -1
  4. package/assets/icons/check.svg +1 -1
  5. package/assets/icons/circle-check.svg +1 -1
  6. package/assets/icons/down.svg +1 -1
  7. package/assets/icons/filter-full.svg +1 -1
  8. package/assets/icons/filter.svg +1 -1
  9. package/assets/icons/hashtag.svg +1 -1
  10. package/assets/icons/image-slash.svg +1 -1
  11. package/assets/icons/left.svg +1 -1
  12. package/assets/icons/magnifier.svg +1 -1
  13. package/assets/icons/phone.svg +1 -1
  14. package/assets/icons/right.svg +1 -1
  15. package/assets/icons/sort-calendar-ascending.svg +5 -5
  16. package/assets/icons/spinner-third.svg +1 -1
  17. package/assets/icons/table-columns.svg +1 -1
  18. package/assets/icons/table-footer-slash.svg +4 -4
  19. package/assets/icons/table-footer.svg +3 -3
  20. package/assets/icons/up.svg +1 -1
  21. package/assets/icons/user-tie.svg +1 -1
  22. package/assets/icons/x-bar.svg +3 -3
  23. package/dist/components/auth/LoginForm.js +0 -1
  24. package/dist/components/data/DataGrid/AdvancedRequestDataGrid.d.ts +10 -0
  25. package/dist/components/data/DataGrid/AdvancedRequestDataGrid.js +173 -0
  26. package/dist/components/data/DataGrid/FilterValuesScroller.d.ts +13 -0
  27. package/dist/components/data/DataGrid/FilterValuesScroller.js +73 -0
  28. package/dist/components/data/DataGrid/VirtualScroller.d.ts +11 -0
  29. package/dist/components/data/DataGrid/VirtualScroller.js +41 -0
  30. package/dist/components/data/DataGrid/helpers/advancedRequests.d.ts +12 -0
  31. package/dist/components/data/DataGrid/helpers/advancedRequests.js +53 -0
  32. package/dist/components/data/DataGrid/helpers.d.ts +28 -0
  33. package/dist/components/data/DataGrid/helpers.js +436 -0
  34. package/dist/config/types.d.ts +11 -0
  35. package/dist/config/types.js +2 -0
  36. package/dist/providers/AuthenticationProvider/index.d.ts +0 -1
  37. package/dist/providers/AuthenticationProvider/index.js +14 -28
  38. package/dist/services/advancedRequests.d.ts +1 -1
  39. package/dist/services/requests/userPermissions.d.ts +4 -0
  40. package/dist/services/requests/userPermissions.js +20 -0
  41. package/dist/services/sqlRequests.d.ts +1 -1
  42. package/package.json +1 -1
  43. package/src/Icons.tsx +128 -128
  44. package/src/components/auth/LoginForm.tsx +84 -84
  45. package/src/components/auth/LoginPage.tsx +32 -32
  46. package/src/components/auth/PasswordRecoveryForm.tsx +52 -52
  47. package/src/components/auth/PasswordResetForm.tsx +112 -112
  48. package/src/components/auth/index.ts +4 -4
  49. package/src/components/auth/styles.ts +14 -14
  50. package/src/components/data/AdvancedRequestDataGrid/helpers/advancedRequests.ts +93 -93
  51. package/src/components/data/AdvancedRequestDataGrid/helpers/columns.tsx +262 -262
  52. package/src/components/data/AdvancedRequestDataGrid/helpers/index.ts +2 -2
  53. package/src/components/data/AdvancedRequestDataGrid/index.tsx +267 -267
  54. package/src/components/data/AdvancedRequestDataGrid/types.ts +47 -47
  55. package/src/components/data/DataGrid/DataGridCell.tsx +76 -76
  56. package/src/components/data/DataGrid/DataGridColumnsModal/helpers.ts +14 -14
  57. package/src/components/data/DataGrid/DataGridColumnsModal/hooks.tsx +59 -59
  58. package/src/components/data/DataGrid/DataGridColumnsModal/index.tsx +181 -181
  59. package/src/components/data/DataGrid/DataGridColumnsModal/styles.ts +104 -104
  60. package/src/components/data/DataGrid/DataGridEditableCell.tsx +43 -43
  61. package/src/components/data/DataGrid/DataGridFilterMenu/FilterValuesScroller.tsx +131 -131
  62. package/src/components/data/DataGrid/DataGridFilterMenu/hooks.tsx +78 -78
  63. package/src/components/data/DataGrid/DataGridFilterMenu/index.tsx +378 -378
  64. package/src/components/data/DataGrid/DataGridFilterMenu/styles.ts +97 -97
  65. package/src/components/data/DataGrid/DataGridFooter.tsx +43 -43
  66. package/src/components/data/DataGrid/DataGridHeader.tsx +128 -128
  67. package/src/components/data/DataGrid/DataGridHeaderCell.tsx +101 -101
  68. package/src/components/data/DataGrid/DataGridRowTemplate.tsx +70 -70
  69. package/src/components/data/DataGrid/FilterModalContent/index.tsx +136 -136
  70. package/src/components/data/DataGrid/FilterModalContent/styles.ts +22 -22
  71. package/src/components/data/DataGrid/constants.ts +6 -6
  72. package/src/components/data/DataGrid/helpers/columns.tsx +319 -319
  73. package/src/components/data/DataGrid/helpers/filters.ts +287 -287
  74. package/src/components/data/DataGrid/helpers/index.ts +2 -2
  75. package/src/components/data/DataGrid/hooks/index.ts +30 -30
  76. package/src/components/data/DataGrid/hooks/useDataGrid.tsx +338 -338
  77. package/src/components/data/DataGrid/hooks/useDataGridCopy.ts +175 -175
  78. package/src/components/data/DataGrid/hooks/useDataGridSettings.ts +48 -48
  79. package/src/components/data/DataGrid/index.tsx +110 -110
  80. package/src/components/data/DataGrid/styles.ts +336 -336
  81. package/src/components/data/DataGrid/types.ts +283 -283
  82. package/src/components/data/SmartQueryDataGrid/helpers/columns.tsx +333 -0
  83. package/src/components/data/SmartQueryDataGrid/helpers/hooks.ts +41 -0
  84. package/src/components/data/SmartQueryDataGrid/helpers/index.ts +2 -0
  85. package/src/components/data/SmartQueryDataGrid/helpers/smartQueries.ts +17 -0
  86. package/src/components/data/SmartQueryDataGrid/hooks.ts +75 -0
  87. package/src/components/data/SmartQueryDataGrid/index.tsx +338 -0
  88. package/src/components/data/SmartQueryDataGrid/types.ts +45 -0
  89. package/src/components/data/SqlRequestDataGrid/helpers/columns.tsx +306 -306
  90. package/src/components/data/SqlRequestDataGrid/helpers/index.ts +2 -2
  91. package/src/components/data/SqlRequestDataGrid/helpers/sqlRequests.ts +16 -16
  92. package/src/components/data/SqlRequestDataGrid/index.tsx +387 -387
  93. package/src/components/data/SqlRequestDataGrid/types.ts +48 -48
  94. package/src/components/data/SqlRequestGrid/filters/FiltersSidebar.tsx +106 -106
  95. package/src/components/data/SqlRequestGrid/filters/styles.ts +88 -88
  96. package/src/components/data/SqlRequestGrid/helpers/index.ts +1 -1
  97. package/src/components/data/SqlRequestGrid/helpers/sqlRequests.ts +16 -16
  98. package/src/components/data/SqlRequestGrid/index.tsx +310 -310
  99. package/src/components/data/SqlRequestGrid/styles.ts +20 -20
  100. package/src/components/data/SqlRequestGrid/types.ts +53 -53
  101. package/src/components/data/VirtualScroller/hooks.ts +71 -71
  102. package/src/components/data/VirtualScroller/index.tsx +89 -89
  103. package/src/components/data/VirtualScroller/styles.ts +58 -58
  104. package/src/components/data/VirtualScroller/types.ts +12 -12
  105. package/src/components/data/index.ts +21 -17
  106. package/src/components/forms/AutoTextArea.tsx +41 -41
  107. package/src/components/forms/Button.tsx +133 -133
  108. package/src/components/forms/IconButton.tsx +57 -57
  109. package/src/components/forms/IndeterminateCheckbox.tsx +46 -46
  110. package/src/components/forms/Select.tsx +40 -40
  111. package/src/components/forms/VerticalLabel.tsx +20 -20
  112. package/src/components/forms/index.ts +6 -6
  113. package/src/components/forms/styles.ts +31 -31
  114. package/src/components/index.ts +6 -6
  115. package/src/components/layout/Dropdown/index.tsx +112 -112
  116. package/src/components/layout/Dropdown/styles.ts +45 -45
  117. package/src/components/layout/Loading/index.tsx +29 -29
  118. package/src/components/layout/Loading/styles.ts +29 -29
  119. package/src/components/layout/Modal/index.tsx +51 -51
  120. package/src/components/layout/Modal/styles.ts +121 -121
  121. package/src/components/layout/index.ts +3 -3
  122. package/src/components/search/HighlightedText.tsx +37 -37
  123. package/src/components/search/QuickSearchBar.tsx +86 -86
  124. package/src/components/search/QuickSearchResults.tsx +86 -86
  125. package/src/components/search/index.ts +9 -9
  126. package/src/components/search/styles.ts +96 -96
  127. package/src/components/search/types.ts +26 -26
  128. package/src/components/ui/Avatar/index.tsx +54 -54
  129. package/src/components/ui/Card/index.tsx +14 -14
  130. package/src/components/ui/Card/styles.ts +37 -37
  131. package/src/components/ui/ContextMenu/index.tsx +79 -79
  132. package/src/components/ui/ContextMenu/styles.ts +119 -119
  133. package/src/components/ui/Label.tsx +90 -90
  134. package/src/components/ui/Message/index.tsx +57 -57
  135. package/src/components/ui/Message/styles.ts +40 -40
  136. package/src/components/ui/index.ts +5 -5
  137. package/src/config/index.ts +14 -14
  138. package/src/helpers/dates.ts +17 -17
  139. package/src/helpers/getScrollbarSize.ts +14 -14
  140. package/src/helpers/index.ts +3 -3
  141. package/src/helpers/numbers.ts +26 -26
  142. package/src/helpers/text.ts +13 -13
  143. package/src/hooks/index.ts +3 -3
  144. package/src/hooks/useElementSize.ts +24 -24
  145. package/src/hooks/useShowArchived.ts +28 -28
  146. package/src/hooks/useWindowSize.ts +20 -20
  147. package/src/index.ts +9 -9
  148. package/src/providers/AuthenticationProvider/helpers.ts +3 -3
  149. package/src/providers/AuthenticationProvider/index.tsx +243 -243
  150. package/src/providers/LoadingProvider/index.tsx +47 -47
  151. package/src/providers/PortalsProvider/index.tsx +54 -54
  152. package/src/providers/PortalsProvider/styles.ts +31 -31
  153. package/src/providers/SettingsProvider/index.tsx +70 -70
  154. package/src/providers/ThemeProvider/ThemeProvider.ts +63 -63
  155. package/src/providers/ThemeProvider/defaultTheme.ts +457 -457
  156. package/src/providers/ThemeProvider/index.ts +4 -4
  157. package/src/providers/ThemeProvider/types.ts +131 -131
  158. package/src/providers/TrackingProvider/index.tsx +71 -71
  159. package/src/providers/UiProviders/index.tsx +68 -68
  160. package/src/providers/UiProviders/styles.ts +10 -10
  161. package/src/providers/hooks.ts +12 -12
  162. package/src/providers/index.ts +8 -8
  163. package/src/services/HttpService.ts +92 -92
  164. package/src/services/WebSocketService.ts +137 -137
  165. package/src/services/advancedRequests.ts +102 -102
  166. package/src/services/base.ts +23 -23
  167. package/src/services/globalSearch.ts +29 -29
  168. package/src/services/hooks.ts +44 -44
  169. package/src/services/index.ts +20 -19
  170. package/src/services/requests/auth.ts +44 -44
  171. package/src/services/requests/generic.ts +62 -62
  172. package/src/services/requests/tracking.ts +12 -12
  173. package/src/services/requests/userProfiles.ts +35 -35
  174. package/src/services/requests/users.ts +28 -28
  175. package/src/services/smartQueries.ts +122 -0
  176. package/src/services/sqlRequests.ts +111 -111
  177. package/src/services/types/auth.ts +131 -131
  178. package/src/services/types/base.ts +10 -10
  179. package/src/services/types/generic.ts +92 -92
  180. package/src/services/types/tracking.ts +39 -39
  181. package/src/services/types/userProfiles.ts +107 -107
  182. package/src/services/types/users.ts +106 -106
  183. package/src/styles/animations.scss +30 -30
  184. package/src/styles/index.scss +42 -42
  185. package/src/typings.d.ts +13 -13
  186. package/tsconfig.json +18 -18
@@ -1,92 +1,92 @@
1
- import { Config } from '../config';
2
- import { trimEnd } from 'lodash';
3
- import { v4 } from 'uuid';
4
-
5
- export class HttpService {
6
- private static instance: HttpService;
7
- private config: Config;
8
- private promises: {
9
- [id: string]: {
10
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
11
- resolve: (value: any) => void;
12
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
13
- reject: (reason?: any) => void;
14
- };
15
- } = {};
16
-
17
- constructor(config: Config) {
18
- HttpService.instance = this;
19
- this.config = config;
20
- }
21
-
22
- public static getInstance() {
23
- return HttpService.instance;
24
- }
25
-
26
- public sendRequest<TReq, TRes>(
27
- name: string,
28
- data: TReq,
29
- files?: Record<string, File>
30
- ) {
31
- const id = v4();
32
- const promise = new Promise<TRes>((resolve, reject) => {
33
- this.promises[id] = { resolve, reject };
34
-
35
- const formData = new FormData();
36
- formData.append('id', id);
37
- formData.append('data', JSON.stringify(data));
38
- if (files) {
39
- Object.entries(files).forEach(([key, file]) => {
40
- formData.append(key, file);
41
- });
42
- }
43
-
44
- console.log('[HTTP] Sending request:', { id, name, data });
45
- fetch(`${trimEnd(this.config.httpServerUrl, '/')}/${name}`, {
46
- method: 'POST',
47
- headers: {
48
- 'Content-Type': 'application/json',
49
- },
50
- body: formData,
51
- })
52
- .then(async (response) => {
53
- if (!response.ok) {
54
- throw new Error('HTTP request failed');
55
- }
56
- const body = await response.text();
57
- this.parseMessage(body);
58
- })
59
- .catch((error) => {
60
- reject(error);
61
- });
62
- });
63
- return promise;
64
- }
65
-
66
- private parseMessage(message: string) {
67
- try {
68
- const response = JSON.parse(message);
69
- if (!response.id) {
70
- throw new Error('Received message is not valid');
71
- }
72
- if (this.promises[response.id]) {
73
- console.log('[HTTP] Received response:', response);
74
- if (
75
- typeof response.data?.status === 'number' &&
76
- response.data.status < 0
77
- ) {
78
- this.promises[response.id].reject(new Error(response.data.message));
79
- } else {
80
- this.promises[response.id].resolve(response.data);
81
- }
82
- delete this.promises[response.id];
83
- } else {
84
- console.log('[HTTP] Received request:', response);
85
- // TODO : Implement request handling
86
- throw new Error('Not yet implemented');
87
- }
88
- } catch (error) {
89
- console.error('[HTTP] Error parsing message:', error);
90
- }
91
- }
92
- }
1
+ import { Config } from '../config';
2
+ import { trimEnd } from 'lodash';
3
+ import { v4 } from 'uuid';
4
+
5
+ export class HttpService {
6
+ private static instance: HttpService;
7
+ private config: Config;
8
+ private promises: {
9
+ [id: string]: {
10
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
11
+ resolve: (value: any) => void;
12
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
13
+ reject: (reason?: any) => void;
14
+ };
15
+ } = {};
16
+
17
+ constructor(config: Config) {
18
+ HttpService.instance = this;
19
+ this.config = config;
20
+ }
21
+
22
+ public static getInstance() {
23
+ return HttpService.instance;
24
+ }
25
+
26
+ public sendRequest<TReq, TRes>(
27
+ name: string,
28
+ data: TReq,
29
+ files?: Record<string, File>
30
+ ) {
31
+ const id = v4();
32
+ const promise = new Promise<TRes>((resolve, reject) => {
33
+ this.promises[id] = { resolve, reject };
34
+
35
+ const formData = new FormData();
36
+ formData.append('id', id);
37
+ formData.append('data', JSON.stringify(data));
38
+ if (files) {
39
+ Object.entries(files).forEach(([key, file]) => {
40
+ formData.append(key, file);
41
+ });
42
+ }
43
+
44
+ console.log('[HTTP] Sending request:', { id, name, data });
45
+ fetch(`${trimEnd(this.config.httpServerUrl, '/')}/${name}`, {
46
+ method: 'POST',
47
+ headers: {
48
+ 'Content-Type': 'application/json',
49
+ },
50
+ body: formData,
51
+ })
52
+ .then(async (response) => {
53
+ if (!response.ok) {
54
+ throw new Error('HTTP request failed');
55
+ }
56
+ const body = await response.text();
57
+ this.parseMessage(body);
58
+ })
59
+ .catch((error) => {
60
+ reject(error);
61
+ });
62
+ });
63
+ return promise;
64
+ }
65
+
66
+ private parseMessage(message: string) {
67
+ try {
68
+ const response = JSON.parse(message);
69
+ if (!response.id) {
70
+ throw new Error('Received message is not valid');
71
+ }
72
+ if (this.promises[response.id]) {
73
+ console.log('[HTTP] Received response:', response);
74
+ if (
75
+ typeof response.data?.status === 'number' &&
76
+ response.data.status < 0
77
+ ) {
78
+ this.promises[response.id].reject(new Error(response.data.message));
79
+ } else {
80
+ this.promises[response.id].resolve(response.data);
81
+ }
82
+ delete this.promises[response.id];
83
+ } else {
84
+ console.log('[HTTP] Received request:', response);
85
+ // TODO : Implement request handling
86
+ throw new Error('Not yet implemented');
87
+ }
88
+ } catch (error) {
89
+ console.error('[HTTP] Error parsing message:', error);
90
+ }
91
+ }
92
+ }
@@ -1,137 +1,137 @@
1
- import { Config } from '../config';
2
- import { Request } from './base';
3
- import { Subject } from 'rxjs';
4
- import { v4 } from 'uuid';
5
-
6
- export class WebSocketService {
7
- private static instance: WebSocketService;
8
- private config: Config;
9
- private socket: WebSocket | null = null;
10
-
11
- public status: boolean | undefined = undefined;
12
- public status$ = new Subject<boolean | undefined>();
13
-
14
- private queue: Request[] = [];
15
- private promises: {
16
- [id: string]: {
17
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
18
- resolve: (value: any) => void;
19
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
20
- reject: (reason?: any) => void;
21
- };
22
- } = {};
23
-
24
- public onOpen?: () => void = () => {};
25
- public onClose?: () => void = () => {};
26
- public onMessage?: (message: string) => void = () => {};
27
- public onError?: (error: unknown) => void = () => {};
28
-
29
- constructor(config: Config) {
30
- WebSocketService.instance = this;
31
- this.config = config;
32
- }
33
-
34
- public static getInstance() {
35
- return WebSocketService.instance;
36
- }
37
-
38
- private resetConnection() {
39
- this.setStatus(undefined);
40
- this.socket = new WebSocket(this.config.webSocketUrl);
41
-
42
- this.socket.onopen = () => {
43
- console.log('[WS] Connected');
44
- const interval = setInterval(() => {
45
- if (this.socket && this.socket.readyState === 1) {
46
- clearInterval(interval);
47
- this.setStatus(true);
48
- this.sendQueue();
49
- this.onOpen?.();
50
- }
51
- }, 100);
52
- };
53
-
54
- this.socket.onclose = () => {
55
- console.log('[WS] Disconnected');
56
- setTimeout(() => this.connect(), this.status === true ? 500 : 5000);
57
- this.onClose?.();
58
- this.setStatus(false);
59
- };
60
-
61
- this.socket.onmessage = (event) => {
62
- this.onMessage?.(event.data);
63
- this.parseMessage(event.data);
64
- };
65
-
66
- this.socket.onerror = (error) => {
67
- this.onError?.(error);
68
- console.error('[WS] Error:', error);
69
- };
70
- }
71
-
72
- public connect(force = false) {
73
- if (this.status === false || force) {
74
- this.resetConnection();
75
- }
76
- }
77
-
78
- private setStatus(status: boolean | undefined) {
79
- this.status = status;
80
- this.status$.next(status);
81
- }
82
-
83
- private sendQueue() {
84
- if (this.socket && this.status) {
85
- let request: Request | undefined;
86
- while ((request = this.queue.shift())) {
87
- console.log('[WS] Sending queued request:', request);
88
- this.socket?.send(JSON.stringify(request));
89
- }
90
- this.queue.forEach((request) =>
91
- this.socket?.send(JSON.stringify(request))
92
- );
93
- }
94
- }
95
-
96
- public sendRequest<TReq, TRes>(name: string, data: TReq) {
97
- const id = v4();
98
- const promise = new Promise<TRes>((resolve, reject) => {
99
- const request: Request = { id, name, data };
100
- this.promises[id] = { resolve, reject };
101
- if (!this.socket || !this.status) {
102
- this.queue.push(request);
103
- return;
104
- }
105
- console.log('[WS] Sending request:', request);
106
- this.socket?.send(JSON.stringify(request));
107
- });
108
- return promise;
109
- }
110
-
111
- private parseMessage(message: string) {
112
- try {
113
- const response = JSON.parse(message);
114
- if (!response.id) {
115
- throw new Error('Received message is not valid');
116
- }
117
- if (this.promises[response.id]) {
118
- console.log('[WS] Received response:', response);
119
- if (
120
- typeof response.data?.status === 'number' &&
121
- response.data.status < 0
122
- ) {
123
- this.promises[response.id].reject(new Error(response.data.message));
124
- } else {
125
- this.promises[response.id].resolve(response.data);
126
- }
127
- delete this.promises[response.id];
128
- } else {
129
- console.log('[WS] Received request:', response);
130
- // TODO : Implement request handling
131
- throw new Error('Not yet implemented');
132
- }
133
- } catch (error) {
134
- console.error('[WS] Error parsing message:', error);
135
- }
136
- }
137
- }
1
+ import { Config } from '../config';
2
+ import { Request } from './base';
3
+ import { Subject } from 'rxjs';
4
+ import { v4 } from 'uuid';
5
+
6
+ export class WebSocketService {
7
+ private static instance: WebSocketService;
8
+ private config: Config;
9
+ private socket: WebSocket | null = null;
10
+
11
+ public status: boolean | undefined = undefined;
12
+ public status$ = new Subject<boolean | undefined>();
13
+
14
+ private queue: Request[] = [];
15
+ private promises: {
16
+ [id: string]: {
17
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
18
+ resolve: (value: any) => void;
19
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
20
+ reject: (reason?: any) => void;
21
+ };
22
+ } = {};
23
+
24
+ public onOpen?: () => void = () => {};
25
+ public onClose?: () => void = () => {};
26
+ public onMessage?: (message: string) => void = () => {};
27
+ public onError?: (error: unknown) => void = () => {};
28
+
29
+ constructor(config: Config) {
30
+ WebSocketService.instance = this;
31
+ this.config = config;
32
+ }
33
+
34
+ public static getInstance() {
35
+ return WebSocketService.instance;
36
+ }
37
+
38
+ private resetConnection() {
39
+ this.setStatus(undefined);
40
+ this.socket = new WebSocket(this.config.webSocketUrl);
41
+
42
+ this.socket.onopen = () => {
43
+ console.log('[WS] Connected');
44
+ const interval = setInterval(() => {
45
+ if (this.socket && this.socket.readyState === 1) {
46
+ clearInterval(interval);
47
+ this.setStatus(true);
48
+ this.sendQueue();
49
+ this.onOpen?.();
50
+ }
51
+ }, 100);
52
+ };
53
+
54
+ this.socket.onclose = () => {
55
+ console.log('[WS] Disconnected');
56
+ setTimeout(() => this.connect(), this.status === true ? 500 : 5000);
57
+ this.onClose?.();
58
+ this.setStatus(false);
59
+ };
60
+
61
+ this.socket.onmessage = (event) => {
62
+ this.onMessage?.(event.data);
63
+ this.parseMessage(event.data);
64
+ };
65
+
66
+ this.socket.onerror = (error) => {
67
+ this.onError?.(error);
68
+ console.error('[WS] Error:', error);
69
+ };
70
+ }
71
+
72
+ public connect(force = false) {
73
+ if (this.status === false || force) {
74
+ this.resetConnection();
75
+ }
76
+ }
77
+
78
+ private setStatus(status: boolean | undefined) {
79
+ this.status = status;
80
+ this.status$.next(status);
81
+ }
82
+
83
+ private sendQueue() {
84
+ if (this.socket && this.status) {
85
+ let request: Request | undefined;
86
+ while ((request = this.queue.shift())) {
87
+ console.log('[WS] Sending queued request:', request);
88
+ this.socket?.send(JSON.stringify(request));
89
+ }
90
+ this.queue.forEach((request) =>
91
+ this.socket?.send(JSON.stringify(request))
92
+ );
93
+ }
94
+ }
95
+
96
+ public sendRequest<TReq, TRes>(name: string, data: TReq) {
97
+ const id = v4();
98
+ const promise = new Promise<TRes>((resolve, reject) => {
99
+ const request: Request = { id, name, data };
100
+ this.promises[id] = { resolve, reject };
101
+ if (!this.socket || !this.status) {
102
+ this.queue.push(request);
103
+ return;
104
+ }
105
+ console.log('[WS] Sending request:', request);
106
+ this.socket?.send(JSON.stringify(request));
107
+ });
108
+ return promise;
109
+ }
110
+
111
+ private parseMessage(message: string) {
112
+ try {
113
+ const response = JSON.parse(message);
114
+ if (!response.id) {
115
+ throw new Error('Received message is not valid');
116
+ }
117
+ if (this.promises[response.id]) {
118
+ console.log('[WS] Received response:', response);
119
+ if (
120
+ typeof response.data?.status === 'number' &&
121
+ response.data.status < 0
122
+ ) {
123
+ this.promises[response.id].reject(new Error(response.data.message));
124
+ } else {
125
+ this.promises[response.id].resolve(response.data);
126
+ }
127
+ delete this.promises[response.id];
128
+ } else {
129
+ console.log('[WS] Received request:', response);
130
+ // TODO : Implement request handling
131
+ throw new Error('Not yet implemented');
132
+ }
133
+ } catch (error) {
134
+ console.error('[WS] Error parsing message:', error);
135
+ }
136
+ }
137
+ }
@@ -1,102 +1,102 @@
1
- import { useWebSocketRequestHandler } from './hooks';
2
-
3
- export type FieldDTO<T extends string = string> = {
4
- fieldName?: T;
5
- fieldAlias?: string;
6
- operator?:
7
- | 'add'
8
- | 'concat'
9
- | 'divide'
10
- | 'groupConcat'
11
- | 'if'
12
- | 'ifNull'
13
- | 'jsonObject'
14
- | 'length'
15
- | 'modulo'
16
- | 'multiply'
17
- | 'subtract'
18
- | 'sum'
19
- | 'trim';
20
- operands?: FieldDTO[];
21
- constantValue?: string | number | boolean | null;
22
- groupBy?: boolean;
23
- };
24
-
25
- export type ConditionDTO = {
26
- field: string;
27
- operator:
28
- | 'lessThan'
29
- | 'lessThanOrEqual'
30
- | 'lessThanOrEquals'
31
- | 'equals'
32
- | 'notEquals'
33
- | 'greaterThanOrEqual'
34
- | 'greaterThanOrEquals'
35
- | 'greaterThan'
36
- | 'like'
37
- | 'contains'
38
- | 'notContains'
39
- | 'startsWith'
40
- | 'endsWith'
41
- | 'notLike'
42
- | 'inRange'
43
- | 'between'
44
- | 'isNull'
45
- | 'isNotNull'
46
- | 'inArray'
47
- | 'in'
48
- | 'not'
49
- | 'and'
50
- | 'or';
51
- value?:
52
- | string
53
- | number
54
- | boolean
55
- | null
56
- | (string | number | boolean | null)[];
57
- children?: boolean;
58
- };
59
-
60
- export type OrderByDTO = {
61
- field: string;
62
- direction?: 'ASC' | 'DESC';
63
- };
64
-
65
- export type AdvancedRequestDTO = {
66
- type: string;
67
- fields: FieldDTO[];
68
- conditions: ConditionDTO[];
69
- orderBy?: OrderByDTO[];
70
- start?: number;
71
- length?: number;
72
- getTotal?: boolean;
73
- unique?: boolean;
74
- };
75
-
76
- export type AdvancedRequestRow<R> = {
77
- [K in keyof R]: R[K] extends string | number | null
78
- ? R[K]
79
- : string | number | null;
80
- };
81
-
82
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
83
- export type AdvancedResponseDTO<T = any> = {
84
- data: AdvancedRequestRow<T>[];
85
- count?: number;
86
- };
87
-
88
- export type AdvancedRequestFieldDTO =
89
- | string
90
- | {
91
- name: string;
92
- fields: AdvancedRequestFieldDTO[];
93
- };
94
-
95
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
96
- export const useAdvancedRequestHandler = <T = any>() =>
97
- useWebSocketRequestHandler<AdvancedRequestDTO, AdvancedResponseDTO<T>>(
98
- 'AdvancedRequest'
99
- );
100
-
101
- export const useRawAdvancedRequestHandler = () =>
102
- useWebSocketRequestHandler<AdvancedRequestDTO, string>('RawAdvancedRequest');
1
+ import { useWebSocketRequestHandler } from './hooks';
2
+
3
+ export type FieldDTO<T extends string = string> = {
4
+ fieldName?: T;
5
+ fieldAlias?: string;
6
+ operator?:
7
+ | 'add'
8
+ | 'concat'
9
+ | 'divide'
10
+ | 'groupConcat'
11
+ | 'if'
12
+ | 'ifNull'
13
+ | 'jsonObject'
14
+ | 'length'
15
+ | 'modulo'
16
+ | 'multiply'
17
+ | 'subtract'
18
+ | 'sum'
19
+ | 'trim';
20
+ operands?: FieldDTO[];
21
+ constantValue?: string | number | boolean | null;
22
+ groupBy?: boolean;
23
+ };
24
+
25
+ export type ConditionDTO = {
26
+ field: string;
27
+ operator:
28
+ | 'lessThan'
29
+ | 'lessThanOrEqual'
30
+ | 'lessThanOrEquals'
31
+ | 'equals'
32
+ | 'notEquals'
33
+ | 'greaterThanOrEqual'
34
+ | 'greaterThanOrEquals'
35
+ | 'greaterThan'
36
+ | 'like'
37
+ | 'contains'
38
+ | 'notContains'
39
+ | 'startsWith'
40
+ | 'endsWith'
41
+ | 'notLike'
42
+ | 'inRange'
43
+ | 'between'
44
+ | 'isNull'
45
+ | 'isNotNull'
46
+ | 'inArray'
47
+ | 'in'
48
+ | 'not'
49
+ | 'and'
50
+ | 'or';
51
+ value?:
52
+ | string
53
+ | number
54
+ | boolean
55
+ | null
56
+ | (string | number | boolean | null)[];
57
+ children?: boolean;
58
+ };
59
+
60
+ export type OrderByDTO = {
61
+ field: string;
62
+ direction?: 'ASC' | 'DESC';
63
+ };
64
+
65
+ export type AdvancedRequestDTO = {
66
+ type: string;
67
+ fields: FieldDTO[];
68
+ conditions: ConditionDTO[];
69
+ orderBy?: OrderByDTO[];
70
+ start?: number;
71
+ length?: number;
72
+ getTotal?: boolean;
73
+ unique?: boolean;
74
+ };
75
+
76
+ export type AdvancedRequestRow<R> = {
77
+ [K in keyof R]: R[K] extends string | number | null
78
+ ? R[K]
79
+ : string | number | null;
80
+ };
81
+
82
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
83
+ export type AdvancedResponseDTO<T = any> = {
84
+ data: AdvancedRequestRow<T>[];
85
+ count?: number;
86
+ };
87
+
88
+ export type AdvancedRequestFieldDTO =
89
+ | string
90
+ | {
91
+ name: string;
92
+ fields: AdvancedRequestFieldDTO[];
93
+ };
94
+
95
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
96
+ export const useAdvancedRequestHandler = <T = any>() =>
97
+ useWebSocketRequestHandler<AdvancedRequestDTO, AdvancedResponseDTO<T>>(
98
+ 'AdvancedRequest'
99
+ );
100
+
101
+ export const useRawAdvancedRequestHandler = () =>
102
+ useWebSocketRequestHandler<AdvancedRequestDTO, string>('RawAdvancedRequest');