import { type Environment, type EnvironmentId, EnvironmentStatus, } from '@/portainer/environments/types'; import { Authorized, useUser, isEnvironmentAdmin, } from '@/portainer/hooks/useUser'; import { useInfo, useVersion } from '@/docker/services/system.service'; import { SidebarItem } from './SidebarItem'; interface Props { environmentId: EnvironmentId; environment: Environment; } export function DockerSidebar({ environmentId, environment }: Props) { const { user } = useUser(); const isAdmin = isEnvironmentAdmin(user, environmentId); const areStacksVisible = isAdmin || environment.SecuritySettings.allowStackManagementForRegularUsers; const envInfoQuery = useInfo( environmentId, (info) => !!info.Swarm?.NodeID && !!info.Swarm?.ControlAvailable ); const envVersionQuery = useVersion(environmentId, (version) => parseFloat(version.ApiVersion) ); const isSwarmManager = envInfoQuery.data; const apiVersion = envVersionQuery.data || 0; const offlineMode = environment.Status === EnvironmentStatus.Down; const setupSubMenuProps = isSwarmManager ? { label: 'Swarm', iconClass: 'fa-object-group fa-fw', to: 'docker.swarm', } : { label: 'Host', iconClass: 'fa-th fa-fw', to: 'docker.host', }; return ( <> {!offlineMode && ( )} {areStacksVisible && ( )} {isSwarmManager && ( )} {apiVersion >= 1.3 && isSwarmManager && ( )} {apiVersion >= 1.25 && isSwarmManager && ( )} {!isSwarmManager && isAdmin && !offlineMode && ( )} ); }