'use client' import { useQueryClient } from '@tanstack/react-query' import { useParams } from 'common' import { useEffect, useState } from 'react' import { cn, Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from 'ui' import { projectKeys } from '@/data/projects/keys' import { useSetProjectStatus, type Project } from '@/data/projects/project-detail-query' import { clearPauseStatusOverride, getPauseStatusOverride, setPauseStatusOverride, type PauseStateOverride, } from '@/data/projects/project-pause-status-override' import { clearProjectStatusOverride, getProjectStatusOverride, setProjectStatusOverride, } from '@/data/projects/project-status-override' import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' import { PROJECT_STATUS } from '@/lib/constants' type ProjectStatus = Project['status'] const STATUS_LABELS: Record = { INACTIVE: 'Paused', ACTIVE_HEALTHY: 'Active (healthy)', ACTIVE_UNHEALTHY: 'Active (unhealthy)', COMING_UP: 'Coming up', UNKNOWN: 'Unknown', GOING_DOWN: 'Going down', INIT_FAILED: 'Init failed', REMOVED: 'Removed', RESTARTING: 'Restarting', RESTORING: 'Restoring', RESTORE_FAILED: 'Restore failed', UPGRADING: 'Upgrading', PAUSING: 'Pausing', PAUSE_FAILED: 'Pause failed', RESIZING: 'Resizing', } const STATUS_OPTIONS = Object.values(PROJECT_STATUS) const PAUSE_STATE_VALUE_REAL = 'real' const PAUSE_STATE_OPTIONS: { value: PauseStateOverride | typeof PAUSE_STATE_VALUE_REAL label: string }[] = [ { value: PAUSE_STATE_VALUE_REAL, label: 'Real data' }, { value: 'restorable', label: 'Restorable (can resume)' }, { value: 'restore-disabled', label: 'Restore disabled (90+ days)' }, ] export const ProjectStatusTab = () => { const { ref } = useParams() const queryClient = useQueryClient() const { setProjectStatus } = useSetProjectStatus() const { data: project } = useSelectedProjectQuery() const { data: selectedOrg } = useSelectedOrganizationQuery() const orgSlug = selectedOrg?.slug const [statusOverride, setStatusOverride] = useState(undefined) const [pauseOverride, setPauseOverride] = useState(undefined) useEffect(() => { setStatusOverride(getProjectStatusOverride(ref)) setPauseOverride(getPauseStatusOverride(ref)) }, [ref]) const currentStatus = statusOverride ?? project?.status const isPaused = currentStatus === PROJECT_STATUS.INACTIVE const hasOverride = statusOverride !== undefined || pauseOverride !== undefined const refetchProjectStatus = () => { queryClient.invalidateQueries({ queryKey: projectKeys.detail(ref) }) queryClient.invalidateQueries({ queryKey: projectKeys.infiniteList() }) if (orgSlug) { queryClient.invalidateQueries({ queryKey: projectKeys.infiniteListByOrg(orgSlug) }) } } const handleStatusChange = (status: ProjectStatus) => { if (!ref) return setProjectStatusOverride(ref, status) setStatusOverride(status) setProjectStatus({ ref, slug: orgSlug, status }) } const handlePauseStateChange = (value: PauseStateOverride | typeof PAUSE_STATE_VALUE_REAL) => { if (!ref) return if (value === PAUSE_STATE_VALUE_REAL) { clearPauseStatusOverride(ref) setPauseOverride(undefined) } else { setPauseStatusOverride(ref, value) setPauseOverride(value) } queryClient.invalidateQueries({ queryKey: projectKeys.pauseStatus(ref) }) } const handleReset = () => { if (ref) { clearProjectStatusOverride(ref) clearPauseStatusOverride(ref) } setStatusOverride(undefined) setPauseOverride(undefined) refetchProjectStatus() queryClient.invalidateQueries({ queryKey: projectKeys.pauseStatus(ref) }) } const isDisabled = !ref return (

Override the status of the current project. Overrides persist across refetches until reset.

{isDisabled && (

Navigate to a project page to use this tab.

)}
Status
Pause state Applies when status is Paused
) }