@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.
Files changed (190) hide show
  1. package/dist/types/imagebuilder/index.d.ts +1 -0
  2. package/dist/types/imagebuilder/index.d.ts.map +1 -1
  3. package/dist/types/imagebuilder/index.js +3 -1
  4. package/dist/types/imagebuilder/index.js.map +1 -1
  5. package/dist/types/imagebuilder/models/ApiVersion.d.ts +8 -0
  6. package/dist/types/imagebuilder/models/ApiVersion.d.ts.map +1 -0
  7. package/dist/types/imagebuilder/models/ApiVersion.js +16 -0
  8. package/dist/types/imagebuilder/models/ApiVersion.js.map +1 -0
  9. package/dist/types/imagebuilder/models/ImageBuild.d.ts +2 -4
  10. package/dist/types/imagebuilder/models/ImageBuild.d.ts.map +1 -1
  11. package/dist/types/imagebuilder/models/ImageBuildList.d.ts +2 -4
  12. package/dist/types/imagebuilder/models/ImageBuildList.d.ts.map +1 -1
  13. package/dist/types/imagebuilder/models/ImageExport.d.ts +2 -4
  14. package/dist/types/imagebuilder/models/ImageExport.d.ts.map +1 -1
  15. package/dist/types/imagebuilder/models/ImageExportList.d.ts +2 -4
  16. package/dist/types/imagebuilder/models/ImageExportList.d.ts.map +1 -1
  17. package/dist/types/imagebuilder/models/Status.d.ts +2 -4
  18. package/dist/types/imagebuilder/models/Status.d.ts.map +1 -1
  19. package/dist/types/index.d.ts +1 -0
  20. package/dist/types/index.d.ts.map +1 -1
  21. package/dist/types/index.js +3 -1
  22. package/dist/types/index.js.map +1 -1
  23. package/dist/types/models/ApiVersion.d.ts +9 -0
  24. package/dist/types/models/ApiVersion.d.ts.map +1 -0
  25. package/dist/types/models/ApiVersion.js +17 -0
  26. package/dist/types/models/ApiVersion.js.map +1 -0
  27. package/dist/types/models/AuthConfig.d.ts +2 -4
  28. package/dist/types/models/AuthConfig.d.ts.map +1 -1
  29. package/dist/types/models/AuthProvider.d.ts +2 -4
  30. package/dist/types/models/AuthProvider.d.ts.map +1 -1
  31. package/dist/types/models/AuthProviderList.d.ts +2 -4
  32. package/dist/types/models/AuthProviderList.d.ts.map +1 -1
  33. package/dist/types/models/CertificateSigningRequest.d.ts +2 -4
  34. package/dist/types/models/CertificateSigningRequest.d.ts.map +1 -1
  35. package/dist/types/models/CertificateSigningRequestList.d.ts +2 -4
  36. package/dist/types/models/CertificateSigningRequestList.d.ts.map +1 -1
  37. package/dist/types/models/Device.d.ts +2 -4
  38. package/dist/types/models/Device.d.ts.map +1 -1
  39. package/dist/types/models/DeviceList.d.ts +2 -4
  40. package/dist/types/models/DeviceList.d.ts.map +1 -1
  41. package/dist/types/models/EnrollmentRequest.d.ts +2 -4
  42. package/dist/types/models/EnrollmentRequest.d.ts.map +1 -1
  43. package/dist/types/models/EnrollmentRequestList.d.ts +2 -4
  44. package/dist/types/models/EnrollmentRequestList.d.ts.map +1 -1
  45. package/dist/types/models/Event.d.ts +2 -4
  46. package/dist/types/models/Event.d.ts.map +1 -1
  47. package/dist/types/models/Event.js.map +1 -1
  48. package/dist/types/models/EventList.d.ts +2 -4
  49. package/dist/types/models/EventList.d.ts.map +1 -1
  50. package/dist/types/models/Fleet.d.ts +2 -4
  51. package/dist/types/models/Fleet.d.ts.map +1 -1
  52. package/dist/types/models/FleetList.d.ts +2 -4
  53. package/dist/types/models/FleetList.d.ts.map +1 -1
  54. package/dist/types/models/Organization.d.ts +2 -4
  55. package/dist/types/models/Organization.d.ts.map +1 -1
  56. package/dist/types/models/OrganizationList.d.ts +2 -4
  57. package/dist/types/models/OrganizationList.d.ts.map +1 -1
  58. package/dist/types/models/Repository.d.ts +2 -4
  59. package/dist/types/models/Repository.d.ts.map +1 -1
  60. package/dist/types/models/RepositoryList.d.ts +2 -4
  61. package/dist/types/models/RepositoryList.d.ts.map +1 -1
  62. package/dist/types/models/ResourceSync.d.ts +2 -4
  63. package/dist/types/models/ResourceSync.d.ts.map +1 -1
  64. package/dist/types/models/ResourceSyncList.d.ts +2 -4
  65. package/dist/types/models/ResourceSyncList.d.ts.map +1 -1
  66. package/dist/types/models/Status.d.ts +2 -4
  67. package/dist/types/models/Status.d.ts.map +1 -1
  68. package/dist/types/models/TemplateVersion.d.ts +2 -4
  69. package/dist/types/models/TemplateVersion.d.ts.map +1 -1
  70. package/dist/types/models/TemplateVersionList.d.ts +2 -4
  71. package/dist/types/models/TemplateVersionList.d.ts.map +1 -1
  72. package/dist/ui-components/src/components/AuthProvider/CreateAuthProvider/utils.d.ts.map +1 -1
  73. package/dist/ui-components/src/components/AuthProvider/CreateAuthProvider/utils.js +51 -51
  74. package/dist/ui-components/src/components/AuthProvider/CreateAuthProvider/utils.js.map +1 -1
  75. package/dist/ui-components/src/components/Device/DeviceDetails/TerminalTab.d.ts.map +1 -1
  76. package/dist/ui-components/src/components/Device/DeviceDetails/TerminalTab.js +5 -1
  77. package/dist/ui-components/src/components/Device/DeviceDetails/TerminalTab.js.map +1 -1
  78. package/dist/ui-components/src/components/Device/EditDeviceWizard/deviceSpecUtils.d.ts.map +1 -1
  79. package/dist/ui-components/src/components/Device/EditDeviceWizard/deviceSpecUtils.js +3 -1
  80. package/dist/ui-components/src/components/Device/EditDeviceWizard/deviceSpecUtils.js.map +1 -1
  81. package/dist/ui-components/src/components/Device/EditDeviceWizard/steps/ApplicationHelmForm.js +1 -1
  82. package/dist/ui-components/src/components/Device/EditDeviceWizard/steps/ApplicationHelmForm.js.map +1 -1
  83. package/dist/ui-components/src/components/ErrorAlert/ErrorAlert.d.ts +4 -2
  84. package/dist/ui-components/src/components/ErrorAlert/ErrorAlert.d.ts.map +1 -1
  85. package/dist/ui-components/src/components/ErrorAlert/ErrorAlert.js +2 -2
  86. package/dist/ui-components/src/components/ErrorAlert/ErrorAlert.js.map +1 -1
  87. package/dist/ui-components/src/components/Fleet/CreateFleet/utils.d.ts +1 -1
  88. package/dist/ui-components/src/components/Fleet/CreateFleet/utils.d.ts.map +1 -1
  89. package/dist/ui-components/src/components/Fleet/CreateFleet/utils.js +2 -2
  90. package/dist/ui-components/src/components/Fleet/CreateFleet/utils.js.map +1 -1
  91. package/dist/ui-components/src/components/ImageBuilds/ConfirmImageExportModal/ConfirmImageExportModal.d.ts +3 -3
  92. package/dist/ui-components/src/components/ImageBuilds/ConfirmImageExportModal/ConfirmImageExportModal.d.ts.map +1 -1
  93. package/dist/ui-components/src/components/ImageBuilds/ConfirmImageExportModal/ConfirmImageExportModal.js +20 -13
  94. package/dist/ui-components/src/components/ImageBuilds/ConfirmImageExportModal/ConfirmImageExportModal.js.map +1 -1
  95. package/dist/ui-components/src/components/ImageBuilds/CreateImageBuildWizard/CreateImageBuildWizard.d.ts.map +1 -1
  96. package/dist/ui-components/src/components/ImageBuilds/CreateImageBuildWizard/CreateImageBuildWizard.js +4 -3
  97. package/dist/ui-components/src/components/ImageBuilds/CreateImageBuildWizard/CreateImageBuildWizard.js.map +1 -1
  98. package/dist/ui-components/src/components/ImageBuilds/CreateImageBuildWizard/steps/OutputImageStep.js +1 -1
  99. package/dist/ui-components/src/components/ImageBuilds/CreateImageBuildWizard/steps/OutputImageStep.js.map +1 -1
  100. package/dist/ui-components/src/components/ImageBuilds/CreateImageBuildWizard/steps/RegistrationStep.d.ts.map +1 -1
  101. package/dist/ui-components/src/components/ImageBuilds/CreateImageBuildWizard/steps/RegistrationStep.js +13 -10
  102. package/dist/ui-components/src/components/ImageBuilds/CreateImageBuildWizard/steps/RegistrationStep.js.map +1 -1
  103. package/dist/ui-components/src/components/ImageBuilds/CreateImageBuildWizard/steps/ReviewStep.d.ts.map +1 -1
  104. package/dist/ui-components/src/components/ImageBuilds/CreateImageBuildWizard/steps/ReviewStep.js +4 -2
  105. package/dist/ui-components/src/components/ImageBuilds/CreateImageBuildWizard/steps/ReviewStep.js.map +1 -1
  106. package/dist/ui-components/src/components/ImageBuilds/CreateImageBuildWizard/steps/SourceImageStep.d.ts.map +1 -1
  107. package/dist/ui-components/src/components/ImageBuilds/CreateImageBuildWizard/steps/SourceImageStep.js +7 -1
  108. package/dist/ui-components/src/components/ImageBuilds/CreateImageBuildWizard/steps/SourceImageStep.js.map +1 -1
  109. package/dist/ui-components/src/components/ImageBuilds/CreateImageBuildWizard/types.d.ts +3 -5
  110. package/dist/ui-components/src/components/ImageBuilds/CreateImageBuildWizard/types.d.ts.map +1 -1
  111. package/dist/ui-components/src/components/ImageBuilds/CreateImageBuildWizard/utils.d.ts +3 -2
  112. package/dist/ui-components/src/components/ImageBuilds/CreateImageBuildWizard/utils.d.ts.map +1 -1
  113. package/dist/ui-components/src/components/ImageBuilds/CreateImageBuildWizard/utils.js +139 -34
  114. package/dist/ui-components/src/components/ImageBuilds/CreateImageBuildWizard/utils.js.map +1 -1
  115. package/dist/ui-components/src/components/ImageBuilds/ImageBuildDetails/ImageBuildDetailsPage.js +1 -1
  116. package/dist/ui-components/src/components/ImageBuilds/ImageBuildDetails/ImageBuildDetailsPage.js.map +1 -1
  117. package/dist/ui-components/src/components/ImageBuilds/ImageBuildDetails/ImageBuildExportsGallery.d.ts.map +1 -1
  118. package/dist/ui-components/src/components/ImageBuilds/ImageBuildDetails/ImageBuildExportsGallery.js +25 -16
  119. package/dist/ui-components/src/components/ImageBuilds/ImageBuildDetails/ImageBuildExportsGallery.js.map +1 -1
  120. package/dist/ui-components/src/components/ImageBuilds/ImageBuildDetails/ImageBuildLogsTab.d.ts +1 -0
  121. package/dist/ui-components/src/components/ImageBuilds/ImageBuildDetails/ImageBuildLogsTab.d.ts.map +1 -1
  122. package/dist/ui-components/src/components/ImageBuilds/ImageBuildDetails/ImageBuildLogsTab.js +17 -18
  123. package/dist/ui-components/src/components/ImageBuilds/ImageBuildDetails/ImageBuildLogsTab.js.map +1 -1
  124. package/dist/ui-components/src/components/ImageBuilds/ImageExportCards.d.ts.map +1 -1
  125. package/dist/ui-components/src/components/ImageBuilds/ImageExportCards.js +22 -10
  126. package/dist/ui-components/src/components/ImageBuilds/ImageExportCards.js.map +1 -1
  127. package/dist/ui-components/src/components/Repository/CreateRepository/CreateRepositoryForm.d.ts +2 -1
  128. package/dist/ui-components/src/components/Repository/CreateRepository/CreateRepositoryForm.d.ts.map +1 -1
  129. package/dist/ui-components/src/components/Repository/CreateRepository/CreateRepositoryForm.js +9 -3
  130. package/dist/ui-components/src/components/Repository/CreateRepository/CreateRepositoryForm.js.map +1 -1
  131. package/dist/ui-components/src/components/Repository/CreateRepository/utils.d.ts.map +1 -1
  132. package/dist/ui-components/src/components/Repository/CreateRepository/utils.js +3 -4
  133. package/dist/ui-components/src/components/Repository/CreateRepository/utils.js.map +1 -1
  134. package/dist/ui-components/src/components/form/RepositorySelect.d.ts.map +1 -1
  135. package/dist/ui-components/src/components/form/RepositorySelect.js +1 -1
  136. package/dist/ui-components/src/components/form/RepositorySelect.js.map +1 -1
  137. package/dist/ui-components/src/components/form/UploadField.d.ts.map +1 -1
  138. package/dist/ui-components/src/components/form/UploadField.js +25 -16
  139. package/dist/ui-components/src/components/form/UploadField.js.map +1 -1
  140. package/dist/ui-components/src/components/form/validations.d.ts +5 -0
  141. package/dist/ui-components/src/components/form/validations.d.ts.map +1 -1
  142. package/dist/ui-components/src/components/form/validations.js +40 -23
  143. package/dist/ui-components/src/components/form/validations.js.map +1 -1
  144. package/dist/ui-components/src/components/modals/CreateRepositoryModal/CreateRepositoryModal.d.ts +2 -1
  145. package/dist/ui-components/src/components/modals/CreateRepositoryModal/CreateRepositoryModal.d.ts.map +1 -1
  146. package/dist/ui-components/src/components/modals/CreateRepositoryModal/CreateRepositoryModal.js +2 -2
  147. package/dist/ui-components/src/components/modals/CreateRepositoryModal/CreateRepositoryModal.js.map +1 -1
  148. package/dist/ui-components/src/constants.d.ts +0 -2
  149. package/dist/ui-components/src/constants.d.ts.map +1 -1
  150. package/dist/ui-components/src/constants.js +5 -5
  151. package/dist/ui-components/src/constants.js.map +1 -1
  152. package/dist/ui-components/src/hooks/useWebSocket.d.ts.map +1 -1
  153. package/dist/ui-components/src/hooks/useWebSocket.js +25 -4
  154. package/dist/ui-components/src/hooks/useWebSocket.js.map +1 -1
  155. package/dist/ui-components/src/utils/imageBuilds.d.ts.map +1 -1
  156. package/dist/ui-components/src/utils/imageBuilds.js +13 -28
  157. package/dist/ui-components/src/utils/imageBuilds.js.map +1 -1
  158. package/dist/ui-components/src/utils/search.d.ts +2 -1
  159. package/dist/ui-components/src/utils/search.d.ts.map +1 -1
  160. package/dist/ui-components/src/utils/search.js +2 -2
  161. package/dist/ui-components/src/utils/search.js.map +1 -1
  162. package/package.json +2 -2
  163. package/src/components/AuthProvider/CreateAuthProvider/utils.ts +2 -2
  164. package/src/components/Device/DeviceDetails/TerminalTab.tsx +9 -1
  165. package/src/components/Device/EditDeviceWizard/deviceSpecUtils.ts +3 -1
  166. package/src/components/Device/EditDeviceWizard/steps/ApplicationHelmForm.tsx +1 -1
  167. package/src/components/ErrorAlert/ErrorAlert.tsx +13 -3
  168. package/src/components/Fleet/CreateFleet/utils.ts +2 -3
  169. package/src/components/ImageBuilds/ConfirmImageExportModal/ConfirmImageExportModal.tsx +28 -15
  170. package/src/components/ImageBuilds/CreateImageBuildWizard/CreateImageBuildWizard.tsx +8 -3
  171. package/src/components/ImageBuilds/CreateImageBuildWizard/steps/OutputImageStep.tsx +1 -1
  172. package/src/components/ImageBuilds/CreateImageBuildWizard/steps/RegistrationStep.tsx +18 -10
  173. package/src/components/ImageBuilds/CreateImageBuildWizard/steps/ReviewStep.tsx +5 -1
  174. package/src/components/ImageBuilds/CreateImageBuildWizard/steps/SourceImageStep.tsx +13 -1
  175. package/src/components/ImageBuilds/CreateImageBuildWizard/types.ts +3 -6
  176. package/src/components/ImageBuilds/CreateImageBuildWizard/utils.ts +161 -37
  177. package/src/components/ImageBuilds/ImageBuildDetails/ImageBuildDetailsPage.tsx +1 -1
  178. package/src/components/ImageBuilds/ImageBuildDetails/ImageBuildExportsGallery.tsx +27 -18
  179. package/src/components/ImageBuilds/ImageBuildDetails/ImageBuildLogsTab.tsx +22 -26
  180. package/src/components/ImageBuilds/ImageExportCards.tsx +31 -12
  181. package/src/components/Repository/CreateRepository/CreateRepositoryForm.tsx +13 -4
  182. package/src/components/Repository/CreateRepository/utils.ts +4 -4
  183. package/src/components/form/RepositorySelect.tsx +1 -0
  184. package/src/components/form/UploadField.tsx +29 -30
  185. package/src/components/form/validations.ts +44 -24
  186. package/src/components/modals/CreateRepositoryModal/CreateRepositoryModal.tsx +3 -1
  187. package/src/constants.ts +5 -5
  188. package/src/hooks/useWebSocket.ts +25 -3
  189. package/src/utils/imageBuilds.ts +14 -32
  190. 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
- export const APP_TITLE = 'Edge Manager';
2
- export const CORE_API_VERSION = 'v1beta1';
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 CORE_API_VERSION;
13
+ return ApiVersion.ApiVersionV1beta1;
14
14
  case 'imagebuilder':
15
- return IMAGEBUILDER_API_VERSION;
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?.send(msgToBytes(data, resize));
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
- setError(t('Websocket error occured'));
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
  };
@@ -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
- // If a redirect URL is found, we should use it to trigger the download in the browser.
158
- // If no redirect URL is found, we should download the blob directly.
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 && response.status !== 0) {
137
+ if (!response.ok || response.type === 'opaqueredirect' || response.status === 0) {
161
138
  return null;
162
139
  }
163
- const redirectUrl = getRedirectUrl(response);
164
- if (redirectUrl) {
165
- if (!isValidDownloadUrl(redirectUrl)) {
166
- throw new Error('Invalid redirect URL received from server');
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 { type: 'redirect', url: redirectUrl };
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 = '';
@@ -1,5 +1,5 @@
1
1
  import fuzzy from 'fuzzysearch';
2
- import { CORE_API_VERSION } from '../constants';
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: CORE_API_VERSION,
29
+ apiVersion: ApiVersion.ApiVersionV1beta1,
30
30
  kind: 'Fleet',
31
31
  metadata: {},
32
32
  items: [],