@addev-be/ui 2.4.4 → 2.4.6

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