datahub/datahub-web-react/src/app/ingest/ManageIngestionPage.tsx

113 lines
4.0 KiB
TypeScript
Raw Normal View History

import { Tabs, Typography } from 'antd';
import React, { useEffect, useState } from 'react';
import { useHistory } from 'react-router';
import styled from 'styled-components';
import { useUserContext } from '@app/context/useUserContext';
import { SecretsList } from '@app/ingest/secret/SecretsList';
import { IngestionSourceList } from '@app/ingest/source/IngestionSourceList';
import { TabType } from '@app/ingest/types';
import { OnboardingTour } from '@app/onboarding/OnboardingTour';
import {
INGESTION_CREATE_SOURCE_ID,
INGESTION_REFRESH_SOURCES_ID,
} from '@app/onboarding/config/IngestionOnboardingConfig';
import { useAppConfig } from '@app/useAppConfig';
import { useShowNavBarRedesign } from '@app/useShowNavBarRedesign';
2025-01-29 20:42:01 -05:00
const PageContainer = styled.div<{ $isShowNavBarRedesign?: boolean }>`
padding-top: 20px;
2025-01-29 20:42:01 -05:00
background-color: white;
border-radius: ${(props) =>
props.$isShowNavBarRedesign ? props.theme.styles['border-radius-navbar-redesign'] : '8px'};
${(props) =>
props.$isShowNavBarRedesign &&
`
overflow: hidden;
margin: 5px;
box-shadow: ${props.theme.styles['box-shadow-navbar-redesign']};
height: 100%;
`}
`;
const PageHeaderContainer = styled.div`
&& {
padding-left: 24px;
}
`;
const PageTitle = styled(Typography.Title)`
&& {
margin-bottom: 12px;
}
`;
const StyledTabs = styled(Tabs)`
&&& .ant-tabs-nav {
margin-bottom: 0;
padding-left: 28px;
}
`;
const Tab = styled(Tabs.TabPane)`
font-size: 14px;
line-height: 22px;
`;
const ListContainer = styled.div``;
export const ManageIngestionPage = () => {
/**
* Determines which view should be visible: ingestion sources or secrets.
*/
const me = useUserContext();
const { config, loaded } = useAppConfig();
2024-12-12 20:49:25 +05:30
const isIngestionEnabled = config?.managedIngestionConfig?.enabled;
const showIngestionTab = isIngestionEnabled && me && me.platformPrivileges?.manageIngestion;
const showSecretsTab = isIngestionEnabled && me && me.platformPrivileges?.manageSecrets;
const [selectedTab, setSelectedTab] = useState<TabType>(TabType.Sources);
2025-01-29 20:42:01 -05:00
const isShowNavBarRedesign = useShowNavBarRedesign();
// defaultTab might not be calculated correctly on mount, if `config` or `me` haven't been loaded yet
useEffect(() => {
if (loaded && me.loaded && !showIngestionTab && selectedTab === TabType.Sources) {
setSelectedTab(TabType.Secrets);
}
}, [loaded, me.loaded, showIngestionTab, selectedTab]);
const history = useHistory();
const onSwitchTab = (newTab: string, options?: { clearQueryParams: boolean }) => {
const matchingTab = Object.values(TabType).find((tab) => tab === newTab);
setSelectedTab(matchingTab || selectedTab);
if (options?.clearQueryParams) {
history.push({ search: '' });
}
};
const TabTypeToListComponent = {
[TabType.Sources]: <IngestionSourceList />,
[TabType.Secrets]: <SecretsList />,
};
return (
2025-01-29 20:42:01 -05:00
<PageContainer $isShowNavBarRedesign={isShowNavBarRedesign}>
<OnboardingTour stepIds={[INGESTION_CREATE_SOURCE_ID, INGESTION_REFRESH_SOURCES_ID]} />
<PageHeaderContainer>
<PageTitle level={3}>Manage Data Sources</PageTitle>
<Typography.Paragraph type="secondary">
Configure and schedule syncs to import data from your data sources
</Typography.Paragraph>
</PageHeaderContainer>
<StyledTabs
activeKey={selectedTab}
size="large"
onTabClick={(tab) => onSwitchTab(tab, { clearQueryParams: true })}
>
{showIngestionTab && <Tab key={TabType.Sources} tab={TabType.Sources} />}
{showSecretsTab && <Tab key={TabType.Secrets} tab={TabType.Secrets} />}
</StyledTabs>
<ListContainer>{TabTypeToListComponent[selectedTab]}</ListContainer>
</PageContainer>
);
};