@flightctl/ui-components 1.1.0-rc2 → 1.1.0-rc3
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/dist/types/imagebuilder/index.d.ts +1 -0
- package/dist/types/imagebuilder/index.d.ts.map +1 -1
- package/dist/types/imagebuilder/index.js +3 -1
- package/dist/types/imagebuilder/index.js.map +1 -1
- package/dist/types/imagebuilder/models/ApiVersion.d.ts +8 -0
- package/dist/types/imagebuilder/models/ApiVersion.d.ts.map +1 -0
- package/dist/types/imagebuilder/models/ApiVersion.js +16 -0
- package/dist/types/imagebuilder/models/ApiVersion.js.map +1 -0
- package/dist/types/imagebuilder/models/ImageBuild.d.ts +2 -4
- package/dist/types/imagebuilder/models/ImageBuild.d.ts.map +1 -1
- package/dist/types/imagebuilder/models/ImageBuildList.d.ts +2 -4
- package/dist/types/imagebuilder/models/ImageBuildList.d.ts.map +1 -1
- package/dist/types/imagebuilder/models/ImageExport.d.ts +2 -4
- package/dist/types/imagebuilder/models/ImageExport.d.ts.map +1 -1
- package/dist/types/imagebuilder/models/ImageExportList.d.ts +2 -4
- package/dist/types/imagebuilder/models/ImageExportList.d.ts.map +1 -1
- package/dist/types/imagebuilder/models/Status.d.ts +2 -4
- package/dist/types/imagebuilder/models/Status.d.ts.map +1 -1
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +3 -1
- package/dist/types/index.js.map +1 -1
- package/dist/types/models/ApiVersion.d.ts +9 -0
- package/dist/types/models/ApiVersion.d.ts.map +1 -0
- package/dist/types/models/ApiVersion.js +17 -0
- package/dist/types/models/ApiVersion.js.map +1 -0
- package/dist/types/models/AuthConfig.d.ts +2 -4
- package/dist/types/models/AuthConfig.d.ts.map +1 -1
- package/dist/types/models/AuthProvider.d.ts +2 -4
- package/dist/types/models/AuthProvider.d.ts.map +1 -1
- package/dist/types/models/AuthProviderList.d.ts +2 -4
- package/dist/types/models/AuthProviderList.d.ts.map +1 -1
- package/dist/types/models/CertificateSigningRequest.d.ts +2 -4
- package/dist/types/models/CertificateSigningRequest.d.ts.map +1 -1
- package/dist/types/models/CertificateSigningRequestList.d.ts +2 -4
- package/dist/types/models/CertificateSigningRequestList.d.ts.map +1 -1
- package/dist/types/models/Device.d.ts +2 -4
- package/dist/types/models/Device.d.ts.map +1 -1
- package/dist/types/models/DeviceList.d.ts +2 -4
- package/dist/types/models/DeviceList.d.ts.map +1 -1
- package/dist/types/models/EnrollmentRequest.d.ts +2 -4
- package/dist/types/models/EnrollmentRequest.d.ts.map +1 -1
- package/dist/types/models/EnrollmentRequestList.d.ts +2 -4
- package/dist/types/models/EnrollmentRequestList.d.ts.map +1 -1
- package/dist/types/models/Event.d.ts +2 -4
- package/dist/types/models/Event.d.ts.map +1 -1
- package/dist/types/models/Event.js.map +1 -1
- package/dist/types/models/EventList.d.ts +2 -4
- package/dist/types/models/EventList.d.ts.map +1 -1
- package/dist/types/models/Fleet.d.ts +2 -4
- package/dist/types/models/Fleet.d.ts.map +1 -1
- package/dist/types/models/FleetList.d.ts +2 -4
- package/dist/types/models/FleetList.d.ts.map +1 -1
- package/dist/types/models/Organization.d.ts +2 -4
- package/dist/types/models/Organization.d.ts.map +1 -1
- package/dist/types/models/OrganizationList.d.ts +2 -4
- package/dist/types/models/OrganizationList.d.ts.map +1 -1
- package/dist/types/models/Repository.d.ts +2 -4
- package/dist/types/models/Repository.d.ts.map +1 -1
- package/dist/types/models/RepositoryList.d.ts +2 -4
- package/dist/types/models/RepositoryList.d.ts.map +1 -1
- package/dist/types/models/ResourceSync.d.ts +2 -4
- package/dist/types/models/ResourceSync.d.ts.map +1 -1
- package/dist/types/models/ResourceSyncList.d.ts +2 -4
- package/dist/types/models/ResourceSyncList.d.ts.map +1 -1
- package/dist/types/models/Status.d.ts +2 -4
- package/dist/types/models/Status.d.ts.map +1 -1
- package/dist/types/models/TemplateVersion.d.ts +2 -4
- package/dist/types/models/TemplateVersion.d.ts.map +1 -1
- package/dist/types/models/TemplateVersionList.d.ts +2 -4
- package/dist/types/models/TemplateVersionList.d.ts.map +1 -1
- package/dist/ui-components/src/components/AuthProvider/CreateAuthProvider/utils.d.ts.map +1 -1
- package/dist/ui-components/src/components/AuthProvider/CreateAuthProvider/utils.js +51 -51
- package/dist/ui-components/src/components/AuthProvider/CreateAuthProvider/utils.js.map +1 -1
- package/dist/ui-components/src/components/Device/DeviceDetails/TerminalTab.d.ts.map +1 -1
- package/dist/ui-components/src/components/Device/DeviceDetails/TerminalTab.js +5 -1
- package/dist/ui-components/src/components/Device/DeviceDetails/TerminalTab.js.map +1 -1
- package/dist/ui-components/src/components/Device/EditDeviceWizard/deviceSpecUtils.d.ts.map +1 -1
- package/dist/ui-components/src/components/Device/EditDeviceWizard/deviceSpecUtils.js +3 -1
- package/dist/ui-components/src/components/Device/EditDeviceWizard/deviceSpecUtils.js.map +1 -1
- package/dist/ui-components/src/components/Device/EditDeviceWizard/steps/ApplicationHelmForm.js +1 -1
- package/dist/ui-components/src/components/Device/EditDeviceWizard/steps/ApplicationHelmForm.js.map +1 -1
- package/dist/ui-components/src/components/ErrorAlert/ErrorAlert.d.ts +4 -2
- package/dist/ui-components/src/components/ErrorAlert/ErrorAlert.d.ts.map +1 -1
- package/dist/ui-components/src/components/ErrorAlert/ErrorAlert.js +2 -2
- package/dist/ui-components/src/components/ErrorAlert/ErrorAlert.js.map +1 -1
- package/dist/ui-components/src/components/Fleet/CreateFleet/utils.d.ts +1 -1
- package/dist/ui-components/src/components/Fleet/CreateFleet/utils.d.ts.map +1 -1
- package/dist/ui-components/src/components/Fleet/CreateFleet/utils.js +2 -2
- package/dist/ui-components/src/components/Fleet/CreateFleet/utils.js.map +1 -1
- package/dist/ui-components/src/components/ImageBuilds/ConfirmImageExportModal/ConfirmImageExportModal.d.ts +3 -3
- package/dist/ui-components/src/components/ImageBuilds/ConfirmImageExportModal/ConfirmImageExportModal.d.ts.map +1 -1
- package/dist/ui-components/src/components/ImageBuilds/ConfirmImageExportModal/ConfirmImageExportModal.js +20 -13
- package/dist/ui-components/src/components/ImageBuilds/ConfirmImageExportModal/ConfirmImageExportModal.js.map +1 -1
- package/dist/ui-components/src/components/ImageBuilds/CreateImageBuildWizard/CreateImageBuildWizard.d.ts.map +1 -1
- package/dist/ui-components/src/components/ImageBuilds/CreateImageBuildWizard/CreateImageBuildWizard.js +4 -3
- package/dist/ui-components/src/components/ImageBuilds/CreateImageBuildWizard/CreateImageBuildWizard.js.map +1 -1
- package/dist/ui-components/src/components/ImageBuilds/CreateImageBuildWizard/steps/OutputImageStep.js +1 -1
- package/dist/ui-components/src/components/ImageBuilds/CreateImageBuildWizard/steps/OutputImageStep.js.map +1 -1
- package/dist/ui-components/src/components/ImageBuilds/CreateImageBuildWizard/steps/RegistrationStep.d.ts.map +1 -1
- package/dist/ui-components/src/components/ImageBuilds/CreateImageBuildWizard/steps/RegistrationStep.js +13 -10
- package/dist/ui-components/src/components/ImageBuilds/CreateImageBuildWizard/steps/RegistrationStep.js.map +1 -1
- package/dist/ui-components/src/components/ImageBuilds/CreateImageBuildWizard/steps/ReviewStep.d.ts.map +1 -1
- package/dist/ui-components/src/components/ImageBuilds/CreateImageBuildWizard/steps/ReviewStep.js +4 -2
- package/dist/ui-components/src/components/ImageBuilds/CreateImageBuildWizard/steps/ReviewStep.js.map +1 -1
- package/dist/ui-components/src/components/ImageBuilds/CreateImageBuildWizard/steps/SourceImageStep.d.ts.map +1 -1
- package/dist/ui-components/src/components/ImageBuilds/CreateImageBuildWizard/steps/SourceImageStep.js +7 -1
- package/dist/ui-components/src/components/ImageBuilds/CreateImageBuildWizard/steps/SourceImageStep.js.map +1 -1
- package/dist/ui-components/src/components/ImageBuilds/CreateImageBuildWizard/types.d.ts +3 -5
- package/dist/ui-components/src/components/ImageBuilds/CreateImageBuildWizard/types.d.ts.map +1 -1
- package/dist/ui-components/src/components/ImageBuilds/CreateImageBuildWizard/utils.d.ts +3 -2
- package/dist/ui-components/src/components/ImageBuilds/CreateImageBuildWizard/utils.d.ts.map +1 -1
- package/dist/ui-components/src/components/ImageBuilds/CreateImageBuildWizard/utils.js +139 -34
- package/dist/ui-components/src/components/ImageBuilds/CreateImageBuildWizard/utils.js.map +1 -1
- package/dist/ui-components/src/components/ImageBuilds/ImageBuildDetails/ImageBuildDetailsPage.js +1 -1
- package/dist/ui-components/src/components/ImageBuilds/ImageBuildDetails/ImageBuildDetailsPage.js.map +1 -1
- package/dist/ui-components/src/components/ImageBuilds/ImageBuildDetails/ImageBuildExportsGallery.d.ts.map +1 -1
- package/dist/ui-components/src/components/ImageBuilds/ImageBuildDetails/ImageBuildExportsGallery.js +25 -16
- package/dist/ui-components/src/components/ImageBuilds/ImageBuildDetails/ImageBuildExportsGallery.js.map +1 -1
- package/dist/ui-components/src/components/ImageBuilds/ImageBuildDetails/ImageBuildLogsTab.d.ts +1 -0
- package/dist/ui-components/src/components/ImageBuilds/ImageBuildDetails/ImageBuildLogsTab.d.ts.map +1 -1
- package/dist/ui-components/src/components/ImageBuilds/ImageBuildDetails/ImageBuildLogsTab.js +17 -18
- package/dist/ui-components/src/components/ImageBuilds/ImageBuildDetails/ImageBuildLogsTab.js.map +1 -1
- package/dist/ui-components/src/components/ImageBuilds/ImageExportCards.d.ts.map +1 -1
- package/dist/ui-components/src/components/ImageBuilds/ImageExportCards.js +22 -10
- package/dist/ui-components/src/components/ImageBuilds/ImageExportCards.js.map +1 -1
- package/dist/ui-components/src/components/Repository/CreateRepository/CreateRepositoryForm.d.ts +2 -1
- package/dist/ui-components/src/components/Repository/CreateRepository/CreateRepositoryForm.d.ts.map +1 -1
- package/dist/ui-components/src/components/Repository/CreateRepository/CreateRepositoryForm.js +9 -3
- package/dist/ui-components/src/components/Repository/CreateRepository/CreateRepositoryForm.js.map +1 -1
- package/dist/ui-components/src/components/Repository/CreateRepository/utils.d.ts.map +1 -1
- package/dist/ui-components/src/components/Repository/CreateRepository/utils.js +3 -4
- package/dist/ui-components/src/components/Repository/CreateRepository/utils.js.map +1 -1
- package/dist/ui-components/src/components/form/RepositorySelect.d.ts.map +1 -1
- package/dist/ui-components/src/components/form/RepositorySelect.js +1 -1
- package/dist/ui-components/src/components/form/RepositorySelect.js.map +1 -1
- package/dist/ui-components/src/components/form/UploadField.d.ts.map +1 -1
- package/dist/ui-components/src/components/form/UploadField.js +25 -16
- package/dist/ui-components/src/components/form/UploadField.js.map +1 -1
- package/dist/ui-components/src/components/form/validations.d.ts +5 -0
- package/dist/ui-components/src/components/form/validations.d.ts.map +1 -1
- package/dist/ui-components/src/components/form/validations.js +40 -23
- package/dist/ui-components/src/components/form/validations.js.map +1 -1
- package/dist/ui-components/src/components/modals/CreateRepositoryModal/CreateRepositoryModal.d.ts +2 -1
- package/dist/ui-components/src/components/modals/CreateRepositoryModal/CreateRepositoryModal.d.ts.map +1 -1
- package/dist/ui-components/src/components/modals/CreateRepositoryModal/CreateRepositoryModal.js +2 -2
- package/dist/ui-components/src/components/modals/CreateRepositoryModal/CreateRepositoryModal.js.map +1 -1
- package/dist/ui-components/src/constants.d.ts +0 -2
- package/dist/ui-components/src/constants.d.ts.map +1 -1
- package/dist/ui-components/src/constants.js +5 -5
- package/dist/ui-components/src/constants.js.map +1 -1
- package/dist/ui-components/src/hooks/useWebSocket.d.ts.map +1 -1
- package/dist/ui-components/src/hooks/useWebSocket.js +25 -4
- package/dist/ui-components/src/hooks/useWebSocket.js.map +1 -1
- package/dist/ui-components/src/utils/imageBuilds.d.ts.map +1 -1
- package/dist/ui-components/src/utils/imageBuilds.js +13 -28
- package/dist/ui-components/src/utils/imageBuilds.js.map +1 -1
- package/dist/ui-components/src/utils/search.d.ts +2 -1
- package/dist/ui-components/src/utils/search.d.ts.map +1 -1
- package/dist/ui-components/src/utils/search.js +2 -2
- package/dist/ui-components/src/utils/search.js.map +1 -1
- package/package.json +2 -2
- package/src/components/AuthProvider/CreateAuthProvider/utils.ts +2 -2
- package/src/components/Device/DeviceDetails/TerminalTab.tsx +9 -1
- package/src/components/Device/EditDeviceWizard/deviceSpecUtils.ts +3 -1
- package/src/components/Device/EditDeviceWizard/steps/ApplicationHelmForm.tsx +1 -1
- package/src/components/ErrorAlert/ErrorAlert.tsx +13 -3
- package/src/components/Fleet/CreateFleet/utils.ts +2 -3
- package/src/components/ImageBuilds/ConfirmImageExportModal/ConfirmImageExportModal.tsx +28 -15
- package/src/components/ImageBuilds/CreateImageBuildWizard/CreateImageBuildWizard.tsx +8 -3
- package/src/components/ImageBuilds/CreateImageBuildWizard/steps/OutputImageStep.tsx +1 -1
- package/src/components/ImageBuilds/CreateImageBuildWizard/steps/RegistrationStep.tsx +18 -10
- package/src/components/ImageBuilds/CreateImageBuildWizard/steps/ReviewStep.tsx +5 -1
- package/src/components/ImageBuilds/CreateImageBuildWizard/steps/SourceImageStep.tsx +13 -1
- package/src/components/ImageBuilds/CreateImageBuildWizard/types.ts +3 -6
- package/src/components/ImageBuilds/CreateImageBuildWizard/utils.ts +161 -37
- package/src/components/ImageBuilds/ImageBuildDetails/ImageBuildDetailsPage.tsx +1 -1
- package/src/components/ImageBuilds/ImageBuildDetails/ImageBuildExportsGallery.tsx +27 -18
- package/src/components/ImageBuilds/ImageBuildDetails/ImageBuildLogsTab.tsx +22 -26
- package/src/components/ImageBuilds/ImageExportCards.tsx +31 -12
- package/src/components/Repository/CreateRepository/CreateRepositoryForm.tsx +13 -4
- package/src/components/Repository/CreateRepository/utils.ts +4 -4
- package/src/components/form/RepositorySelect.tsx +1 -0
- package/src/components/form/UploadField.tsx +29 -30
- package/src/components/form/validations.ts +44 -24
- package/src/components/modals/CreateRepositoryModal/CreateRepositoryModal.tsx +3 -1
- package/src/constants.ts +5 -5
- package/src/hooks/useWebSocket.ts +25 -3
- package/src/utils/imageBuilds.ts +14 -32
- package/src/utils/search.ts +2 -2
|
@@ -9,9 +9,10 @@ type CreateRepositoryModalProps = {
|
|
|
9
9
|
type: RepoSpecType;
|
|
10
10
|
onClose: VoidFunction;
|
|
11
11
|
onSuccess: (repository: Repository) => void;
|
|
12
|
+
validateBeforeCreate?: (repo: Repository) => string | undefined;
|
|
12
13
|
};
|
|
13
14
|
|
|
14
|
-
const CreateRepositoryModal = ({ type, onClose, onSuccess }: CreateRepositoryModalProps) => {
|
|
15
|
+
const CreateRepositoryModal = ({ type, onClose, onSuccess, validateBeforeCreate }: CreateRepositoryModalProps) => {
|
|
15
16
|
const { t } = useTranslation();
|
|
16
17
|
return (
|
|
17
18
|
<Modal variant="medium" isOpen>
|
|
@@ -20,6 +21,7 @@ const CreateRepositoryModal = ({ type, onClose, onSuccess }: CreateRepositoryMod
|
|
|
20
21
|
<CreateRepositoryForm
|
|
21
22
|
onClose={onClose}
|
|
22
23
|
onSuccess={onSuccess}
|
|
24
|
+
validateBefore={validateBeforeCreate}
|
|
23
25
|
options={{
|
|
24
26
|
canUseResourceSyncs: false,
|
|
25
27
|
allowedRepoTypes: [type],
|
package/src/constants.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
export const IMAGEBUILDER_API_VERSION = 'v1alpha1';
|
|
1
|
+
import { ApiVersion } from '@flightctl/types';
|
|
2
|
+
import { ApiVersion as ImageBuilderApiVersion } from '@flightctl/types/imagebuilder';
|
|
4
3
|
|
|
4
|
+
export const APP_TITLE = 'Edge Manager';
|
|
5
5
|
export const PAGE_SIZE = 15;
|
|
6
6
|
export const EVENT_PAGE_SIZE = 200; // It's 500 in OCP console
|
|
7
7
|
|
|
@@ -10,9 +10,9 @@ export const CERTIFICATE_VALIDITY_IN_YEARS = 1;
|
|
|
10
10
|
export const getApiVersion = (api: 'flightctl' | 'imagebuilder' | 'alerts'): string | undefined => {
|
|
11
11
|
switch (api) {
|
|
12
12
|
case 'flightctl':
|
|
13
|
-
return
|
|
13
|
+
return ApiVersion.ApiVersionV1beta1;
|
|
14
14
|
case 'imagebuilder':
|
|
15
|
-
return
|
|
15
|
+
return ImageBuilderApiVersion.ApiVersionV1alpha1;
|
|
16
16
|
case 'alerts':
|
|
17
17
|
default:
|
|
18
18
|
return undefined;
|
|
@@ -11,6 +11,8 @@ const msgToBytes = (msg: string, resize?: boolean) => {
|
|
|
11
11
|
return result;
|
|
12
12
|
};
|
|
13
13
|
|
|
14
|
+
const isErrorCloseEvent = (evt: CloseEvent) => evt.code !== 1000 && evt.code !== 1001;
|
|
15
|
+
|
|
14
16
|
export type WsMetadata = {
|
|
15
17
|
tty: boolean;
|
|
16
18
|
term: string;
|
|
@@ -34,13 +36,17 @@ export const useWebSocket = <T>(
|
|
|
34
36
|
const { t } = useTranslation();
|
|
35
37
|
const wsRef = React.useRef<WebSocket>();
|
|
36
38
|
const isMountedRef = React.useRef(true);
|
|
39
|
+
const hasReceivedMessageRef = React.useRef(false);
|
|
37
40
|
const [isConnecting, setIsConnecting] = React.useState(true);
|
|
38
41
|
const [isClosed, setIsClosed] = React.useState(false);
|
|
39
42
|
const [error, setError] = React.useState<unknown>();
|
|
40
43
|
const [reset, setReset] = React.useState<number>(0);
|
|
41
44
|
|
|
42
45
|
const sendMessage = React.useCallback((data: string, resize?: boolean) => {
|
|
43
|
-
wsRef.current
|
|
46
|
+
const ws = wsRef.current;
|
|
47
|
+
if (ws?.readyState === WebSocket.OPEN) {
|
|
48
|
+
ws.send(msgToBytes(data, resize));
|
|
49
|
+
}
|
|
44
50
|
}, []);
|
|
45
51
|
|
|
46
52
|
React.useEffect(() => {
|
|
@@ -54,6 +60,8 @@ export const useWebSocket = <T>(
|
|
|
54
60
|
try {
|
|
55
61
|
setIsConnecting(true);
|
|
56
62
|
setIsClosed(false);
|
|
63
|
+
setError(undefined);
|
|
64
|
+
hasReceivedMessageRef.current = false;
|
|
57
65
|
const wsEndpoint = getWsEndpoint(deviceId);
|
|
58
66
|
const wsMeta = JSON.stringify(wsMetadata);
|
|
59
67
|
const params = new URLSearchParams({
|
|
@@ -73,9 +81,16 @@ export const useWebSocket = <T>(
|
|
|
73
81
|
}
|
|
74
82
|
};
|
|
75
83
|
|
|
76
|
-
const handleClose = () => {
|
|
84
|
+
const handleClose = (evt: CloseEvent) => {
|
|
77
85
|
if (isMountedRef.current) {
|
|
86
|
+
setIsConnecting(false);
|
|
78
87
|
setIsClosed(true);
|
|
88
|
+
// If we never received any data from the backend, treat an error close as a failure
|
|
89
|
+
// Otherwise it may be a normal session close, and we'll show the "Reconnect" banner.
|
|
90
|
+
if (isErrorCloseEvent(evt) && !hasReceivedMessageRef.current) {
|
|
91
|
+
const reason = evt.reason || t('Unknown error');
|
|
92
|
+
setError(t('Failed to connect to device terminal: {{reason}}', { reason }));
|
|
93
|
+
}
|
|
79
94
|
}
|
|
80
95
|
wsRef.current = undefined;
|
|
81
96
|
};
|
|
@@ -84,7 +99,13 @@ export const useWebSocket = <T>(
|
|
|
84
99
|
// eslint-disable-next-line no-console
|
|
85
100
|
console.error('Error creating websocket:', evt);
|
|
86
101
|
if (isMountedRef.current) {
|
|
87
|
-
|
|
102
|
+
setIsConnecting(false);
|
|
103
|
+
if (!hasReceivedMessageRef.current) {
|
|
104
|
+
setError(t('Failed to connect to device terminal'));
|
|
105
|
+
} else {
|
|
106
|
+
// User may have closed the session, so we'll show the "Reconnect" banner.
|
|
107
|
+
setIsClosed(true);
|
|
108
|
+
}
|
|
88
109
|
}
|
|
89
110
|
};
|
|
90
111
|
|
|
@@ -120,6 +141,7 @@ export const useWebSocket = <T>(
|
|
|
120
141
|
React.useEffect(() => {
|
|
121
142
|
const listener = (evt: MessageEvent<T>) => {
|
|
122
143
|
if (isMountedRef.current) {
|
|
144
|
+
hasReceivedMessageRef.current = true;
|
|
123
145
|
onMsgReceived(evt.data);
|
|
124
146
|
}
|
|
125
147
|
};
|
package/src/utils/imageBuilds.ts
CHANGED
|
@@ -116,17 +116,6 @@ export const isImageExportActiveReason = (reason: ImageExportConditionReason): b
|
|
|
116
116
|
);
|
|
117
117
|
};
|
|
118
118
|
|
|
119
|
-
const isDownloadResultRedirect = (response: Response): boolean => {
|
|
120
|
-
return (
|
|
121
|
-
response.status === 302 ||
|
|
122
|
-
response.status === 301 ||
|
|
123
|
-
response.status === 307 ||
|
|
124
|
-
response.status === 308 ||
|
|
125
|
-
response.type === 'opaqueredirect' ||
|
|
126
|
-
response.status === 0
|
|
127
|
-
);
|
|
128
|
-
};
|
|
129
|
-
|
|
130
119
|
// Validate that a URL is safe to use for download (only http/https protocols)
|
|
131
120
|
const isValidDownloadUrl = (url: string): boolean => {
|
|
132
121
|
try {
|
|
@@ -137,37 +126,30 @@ const isValidDownloadUrl = (url: string): boolean => {
|
|
|
137
126
|
}
|
|
138
127
|
};
|
|
139
128
|
|
|
140
|
-
const getRedirectUrl = (response: Response): string | undefined => {
|
|
141
|
-
// If the Location header is present, it indicates a redirect.
|
|
142
|
-
const redirectUrl = response.headers.get('Location');
|
|
143
|
-
if (redirectUrl) {
|
|
144
|
-
return redirectUrl;
|
|
145
|
-
}
|
|
146
|
-
if (isDownloadResultRedirect(response) && response.url) {
|
|
147
|
-
return response.url;
|
|
148
|
-
}
|
|
149
|
-
return undefined;
|
|
150
|
-
};
|
|
151
|
-
|
|
152
129
|
export type ExportDownloadResult =
|
|
153
130
|
| { type: 'redirect'; url: string }
|
|
154
131
|
| { type: 'blob'; blob: Blob; filename: string | undefined };
|
|
155
132
|
|
|
156
|
-
// The download endpoint returns two types of responses: a redirect URL or a blob.
|
|
157
|
-
//
|
|
158
|
-
//
|
|
133
|
+
// The ImageBuilder API download endpoint returns two types of responses: a redirect URL or a blob.
|
|
134
|
+
// When it returns a redirect URL, the UI proxy rewrites the response to 200 with { redirectUrl: CDN_URL }
|
|
135
|
+
// When no redirect URL is found, we should download the blob directly.
|
|
159
136
|
export const getExportDownloadResult = async (response: Response): Promise<ExportDownloadResult | null> => {
|
|
160
|
-
if (!response.ok
|
|
137
|
+
if (!response.ok || response.type === 'opaqueredirect' || response.status === 0) {
|
|
161
138
|
return null;
|
|
162
139
|
}
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
140
|
+
|
|
141
|
+
// Extract the redirect URL returned by the UI proxy
|
|
142
|
+
const contentType = response.headers.get('Content-Type') || '';
|
|
143
|
+
if (response.ok && contentType.includes('application/json')) {
|
|
144
|
+
const data = (await response.json()) as { redirectUrl?: string };
|
|
145
|
+
const url = data?.redirectUrl;
|
|
146
|
+
if (url && isValidDownloadUrl(url)) {
|
|
147
|
+
return { type: 'redirect', url };
|
|
167
148
|
}
|
|
168
|
-
return
|
|
149
|
+
return null;
|
|
169
150
|
}
|
|
170
151
|
|
|
152
|
+
// Download the blob directly
|
|
171
153
|
const blob = await response.blob();
|
|
172
154
|
|
|
173
155
|
let filename = '';
|
package/src/utils/search.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import fuzzy from 'fuzzysearch';
|
|
2
|
-
import {
|
|
2
|
+
import { ApiVersion } from '@flightctl/types';
|
|
3
3
|
|
|
4
4
|
// Must be an even number for "getSearchResultsCount" to work
|
|
5
5
|
export const MAX_TOTAL_SEARCH_RESULTS = 10;
|
|
@@ -26,7 +26,7 @@ export const getSearchResultsCount = (labelCount: number, fleetCount: number) =>
|
|
|
26
26
|
};
|
|
27
27
|
|
|
28
28
|
export const getEmptyFleetSearch = () => ({
|
|
29
|
-
apiVersion:
|
|
29
|
+
apiVersion: ApiVersion.ApiVersionV1beta1,
|
|
30
30
|
kind: 'Fleet',
|
|
31
31
|
metadata: {},
|
|
32
32
|
items: [],
|