import { DatabaseUpgradeStatus } from '@supabase/shared-types/out/events' import dayjs from 'dayjs' import { X } from 'lucide-react' import Link from 'next/link' import { useState } from 'react' import { useParams } from 'common' import { useProjectUpgradingStatusQuery } from 'data/config/project-upgrade-status-query' import { IS_PLATFORM } from 'lib/constants' import { Alert, Button } from 'ui' import { InlineLink } from './InlineLink' // [Joshen] Think twice about the category though - it doesn't correspond export const ProjectUpgradeFailedBanner = () => { const { ref } = useParams() const { data } = useProjectUpgradingStatusQuery({ projectRef: ref }, { enabled: IS_PLATFORM }) const { status, initiated_at, latest_status_at, error } = data?.databaseUpgradeStatus ?? {} const key = `supabase-upgrade-${ref}-${initiated_at}` const isAcknowledged = typeof window !== 'undefined' ? localStorage?.getItem(key) === 'true' : false const [showMessage, setShowMessage] = useState(!isAcknowledged) const isFailed = status === DatabaseUpgradeStatus.Failed const initiatedAt = dayjs .utc(initiated_at ?? 0) .tz(dayjs.tz.guess()) .format('DD MMM YYYY HH:mm:ss') const subject = 'Upgrade%20failed%20for%20project' const message = `Upgrade information:%0A• Initiated at: ${initiated_at}%0A• Error: ${error}` const initiatedAtEncoded = encodeURIComponent( dayjs.utc(initiated_at ?? 0).format('YYYY-MM-DDTHH:mm:ss') ) const latestStatusAtEncoded = encodeURIComponent( dayjs .utc(latest_status_at ?? 0) .utcOffset(0) .format('YYYY-MM-DDTHH:mm:ss') ) const timestampFilter = `its=${initiatedAtEncoded}&ite=${latestStatusAtEncoded}` const acknowledgeMessage = () => { setShowMessage(false) localStorage.setItem(key, 'true') } if (!isFailed || !showMessage) return null return (