import { useQueryClient } from '@tanstack/react-query' import { CheckCircle, Download, Loader } from 'lucide-react' import Link from 'next/link' import { useEffect, useRef, useState } from 'react' import { useParams } from 'common' import { ButtonTooltip } from 'components/ui/ButtonTooltip' import { useBackupDownloadMutation } from 'data/database/backup-download-mutation' import { useDownloadableBackupQuery } from 'data/database/backup-query' import { projectKeys } from 'data/projects/keys' import { invalidateProjectDetailsQuery } from 'data/projects/project-detail-query' import { getWithTimeout } from 'lib/common/fetch' import { API_URL, PROJECT_STATUS } from 'lib/constants' import { Button } from 'ui' import { useProjectContext } from './ProjectContext' const RestoringState = () => { const { ref } = useParams() const queryClient = useQueryClient() const { project } = useProjectContext() const checkServerInterval = useRef() const [loading, setLoading] = useState(false) const [isCompleted, setIsCompleted] = useState(false) const { data } = useDownloadableBackupQuery({ projectRef: ref }) const backups = data?.backups ?? [] const logicalBackups = backups.filter((b) => !b.isPhysicalBackup) const { mutate: downloadBackup, isLoading: isDownloading } = useBackupDownloadMutation({ onSuccess: (res) => { const { fileUrl } = res // Trigger browser download by create,trigger and remove tempLink const tempLink = document.createElement('a') tempLink.href = fileUrl document.body.appendChild(tempLink) tempLink.click() document.body.removeChild(tempLink) }, }) const onClickDownloadBackup = () => { if (!ref) return console.error('Project ref is required') if (logicalBackups.length === 0) return console.error('No available backups to download') downloadBackup({ ref, backup: logicalBackups[0] }) } async function checkServer() { if (!project) return const projectStatus = await getWithTimeout(`${API_URL}/projects/${project.ref}/status`, { timeout: 2000, }) if (projectStatus && !projectStatus.error) { const { status } = projectStatus if (status === PROJECT_STATUS.ACTIVE_HEALTHY) { clearInterval(checkServerInterval.current) setIsCompleted(true) } else { queryClient.invalidateQueries(projectKeys.detail(ref)) } } } const onConfirm = async () => { if (!project) return console.error('Project is required') setLoading(true) if (ref) await invalidateProjectDetailsQuery(queryClient, ref) } useEffect(() => { checkServerInterval.current = window.setInterval(checkServer, 4000) return () => clearInterval(checkServerInterval.current) }, []) return (
{isCompleted ? (

Restoration complete!

Your project has been successfully restored and is now back online.

) : ( <>

Restoration in progress

Restoration can take from a few minutes up to several hours depending on the size of your database. Your project will be offline while the restoration is running.

} loading={isDownloading} disabled={logicalBackups.length === 0} tooltip={{ content: { side: 'bottom', text: logicalBackups.length === 0 ? 'No available backups to download' : undefined, }, }} onClick={onClickDownloadBackup} > Download latest backup
)}
) } export default RestoringState