import { SupportCategories } from '@supabase/shared-types/out/constants' import { DatabaseUpgradeProgress, DatabaseUpgradeStatus } from '@supabase/shared-types/out/events' import { useParams } from 'common' import dayjs from 'dayjs' import { AlertCircle, Check, CheckCircle, Circle, Loader, Maximize2, Minimize2, Settings, } from 'lucide-react' import { useSearchParams } from 'next/navigation' import { useState } from 'react' import { Button, Tooltip, TooltipContent, TooltipTrigger } from 'ui' import { DATABASE_UPGRADE_MESSAGES } from './UpgradingState.constants' import { SupportLink } from '@/components/interfaces/Support/SupportLink' import { useProjectUpgradingStatusQuery } from '@/data/config/project-upgrade-status-query' import { useInvalidateProjectDetailsQuery } from '@/data/projects/project-detail-query' import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' import { IS_PLATFORM } from '@/lib/constants' export const UpgradingState = () => { const { ref } = useParams() const queryParams = useSearchParams() const { data: project } = useSelectedProjectQuery() const [loading, setLoading] = useState(false) const [isExpanded, setIsExpanded] = useState(false) const { invalidateProjectDetailsQuery } = useInvalidateProjectDetailsQuery() const { data } = useProjectUpgradingStatusQuery( { projectRef: ref, projectStatus: project?.status, trackingId: queryParams?.get('trackingId'), }, { enabled: IS_PLATFORM, } ) const { initiated_at, status, progress, target_version, error } = data?.databaseUpgradeStatus ?? {} const progressStage = Number((progress || '').split('_')[0]) const isFailed = status === DatabaseUpgradeStatus.Failed const isCompleted = status === DatabaseUpgradeStatus.Upgraded const isPerformingFullPhysicalBackup = status === DatabaseUpgradeStatus.Upgrading && progress === DatabaseUpgradeProgress.CompletedUpgrade const initiatedAtUTC = dayjs.utc(initiated_at ?? 0).format('DD MMM YYYY HH:mm:ss') const initiatedAt = dayjs .utc(initiated_at ?? 0) .local() .format('DD MMM YYYY HH:mm:ss (ZZ)') const refetchProjectDetails = async () => { setLoading(true) if (ref) await invalidateProjectDetailsQuery(ref) } const subject = 'Upgrade failed for project' const message = `Upgrade information:\n• Initiated at: ${initiated_at}\n• Target Version: ${target_version}\n• Error: ${error}` return (
Upgrade completed!
Your project has been successfully upgraded to Postgres {target_version} and is now back online.
We ran into an issue while upgrading your project
Your project is back online and its data is not affected. Please reach out to us via our support form for assistance with the upgrade.
Performing a full backup
Upgrade is now complete, and your project is online. A full backup is now being performed to ensure that there is a proper base backup available post-upgrade. This can take from a few minutes up to several hours depending on the size of your database.
Upgrading in progress
Upgrades can take from a few minutes up to several hours depending on the size of your database. Your project will be offline while it is being upgraded.
{isCurrent ? message.progress : isCompleted ? message.completed : message.initial}
Started on: {initiatedAtUTC} (UTC)