@addev-be/ui 1.1.7 → 1.2.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 (284) 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/data/AdvancedRequestDataGrid/helpers/advancedRequests.js +9 -8
  24. package/dist/components/data/AdvancedRequestDataGrid/helpers/columns.js +21 -72
  25. package/dist/components/data/AdvancedRequestDataGrid/index.js +2 -2
  26. package/dist/components/data/AdvancedRequestDataGrid/types.d.ts +1 -1
  27. package/dist/components/data/DataGrid/AdvancedRequestDataGrid.d.ts +10 -0
  28. package/dist/components/data/DataGrid/AdvancedRequestDataGrid.js +173 -0
  29. package/dist/components/data/DataGrid/DataGridCell.js +17 -7
  30. package/dist/components/data/DataGrid/DataGridColumnsModal/index.js +17 -7
  31. package/dist/components/data/DataGrid/DataGridColumnsModal/styles.js +17 -7
  32. package/dist/components/data/DataGrid/DataGridFilterMenu/FilterValuesScroller.js +17 -7
  33. package/dist/components/data/DataGrid/DataGridFilterMenu/index.js +17 -7
  34. package/dist/components/data/DataGrid/DataGridFooter.js +17 -7
  35. package/dist/components/data/DataGrid/DataGridHeader.js +17 -7
  36. package/dist/components/data/DataGrid/DataGridHeaderCell.js +17 -7
  37. package/dist/components/data/DataGrid/DataGridRowTemplate.js +17 -7
  38. package/dist/components/data/DataGrid/DataGridToolbar.js +17 -7
  39. package/dist/components/data/DataGrid/FilterModalContent/index.js +17 -7
  40. package/dist/components/data/DataGrid/FilterValuesScroller.d.ts +13 -0
  41. package/dist/components/data/DataGrid/FilterValuesScroller.js +73 -0
  42. package/dist/components/data/DataGrid/VirtualScroller.d.ts +11 -0
  43. package/dist/components/data/DataGrid/VirtualScroller.js +41 -0
  44. package/dist/components/data/DataGrid/helpers/advancedRequests.d.ts +12 -0
  45. package/dist/components/data/DataGrid/helpers/advancedRequests.js +53 -0
  46. package/dist/components/data/DataGrid/helpers.d.ts +28 -0
  47. package/dist/components/data/DataGrid/helpers.js +436 -0
  48. package/dist/components/data/DataGrid/index.js +17 -7
  49. package/dist/components/data/DataGrid/styles.js +17 -7
  50. package/dist/components/data/DataGrid/types.js +17 -7
  51. package/dist/components/data/SmartQueryDataGrid/helpers/columns.d.ts +20 -0
  52. package/dist/components/data/SmartQueryDataGrid/helpers/columns.js +160 -0
  53. package/dist/components/data/SmartQueryDataGrid/helpers/hooks.d.ts +5 -0
  54. package/dist/components/data/SmartQueryDataGrid/helpers/hooks.js +41 -0
  55. package/dist/components/data/SmartQueryDataGrid/helpers/index.d.ts +2 -0
  56. package/dist/components/data/SmartQueryDataGrid/helpers/index.js +18 -0
  57. package/dist/components/data/SmartQueryDataGrid/helpers/smartQueries.d.ts +3 -0
  58. package/dist/components/data/SmartQueryDataGrid/helpers/smartQueries.js +15 -0
  59. package/dist/components/data/SmartQueryDataGrid/hooks.d.ts +9 -0
  60. package/dist/components/data/SmartQueryDataGrid/hooks.js +63 -0
  61. package/dist/components/data/SmartQueryDataGrid/index.d.ts +12 -0
  62. package/dist/components/data/SmartQueryDataGrid/index.js +242 -0
  63. package/dist/components/data/SmartQueryDataGrid/types.d.ts +22 -0
  64. package/dist/components/data/SmartQueryDataGrid/types.js +2 -0
  65. package/dist/components/data/SqlRequestDataGrid/index.js +17 -7
  66. package/dist/components/data/SqlRequestGrid/filters/FiltersSidebar.js +17 -7
  67. package/dist/components/data/SqlRequestGrid/index.js +17 -7
  68. package/dist/components/data/VirtualScroller/index.js +17 -7
  69. package/dist/components/forms/Button.js +17 -7
  70. package/dist/components/forms/Form/InputWithLabel.d.ts +2 -0
  71. package/dist/components/forms/Form/InputWithLabel.js +10 -0
  72. package/dist/components/forms/Form/styles.js +17 -7
  73. package/dist/components/forms/Form/types.d.ts +7 -0
  74. package/dist/components/forms/Form/types.js +2 -0
  75. package/dist/components/forms/styles.js +17 -7
  76. package/dist/components/layout/Dropdown/index.js +17 -7
  77. package/dist/components/layout/Dropdown/styles.js +17 -7
  78. package/dist/components/layout/Loading/index.js +17 -7
  79. package/dist/components/layout/Modal/index.js +17 -7
  80. package/dist/components/layout/Modal/styles.js +17 -7
  81. package/dist/components/search/QuickSearchBar.js +17 -7
  82. package/dist/components/search/QuickSearchResults.js +17 -7
  83. package/dist/components/ui/Avatar/index.js +17 -7
  84. package/dist/components/ui/Avatar/styles.js +17 -7
  85. package/dist/components/ui/ContextMenu/styles.js +17 -7
  86. package/dist/components/ui/Label.js +17 -7
  87. package/dist/components/ui/Message/index.js +17 -7
  88. package/dist/components/ui/Message/styles.js +17 -7
  89. package/dist/components/ui/TabsView/styles.js +17 -7
  90. package/dist/config/types.d.ts +11 -0
  91. package/dist/config/types.js +2 -0
  92. package/dist/helpers/styled/typography.js +17 -7
  93. package/dist/providers/PortalsProvider/index.js +17 -7
  94. package/dist/providers/UiProviders/index.js +17 -7
  95. package/dist/services/index.js +17 -7
  96. package/dist/services/requests/generic.d.ts +6 -94
  97. package/dist/services/requests/userPermissions.d.ts +4 -0
  98. package/dist/services/requests/userPermissions.js +20 -0
  99. package/dist/services/types/auth.js +17 -7
  100. package/dist/services/types/base.js +17 -7
  101. package/dist/services/types/generic.js +17 -7
  102. package/dist/services/types/tracking.js +17 -7
  103. package/dist/services/types/userProfiles.js +17 -7
  104. package/dist/services/types/users.js +17 -7
  105. package/eslint.config.js +3 -3
  106. package/package.json +14 -14
  107. package/src/Icons.tsx +138 -138
  108. package/src/components/auth/LoginForm.tsx +84 -84
  109. package/src/components/auth/LoginPage.tsx +32 -32
  110. package/src/components/auth/PasswordRecoveryForm.tsx +52 -52
  111. package/src/components/auth/PasswordResetForm.tsx +112 -112
  112. package/src/components/auth/index.ts +4 -4
  113. package/src/components/auth/styles.ts +14 -14
  114. package/src/components/data/DataGrid/DataGridCell.tsx +81 -81
  115. package/src/components/data/DataGrid/DataGridColumnsModal/helpers.ts +9 -9
  116. package/src/components/data/DataGrid/DataGridColumnsModal/hooks.tsx +59 -59
  117. package/src/components/data/DataGrid/DataGridColumnsModal/index.tsx +182 -182
  118. package/src/components/data/DataGrid/DataGridColumnsModal/styles.ts +104 -104
  119. package/src/components/data/DataGrid/DataGridEditableCell/CheckboxEditableCell.tsx +38 -38
  120. package/src/components/data/DataGrid/DataGridEditableCell/DateEditableCell.tsx +39 -39
  121. package/src/components/data/DataGrid/DataGridEditableCell/NumberEditableCell.tsx +75 -75
  122. package/src/components/data/DataGrid/DataGridEditableCell/TextEditableCell.tsx +38 -38
  123. package/src/components/data/DataGrid/DataGridEditableCell/index.tsx +106 -106
  124. package/src/components/data/DataGrid/DataGridEditableCell/styles.ts +35 -35
  125. package/src/components/data/DataGrid/DataGridEditableCell/types.ts +19 -19
  126. package/src/components/data/DataGrid/DataGridFilterMenu/FilterValuesScroller.tsx +129 -129
  127. package/src/components/data/DataGrid/DataGridFilterMenu/hooks.tsx +81 -81
  128. package/src/components/data/DataGrid/DataGridFilterMenu/index.tsx +370 -370
  129. package/src/components/data/DataGrid/DataGridFilterMenu/styles.ts +97 -97
  130. package/src/components/data/DataGrid/DataGridFooter.tsx +45 -45
  131. package/src/components/data/DataGrid/DataGridHeader.tsx +74 -74
  132. package/src/components/data/DataGrid/DataGridHeaderCell.tsx +112 -112
  133. package/src/components/data/DataGrid/DataGridRowTemplate.tsx +83 -83
  134. package/src/components/data/DataGrid/DataGridToolbar.tsx +134 -134
  135. package/src/components/data/DataGrid/FilterModalContent/index.tsx +135 -135
  136. package/src/components/data/DataGrid/FilterModalContent/styles.ts +22 -22
  137. package/src/components/data/DataGrid/constants.ts +6 -6
  138. package/src/components/data/DataGrid/helpers/columns.tsx +453 -453
  139. package/src/components/data/DataGrid/helpers/filters.ts +287 -287
  140. package/src/components/data/DataGrid/helpers/index.ts +2 -2
  141. package/src/components/data/DataGrid/hooks/index.ts +29 -29
  142. package/src/components/data/DataGrid/hooks/useDataGrid.tsx +380 -380
  143. package/src/components/data/DataGrid/hooks/useDataGridChangedRows.ts +97 -97
  144. package/src/components/data/DataGrid/hooks/useDataGridCopy.ts +174 -174
  145. package/src/components/data/DataGrid/hooks/useDataGridSettings.ts +48 -48
  146. package/src/components/data/DataGrid/hooks/useRefreshModal.tsx +48 -48
  147. package/src/components/data/DataGrid/index.tsx +122 -122
  148. package/src/components/data/DataGrid/styles.ts +430 -430
  149. package/src/components/data/DataGrid/types.ts +380 -380
  150. package/src/components/data/SqlRequestDataGrid/SqlRequestForeignListEditableCell.tsx +16 -16
  151. package/src/components/data/SqlRequestDataGrid/helpers/columns.tsx +526 -526
  152. package/src/components/data/SqlRequestDataGrid/helpers/index.ts +2 -2
  153. package/src/components/data/SqlRequestDataGrid/helpers/sqlRequests.ts +16 -16
  154. package/src/components/data/SqlRequestDataGrid/index.tsx +420 -420
  155. package/src/components/data/SqlRequestDataGrid/styles.ts +15 -15
  156. package/src/components/data/SqlRequestDataGrid/types.ts +74 -74
  157. package/src/components/data/SqlRequestForeignList/index.tsx +257 -257
  158. package/src/components/data/SqlRequestForeignList/styles.ts +43 -43
  159. package/src/components/data/SqlRequestForeignList/types.ts +32 -32
  160. package/src/components/data/SqlRequestGrid/filters/FiltersSidebar.tsx +108 -108
  161. package/src/components/data/SqlRequestGrid/filters/styles.ts +88 -88
  162. package/src/components/data/SqlRequestGrid/helpers/index.ts +1 -1
  163. package/src/components/data/SqlRequestGrid/helpers/sqlRequests.ts +16 -16
  164. package/src/components/data/SqlRequestGrid/index.tsx +315 -315
  165. package/src/components/data/SqlRequestGrid/styles.ts +20 -20
  166. package/src/components/data/SqlRequestGrid/types.ts +73 -73
  167. package/src/components/data/VirtualScroller/hooks.ts +71 -71
  168. package/src/components/data/VirtualScroller/index.tsx +89 -89
  169. package/src/components/data/VirtualScroller/styles.ts +57 -57
  170. package/src/components/data/VirtualScroller/types.ts +10 -10
  171. package/src/components/data/index.ts +16 -16
  172. package/src/components/forms/AutoTextArea.tsx +48 -48
  173. package/src/components/forms/Button.tsx +132 -132
  174. package/src/components/forms/Form/Checkbox.tsx +12 -12
  175. package/src/components/forms/Form/CustomSelect.tsx +94 -94
  176. package/src/components/forms/Form/FormGroup.tsx +31 -31
  177. package/src/components/forms/Form/Input.tsx +16 -16
  178. package/src/components/forms/Form/Row.tsx +32 -32
  179. package/src/components/forms/Form/Select.tsx +87 -87
  180. package/src/components/forms/Form/TextArea.tsx +17 -17
  181. package/src/components/forms/Form/index.tsx +48 -48
  182. package/src/components/forms/Form/styles.ts +184 -184
  183. package/src/components/forms/IconButton.tsx +67 -67
  184. package/src/components/forms/IndeterminateCheckbox.tsx +46 -46
  185. package/src/components/forms/NumberInput.tsx +53 -53
  186. package/src/components/forms/Select.tsx +34 -34
  187. package/src/components/forms/VerticalLabel.tsx +20 -20
  188. package/src/components/forms/index.ts +9 -9
  189. package/src/components/forms/styles.ts +42 -42
  190. package/src/components/index.ts +6 -6
  191. package/src/components/layout/Columns.ts +28 -28
  192. package/src/components/layout/Dropdown/index.tsx +113 -113
  193. package/src/components/layout/Dropdown/styles.ts +53 -53
  194. package/src/components/layout/Flexbox.ts +21 -21
  195. package/src/components/layout/Grid/index.tsx +8 -8
  196. package/src/components/layout/Grid/styles.ts +34 -34
  197. package/src/components/layout/Loading/index.tsx +29 -29
  198. package/src/components/layout/Loading/styles.ts +29 -29
  199. package/src/components/layout/Masonry/index.tsx +29 -29
  200. package/src/components/layout/Masonry/styles.ts +20 -20
  201. package/src/components/layout/Modal/index.tsx +51 -51
  202. package/src/components/layout/Modal/styles.ts +125 -125
  203. package/src/components/layout/index.ts +7 -7
  204. package/src/components/search/HighlightedText.tsx +41 -41
  205. package/src/components/search/QuickSearchBar.tsx +99 -99
  206. package/src/components/search/QuickSearchResults.tsx +86 -86
  207. package/src/components/search/index.ts +9 -9
  208. package/src/components/search/styles.ts +96 -96
  209. package/src/components/search/types.ts +29 -29
  210. package/src/components/ui/Avatar/index.tsx +54 -54
  211. package/src/components/ui/Card/index.tsx +14 -14
  212. package/src/components/ui/Card/styles.ts +37 -37
  213. package/src/components/ui/ContextMenu/index.tsx +79 -79
  214. package/src/components/ui/ContextMenu/styles.ts +119 -119
  215. package/src/components/ui/Ellipsis.tsx +34 -34
  216. package/src/components/ui/Label.tsx +99 -99
  217. package/src/components/ui/Message/index.tsx +57 -57
  218. package/src/components/ui/Message/styles.ts +40 -40
  219. package/src/components/ui/TabsView/TabsList.tsx +44 -44
  220. package/src/components/ui/TabsView/TabsView.tsx +38 -38
  221. package/src/components/ui/TabsView/styles.ts +73 -73
  222. package/src/components/ui/TabsView/types.ts +12 -12
  223. package/src/components/ui/index.ts +7 -7
  224. package/src/config/index.ts +14 -14
  225. package/src/helpers/dates.ts +17 -17
  226. package/src/helpers/getScrollbarSize.ts +14 -14
  227. package/src/helpers/index.ts +5 -5
  228. package/src/helpers/numbers.ts +63 -63
  229. package/src/helpers/responsive.ts +83 -83
  230. package/src/helpers/styled/typography.ts +25 -25
  231. package/src/helpers/text.ts +13 -13
  232. package/src/helpers/types.ts +9 -9
  233. package/src/hooks/index.ts +7 -7
  234. package/src/hooks/useContainerMediaQuery.ts +7 -7
  235. package/src/hooks/useElementSize.ts +24 -24
  236. package/src/hooks/useMediaQuery.ts +9 -9
  237. package/src/hooks/useMediaQueryForWidth.ts +35 -35
  238. package/src/hooks/useMutableState.ts +17 -17
  239. package/src/hooks/useShowArchived.ts +28 -28
  240. package/src/hooks/useWindowSize.ts +20 -20
  241. package/src/index.ts +13 -13
  242. package/src/providers/AuthenticationProvider/helpers.ts +3 -3
  243. package/src/providers/AuthenticationProvider/index.tsx +303 -303
  244. package/src/providers/LoadingProvider/index.tsx +47 -47
  245. package/src/providers/PortalsProvider/index.tsx +54 -54
  246. package/src/providers/PortalsProvider/styles.ts +31 -31
  247. package/src/providers/SettingsProvider/index.tsx +70 -70
  248. package/src/providers/ThemeProvider/ThemeProvider.ts +66 -66
  249. package/src/providers/ThemeProvider/defaultTheme.ts +470 -470
  250. package/src/providers/ThemeProvider/helpers.ts +84 -84
  251. package/src/providers/ThemeProvider/index.ts +5 -5
  252. package/src/providers/ThemeProvider/types.ts +134 -134
  253. package/src/providers/ToastProvider/index.tsx +93 -93
  254. package/src/providers/TrackingProvider/index.tsx +71 -71
  255. package/src/providers/UiProviders/index.tsx +76 -76
  256. package/src/providers/UiProviders/styles.ts +10 -10
  257. package/src/providers/hooks.ts +14 -14
  258. package/src/providers/index.ts +9 -9
  259. package/src/services/HttpService.ts +92 -92
  260. package/src/services/WebSocketService.ts +155 -155
  261. package/src/services/advancedRequests.ts +102 -102
  262. package/src/services/base.ts +23 -23
  263. package/src/services/globalSearch.ts +32 -32
  264. package/src/services/hooks.ts +92 -92
  265. package/src/services/index.ts +21 -21
  266. package/src/services/requests/auth.ts +44 -44
  267. package/src/services/requests/generic.ts +62 -62
  268. package/src/services/requests/tracking.ts +12 -12
  269. package/src/services/requests/userProfiles.ts +35 -35
  270. package/src/services/requests/users.ts +28 -28
  271. package/src/services/smartQueries.ts +122 -122
  272. package/src/services/sqlRequests.ts +111 -111
  273. package/src/services/types/auth.ts +98 -98
  274. package/src/services/types/base.ts +10 -10
  275. package/src/services/types/generic.ts +82 -82
  276. package/src/services/types/tracking.ts +29 -29
  277. package/src/services/types/userProfiles.ts +79 -79
  278. package/src/services/types/users.ts +74 -74
  279. package/src/services/updateSqlRequests.ts +32 -32
  280. package/src/styles/animations.scss +30 -30
  281. package/src/styles/index.scss +42 -42
  282. package/src/typings.d.ts +17 -17
  283. package/tsconfig.json +18 -18
  284. package/tsconfig.tsbuildinfo +1 -1
@@ -1,155 +1,155 @@
1
- import { Config } from '../config';
2
- import { Request } from './base';
3
- import { Subject } from 'rxjs';
4
- import { v4 } from 'uuid';
5
-
6
- export class WebSocketError extends Error {
7
- public status: number;
8
-
9
- constructor(status: number, message: string) {
10
- super(message);
11
- this.status = status;
12
- this.name = 'WebSocketError';
13
- }
14
- }
15
-
16
- export class WebSocketService {
17
- private static instance: WebSocketService;
18
- private config: Config;
19
- private socket: WebSocket | null = null;
20
-
21
- public status: boolean | undefined = undefined;
22
- public status$ = new Subject<boolean | undefined>();
23
- public error$ = new Subject<{ status: number; message: string }>();
24
-
25
- private queue: Request[] = [];
26
- private promises: {
27
- [id: string]: {
28
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
29
- resolve: (value: any) => void;
30
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
31
- reject: (reason?: any) => void;
32
- };
33
- } = {};
34
-
35
- public onOpen?: () => void = () => {};
36
- public onClose?: () => void = () => {};
37
- public onMessage?: (message: string) => void = () => {};
38
- public onError?: (error: unknown) => void = () => {};
39
-
40
- constructor(config: Config) {
41
- WebSocketService.instance = this;
42
- this.config = config;
43
- }
44
-
45
- public static getInstance() {
46
- return WebSocketService.instance;
47
- }
48
-
49
- private resetConnection() {
50
- this.setStatus(undefined);
51
- this.socket = new WebSocket(this.config.webSocketUrl);
52
-
53
- this.socket.onopen = () => {
54
- console.log('[WS] Connected');
55
- const interval = setInterval(() => {
56
- if (this.socket && this.socket.readyState === 1) {
57
- clearInterval(interval);
58
- this.setStatus(true);
59
- this.sendQueue();
60
- this.onOpen?.();
61
- }
62
- }, 100);
63
- };
64
-
65
- this.socket.onclose = () => {
66
- console.log('[WS] Disconnected');
67
- setTimeout(() => this.connect(), this.status === true ? 500 : 5000);
68
- this.onClose?.();
69
- this.setStatus(false);
70
- };
71
-
72
- this.socket.onmessage = (event) => {
73
- this.onMessage?.(event.data);
74
- this.parseMessage(event.data);
75
- };
76
-
77
- this.socket.onerror = (error) => {
78
- this.onError?.(error);
79
- console.error('[WS] Error:', error);
80
- };
81
- }
82
-
83
- public connect(force = false) {
84
- if (this.status === false || force) {
85
- this.resetConnection();
86
- }
87
- }
88
-
89
- private setStatus(status: boolean | undefined) {
90
- this.status = status;
91
- this.status$.next(status);
92
- }
93
-
94
- private sendQueue() {
95
- if (this.socket && this.status) {
96
- let request: Request | undefined;
97
- while ((request = this.queue.shift())) {
98
- console.log('[WS] Sending queued request:', request);
99
- this.socket?.send(JSON.stringify(request));
100
- }
101
- this.queue.forEach((request) =>
102
- this.socket?.send(JSON.stringify(request))
103
- );
104
- }
105
- }
106
-
107
- public sendRequest<TReq, TRes>(name: string, data: TReq) {
108
- const id = v4();
109
- const promise = new Promise<TRes>((resolve, reject) => {
110
- const request: Request = { id, name, data };
111
- this.promises[id] = { resolve, reject };
112
- if (!this.socket || !this.status) {
113
- console.log('[WS] Queuing request:', request);
114
- this.queue.push(request);
115
- return;
116
- }
117
- console.log('[WS] Sending request:', request);
118
- this.socket?.send(JSON.stringify(request));
119
- });
120
- return promise;
121
- }
122
-
123
- private parseMessage(message: string) {
124
- try {
125
- const response = JSON.parse(message);
126
- if (!response.id) {
127
- throw new Error('Received message is not valid');
128
- }
129
- if (this.promises[response.id]) {
130
- console.log('[WS] Received response:', response);
131
- if (
132
- typeof response.data?.status === 'number' &&
133
- response.data.status < 0
134
- ) {
135
- this.promises[response.id].reject(
136
- new WebSocketError(response.data.status, response.data.message)
137
- );
138
- this.error$.next({
139
- status: response.data.status,
140
- message: response.data.message || 'Unknown error',
141
- });
142
- } else {
143
- this.promises[response.id].resolve(response.data);
144
- }
145
- delete this.promises[response.id];
146
- } else {
147
- console.log('[WS] Received request:', response);
148
- // TODO : Implement request handling
149
- throw new Error('Not yet implemented');
150
- }
151
- } catch (error) {
152
- console.error('[WS] Error parsing message:', error);
153
- }
154
- }
155
- }
1
+ import { Config } from '../config';
2
+ import { Request } from './base';
3
+ import { Subject } from 'rxjs';
4
+ import { v4 } from 'uuid';
5
+
6
+ export class WebSocketError extends Error {
7
+ public status: number;
8
+
9
+ constructor(status: number, message: string) {
10
+ super(message);
11
+ this.status = status;
12
+ this.name = 'WebSocketError';
13
+ }
14
+ }
15
+
16
+ export class WebSocketService {
17
+ private static instance: WebSocketService;
18
+ private config: Config;
19
+ private socket: WebSocket | null = null;
20
+
21
+ public status: boolean | undefined = undefined;
22
+ public status$ = new Subject<boolean | undefined>();
23
+ public error$ = new Subject<{ status: number; message: string }>();
24
+
25
+ private queue: Request[] = [];
26
+ private promises: {
27
+ [id: string]: {
28
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
29
+ resolve: (value: any) => void;
30
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
31
+ reject: (reason?: any) => void;
32
+ };
33
+ } = {};
34
+
35
+ public onOpen?: () => void = () => {};
36
+ public onClose?: () => void = () => {};
37
+ public onMessage?: (message: string) => void = () => {};
38
+ public onError?: (error: unknown) => void = () => {};
39
+
40
+ constructor(config: Config) {
41
+ WebSocketService.instance = this;
42
+ this.config = config;
43
+ }
44
+
45
+ public static getInstance() {
46
+ return WebSocketService.instance;
47
+ }
48
+
49
+ private resetConnection() {
50
+ this.setStatus(undefined);
51
+ this.socket = new WebSocket(this.config.webSocketUrl);
52
+
53
+ this.socket.onopen = () => {
54
+ console.log('[WS] Connected');
55
+ const interval = setInterval(() => {
56
+ if (this.socket && this.socket.readyState === 1) {
57
+ clearInterval(interval);
58
+ this.setStatus(true);
59
+ this.sendQueue();
60
+ this.onOpen?.();
61
+ }
62
+ }, 100);
63
+ };
64
+
65
+ this.socket.onclose = () => {
66
+ console.log('[WS] Disconnected');
67
+ setTimeout(() => this.connect(), this.status === true ? 500 : 5000);
68
+ this.onClose?.();
69
+ this.setStatus(false);
70
+ };
71
+
72
+ this.socket.onmessage = (event) => {
73
+ this.onMessage?.(event.data);
74
+ this.parseMessage(event.data);
75
+ };
76
+
77
+ this.socket.onerror = (error) => {
78
+ this.onError?.(error);
79
+ console.error('[WS] Error:', error);
80
+ };
81
+ }
82
+
83
+ public connect(force = false) {
84
+ if (this.status === false || force) {
85
+ this.resetConnection();
86
+ }
87
+ }
88
+
89
+ private setStatus(status: boolean | undefined) {
90
+ this.status = status;
91
+ this.status$.next(status);
92
+ }
93
+
94
+ private sendQueue() {
95
+ if (this.socket && this.status) {
96
+ let request: Request | undefined;
97
+ while ((request = this.queue.shift())) {
98
+ console.log('[WS] Sending queued request:', request);
99
+ this.socket?.send(JSON.stringify(request));
100
+ }
101
+ this.queue.forEach((request) =>
102
+ this.socket?.send(JSON.stringify(request))
103
+ );
104
+ }
105
+ }
106
+
107
+ public sendRequest<TReq, TRes>(name: string, data: TReq) {
108
+ const id = v4();
109
+ const promise = new Promise<TRes>((resolve, reject) => {
110
+ const request: Request = { id, name, data };
111
+ this.promises[id] = { resolve, reject };
112
+ if (!this.socket || !this.status) {
113
+ console.log('[WS] Queuing request:', request);
114
+ this.queue.push(request);
115
+ return;
116
+ }
117
+ console.log('[WS] Sending request:', request);
118
+ this.socket?.send(JSON.stringify(request));
119
+ });
120
+ return promise;
121
+ }
122
+
123
+ private parseMessage(message: string) {
124
+ try {
125
+ const response = JSON.parse(message);
126
+ if (!response.id) {
127
+ throw new Error('Received message is not valid');
128
+ }
129
+ if (this.promises[response.id]) {
130
+ console.log('[WS] Received response:', response);
131
+ if (
132
+ typeof response.data?.status === 'number' &&
133
+ response.data.status < 0
134
+ ) {
135
+ this.promises[response.id].reject(
136
+ new WebSocketError(response.data.status, response.data.message)
137
+ );
138
+ this.error$.next({
139
+ status: response.data.status,
140
+ message: response.data.message || 'Unknown error',
141
+ });
142
+ } else {
143
+ this.promises[response.id].resolve(response.data);
144
+ }
145
+ delete this.promises[response.id];
146
+ } else {
147
+ console.log('[WS] Received request:', response);
148
+ // TODO : Implement request handling
149
+ throw new Error('Not yet implemented');
150
+ }
151
+ } catch (error) {
152
+ console.error('[WS] Error parsing message:', error);
153
+ }
154
+ }
155
+ }
@@ -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');
@@ -1,23 +1,23 @@
1
- import { BaseModelDTO } from './types/base';
2
-
3
- export const emptyBaseModel: BaseModelDTO = {
4
- id: '',
5
- };
6
-
7
- export type ArchivableModelDTO = BaseModelDTO & {
8
- archived: boolean | null;
9
- };
10
-
11
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
12
- export type Request<T = any> = {
13
- id: string;
14
- name: string;
15
- data: T;
16
- };
17
-
18
- export const UUID_REGEX =
19
- /^[0-9a-f]{8}-[0-9a-f]{4}-[0-5][0-9a-f]{3}-[089ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
20
-
21
- export type GetObjectRequestDTO = {
22
- id: string;
23
- };
1
+ import { BaseModelDTO } from './types/base';
2
+
3
+ export const emptyBaseModel: BaseModelDTO = {
4
+ id: '',
5
+ };
6
+
7
+ export type ArchivableModelDTO = BaseModelDTO & {
8
+ archived: boolean | null;
9
+ };
10
+
11
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
12
+ export type Request<T = any> = {
13
+ id: string;
14
+ name: string;
15
+ data: T;
16
+ };
17
+
18
+ export const UUID_REGEX =
19
+ /^[0-9a-f]{8}-[0-9a-f]{4}-[0-5][0-9a-f]{3}-[089ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
20
+
21
+ export type GetObjectRequestDTO = {
22
+ id: string;
23
+ };
@@ -1,32 +1,32 @@
1
- import { ConditionDTO, SqlRequestRow } from './sqlRequests';
2
-
3
- import { OrderByDTO } from './sqlRequests';
4
- import { useWebSocketRequestHandler } from './hooks';
5
-
6
- export type GlobalSearchRequestDTO = {
7
- types: Record<
8
- string,
9
- { conditions?: ConditionDTO[]; orderBy?: OrderByDTO[] }
10
- >;
11
- searchTerm: string;
12
- limit?: number;
13
- };
14
-
15
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
16
- export type GlobalSearchResponseDTO<T = any> = {
17
- data: Record<string, SqlRequestRow<T>[]>;
18
- count?: number;
19
- };
20
-
21
- type GlobalSearchRequestHandler<T> = (
22
- request: GlobalSearchRequestDTO
23
- ) => Promise<GlobalSearchResponseDTO<T>>;
24
-
25
- export const useGlobalSearchRequestHandler = <
26
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
27
- T = any
28
- >(): GlobalSearchRequestHandler<T> =>
29
- useWebSocketRequestHandler<
30
- GlobalSearchRequestDTO,
31
- GlobalSearchResponseDTO<T>
32
- >('GlobalSearch');
1
+ import { ConditionDTO, SqlRequestRow } from './sqlRequests';
2
+
3
+ import { OrderByDTO } from './sqlRequests';
4
+ import { useWebSocketRequestHandler } from './hooks';
5
+
6
+ export type GlobalSearchRequestDTO = {
7
+ types: Record<
8
+ string,
9
+ { conditions?: ConditionDTO[]; orderBy?: OrderByDTO[] }
10
+ >;
11
+ searchTerm: string;
12
+ limit?: number;
13
+ };
14
+
15
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
16
+ export type GlobalSearchResponseDTO<T = any> = {
17
+ data: Record<string, SqlRequestRow<T>[]>;
18
+ count?: number;
19
+ };
20
+
21
+ type GlobalSearchRequestHandler<T> = (
22
+ request: GlobalSearchRequestDTO
23
+ ) => Promise<GlobalSearchResponseDTO<T>>;
24
+
25
+ export const useGlobalSearchRequestHandler = <
26
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
27
+ T = any
28
+ >(): GlobalSearchRequestHandler<T> =>
29
+ useWebSocketRequestHandler<
30
+ GlobalSearchRequestDTO,
31
+ GlobalSearchResponseDTO<T>
32
+ >('GlobalSearch');