@scality/data-browser-library 1.0.0-preview.15 → 1.0.0-preview.17

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 (48) hide show
  1. package/dist/components/DataBrowserUI.d.ts +4 -19
  2. package/dist/components/__tests__/BucketDetails.test.js +4 -4
  3. package/dist/components/__tests__/BucketList.test.js +2 -2
  4. package/dist/components/__tests__/BucketOverview.test.js +4 -4
  5. package/dist/components/__tests__/ObjectList.test.js +4 -4
  6. package/dist/components/buckets/BucketOverview.js +2 -3
  7. package/dist/components/buckets/BucketPage.js +3 -3
  8. package/dist/components/buckets/notifications/EventsSection.js +1 -1
  9. package/dist/components/index.d.ts +2 -1
  10. package/dist/components/index.js +3 -2
  11. package/dist/components/objects/ObjectDetails/__tests__/ObjectDetails.test.js +3 -3
  12. package/dist/components/objects/ObjectList.js +1 -1
  13. package/dist/components/objects/UploadButton.js +3 -3
  14. package/dist/components/providers/DataBrowserProvider.d.ts +9 -9
  15. package/dist/components/providers/DataBrowserProvider.js +41 -41
  16. package/dist/components/providers/QueryProvider.d.ts +9 -0
  17. package/dist/components/providers/QueryProvider.js +22 -0
  18. package/dist/config/__tests__/factory.test.d.ts +1 -0
  19. package/dist/config/__tests__/factory.test.js +311 -0
  20. package/dist/config/factory.d.ts +6 -65
  21. package/dist/config/factory.js +18 -82
  22. package/dist/config/types.d.ts +85 -41
  23. package/dist/hooks/__tests__/useISVBucketDetection.test.js +2 -2
  24. package/dist/hooks/index.d.ts +2 -0
  25. package/dist/hooks/index.js +3 -1
  26. package/dist/hooks/useDataBrowserNavigate.d.ts +16 -2
  27. package/dist/hooks/useFeatures.d.ts +7 -0
  28. package/dist/hooks/useFeatures.js +8 -0
  29. package/dist/hooks/useISVBucketDetection.js +2 -2
  30. package/dist/hooks/useS3Client.d.ts +2 -1
  31. package/dist/hooks/useS3Client.js +2 -2
  32. package/dist/{utils → hooks}/useSupportedNotificationEvents.d.ts +1 -1
  33. package/dist/{utils → hooks}/useSupportedNotificationEvents.js +2 -1
  34. package/dist/test/setup.js +0 -17
  35. package/dist/test/testUtils.d.ts +0 -23
  36. package/dist/test/testUtils.js +3 -48
  37. package/dist/types/index.d.ts +2 -6
  38. package/dist/utils/__tests__/proxyMiddleware.test.d.ts +1 -0
  39. package/dist/utils/__tests__/proxyMiddleware.test.js +579 -0
  40. package/dist/utils/__tests__/s3Client.test.d.ts +1 -0
  41. package/dist/utils/__tests__/s3Client.test.js +340 -0
  42. package/dist/utils/proxyMiddleware.d.ts +32 -13
  43. package/dist/utils/proxyMiddleware.js +84 -25
  44. package/dist/utils/s3Client.d.ts +12 -2
  45. package/dist/utils/s3Client.js +5 -26
  46. package/package.json +5 -5
  47. package/dist/utils/useFeatures.d.ts +0 -1
  48. package/dist/utils/useFeatures.js +0 -7
@@ -2,26 +2,11 @@ import React from 'react';
2
2
  import type { DataBrowserUIProps } from '../config/types';
3
3
  /**
4
4
  * DataBrowserUI component - Main UI component for data browser.
5
- * Must be wrapped with DataBrowserProvider for S3 client and theme context,
5
+ * Must be wrapped with DataBrowserProvider for S3 configuration context,
6
6
  * and a BrowserRouter for routing.
7
7
  *
8
- * Uses relative routing for route definitions, but absolute paths for navigation.
9
- * Pass basePath to DataBrowserUI to specify where the UI is mounted.
10
- *
11
- * @example
12
- * ```tsx
13
- * <BrowserRouter>
14
- * <DataBrowserProvider
15
- * getS3Config={getS3Config}
16
- * theme={theme}
17
- * >
18
- * <Routes>
19
- * <Route path="/accounts/:accountName/buckets/*" element={
20
- * <DataBrowserUI basePath="/accounts/my-account" />
21
- * } />
22
- * </Routes>
23
- * </DataBrowserProvider>
24
- * </BrowserRouter>
25
- * ```
8
+ * Uses relative routing for route definitions. The `basePath` prop is used internally
9
+ * by `useDataBrowserNavigate()` to prefix all navigation paths, allowing the UI to be
10
+ * mounted at any route within your application.
26
11
  */
27
12
  export declare const DataBrowserUI: React.FC<DataBrowserUIProps>;
@@ -5,11 +5,11 @@ import { BucketDetails } from "../buckets/BucketDetails.js";
5
5
  import { applyBucketMocks, createTestWrapper } from "../../test/testUtils.js";
6
6
  import { useGetBucketAcl, useGetBucketCors, useGetBucketLifecycle, useGetBucketLocation, useGetBucketObjectLockConfiguration, useGetBucketPolicy, useGetBucketReplication, useGetBucketTagging, useGetBucketVersioning } from "../../hooks/index.js";
7
7
  import { useISVBucketStatus } from "../../hooks/useISVBucketDetection.js";
8
- import { useFeatures } from "../../utils/useFeatures.js";
9
- import * as __WEBPACK_EXTERNAL_MODULE__contexts_DataBrowserUICustomizationContext_js_f267b01c__ from "../../contexts/DataBrowserUICustomizationContext.js";
8
+ import { useFeatures } from "../../hooks/useFeatures.js";
9
+ import * as __rspack_external__contexts_DataBrowserUICustomizationContext_js_f267b01c from "../../contexts/DataBrowserUICustomizationContext.js";
10
10
  jest.mock('../../hooks');
11
11
  jest.mock('../../hooks/useISVBucketDetection');
12
- jest.mock('../../utils/useFeatures');
12
+ jest.mock('../../hooks/useFeatures');
13
13
  const mockUseParams = jest.fn();
14
14
  const mockUseNavigate = jest.fn();
15
15
  jest.mock('react-router', ()=>({
@@ -29,7 +29,7 @@ const mockUseGetBucketTagging = jest.mocked(useGetBucketTagging);
29
29
  const mockUseISVBucketStatus = jest.mocked(useISVBucketStatus);
30
30
  const mockUseFeatures = jest.mocked(useFeatures);
31
31
  const mockUseDataBrowserUICustomization = (config = {})=>{
32
- jest.spyOn(__WEBPACK_EXTERNAL_MODULE__contexts_DataBrowserUICustomizationContext_js_f267b01c__, 'useDataBrowserUICustomization').mockReturnValue(config);
32
+ jest.spyOn(__rspack_external__contexts_DataBrowserUICustomizationContext_js_f267b01c, 'useDataBrowserUICustomization').mockReturnValue(config);
33
33
  };
34
34
  const renderBucketDetails = ()=>{
35
35
  const Wrapper = createTestWrapper();
@@ -3,9 +3,9 @@ import { fireEvent, render, screen } from "@testing-library/react";
3
3
  import { MemoryRouter } from "react-router";
4
4
  import { createTestWrapper, mockOffsetSize } from "../../test/testUtils.js";
5
5
  import { BucketList } from "../buckets/BucketList.js";
6
- import * as __WEBPACK_EXTERNAL_MODULE__contexts_DataBrowserUICustomizationContext_js_f267b01c__ from "../../contexts/DataBrowserUICustomizationContext.js";
6
+ import * as __rspack_external__contexts_DataBrowserUICustomizationContext_js_f267b01c from "../../contexts/DataBrowserUICustomizationContext.js";
7
7
  const mockUseDataBrowserUICustomization = (config = {})=>{
8
- jest.spyOn(__WEBPACK_EXTERNAL_MODULE__contexts_DataBrowserUICustomizationContext_js_f267b01c__, 'useDataBrowserUICustomization').mockReturnValue(config);
8
+ jest.spyOn(__rspack_external__contexts_DataBrowserUICustomizationContext_js_f267b01c, 'useDataBrowserUICustomization').mockReturnValue(config);
9
9
  };
10
10
  const renderBucketList = (props = {})=>{
11
11
  const Wrapper = createTestWrapper();
@@ -5,10 +5,10 @@ import { MemoryRouter } from "react-router";
5
5
  import { useGetBucketAcl, useGetBucketCors, useGetBucketLocation, useGetBucketObjectLockConfiguration, useGetBucketPolicy, useGetBucketTagging, useGetBucketVersioning, useISVBucketStatus } from "../../hooks/index.js";
6
6
  import { applyBucketMocks, createTestWrapper } from "../../test/testUtils.js";
7
7
  import { BucketOverview, useBucketOverviewContext } from "../buckets/BucketOverview.js";
8
- import { useFeatures } from "../../utils/useFeatures.js";
9
- import * as __WEBPACK_EXTERNAL_MODULE__contexts_DataBrowserUICustomizationContext_js_f267b01c__ from "../../contexts/DataBrowserUICustomizationContext.js";
8
+ import { useFeatures } from "../../hooks/useFeatures.js";
9
+ import * as __rspack_external__contexts_DataBrowserUICustomizationContext_js_f267b01c from "../../contexts/DataBrowserUICustomizationContext.js";
10
10
  jest.mock('../../hooks');
11
- jest.mock('../../utils/useFeatures');
11
+ jest.mock('../../hooks/useFeatures');
12
12
  const mockUseGetBucketVersioning = jest.mocked(useGetBucketVersioning);
13
13
  const mockUseGetBucketAcl = jest.mocked(useGetBucketAcl);
14
14
  const mockUseGetBucketLocation = jest.mocked(useGetBucketLocation);
@@ -19,7 +19,7 @@ const mockUseGetBucketTagging = jest.mocked(useGetBucketTagging);
19
19
  const mockUseISVBucketStatus = jest.mocked(useISVBucketStatus);
20
20
  const mockUseFeatures = jest.mocked(useFeatures);
21
21
  const mockUseDataBrowserUICustomization = (config = {})=>{
22
- jest.spyOn(__WEBPACK_EXTERNAL_MODULE__contexts_DataBrowserUICustomizationContext_js_f267b01c__, 'useDataBrowserUICustomization').mockReturnValue(config);
22
+ jest.spyOn(__rspack_external__contexts_DataBrowserUICustomizationContext_js_f267b01c, 'useDataBrowserUICustomization').mockReturnValue(config);
23
23
  };
24
24
  const renderBucketOverview = (props = {})=>{
25
25
  const { bucketName = 'test-bucket', onEmptyBucket, onDeleteBucket, onEditPolicy, renderEmptyButton, renderDeleteButton, isEmptyBucketDisabled, isDeleteBucketDisabled } = props;
@@ -5,7 +5,7 @@ import { createTestWrapper, mockOffsetSize, setupMswServer } from "../../test/te
5
5
  import { useListObjectVersions, useListObjects } from "../../hooks/index.js";
6
6
  import { ObjectList } from "../objects/ObjectList.js";
7
7
  import { DataBrowserUICustomizationProvider } from "../../contexts/DataBrowserUICustomizationContext.js";
8
- import * as __WEBPACK_EXTERNAL_MODULE__utils_useFeatures_js_1facdd0d__ from "../../utils/useFeatures.js";
8
+ import * as __rspack_external__hooks_useFeatures_js_a6a84786 from "../../hooks/useFeatures.js";
9
9
  setupMswServer();
10
10
  const renderObjectList = (props = {}, customization)=>{
11
11
  const Wrapper = createTestWrapper();
@@ -32,7 +32,7 @@ describe('ObjectList', ()=>{
32
32
  beforeEach(()=>{
33
33
  jest.clearAllMocks();
34
34
  mockOffsetSize(800, 600);
35
- jest.spyOn(__WEBPACK_EXTERNAL_MODULE__utils_useFeatures_js_1facdd0d__, 'useFeatures').mockReturnValue(false);
35
+ jest.spyOn(__rspack_external__hooks_useFeatures_js_a6a84786, 'useFeatures').mockReturnValue(false);
36
36
  });
37
37
  afterEach(()=>{
38
38
  jest.restoreAllMocks();
@@ -284,7 +284,7 @@ describe('ObjectList', ()=>{
284
284
  });
285
285
  describe('Search Features', ()=>{
286
286
  it('renders table search when metadata-search feature is disabled', async ()=>{
287
- jest.spyOn(__WEBPACK_EXTERNAL_MODULE__utils_useFeatures_js_1facdd0d__, 'useFeatures').mockReturnValue(false);
287
+ jest.spyOn(__rspack_external__hooks_useFeatures_js_a6a84786, 'useFeatures').mockReturnValue(false);
288
288
  renderObjectList();
289
289
  await waitFor(()=>{
290
290
  expect(screen.getByRole('grid')).toBeInTheDocument();
@@ -292,7 +292,7 @@ describe('ObjectList', ()=>{
292
292
  expect(screen.queryByPlaceholderText(/Metadata Search/i)).not.toBeInTheDocument();
293
293
  });
294
294
  it('renders MetadataSearch component when metadata-search feature is enabled', async ()=>{
295
- jest.spyOn(__WEBPACK_EXTERNAL_MODULE__utils_useFeatures_js_1facdd0d__, 'useFeatures').mockReturnValue(true);
295
+ jest.spyOn(__rspack_external__hooks_useFeatures_js_a6a84786, 'useFeatures').mockReturnValue(true);
296
296
  renderObjectList();
297
297
  await waitFor(()=>{
298
298
  expect(screen.getByRole('grid')).toBeInTheDocument();
@@ -6,7 +6,7 @@ import { useDataBrowserUICustomization } from "../../contexts/DataBrowserUICusto
6
6
  import { useGetBucketAcl, useGetBucketCors, useGetBucketObjectLockConfiguration, useGetBucketPolicy, useGetBucketVersioning } from "../../hooks/index.js";
7
7
  import { isNotFoundError } from "../../utils/errorHandling.js";
8
8
  import { EditRetentionButton } from "../objects/ObjectLock/EditRetentionButton.js";
9
- import { useDataBrowserContext } from "../providers/DataBrowserProvider.js";
9
+ import { useDataBrowserConfig } from "../providers/DataBrowserProvider.js";
10
10
  import { Body, Group, GroupContent, GroupName, GroupValues, Key, Row, Table, TableContainer, Value } from "../ui/Table.elements.js";
11
11
  import { BucketLocation } from "./BucketLocation.js";
12
12
  import { BucketPolicyButton } from "./BucketPolicyButton.js";
@@ -401,8 +401,7 @@ DataProtectionSection.displayName = 'BucketOverview.DataProtectionSection';
401
401
  const PermissionsSection = /*#__PURE__*/ memo(({ onEditPolicy, ownerField, aclField, corsField, publicField, bucketPolicyField, renderOwner, renderAcl, renderCors, renderPublic, renderBucketPolicy })=>{
402
402
  const { bucketName } = useBucketOverviewContext();
403
403
  const { extraBucketOverviewPermissions } = useDataBrowserUICustomization();
404
- const { getS3Config } = useDataBrowserContext();
405
- const config = getS3Config();
404
+ const config = useDataBrowserConfig();
406
405
  const { data: aclData, status: aclStatus } = useGetBucketAcl({
407
406
  Bucket: bucketName
408
407
  });
@@ -7,7 +7,7 @@ import { BucketDetails } from "./BucketDetails.js";
7
7
  import { BucketList } from "./BucketList.js";
8
8
  import { useDataBrowserNavigate } from "../../hooks/useDataBrowserNavigate.js";
9
9
  import { useEffect } from "react";
10
- const BucketPage_BucketPage = ()=>{
10
+ const BucketPage = ()=>{
11
11
  const { data, status } = useBuckets();
12
12
  const { bucketName } = useParams();
13
13
  const navigate = useDataBrowserNavigate();
@@ -47,5 +47,5 @@ const BucketPage_BucketPage = ()=>{
47
47
  rightPanel: /*#__PURE__*/ jsx(BucketDetails, {})
48
48
  });
49
49
  };
50
- const BucketPage = BucketPage_BucketPage;
51
- export { BucketPage_BucketPage as BucketPage, BucketPage as default };
50
+ const buckets_BucketPage = BucketPage;
51
+ export { BucketPage, buckets_BucketPage as default };
@@ -4,7 +4,7 @@ import { useCallback, useMemo } from "react";
4
4
  import { Controller, useFormContext } from "react-hook-form";
5
5
  import { getFilteredEventGroups } from "./events.js";
6
6
  import { Box } from "@scality/core-ui/dist/next";
7
- import { useSupportedNotificationEvents } from "../../../utils/useSupportedNotificationEvents.js";
7
+ import { useSupportedNotificationEvents } from "../../../hooks/useSupportedNotificationEvents.js";
8
8
  function EventsSection() {
9
9
  const { control, formState: { errors } } = useFormContext();
10
10
  const supportedEvents = useSupportedNotificationEvents();
@@ -18,6 +18,7 @@ export { ObjectLockSettings } from './objects/ObjectLock/ObjectLockSettings';
18
18
  export { EditRetentionButton } from './objects/ObjectLock/EditRetentionButton';
19
19
  export { MetadataSearch } from './search/MetadataSearch';
20
20
  export { ArrayFieldActions } from './ui/ArrayFieldActions';
21
- export { DataBrowserProvider, useDataBrowserContext, useDataBrowserTheme, } from './providers/DataBrowserProvider';
21
+ export { DataBrowserProvider, useDataBrowserContext, useDataBrowserConfig, useInvalidateQueries, } from './providers/DataBrowserProvider';
22
+ export { QueryProvider } from './providers/QueryProvider';
22
23
  export { useDataBrowserNavigate } from '../hooks/useDataBrowserNavigate';
23
24
  export { DataBrowserUI } from './DataBrowserUI';
@@ -18,7 +18,8 @@ import { ObjectLockSettings } from "./objects/ObjectLock/ObjectLockSettings.js";
18
18
  import { EditRetentionButton } from "./objects/ObjectLock/EditRetentionButton.js";
19
19
  import { MetadataSearch } from "./search/MetadataSearch.js";
20
20
  import { ArrayFieldActions } from "./ui/ArrayFieldActions.js";
21
- import { DataBrowserProvider, useDataBrowserContext, useDataBrowserTheme } from "./providers/DataBrowserProvider.js";
21
+ import { DataBrowserProvider, useDataBrowserConfig, useDataBrowserContext, useInvalidateQueries } from "./providers/DataBrowserProvider.js";
22
+ import { QueryProvider } from "./providers/QueryProvider.js";
22
23
  import { useDataBrowserNavigate } from "../hooks/useDataBrowserNavigate.js";
23
24
  import { DataBrowserUI } from "./DataBrowserUI.js";
24
- export { ArrayFieldActions, BucketCreate, BucketLifecycleFormPage, BucketList, BucketNotificationCreatePage, BucketOverview, BucketOverviewField, BucketOverviewSection, BucketPage, BucketPolicyPage, BucketReplicationFormPage, BucketVersioning, CreateFolderButton, DataBrowserProvider, DataBrowserUI, DeleteBucketButton, EditRetentionButton, EmptyBucketButton, MetadataSearch, ObjectDetails, ObjectList, ObjectLockSettings, ObjectPage, UploadButton, baseBucketCreateSchema, bucketErrorMessage, bucketNameValidationSchema, useBucketOverviewContext, useDataBrowserContext, useDataBrowserNavigate, useDataBrowserTheme };
25
+ export { ArrayFieldActions, BucketCreate, BucketLifecycleFormPage, BucketList, BucketNotificationCreatePage, BucketOverview, BucketOverviewField, BucketOverviewSection, BucketPage, BucketPolicyPage, BucketReplicationFormPage, BucketVersioning, CreateFolderButton, DataBrowserProvider, DataBrowserUI, DeleteBucketButton, EditRetentionButton, EmptyBucketButton, MetadataSearch, ObjectDetails, ObjectList, ObjectLockSettings, ObjectPage, QueryProvider, UploadButton, baseBucketCreateSchema, bucketErrorMessage, bucketNameValidationSchema, useBucketOverviewContext, useDataBrowserConfig, useDataBrowserContext, useDataBrowserNavigate, useInvalidateQueries };
@@ -1,12 +1,12 @@
1
- import * as __WEBPACK_EXTERNAL_MODULE__index_js_95fdb65a__ from "../index.js";
1
+ import * as __rspack_external__index_js_95fdb65a from "../index.js";
2
2
  import { jsx } from "react/jsx-runtime";
3
3
  import { cleanup, render, screen } from "@testing-library/react";
4
4
  import { MemoryRouter, Route, Routes } from "react-router";
5
5
  import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
6
6
  import { DataBrowserUICustomizationProvider } from "../../../../contexts/DataBrowserUICustomizationContext.js";
7
7
  var __webpack_modules__ = {
8
- "..": function(module) {
9
- module.exports = __WEBPACK_EXTERNAL_MODULE__index_js_95fdb65a__;
8
+ ".." (module) {
9
+ module.exports = __rspack_external__index_js_95fdb65a;
10
10
  }
11
11
  };
12
12
  var __webpack_module_cache__ = {};
@@ -8,7 +8,7 @@ import { useSearchObjects, useSearchObjectsVersions } from "../../hooks/index.js
8
8
  import { useGetPresignedDownload } from "../../hooks/presignedOperations.js";
9
9
  import { useBatchObjectLegalHold } from "../../hooks/useBatchObjectLegalHold.js";
10
10
  import { useQueryParams } from "../../utils/hooks.js";
11
- import { useFeatures } from "../../utils/useFeatures.js";
11
+ import { useFeatures } from "../../hooks/useFeatures.js";
12
12
  import CreateFolderButton from "./CreateFolderButton.js";
13
13
  import MetadataSearch from "../search/MetadataSearch.js";
14
14
  import UploadButton from "./UploadButton.js";
@@ -111,7 +111,7 @@ const NoFile = ({ open })=>/*#__PURE__*/ jsxs(EmptyFile, {
111
111
  })
112
112
  ]
113
113
  });
114
- const UploadButton_UploadButton = ({ bucket, prefix = '', uploadOptions = {}, onUploadSuccess, onUploadError })=>{
114
+ const UploadButton = ({ bucket, prefix = '', uploadOptions = {}, onUploadSuccess, onUploadError })=>{
115
115
  const [isModalOpen, setIsModalOpen] = useState(false);
116
116
  const [acceptedFiles, setAcceptedFiles] = useState([]);
117
117
  const uploadMutation = useUploadObjects();
@@ -225,5 +225,5 @@ const UploadButton_UploadButton = ({ bucket, prefix = '', uploadOptions = {}, on
225
225
  ]
226
226
  });
227
227
  };
228
- const UploadButton = UploadButton_UploadButton;
229
- export { UploadButton_UploadButton as UploadButton, UploadButton as default };
228
+ const objects_UploadButton = UploadButton;
229
+ export { UploadButton, objects_UploadButton as default };
@@ -1,23 +1,24 @@
1
1
  import React from 'react';
2
2
  import { QueryClient, InvalidateQueryFilters, QueryKey } from '@tanstack/react-query';
3
3
  import { GetConfigFunction } from '../../types';
4
- import { CoreUITheme } from '@scality/core-ui/dist/style/theme';
4
+ import { CoreUITheme } from '@scality/core-ui/dist/next';
5
5
  export interface DataBrowserContextValue {
6
- getS3Config: GetConfigFunction;
7
- theme: CoreUITheme;
6
+ getS3Config: GetConfigFunction | null;
8
7
  s3ConfigIdentifier: string;
9
8
  }
10
- export declare const DataBrowserContext: React.Context<DataBrowserContextValue | null>;
9
+ export declare const DataBrowserContext: React.Context<DataBrowserContextValue>;
11
10
  export declare const useDataBrowserContext: () => DataBrowserContextValue;
12
- export declare const useDataBrowserTheme: () => CoreUITheme;
13
- interface DataBrowserProviderProps {
11
+ export interface DataBrowserProviderProps {
14
12
  children: React.ReactNode;
15
- queryClient?: QueryClient;
16
- enableDevtools?: boolean;
17
13
  getS3Config?: GetConfigFunction;
14
+ queryClient?: QueryClient;
18
15
  theme?: CoreUITheme;
16
+ enableDevtools?: boolean;
19
17
  }
20
18
  export declare const DataBrowserProvider: React.FC<DataBrowserProviderProps>;
19
+ export declare const useDataBrowserConfig: () => import("../../types").S3BrowserConfig & {
20
+ credentials: import("../../types").S3Credentials;
21
+ };
21
22
  /**
22
23
  * Hook to invalidate queries with automatic S3 config identifier prefixing.
23
24
  *
@@ -28,4 +29,3 @@ export declare const DataBrowserProvider: React.FC<DataBrowserProviderProps>;
28
29
  export declare const useInvalidateQueries: () => (filters: Omit<InvalidateQueryFilters, "queryKey"> & {
29
30
  queryKey: QueryKey;
30
31
  }) => Promise<void>;
31
- export {};
@@ -1,49 +1,49 @@
1
- import { jsx, jsxs } from "react/jsx-runtime";
2
- import { createContext, useCallback, useContext } from "react";
3
- import { QueryClient, QueryClientProvider, useQueryClient } from "@tanstack/react-query";
4
- import { ReactQueryDevtools } from "@tanstack/react-query-devtools";
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { createContext, useCallback, useContext, useMemo } from "react";
3
+ import { useQueryClient } from "@tanstack/react-query";
5
4
  import { ANONYMOUS_S3_CONFIG_IDENTIFIER, computeS3ConfigIdentifier } from "../../utils/s3ConfigIdentifier.js";
6
- const DataBrowserContext = /*#__PURE__*/ createContext(null);
7
- const useDataBrowserContext = ()=>{
8
- const context = useContext(DataBrowserContext);
9
- if (!context) throw new Error('useDataBrowserContext must be used within a DataBrowserProvider component');
10
- return context;
5
+ import { QueryProvider } from "./QueryProvider.js";
6
+ import { CoreUiThemeProvider } from "@scality/core-ui/dist/next";
7
+ import { coreUIAvailableThemes } from "@scality/core-ui/dist/style/theme";
8
+ const DEFAULT_CONTEXT_VALUE = {
9
+ getS3Config: null,
10
+ s3ConfigIdentifier: ANONYMOUS_S3_CONFIG_IDENTIFIER
11
11
  };
12
- const useDataBrowserTheme = ()=>{
13
- const { theme } = useDataBrowserContext();
14
- return theme;
15
- };
16
- const defaultQueryClient = new QueryClient({
17
- defaultOptions: {
18
- queries: {
19
- staleTime: 300000,
20
- retry: 2
21
- }
22
- }
23
- });
24
- const DataBrowserProvider = ({ children, queryClient = defaultQueryClient, enableDevtools = 'development' === process.env.NODE_ENV, getS3Config, theme })=>{
25
- const config = getS3Config?.();
26
- const s3ConfigIdentifier = config ? computeS3ConfigIdentifier(config) : ANONYMOUS_S3_CONFIG_IDENTIFIER;
27
- const content = /*#__PURE__*/ jsxs(QueryClientProvider, {
28
- client: queryClient,
29
- children: [
30
- children,
31
- enableDevtools && /*#__PURE__*/ jsx(ReactQueryDevtools, {
32
- initialIsOpen: false
33
- })
34
- ]
35
- });
36
- if (!getS3Config || !theme) return content;
37
- const contextValue = {
12
+ const DataBrowserContext = /*#__PURE__*/ createContext(DEFAULT_CONTEXT_VALUE);
13
+ const useDataBrowserContext = ()=>useContext(DataBrowserContext);
14
+ const DataBrowserProvider = ({ children, queryClient, theme, enableDevtools, getS3Config })=>{
15
+ const currentConfig = getS3Config?.();
16
+ const s3ConfigIdentifier = useMemo(()=>currentConfig ? computeS3ConfigIdentifier(currentConfig) : ANONYMOUS_S3_CONFIG_IDENTIFIER, [
17
+ currentConfig?.credentials?.accessKeyId,
18
+ currentConfig?.credentials?.roleArn,
19
+ currentConfig?.credentials?.sessionToken,
20
+ currentConfig?.region,
21
+ currentConfig?.endpoint
22
+ ]);
23
+ const contextValue = useMemo(()=>({
24
+ getS3Config: getS3Config ?? null,
25
+ s3ConfigIdentifier
26
+ }), [
38
27
  getS3Config,
39
- theme,
40
28
  s3ConfigIdentifier
41
- };
42
- return /*#__PURE__*/ jsx(DataBrowserContext.Provider, {
43
- value: contextValue,
44
- children: content
29
+ ]);
30
+ return /*#__PURE__*/ jsx(CoreUiThemeProvider, {
31
+ theme: theme ?? coreUIAvailableThemes.darkRebrand,
32
+ children: /*#__PURE__*/ jsx(QueryProvider, {
33
+ queryClient: queryClient,
34
+ enableDevtools: enableDevtools,
35
+ children: /*#__PURE__*/ jsx(DataBrowserContext.Provider, {
36
+ value: contextValue,
37
+ children: children
38
+ })
39
+ })
45
40
  });
46
41
  };
42
+ const useDataBrowserConfig = ()=>{
43
+ const { getS3Config } = useDataBrowserContext();
44
+ if (!getS3Config) throw new Error("useDataBrowserConfig: S3 config not available. Ensure DataBrowserProvider has getS3Config prop set.");
45
+ return getS3Config();
46
+ };
47
47
  const useInvalidateQueries = ()=>{
48
48
  const { s3ConfigIdentifier } = useDataBrowserContext();
49
49
  const queryClient = useQueryClient();
@@ -61,4 +61,4 @@ const useInvalidateQueries = ()=>{
61
61
  s3ConfigIdentifier
62
62
  ]);
63
63
  };
64
- export { DataBrowserContext, DataBrowserProvider, useDataBrowserContext, useDataBrowserTheme, useInvalidateQueries };
64
+ export { DataBrowserContext, DataBrowserProvider, useDataBrowserConfig, useDataBrowserContext, useInvalidateQueries };
@@ -0,0 +1,9 @@
1
+ import React from 'react';
2
+ import { QueryClient } from '@tanstack/react-query';
3
+ export interface QueryProviderProps {
4
+ children: React.ReactNode;
5
+ queryClient?: QueryClient;
6
+ enableDevtools?: boolean;
7
+ }
8
+ export declare const defaultQueryClient: QueryClient;
9
+ export declare const QueryProvider: React.FC<QueryProviderProps>;
@@ -0,0 +1,22 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import "react";
3
+ import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
4
+ import { ReactQueryDevtools } from "@tanstack/react-query-devtools";
5
+ const defaultQueryClient = new QueryClient({
6
+ defaultOptions: {
7
+ queries: {
8
+ staleTime: 300000,
9
+ retry: 2
10
+ }
11
+ }
12
+ });
13
+ const QueryProvider = ({ children, queryClient = defaultQueryClient, enableDevtools = 'development' === process.env.NODE_ENV })=>/*#__PURE__*/ jsxs(QueryClientProvider, {
14
+ client: queryClient,
15
+ children: [
16
+ children,
17
+ enableDevtools && /*#__PURE__*/ jsx(ReactQueryDevtools, {
18
+ initialIsOpen: false
19
+ })
20
+ ]
21
+ });
22
+ export { QueryProvider, defaultQueryClient };
@@ -0,0 +1 @@
1
+ export {};