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