@addev-be/ui 1.1.2 → 1.1.4

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 (276) 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/table.svg +1 -1
  21. package/assets/icons/up.svg +1 -1
  22. package/assets/icons/user-tie.svg +1 -1
  23. package/assets/icons/x-bar.svg +3 -3
  24. package/dist/components/data/DataGrid/helpers/columns.d.ts +11 -9
  25. package/dist/components/data/DataGrid/helpers/columns.js +17 -12
  26. package/dist/components/data/DataGrid/index.d.ts +1 -1
  27. package/dist/components/data/DataGrid/index.js +2 -2
  28. package/dist/components/data/DataGrid/styles.d.ts +1 -1
  29. package/dist/components/data/DataGrid/styles.js +2 -2
  30. package/dist/components/data/DataGrid/types.d.ts +8 -1
  31. package/dist/components/data/SqlRequestDataGrid/helpers/columns.js +11 -10
  32. package/dist/components/layout/Columns.d.ts +1 -1
  33. package/dist/components/layout/Columns.js +2 -2
  34. package/dist/components/layout/Flexbox.d.ts +1 -1
  35. package/dist/components/layout/Flexbox.js +2 -2
  36. package/dist/components/ui/TabsView/TabsList.d.ts +1 -1
  37. package/dist/components/ui/TabsView/styles.d.ts +1 -1
  38. package/dist/components/ui/TabsView/styles.js +2 -2
  39. package/dist/helpers/index.d.ts +0 -1
  40. package/dist/helpers/index.js +0 -1
  41. package/dist/helpers/styled/typography.d.ts +9 -0
  42. package/dist/helpers/styled/typography.js +51 -0
  43. package/dist/index.d.ts +2 -0
  44. package/dist/index.js +3 -0
  45. package/eslint.config.js +3 -3
  46. package/package.json +2 -2
  47. package/src/Icons.tsx +138 -138
  48. package/src/components/auth/LoginForm.tsx +84 -84
  49. package/src/components/auth/LoginPage.tsx +32 -32
  50. package/src/components/auth/PasswordRecoveryForm.tsx +52 -52
  51. package/src/components/auth/PasswordResetForm.tsx +112 -112
  52. package/src/components/auth/index.ts +4 -4
  53. package/src/components/auth/styles.ts +14 -14
  54. package/src/components/data/DataGrid/DataGridCell.tsx +81 -81
  55. package/src/components/data/DataGrid/DataGridColumnsModal/helpers.ts +9 -9
  56. package/src/components/data/DataGrid/DataGridColumnsModal/hooks.tsx +59 -59
  57. package/src/components/data/DataGrid/DataGridColumnsModal/index.tsx +182 -182
  58. package/src/components/data/DataGrid/DataGridColumnsModal/styles.ts +104 -104
  59. package/src/components/data/DataGrid/DataGridEditableCell/CheckboxEditableCell.tsx +38 -38
  60. package/src/components/data/DataGrid/DataGridEditableCell/DateEditableCell.tsx +39 -39
  61. package/src/components/data/DataGrid/DataGridEditableCell/NumberEditableCell.tsx +75 -75
  62. package/src/components/data/DataGrid/DataGridEditableCell/TextEditableCell.tsx +38 -38
  63. package/src/components/data/DataGrid/DataGridEditableCell/index.tsx +106 -106
  64. package/src/components/data/DataGrid/DataGridEditableCell/styles.ts +35 -35
  65. package/src/components/data/DataGrid/DataGridEditableCell/types.ts +19 -19
  66. package/src/components/data/DataGrid/DataGridFilterMenu/FilterValuesScroller.tsx +129 -129
  67. package/src/components/data/DataGrid/DataGridFilterMenu/helpers.ts +23 -23
  68. package/src/components/data/DataGrid/DataGridFilterMenu/hooks.tsx +81 -81
  69. package/src/components/data/DataGrid/DataGridFilterMenu/index.tsx +370 -370
  70. package/src/components/data/DataGrid/DataGridFilterMenu/styles.ts +97 -97
  71. package/src/components/data/DataGrid/DataGridFooter.tsx +45 -45
  72. package/src/components/data/DataGrid/DataGridHeader.tsx +74 -74
  73. package/src/components/data/DataGrid/DataGridHeaderCell.tsx +112 -112
  74. package/src/components/data/DataGrid/DataGridRowTemplate.tsx +83 -83
  75. package/src/components/data/DataGrid/DataGridToolbar.tsx +134 -134
  76. package/src/components/data/DataGrid/FilterModalContent/index.tsx +135 -135
  77. package/src/components/data/DataGrid/FilterModalContent/styles.ts +22 -22
  78. package/src/components/data/DataGrid/constants.ts +6 -6
  79. package/src/components/data/DataGrid/helpers/columns.tsx +453 -394
  80. package/src/components/data/DataGrid/helpers/filters.ts +287 -287
  81. package/src/components/data/DataGrid/helpers/index.ts +2 -2
  82. package/src/components/data/DataGrid/hooks/index.ts +29 -29
  83. package/src/components/data/DataGrid/hooks/useDataGrid.tsx +380 -380
  84. package/src/components/data/DataGrid/hooks/useDataGridChangedRows.ts +97 -97
  85. package/src/components/data/DataGrid/hooks/useDataGridCopy.ts +174 -174
  86. package/src/components/data/DataGrid/hooks/useDataGridSettings.ts +48 -48
  87. package/src/components/data/DataGrid/hooks/useRefreshModal.tsx +48 -48
  88. package/src/components/data/DataGrid/index.tsx +122 -122
  89. package/src/components/data/DataGrid/styles.ts +430 -430
  90. package/src/components/data/DataGrid/types.ts +380 -372
  91. package/src/components/data/SqlRequestDataGrid/SqlRequestForeignListEditableCell.tsx +16 -16
  92. package/src/components/data/SqlRequestDataGrid/helpers/columns.tsx +526 -479
  93. package/src/components/data/SqlRequestDataGrid/helpers/index.ts +2 -2
  94. package/src/components/data/SqlRequestDataGrid/helpers/sqlRequests.ts +16 -16
  95. package/src/components/data/SqlRequestDataGrid/index.tsx +420 -420
  96. package/src/components/data/SqlRequestDataGrid/styles.ts +15 -15
  97. package/src/components/data/SqlRequestDataGrid/types.ts +74 -74
  98. package/src/components/data/SqlRequestForeignList/index.tsx +257 -257
  99. package/src/components/data/SqlRequestForeignList/styles.ts +43 -43
  100. package/src/components/data/SqlRequestForeignList/types.ts +32 -32
  101. package/src/components/data/SqlRequestGrid/filters/FiltersSidebar.tsx +108 -108
  102. package/src/components/data/SqlRequestGrid/filters/styles.ts +88 -88
  103. package/src/components/data/SqlRequestGrid/helpers/index.ts +1 -1
  104. package/src/components/data/SqlRequestGrid/helpers/sqlRequests.ts +16 -16
  105. package/src/components/data/SqlRequestGrid/index.tsx +315 -315
  106. package/src/components/data/SqlRequestGrid/styles.ts +20 -20
  107. package/src/components/data/SqlRequestGrid/types.ts +73 -73
  108. package/src/components/data/VirtualScroller/hooks.ts +71 -71
  109. package/src/components/data/VirtualScroller/index.tsx +89 -89
  110. package/src/components/data/VirtualScroller/styles.ts +57 -57
  111. package/src/components/data/VirtualScroller/types.ts +10 -10
  112. package/src/components/data/index.ts +16 -16
  113. package/src/components/forms/AutoTextArea.tsx +48 -48
  114. package/src/components/forms/Button.tsx +132 -132
  115. package/src/components/forms/Form/Checkbox.tsx +12 -12
  116. package/src/components/forms/Form/FormGroup.tsx +31 -31
  117. package/src/components/forms/Form/Input.tsx +16 -16
  118. package/src/components/forms/Form/Row.tsx +32 -32
  119. package/src/components/forms/Form/Select.tsx +87 -87
  120. package/src/components/forms/Form/TextArea.tsx +17 -17
  121. package/src/components/forms/Form/index.tsx +45 -45
  122. package/src/components/forms/Form/styles.ts +184 -184
  123. package/src/components/forms/IconButton.tsx +67 -67
  124. package/src/components/forms/IndeterminateCheckbox.tsx +46 -46
  125. package/src/components/forms/NumberInput.tsx +53 -53
  126. package/src/components/forms/Select.tsx +34 -34
  127. package/src/components/forms/VerticalLabel.tsx +20 -20
  128. package/src/components/forms/index.ts +9 -9
  129. package/src/components/forms/styles.ts +42 -42
  130. package/src/components/index.ts +6 -6
  131. package/src/components/layout/Columns.ts +27 -27
  132. package/src/components/layout/Dropdown/index.tsx +113 -113
  133. package/src/components/layout/Dropdown/styles.ts +45 -45
  134. package/src/components/layout/Flexbox.ts +21 -21
  135. package/src/components/layout/Grid/index.tsx +8 -8
  136. package/src/components/layout/Grid/styles.ts +34 -34
  137. package/src/components/layout/Loading/index.tsx +29 -29
  138. package/src/components/layout/Loading/styles.ts +29 -29
  139. package/src/components/layout/Masonry/index.tsx +29 -29
  140. package/src/components/layout/Masonry/styles.ts +20 -20
  141. package/src/components/layout/Modal/index.tsx +51 -51
  142. package/src/components/layout/Modal/styles.ts +125 -125
  143. package/src/components/layout/index.ts +7 -7
  144. package/src/components/search/HighlightedText.tsx +41 -41
  145. package/src/components/search/QuickSearchBar.tsx +99 -99
  146. package/src/components/search/QuickSearchResults.tsx +86 -86
  147. package/src/components/search/index.ts +9 -9
  148. package/src/components/search/styles.ts +96 -96
  149. package/src/components/search/types.ts +29 -29
  150. package/src/components/ui/Avatar/index.tsx +54 -54
  151. package/src/components/ui/Avatar/styles.ts +61 -61
  152. package/src/components/ui/Card/index.tsx +14 -14
  153. package/src/components/ui/Card/styles.ts +37 -37
  154. package/src/components/ui/ContextMenu/index.tsx +79 -79
  155. package/src/components/ui/ContextMenu/styles.ts +119 -119
  156. package/src/components/ui/Ellipsis.tsx +34 -34
  157. package/src/components/ui/Label.tsx +99 -99
  158. package/src/components/ui/Message/index.tsx +57 -57
  159. package/src/components/ui/Message/styles.ts +40 -40
  160. package/src/components/ui/TabsView/TabsList.tsx +44 -44
  161. package/src/components/ui/TabsView/TabsView.tsx +38 -38
  162. package/src/components/ui/TabsView/index.ts +3 -3
  163. package/src/components/ui/TabsView/styles.ts +73 -73
  164. package/src/components/ui/TabsView/types.ts +12 -12
  165. package/src/components/ui/index.ts +7 -7
  166. package/src/config/index.ts +14 -14
  167. package/src/helpers/components.ts +23 -23
  168. package/src/helpers/dates.ts +17 -17
  169. package/src/helpers/getScrollbarSize.ts +14 -14
  170. package/src/helpers/index.ts +5 -6
  171. package/src/helpers/numbers.ts +63 -63
  172. package/src/helpers/responsive.ts +83 -83
  173. package/src/helpers/styled/space.ts +111 -111
  174. package/src/helpers/styled/typography.ts +25 -0
  175. package/src/helpers/text.ts +13 -13
  176. package/src/helpers/types.ts +9 -9
  177. package/src/hooks/index.ts +7 -7
  178. package/src/hooks/useContainerMediaQuery.ts +7 -7
  179. package/src/hooks/useElementSize.ts +24 -24
  180. package/src/hooks/useMediaQuery.ts +9 -9
  181. package/src/hooks/useMediaQueryForWidth.ts +35 -35
  182. package/src/hooks/useMutableState.ts +17 -17
  183. package/src/hooks/useShowArchived.ts +28 -28
  184. package/src/hooks/useWindowSize.ts +20 -20
  185. package/src/index.ts +13 -9
  186. package/src/providers/AuthenticationProvider/helpers.ts +3 -3
  187. package/src/providers/AuthenticationProvider/index.tsx +303 -303
  188. package/src/providers/LoadingProvider/index.tsx +47 -47
  189. package/src/providers/PortalsProvider/index.tsx +54 -54
  190. package/src/providers/PortalsProvider/styles.ts +31 -31
  191. package/src/providers/SettingsProvider/index.tsx +70 -70
  192. package/src/providers/ThemeProvider/ThemeProvider.ts +66 -66
  193. package/src/providers/ThemeProvider/defaultTheme.ts +470 -470
  194. package/src/providers/ThemeProvider/helpers.ts +84 -84
  195. package/src/providers/ThemeProvider/index.ts +5 -5
  196. package/src/providers/ThemeProvider/types.ts +134 -134
  197. package/src/providers/ToastProvider/index.tsx +93 -93
  198. package/src/providers/TrackingProvider/hooks.ts +14 -14
  199. package/src/providers/TrackingProvider/index.tsx +71 -71
  200. package/src/providers/UiProviders/index.tsx +76 -76
  201. package/src/providers/UiProviders/styles.ts +10 -10
  202. package/src/providers/hooks.ts +14 -14
  203. package/src/providers/index.ts +9 -9
  204. package/src/services/HttpService.ts +92 -92
  205. package/src/services/WebSocketService.ts +155 -155
  206. package/src/services/advancedRequests.ts +102 -102
  207. package/src/services/base.ts +23 -23
  208. package/src/services/globalSearch.ts +32 -32
  209. package/src/services/hooks.ts +92 -92
  210. package/src/services/index.ts +21 -21
  211. package/src/services/requests/auth.ts +44 -44
  212. package/src/services/requests/generic.ts +62 -62
  213. package/src/services/requests/tracking.ts +12 -12
  214. package/src/services/requests/userProfiles.ts +35 -35
  215. package/src/services/requests/users.ts +28 -28
  216. package/src/services/smartQueries.ts +122 -122
  217. package/src/services/sqlRequests.ts +111 -111
  218. package/src/services/types/auth.ts +98 -98
  219. package/src/services/types/base.ts +10 -10
  220. package/src/services/types/generic.ts +82 -82
  221. package/src/services/types/tracking.ts +29 -29
  222. package/src/services/types/userProfiles.ts +79 -79
  223. package/src/services/types/users.ts +74 -74
  224. package/src/services/updateSqlRequests.ts +32 -32
  225. package/src/styles/animations.scss +30 -30
  226. package/src/styles/index.scss +42 -42
  227. package/src/typings.d.ts +17 -17
  228. package/tsconfig.json +18 -18
  229. package/tsconfig.tsbuildinfo +1 -1
  230. package/dist/components/data/AdvancedRequestDataGrid/helpers/advancedRequests.d.ts +0 -14
  231. package/dist/components/data/AdvancedRequestDataGrid/helpers/advancedRequests.js +0 -77
  232. package/dist/components/data/AdvancedRequestDataGrid/helpers/columns.d.ts +0 -22
  233. package/dist/components/data/AdvancedRequestDataGrid/helpers/columns.js +0 -105
  234. package/dist/components/data/AdvancedRequestDataGrid/helpers/index.d.ts +0 -2
  235. package/dist/components/data/AdvancedRequestDataGrid/helpers/index.js +0 -18
  236. package/dist/components/data/AdvancedRequestDataGrid/index.d.ts +0 -2
  237. package/dist/components/data/AdvancedRequestDataGrid/index.js +0 -215
  238. package/dist/components/data/AdvancedRequestDataGrid/types.d.ts +0 -21
  239. package/dist/components/data/AdvancedRequestDataGrid/types.js +0 -2
  240. package/dist/components/data/DataGrid/AdvancedRequestDataGrid.d.ts +0 -10
  241. package/dist/components/data/DataGrid/AdvancedRequestDataGrid.js +0 -173
  242. package/dist/components/data/DataGrid/DataGridEditableCell.d.ts +0 -2
  243. package/dist/components/data/DataGrid/DataGridEditableCell.js +0 -27
  244. package/dist/components/data/DataGrid/FilterValuesScroller.d.ts +0 -13
  245. package/dist/components/data/DataGrid/FilterValuesScroller.js +0 -73
  246. package/dist/components/data/DataGrid/VirtualScroller.d.ts +0 -11
  247. package/dist/components/data/DataGrid/VirtualScroller.js +0 -41
  248. package/dist/components/data/DataGrid/helpers/advancedRequests.d.ts +0 -12
  249. package/dist/components/data/DataGrid/helpers/advancedRequests.js +0 -53
  250. package/dist/components/data/DataGrid/helpers.d.ts +0 -28
  251. package/dist/components/data/DataGrid/helpers.js +0 -436
  252. package/dist/components/data/SmartQueryDataGrid/helpers/columns.d.ts +0 -20
  253. package/dist/components/data/SmartQueryDataGrid/helpers/columns.js +0 -160
  254. package/dist/components/data/SmartQueryDataGrid/helpers/hooks.d.ts +0 -5
  255. package/dist/components/data/SmartQueryDataGrid/helpers/hooks.js +0 -41
  256. package/dist/components/data/SmartQueryDataGrid/helpers/index.d.ts +0 -2
  257. package/dist/components/data/SmartQueryDataGrid/helpers/index.js +0 -18
  258. package/dist/components/data/SmartQueryDataGrid/helpers/smartQueries.d.ts +0 -3
  259. package/dist/components/data/SmartQueryDataGrid/helpers/smartQueries.js +0 -15
  260. package/dist/components/data/SmartQueryDataGrid/hooks.d.ts +0 -9
  261. package/dist/components/data/SmartQueryDataGrid/hooks.js +0 -63
  262. package/dist/components/data/SmartQueryDataGrid/index.d.ts +0 -12
  263. package/dist/components/data/SmartQueryDataGrid/index.js +0 -242
  264. package/dist/components/data/SmartQueryDataGrid/types.d.ts +0 -22
  265. package/dist/components/data/SmartQueryDataGrid/types.js +0 -2
  266. package/dist/components/forms/Form/InputWithLabel.d.ts +0 -2
  267. package/dist/components/forms/Form/InputWithLabel.js +0 -10
  268. package/dist/components/forms/Form/types.d.ts +0 -7
  269. package/dist/components/forms/Form/types.js +0 -2
  270. package/dist/config/types.d.ts +0 -11
  271. package/dist/config/types.js +0 -2
  272. package/dist/helpers/styled/index.d.ts +0 -1
  273. package/dist/helpers/styled/index.js +0 -17
  274. package/dist/services/requests/userPermissions.d.ts +0 -4
  275. package/dist/services/requests/userPermissions.js +0 -20
  276. package/src/helpers/styled/index.ts +0 -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');