import { useCurrentStateAndParams, useRouter } from '@uirouter/react';
import { useEffect } from 'react';
import { X, Slash } from 'react-feather';
import clsx from 'clsx';
import angular from 'angular';
import {
PlatformType,
EnvironmentId,
Environment,
} from '@/react/portainer/environments/types';
import { getPlatformType } from '@/react/portainer/environments/utils';
import { useEnvironment } from '@/react/portainer/environments/queries/useEnvironment';
import { useLocalStorage } from '@/portainer/hooks/useLocalStorage';
import { EndpointProviderInterface } from '@/portainer/services/endpointProvider';
import { getPlatformIcon } from '../portainer/environments/utils/get-platform-icon';
import styles from './EnvironmentSidebar.module.css';
import { AzureSidebar } from './AzureSidebar';
import { DockerSidebar } from './DockerSidebar';
import { KubernetesSidebar } from './KubernetesSidebar';
import { SidebarSection, SidebarSectionTitle } from './SidebarSection';
import { useSidebarState } from './useSidebarState';
export function EnvironmentSidebar() {
const { query: currentEnvironmentQuery, clearEnvironment } =
useCurrentEnvironment();
const environment = currentEnvironmentQuery.data;
const { isOpen } = useSidebarState();
if (!isOpen && !environment) {
return null;
}
return (
{environment ? (
) : (
Environment:
None selected
)}
);
}
interface ContentProps {
environment: Environment;
onClear: () => void;
}
function Content({ environment, onClear }: ContentProps) {
const platform = getPlatformType(environment.Type);
const Sidebar = getSidebar(platform);
return (
}
aria-label={environment.Name}
showTitleWhenOpen
>
);
function getSidebar(platform: PlatformType) {
const sidebar: {
[key in PlatformType]: React.ComponentType<{
environmentId: EnvironmentId;
environment: Environment;
}>;
} = {
[PlatformType.Azure]: AzureSidebar,
[PlatformType.Docker]: DockerSidebar,
[PlatformType.Kubernetes]: KubernetesSidebar,
};
return sidebar[platform];
}
}
function useCurrentEnvironment() {
const { params } = useCurrentStateAndParams();
const router = useRouter();
const [environmentId, setEnvironmentId] = useLocalStorage<
EnvironmentId | undefined
>('environmentId', undefined, sessionStorage);
useEffect(() => {
const environmentId = parseInt(params.endpointId, 10);
if (params.endpointId && !Number.isNaN(environmentId)) {
setEnvironmentId(environmentId);
}
}, [params.endpointId, setEnvironmentId]);
return { query: useEnvironment(environmentId), clearEnvironment };
function clearEnvironment() {
const $injector = angular.element(document).injector();
$injector.invoke(
/* @ngInject */ (EndpointProvider: EndpointProviderInterface) => {
EndpointProvider.setCurrentEndpoint(null);
if (!params.endpointId) {
document.title = 'Portainer';
}
}
);
if (params.endpointId) {
router.stateService.go('portainer.home');
}
setEnvironmentId(undefined);
}
}
interface TitleProps {
environment: Environment;
onClear(): void;
}
function Title({ environment, onClear }: TitleProps) {
const { isOpen } = useSidebarState();
const EnvironmentIcon = getPlatformIcon(environment.Type);
if (!isOpen) {
return (
);
}
return (
{environment.Name}
);
}