import { ArrowUp } from 'lucide-react'; import { useRouter } from '@uirouter/react'; import { useState } from 'react'; import { EnvironmentId } from '@/react/portainer/environments/types'; import { notifySuccess } from '@/portainer/services/notifications'; import { semverCompare } from '@/react/common/semver-utils'; import { LoadingButton } from '@@/buttons'; import { InlineLoader } from '@@/InlineLoader'; import { Tooltip } from '@@/Tip/Tooltip'; import { Link } from '@@/Link'; import { HelmRelease } from '../../types'; import { useUpdateHelmReleaseMutation, UpdateHelmReleasePayload, } from '../queries/useUpdateHelmReleaseMutation'; import { ChartVersion, useHelmRepoVersions, useHelmRepositories, } from '../queries/useHelmRepositories'; import { useHelmRelease } from '../queries/useHelmRelease'; import { openUpgradeHelmModal } from './UpgradeHelmModal'; export function UpgradeButton({ environmentId, releaseName, namespace, release, updateRelease, }: { environmentId: EnvironmentId; releaseName: string; namespace: string; release?: HelmRelease; updateRelease: (release: HelmRelease) => void; }) { const router = useRouter(); const updateHelmReleaseMutation = useUpdateHelmReleaseMutation(environmentId); const repositoriesQuery = useHelmRepositories(); const [useCache, setUseCache] = useState(true); const helmRepoVersionsQuery = useHelmRepoVersions( release?.chart.metadata?.name || '', 60 * 60 * 1000, // 1 hour repositoriesQuery.data, useCache ); const versions = helmRepoVersionsQuery.data; // Combined loading state const isInitialLoading = repositoriesQuery.isInitialLoading || helmRepoVersionsQuery.isFetching || helmRepoVersionsQuery.isInitialLoading; const isError = repositoriesQuery.isError || helmRepoVersionsQuery.isError; const latestVersion = useHelmRelease(environmentId, releaseName, namespace, { select: (data) => data.chart.metadata?.version, }); const latestVersionAvailable = versions[0]?.Version ?? ''; const isNewVersionAvailable = Boolean( latestVersion?.data && semverCompare(latestVersionAvailable, latestVersion?.data) === 1 ); const editableHelmRelease: UpdateHelmReleasePayload = { name: releaseName, namespace: namespace || '', values: release?.values?.userSuppliedValues, chart: release?.chart.metadata?.name || '', version: release?.chart.metadata?.version, }; function handleRefreshVersions() { if (useCache === false) { helmRepoVersionsQuery.refetch(); } else { setUseCache(false); } } return (