import { useState } from "react"; import { faArrowRightArrowLeft, faEllipsisH, faPlus } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { useQueryClient } from "@tanstack/react-query"; import { useNavigate, useParams } from "@tanstack/react-router"; import { UpgradePlanModal } from "@app/components/license/UpgradePlanModal"; import { ProjectPermissionCan } from "@app/components/permissions"; import { Button, DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuTrigger, Modal, ModalContent, Tab, TabList, Tabs, Tooltip } from "@app/components/v2"; import { ROUTE_PATHS } from "@app/const/routes"; import { ProjectPermissionActions, ProjectPermissionSub, useSubscription, useWorkspace } from "@app/context"; import { usePopUp } from "@app/hooks"; import { workspaceKeys } from "@app/hooks/api"; import { WorkspaceEnv } from "@app/hooks/api/workspace/types"; import { AddEnvironmentModal } from "@app/pages/secret-manager/SettingsPage/components/EnvironmentSection/AddEnvironmentModal"; import { CompareEnvironments } from "../CompareEnvironments"; const COMPARE_ENVIRONMENT_TAB = "__COMPARE_ENVIRONMENT_TAB__"; const ADD_ENVIRONMENT_TAB = "__ADD_ENVIRONMENT_TAB__"; const VIEW_MORE_ENVIRONMENT_TAB = "__VIEW_MORE_ENVIRONMENT_TAB__"; type Props = { secretPath: string; }; const TABS_TO_SHOW = 5; export const EnvironmentTabs = ({ secretPath }: Props) => { const { currentWorkspace } = useWorkspace(); const currentEnv = useParams({ from: ROUTE_PATHS.SecretManager.SecretDashboardPage.id, select: (el) => el.envSlug }); const { subscription } = useSubscription(); const isMoreEnvironmentsAllowed = subscription?.environmentLimit && currentWorkspace?.environments ? currentWorkspace.environments.length < subscription.environmentLimit : true; const [isNavigating, setIsNavigating] = useState(false); const navigate = useNavigate(); const { popUp, handlePopUpOpen, handlePopUpToggle } = usePopUp([ "compareEnvironments", "createEnvironment", "upgradePlan" ] as const); const selectedIndex = currentWorkspace.environments.findIndex((env) => env.slug === currentEnv); let tabEnvironments: WorkspaceEnv[]; let dropdownEnvironments: WorkspaceEnv[]; if (selectedIndex < TABS_TO_SHOW) { tabEnvironments = currentWorkspace.environments.slice(0, TABS_TO_SHOW); dropdownEnvironments = currentWorkspace.environments.slice(TABS_TO_SHOW); } else { tabEnvironments = [ ...currentWorkspace.environments.slice(0, TABS_TO_SHOW - 1), currentWorkspace.environments[selectedIndex] ]; dropdownEnvironments = currentWorkspace.environments .slice(TABS_TO_SHOW - 1) .filter((env) => env.slug !== currentEnv); } const queryClient = useQueryClient(); const handleSelect = async (envSlug: string) => { if (isNavigating) return; setIsNavigating(true); await navigate({ to: ROUTE_PATHS.SecretManager.SecretDashboardPage.path, params: { envSlug, projectId: currentWorkspace.id }, search: (prev) => prev }); setIsNavigating(false); }; const handleAddEnvironment = () => { if (isMoreEnvironmentsAllowed) { handlePopUpOpen("createEnvironment"); } else { handlePopUpOpen("upgradePlan"); } }; return ( <> { if (value === COMPARE_ENVIRONMENT_TAB) { handlePopUpOpen("compareEnvironments"); return; } if (value === ADD_ENVIRONMENT_TAB) { handleAddEnvironment(); return; } handleSelect(value); }} defaultValue="environment-tabs" > {tabEnvironments.map((environment) => ( {environment.name} ))} {dropdownEnvironments.length ? ( Environments {dropdownEnvironments.map((environment) => ( { e.stopPropagation(); handleSelect(environment.slug); }} > {environment.name} ))} {(isAllowed) => ( } className="w-full" > Add Environment )} ) : ( )} {currentWorkspace.environments.length > 1 && ( Compare Environments )} handlePopUpToggle("compareEnvironments", isOpen)} > handlePopUpToggle("upgradePlan", isOpen)} text="You can add custom environments if you switch to Infisical's Team plan." /> handlePopUpToggle("createEnvironment", isOpen)} onComplete={async (env) => { await queryClient.refetchQueries({ queryKey: workspaceKeys.getWorkspaceById(currentWorkspace.id) }); handleSelect(env.slug); }} /> > ); };
{environment.name}