import { SupportCategories } from '@supabase/shared-types/out/constants' import { LOCAL_STORAGE_KEYS, useParams } from 'common' import { Circle, Loader } from 'lucide-react' import { useEffect, useState } from 'react' import { Badge, Button } from 'ui' import { SupportLink } from '@/components/interfaces/Support/SupportLink' import { useInvalidateProjectsInfiniteQuery } from '@/data/projects/org-projects-infinite-query' import { Project, useInvalidateProjectDetailsQuery } from '@/data/projects/project-detail-query' import { useProjectStatusQuery } from '@/data/projects/project-status-query' import { useLongRunningTransitionState } from '@/hooks/misc/useLongRunningTransitionState' import { PROJECT_STATUS } from '@/lib/constants' import { clearPersistedTransitionStartTime, FALLBACK_LONG_RUNNING_STATE_THRESHOLD_MINUTES, minutesToMilliseconds, } from '@/lib/project-transition-state' const LONG_RUNNING_STATE_THRESHOLD_MINUTES = FALLBACK_LONG_RUNNING_STATE_THRESHOLD_MINUTES const LONG_RUNNING_STATE_THRESHOLD_MS = minutesToMilliseconds(LONG_RUNNING_STATE_THRESHOLD_MINUTES) export interface PausingStateProps { project: Project } export const PausingState = ({ project }: PausingStateProps) => { const { ref } = useParams() const [startPolling, setStartPolling] = useState(false) const pauseStateStartStorageKey = ref ? LOCAL_STORAGE_KEYS.PROJECT_PAUSING_STARTED_AT(ref) : null const isTakingLongerThanExpected = useLongRunningTransitionState({ storageKey: pauseStateStartStorageKey, thresholdMs: LONG_RUNNING_STATE_THRESHOLD_MS, }) const { invalidateProjectsQuery } = useInvalidateProjectsInfiniteQuery() const { invalidateProjectDetailsQuery } = useInvalidateProjectDetailsQuery() const { data: projectStatusData, isSuccess: isProjectStatusSuccess } = useProjectStatusQuery( { projectRef: ref }, { enabled: startPolling, refetchInterval: (query) => { const data = query.state.data return data?.status === PROJECT_STATUS.INACTIVE || data?.status === PROJECT_STATUS.PAUSE_FAILED ? false : 2000 }, } ) useEffect(() => { if (!isProjectStatusSuccess) return if ( projectStatusData?.status === PROJECT_STATUS.INACTIVE || projectStatusData?.status === PROJECT_STATUS.PAUSE_FAILED ) { if (pauseStateStartStorageKey) { clearPersistedTransitionStartTime(pauseStateStartStorageKey) } if (ref) invalidateProjectDetailsQuery(ref) invalidateProjectsQuery() } }, [ isProjectStatusSuccess, projectStatusData, pauseStateStartStorageKey, ref, invalidateProjectDetailsQuery, invalidateProjectsQuery, ]) useEffect(() => { const timeoutId = setTimeout(() => setStartPolling(true), 4000) return () => clearTimeout(timeoutId) }, []) return (

{project.name}

Pausing project

Pausing {project.name}

{isTakingLongerThanExpected ? `This is taking longer than usual. Contact support if your project is still pausing after ${LONG_RUNNING_STATE_THRESHOLD_MINUTES} minutes.` : 'Your project is being paused now. This usually takes a few minutes. While paused, your data stays safe, and you can turn the project back on anytime.'}

{isTakingLongerThanExpected && (
)}
) }